在ggplot2中创建密度直方图?

问题描述 投票:0回答:5

我想用

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)

enter image description here

通过 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 填充颜色定向设置的。

r ggplot2 colors histogram probability-density
5个回答
33
投票

我手动为您的百分位栏添加了颜色。看看这是否适合你。

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())

enter image description here


9
投票

fill=seg
导致分组。实际上,对于每个
seg
值,您都会得到不同的直方图。如果你不需要颜色,你可以使用这个:

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

enter image description here

如果您需要颜色,在 ggplot2 之外计算密度值可能是最简单的。


1
投票

解释

y-axis
的困惑可能是由于绘制的是密度而不是计数。因此,
y-axis
上的值是总样本的比例,其中条形的 总和等于
1


1
投票

或者带有

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)

0
投票

我没有权限将其作为评论发布,但我认为它足以作为一个答案,以节省其他可能遇到此问题的人的时间。

aes(y = ..density..)
语法现已弃用。参见:

警告信息: 1:点点符号 (

..density..
) 在 ggplot2 3.4.0 中已弃用。 ℹ 请使用
after_stat(density)
代替。 此警告每 8 小时显示一次。 致电
lifecycle::last_lifecycle_warnings()
查看此警告是在哪里生成的。

所以上面所有内容中的

=..density..
(这对我很有帮助!)现在应该是
=after_stat(density)

© www.soinside.com 2019 - 2024. All rights reserved.