如何向ggplot直方图添加均值和模式?

Posted

技术标签:

【中文标题】如何向ggplot直方图添加均值和模式?【英文标题】:How to add mean, and mode to ggplot histogram? 【发布时间】:2018-04-10 13:28:47 【问题描述】:

我需要添加一条平均线和模式的值,例如这种类型 地块:

我用这个来计算箱子的数量:

bw <- diff(range(cars$lenght)) / (2 * IQR(cars$lenght) / length(cars$lenght)^(1/3))

还有剧情:

ggplot(data=cars, aes(cars$lenght)) + 
  geom_histogram(aes(y =..density..), 
                 col="red",
                 binwidth = bw,
                 fill="green", 
                 alpha=1) + 
  geom_density(col=4) + 
  labs(title='Lenght Plot', x='Lenght', y='Times')

cars$lenght

168.8 168.8 171.2 176.6 176.6 177.3 192.7 192.7 192.7 178.2 176.8 176.8 176.8 176.8 189.0 189.0 193.8 197.0 141.1 155.9 158.8 157.3 157.3 157.3 157.3 157.3 157.3 157.3 174.6 173.2

提前致谢。

【问题讨论】:

你能发布cars$lenght的一部分吗?另外我假设您想要cars$lenght 的平均线和模式?最后,您是否希望它们在图上显示为垂直线? 垂直线可能是我认为最好的方式。我把向量放在主消息上 试试+ geom_vline(xintercept=mean(cars$lenght), lwd=1, linetype=2, color="black") 谢谢,这意味着!我们可以假设它是最高的模式?还是找到它??就是这个数据集:archive.ics.uci.edu/ml/datasets/Automobile 要估计模式,请使用modes 包:cran.r-project.org/web/packages/modes/modes.pdf 【参考方案1】:

我不确定如何复制您的数据,因此我使用了cars$speed

geom_vline 将在您想要的位置放置垂直线,您可以即时计算原始数据的平均值和众数。但是,如果您希望将模式作为频率最高的直方图 bin,您可以从 ggplot 对象中提取它。

我不太确定你想如何定义模式,所以我绘制了一堆不同的方法。

# function to calculate mode
fun.mode<-function(x)as.numeric(names(sort(-table(x)))[1])

bw <- diff(range(cars$length)) / (2 * IQR(cars$speed) / length(cars$speed)^(1/3))
p<-ggplot(data=cars, aes(cars$speed)) + 
  geom_histogram(aes(y =..density..), 
                 col="red",
                 binwidth = bw,
                 fill="green", 
                 alpha=1) + 
  geom_density(col=4) + 
  labs(title='Lenght Plot', x='Lenght', y='Times')

# Extract data for the histogram and density peaks
data<-ggplot_build(p)$data
hist_peak<-data[[1]]%>%filter(y==max(y))%>%.$x
dens_peak<-data[[2]]%>%filter(y==max(y))%>%.$x

# plot mean, mode, histogram peak and density peak
p%+%
  geom_vline(aes(xintercept = mean(speed)),col='red',size=2)+
  geom_vline(aes(xintercept = fun.mode(speed)),col='blue',size=2)+
  geom_vline(aes(xintercept = hist_peak),col='orange',size=2)+
  geom_vline(aes(xintercept = dens_peak),col='purple',size=2)+
  geom_text(aes(label=round(hist_peak,1),y=0,x=hist_peak),
            vjust=-1,col='orange',size=5)

【讨论】:

从这里的答案中获得模式功能:***.com/questions/2547402/… 嗨@dulearnaux 如果您能帮助我了解如何在线绘制值(平均值、中位数和众数)以及如何将这些值放入图例中,将不胜感激。【参考方案2】:

创建一个 data.frame,其中包含您要绘制的每个统计数据的值。这样做的好处是可以为每个统计数据自动创建一个图例。

cars$length <- cars$speed
bw <- diff(range(cars$length)) / (2 * IQR(cars$length) / length(cars$length)^(1/3))

sumstatz <- data.frame(whichstat = c("mean",
                                     "sd upr", 
                                     "sd lwr"),
                       value     = c(mean(cars$length),
                                     mean(cars$length)+sd(cars$length),
                                     mean(cars$length)-sd(cars$length)))

ggplot(data=cars, aes(length)) + 
  geom_histogram(aes(y =..density..),
                 col="black",
                 binwidth = bw) + 
  geom_density(col="black") + 
  geom_vline(data=sumstatz,aes(xintercept = value,
                               linetype = whichstat,
                               col = whichstat),size=1)+
  labs(title='Length Plot', x='Length', y='Count')

【讨论】:

以上是关于如何向ggplot直方图添加均值和模式?的主要内容,如果未能解决你的问题,请参考以下文章

在 ggplot2 中使用计数数据向直方图添加密度线

用ggplot2直方图中另一个连续变量的平均值填充条形颜色

如何使用ggplot2在直方图上添加多个vlan

每个变量嵌套 ggplot 直方图

R语言ggplot2可视化:ggplot2可视化直方图(histogram)并在直方图的顶部外侧(top upper)或者直方图内部添加数值标签

R语言ggplot2可视化:可视化堆叠的直方图在bin中的每个分组部分添加数值标签为堆叠直方图中的每个分组部分添加数值标签