用均值条形图及其标准差 ggplot2 总结数据框
Posted
技术标签:
【中文标题】用均值条形图及其标准差 ggplot2 总结数据框【英文标题】:Summarising data frame with barplot of means and their standard deviation, ggplot2 【发布时间】:2021-04-13 05:37:43 【问题描述】:我有一个 8 列 152 行的数据集。我的目标是使用每列均值的 ggplot2 及其标准差(这些差异很大)创建一个条形图。我可以轻松创建散点图,但 barplot 带有多个错误消息,包括:
barplot.default(GRPA) 中的错误:“高度”必须是向量或矩阵 任何建议或示例代码都会很棒
部分数据示例:
structure(list(ALP.B = c(80L, 37L, 52L, 36L, 39L, 48L, 71L, 81L,
77L, 38L, 56L, 33L, 64L, 70L, 43L, 45L, 59L, 42L, 59L, 45L),
ALT.B = c(13L, 15L, 10L, 13L, 18L, 8L, 12L, 13L, 18L, 13L,
10L, 28L, 10L, 13L, 12L, 28L, 15L, 7L, 11L, 13L), AST.B = c(14L,
16L, 13L, 13L, 12L, 13L, 18L, 16L, 19L, 14L, 15L, 21L, 15L,
13L, 12L, 16L, 23L, 12L, 14L, 12L), TBL.B = c(12.654, 6.498,
4.788, 6.84, 14.364, 6.156, 9.063, 10.773, 7.353, 7.182,
7.866, 8.721, 13.338, 7.866, 11.628, 10.089, 5.301, 9.918,
7.353, 7.182), ALP.M = c(87L, 37L, 55L, 35L, 37L, 50L, 74L,
89L, 83L, 36L, 58L, 32L, 78L, 78L, 43L, 51L, 60L, 47L, 50L,
51L), ALT.M = c(22L, 25L, 10L, 11L, 21L, 8L, 10L, 17L, 21L,
16L, 13L, 27L, 14L, 18L, 13L, 41L, 14L, 8L, 13L, 14L), AST.M = c(22L,
23L, 13L, 12L, 15L, 13L, 15L, 13L, 22L, 17L, 18L, 27L, 16L,
15L, 13L, 23L, 22L, 12L, 13L, 15L), TBL.M = c(23.085, 8.037,
6.498, 8.037, 16.758, 5.985, 7.524, 7.866, 8.379, 7.866,
8.208, 13.338, 15.732, 8.208, 14.706, 15.39, 7.866, 7.353,
9.918, 7.866)), row.names = c(NA, 20L), class = "data.frame")
我的代码很简陋,因为我尝试了很多次:
ggplot(colMeans(GRPA), aes(x="drug", y="value")) +
geom_bar(stat = "identity")
【问题讨论】:
欢迎来到 SO!为了帮助我们为您提供帮助,您能否通过共享您的数据、您尝试的代码和您的包的示例来重现您的问题用过的?见how to make a minimal reproducible example。 已经更新,如果还好请告诉我 如果您想发布数据,只需在控制台中输入dput(NAME_OF_DATASET)
并将以structure(....
开头的输出复制并粘贴到您的帖子中。如果您的数据集有很多观察结果,您可以对前 20 行数据执行 dput(head(NAME_OF_DATASET, 20))
。此外,请发布您尝试过的代码以及导致问题的原因。
对不起,这真的不起作用没有线索
(: 一切都很好。现在我们将数据作为 nice dput() ).(;
【参考方案1】:
您的代码存在几个问题。首先ggplot2
在你传递一个向量colMeans(GRPA)
时处理数据帧。此外,如果您想传递 ggplot2 变量的名称,请不要使用引号。
为了达到您想要的结果,最好使用例如将您的数据集重塑为长或整齐的格式。 tidyr::pivot_longer()
。之后您可以使用dplyr
计算每种药物的平均值(和/或标准差):
然后可以通过 ggplot2 轻松绘制此汇总数据集。
library(dplyr)
library(tidyr)
library(ggplot2)
# Reshape dataset to long format, compute means per drug using group_by + summarise
GRPA_long <- GRPA %>%
pivot_longer(everything(), names_to = "drug", values_to = "value") %>%
group_by(drug) %>%
summarise(mean = mean(value), sd = sd(value))
#> `summarise()` ungrouping output (override with `.groups` argument)
ggplot(GRPA_long, aes(x = drug, y = mean)) +
geom_bar(stat = "identity") +
geom_errorbar(aes(ymin = mean - sd, ymax = mean + sd))
【讨论】:
非常感谢,现在明白了,这是救命稻草 不客气。总是很高兴帮助人们开始。 (; PS:我刚刚添加了错误栏的代码。 (;以上是关于用均值条形图及其标准差 ggplot2 总结数据框的主要内容,如果未能解决你的问题,请参考以下文章