如何在ggplot直方图中添加平均数和众数?

15
我需要在这些图表中添加平均线和众数的值。我使用它来计算箱子的数量。
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 的平均线和众数?最后,你想让它们显示为图表上的垂直线吗? - Mike H.
13
尝试使用 + geom_vline(xintercept=mean(cars$lenght), lwd=1, linetype=2, color="black"),这会在图表中添加一条垂直线,位置为数据集 cars 中长度列的平均值,线宽为1,线型为虚线,颜色为黑色。 - Marco Sandri
1
谢谢,这对于平均值很有效!模式我们可以假设它是最高的箱子吗?还是有什么方法可以找到它?这是数据集:https://archive.ics.uci.edu/ml/datasets/Automobile - Borja_042
1
要估计模式,请使用modes包:https://cran.r-project.org/web/packages/modes/modes.pdf - Marco Sandri
非常感谢你,伙计! - Borja_042
显示剩余2条评论
2个回答

21

我不确定如何复制你的数据,所以我用cars$speed替代了它。

geom_vline将在需要的地方放置垂直线,您可以即时计算原始数据的平均值和众数。但是,如果您希望将众数定义为直方图中频率最高的柱子,那么可以从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)

在此输入图片描述


从这里的答案中得到了mode函数:https://dev59.com/UXE85IYBdhLWcg3w64EA - dule arnaux
嗨@dulearnaux,希望您能帮助我理解如何在折线图上绘制值(平均值、中位数和众数),以及如何将它们放入图例中。 - BPDESILVA

1
创建一个数据框,其中包含您想绘制的每个统计量的值。这样做的好处是自动为每个统计量创建图例。
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')

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接