R-ggplot箱形图,其中有标准偏差值吗?

时间:2018-08-31 11:05:57

标签: r ggplot2 plot tidyverse tibble

我试图将这个问题写得尽可能清晰和完整,并感谢您的建设性批评:

我有一个名为tibble的{​​{1}},看起来像这样:

my_tibble

# A tibble: 36 x 5 # Groups: fruit [4] fruit length weight length_sd weight_sd <fct> <dbl> <dbl> <dbl> <dbl> 1 Apple 0.531 0.0730 0.211 0.0292 2 Apple 0.489 0.0461 0.211 0.0292 3 Apple 0.503 0.0796 0.211 0.0292 4 Apple 0.560 0.0733 0.211 0.0292 5 Apple 0.533 0.0883 0.211 0.0292 6 Apple 0.612 0.127 0.211 0.0292 7 Apple 0.784 0.0671 0.211 0.0292 8 Apple 0.363 0.0623 0.211 0.0292 9 Apple 1.000 0.0291 0.211 0.0292 10 Apple 0.956 0.0284 0.211 0.0292 # ... with 26 more rows length_sd变量是weight_sdlength的标准偏差(是的,我知道数字是没有意义的),用于{ {1}}个因子变量,即widthfruitAppleBanana

我想对它们的长度和重量进行箱形图绘制,因此我首先Orange编辑数据:

Strawberry

然后我运行gather()my_tibble_gathered <- my_tibble %>% ungroup() %>% gather("length", "weight", key = "measurement", value = "value") 绘制箱形图:

ggplot2

哪个给我:

Boxplot of my_tibble

到目前为止很好。

但是,我还没有使用标准差数据。我想要的是:

  1. 在主图中

    内打印每个水果的标准偏差(长度或重量取决于其所在的面的值)的值>
  2. 轻推着不要触摸方框图,然后

  3. ,具有给定的字体和字体大小的指定小数位数(例如3)。

  4. 理想情况下,我也希望能够在其中使用标准偏差符号(sigma)(因此也许可以使用facet_grid()?)。

因此,例如,在ggplot(data = my_tibble_gathered) + geom_boxplot(mapping = aes(x = fruit, y = value)) + facet_grid(~measurement) expression()的箱形图的顶部,将显示文本为“ [sigma符号] = 0.211”,其他{{1} } s。

我该如何以编程方式执行此操作并从Apple获取数据,这样我就不必通过length手动复制/粘贴数字了?

非常感谢您。

这是fruit中的my_tibble

annotate()

1 个答案:

答案 0 :(得分:2)

您可以尝试一下这种小技巧:

d %>% 
  # transform from wide to long similar as you did already
  gather(k, v, -fruit, -ends_with("sd")) %>% 
  # add corresponding sd values 
  mutate(label = ifelse(k == "length", length_sd, weight_sd)) %>% 
  # prepare the label as expression
  mutate(label = paste0("sigma==", round(label, 3))) %>%       
  # add factor for alpha by adding the second group 
  group_by(k, add = T) %>% 
  mutate(Alpha=c(1, rep(0, n()-1))) %>% 
  ggplot(aes(fruit, v)) + 
  geom_boxplot() + 
  geom_text(aes(y=max(v) + 0.1,  
            label=label,
            alpha=factor(Alpha)), 
            size=3,
            show.legend = F, 
            parse = T) +
  facet_grid(~k) +
  scale_alpha_manual(values=c(0, 1))

enter image description here

您必须像sd列那样转换fruit值对应于klabel列的数据。然后,您必须添加一个二进制因子,以避免使用alpha参数进行过度绘图。

d %>% 
  gather(k, v, -fruit, -ends_with("sd")) %>% 
  mutate(label=ifelse(k == "length",length_sd,weight_sd )) %>% 
  group_by(k, add=T) %>% 
  mutate(Alpha=c(1,rep(0,n()-1))) %>% 
  head(3)
# A tibble: 3 x 7
# Groups:   fruit, k [1]
  fruit length_sd weight_sd k          v label Alpha
  <fct>     <dbl>     <dbl> <chr>  <dbl> <dbl> <dbl>
1 Apple     0.211    0.0292 length 0.531 0.211     1
2 Apple     0.211    0.0292 length 0.489 0.211     0
3 Apple     0.211    0.0292 length 0.503 0.211     0