Создание гистограммы плотности в ggplot2?

Я хочу создать следующий график плотности гистограммы с ggplot2. «Обычным» способом (базовые пакеты) действительно просто:

set.seed(46)
vector <- rnorm(500)  
breaks <- quantile(vector,seq(0,1,by=0.1))
labels = 1:(length(breaks)-1)
den = density(vector)
hist(df$vector,
     breaks=breaks,
     col=rainbow(length(breaks)),
     probability=TRUE)
lines(den)

введите описание изображения здесь

С ggplot я дошел до этого:

seg <- cut(vector,breaks,
           labels=labels,
           include.lowest = TRUE, right = TRUE)
df = data.frame(vector=vector,seg=seg)

ggplot(df) + 
     geom_histogram(breaks=breaks,
                    aes(x=vector,
                        y=..density..,
                        fill=seg)) + 
     geom_density(aes(x=vector,
                      y=..density..))

Но шкала «y» имеет неправильный размер. Я заметил, что в следующем прогоне шкала «y» будет правильной.

 ggplot(df) + 
     geom_histogram(breaks=breaks,
                    aes(x=vector,
                    y=..density..,
                    fill=seg)) + 
     geom_density(aes(x=vector,
                      y=..density..))

Я просто этого не понимаю. y=..density.. там, это должна быть высота. Так почему же моя шкала видоизменяется, когда я пытаюсь ее заполнить?

Мне нужны цвета. Мне просто нужна гистограмма, где разрывы и цвета каждого блока направленно установлены в соответствии с цветами заливки ggplot по умолчанию.


person Usobi    schedule 11.01.2014    source источник
comment
Я отредактировал ваше сообщение, чтобы код поместился на странице. Возможно, вас заинтересуют предложения Google о том, как кодировать для максимальной удобочитаемости и полезности: см. google-styleguide.googlecode.com/svn/trunk/Rguide.xml   -  person Andy Clifton    schedule 12.01.2014


Ответы (4)


Вручную я добавил цвета к вашим столбцам процентилей. Посмотрите, работает ли это для вас.

library(ggplot2)

ggplot(df, aes(x=vector)) +   
   geom_histogram(breaks=breaks,aes(y=..density..),colour="black",fill=c("red","orange","yellow","lightgreen","green","darkgreen","blue","darkblue","purple","pink")) + 
   geom_density(aes(y=..density..)) +
   scale_x_continuous(breaks=c(-3,-2,-1,0,1,2,3)) +
   ylab("Density") + xlab("df$vector") + ggtitle("Histogram of df$vector") +
   theme_bw() + theme(plot.title=element_text(size=20),
                      axis.title.y=element_text(size = 16, vjust=+0.2),
                      axis.title.x=element_text(size = 16, vjust=-0.2),
                      axis.text.y=element_text(size = 14),
                      axis.text.x=element_text(size = 14),
                      panel.grid.major = element_blank(),
                      panel.grid.minor = element_blank())

введите описание изображения здесь

person Andre Silva    schedule 12.01.2014
comment
спасибо, искал альтернативные решения, но в итоге остановился на вашем. - person Usobi; 14.01.2014

fill=seg приводит к группировке. Фактически вы получаете разные гистограммы для каждого значения seg. Если вам не нужны цвета, вы можете использовать это:

ggplot(df) + 
  geom_histogram(breaks=breaks,aes(x=vector,y=..density..), position="identity") + 
  geom_density(aes(x=vector,y=..density..))

введите описание изображения здесь

Если вам нужны цвета, может быть проще всего рассчитать значения плотности вне ggplot2.

person Roland    schedule 11.01.2014
comment
Извините, я не понимаю ваш комментарий. - person Roland; 11.01.2014

Или вариант с ggpubr

library(ggpubr)
gghistogram(df, x = "vector", add = "mean", rug = TRUE, fill = "seg",
   palette = c("#00AFBB", "#E7B800", "#E5A800", "#00BFAB", "#01ADFA", 
   "#00FABA", "#00BEAF", "#01AEBF", "#00EABA", "#00EABB"), add_density = TRUE)
person akrun    schedule 12.09.2020

Путаница при интерпретации y-axis может быть связана с нанесением на график плотности, а не с подсчетом. Таким образом, значения в y-axis являются пропорциями общей выборки, где сумма столбцов равна 1.

person Iroise Dumontheil    schedule 05.09.2019