我试图将这个问题写得尽可能清晰和完整,并感谢您的建设性批评:
我有一个名为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_sd
和length
的标准偏差(是的,我知道数字是没有意义的),用于{ {1}}个因子变量,即width
,fruit
,Apple
和Banana
。
我想对它们的长度和重量进行箱形图绘制,因此我首先Orange
编辑数据:
Strawberry
然后我运行gather()
用my_tibble_gathered <- my_tibble %>%
ungroup() %>%
gather("length", "weight", key = "measurement", value = "value")
绘制箱形图:
ggplot2
哪个给我:
到目前为止很好。
但是,我还没有使用标准差数据。我想要的是:
在主图中
内打印每个水果的标准偏差(长度或重量取决于其所在的面的值)的值>轻推着不要触摸方框图,然后
,具有给定的字体和字体大小的指定小数位数(例如3)。
理想情况下,我也希望能够在其中使用标准偏差符号(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()
答案 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))
您必须像sd
列那样转换fruit
值对应于k
和label
列的数据。然后,您必须添加一个二进制因子,以避免使用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