【问题标题】:Illustrate mean and standard deviation in ggplot2 density plot说明 ggplot2 密度图中的均值和标准差
【发布时间】:2016-05-16 12:57:18
【问题描述】:

我正在尝试构建一个图,在其中绘制正态分布的变量,在 x 轴上显示它们的平均值,在 y 轴上显示标准偏差 (SD)。有点像密度图,但不是在 y 轴上显示密度,而是我想要 SD(值)。

我正在处理以下数据,

set.seed(1)
mu1 <- rnorm(10^5, mean = 1, sd = 1)
mu3 <- rnorm(10^5, mean = 3, sd = 2)

两个正态分布的变量。这里他们的平均值和标准差,

# install.packages("tidyverse", dependencies = TRUE)
require(tidyverse)
tibble(mu1, mu3) %>% summarise_all(funs(mean, sd))
#> # A tibble: 1 x 4
#>    mu1_mean mu3_mean    mu1_sd   mu3_sd
#>       <dbl>    <dbl>     <dbl>    <dbl>
#> 1 0.9993454 3.000825 0.9982848 1.998234

我玩过 和其他 包,以更接近我想要的。我也尝试过从箱形图中复制this function 做类似的事情,但已经成功了。

这是我的开始,

tibble(mu1, mu3) %>% gather() %>% ggplot() + 
  geom_density(aes(x = value, colour = key)) + 
  labs(x = 'mean', y = 'currently density, but I would like sd')

【问题讨论】:

  • 你有你心目中情节的例子吗? (可能是一张图)。你的情节应该传达什么信息?
  • 我或多或少想要你看到的图中的内容,但我想要 y 轴上的标准偏差而不是密度。这有意义吗?
  • 对我来说不是真的,因为 sd 只是一个数字。它不会随着分布而变化(与密度一样)。
  • 您正在绘制密度(这是geom_density() 的用途),x 轴和 y 轴都没有显示平均值或标准差。您链接的示例中的箱线图实际上传达了与密度图类似的信息,但方式不同。它也没有标准偏差的平均值作为其轴之一。我真的不明白你的问题......

标签: ggplot2 tidyverse r ggplot2 data-visualization kernel-density


【解决方案1】:

平均值和标准差是在 x 轴上测量的,因此您需要沿 x 轴绘制它们。 y 轴是给定 x 间隔内的点的密度,类似于直方图中条形的高度。

也许这会给您提供您正在寻找的东西:下面的代码添加了一条跨越每个密度图的标准偏差的水平线,以及用于标记它们在 x 轴上的位置的下降线。 sd 线位于分布宽度等于标准偏差的 y 值处。如果您愿意,您可以另外(或替代)填充标准差所跨越的区域。

library(dplyr)

# Densities
n = 2^10
df = data.frame(x = c(density(foo,n=n)$x, density(bar,n=n)$x),
                y = c(density(foo,n=n)$y, density(bar,n=n)$y),
                group=rep(c("foo","bar"), each=n))

## Mean and SD
msd =  melt(data.frame(foo=foo, bar=bar)) %>% 
         group_by(group=variable) %>% summarise(mean=mean(value), sd=sd(value))

# Find y value (of density) where sd has same width as density
msd$y = unlist(lapply(unique(df$group), function(g) {
  d = df[df$group==g,]
  d$y[which.min(abs(d$x - (msd$mean[msd$group==g] - msd$sd[msd$group==g])))]
}))

ggplot(df, aes(x=x, y=y, colour=group)) + 
  geom_line() + labs(x = NULL) +
  geom_segment(data=msd, aes(y=y,yend=y, x=mean - sd, xend=mean + sd), lty="21") +
  geom_point(data=msd, aes(y=y, x=mean)) +
  geom_segment(data=msd, aes(x=mean-sd, xend=mean-sd, y=0, yend=y), alpha=0.5, lty="21") +
  geom_segment(data=msd, aes(x=mean+sd, xend=mean+sd, y=0, yend=y), alpha=0.5, lty="21")

【讨论】:

  • 什么是“%>%”,它对我不起作用,它是某种管道?我没见过。
  • 是的,它是来自dplyr 包的管道运算符。请参阅the dplyr vignette 的“管道”部分。
猜你喜欢
  • 2014-04-27
  • 2018-02-25
  • 2019-07-24
  • 1970-01-01
  • 2021-06-04
  • 2020-12-26
  • 2020-04-15
  • 1970-01-01
  • 2022-01-19
相关资源
最近更新 更多