如何用ggplot2的aes(Group, DoublingTime)生成类DT_plotB的分面统计图?
问题:如何用
aes(Group, DoublingTime)生成与DT_plotB外观一致的ggplot2统计图? 在ggplot2中使用stat_summary()计算并绘制数据集的均值和标准差,同时用facet_wrap()拆分为两个分面图时,facet_wrap()会让stat_summary()独立应用于每个数据子集,但遇到以下问题:
- 用
aes(Group, DoublingTime)生成的DT_plotA能正确计算统计量,但每个分面会显示当前分面不存在的Group(比如A菌株分面会出现B_3g、B_6g的刻度)。 - 改用
aes(Condition, DoublingTime)生成的DT_plotB分面显示正常,但移除facet_wrap()后,stat_summary()会合并不同Strain的数据计算均值,容易引发错误。
需求:能否使用aes(Group, DoublingTime)生成外观与DT_plotB一致的统计图?
数据集
df <- data.frame( ID = c("A_3g_Rep1", "A_3g_Rep2", "A_3g_Rep3", "A_6g_Rep1", "A_6g_Rep2", "A_6g_Rep3", "B_3g_Rep1", "B_3g_Rep2", "B_3g_Rep3", "B_6g_Rep1", "B_6g_Rep2", "B_6g_Rep3"), Group = c("A_3g", "A_3g", "A_3g", "A_6g", "A_6g", "A_6g", "B_3g", "B_3g", "B_3g", "B_6g", "B_6g", "B_6g"), Strain = c("A", "A", "A", "A", "A", "A", "B", "B", "B", "B", "B", "B"), Condition = c("3g", "3g", "3g", "6g", "6g", "6g", "3g", "3g", "3g", "6g", "6g", "6g"), DoublingTime = c(122.4135, 124.5801, 124.9419, 120.5004, 124.1666, 124.6453, 132.568, 137.5242, 135.5238, 137.1333, 142.733, 140.0722) )
原代码示例
DT_plotA(分面显示多余Group)
DT_plotA <- ggplot(df, aes(Group, DoublingTime)) + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="errorbar", width=0.5) + stat_summary(fun=mean, geom="point", size=3) + facet_wrap(nrow = 1, .~Strain)
DT_plotB(分面正常,但无facet时易出错)
DT_plotB <- ggplot(df, aes(Condition, DoublingTime)) + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="errorbar", width=0.5) + stat_summary(fun=mean, geom="point", size=3) + facet_wrap(nrow = 1, .~Strain)
解决方案
只需对DT_plotA做两处修改,即可实现与DT_plotB一致的外观,同时保留Group作为x轴的优势(移除分面时按Group独立计算统计量):
- 在
facet_wrap()中添加scales = "free_x",让每个分面只显示当前子集存在的Group刻度,避免无关Group的干扰。 - 用
scale_x_discrete()将Group的标签替换为Condition样式(3g/6g),让x轴显示与DT_plotB完全一致。
修改后的代码:
DT_plotC <- ggplot(df, aes(Group, DoublingTime)) + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="errorbar", width=0.5) + stat_summary(fun=mean, geom="point", size=3) + facet_wrap(nrow = 1, .~Strain, scales = "free_x") + scale_x_discrete( labels = c("A_3g" = "3g", "A_6g" = "6g", "B_3g" = "3g", "B_6g" = "6g") )
效果说明
scales = "free_x"让A菌株分面仅显示A_3g和A_6g,B菌株分面仅显示B_3g和B_6g,解决了原DT_plotA分面显示多余Group的问题。- 自定义x轴标签后,图表外观与DT_plotB完全一致。
- 移除
facet_wrap()后,stat_summary()会按Group(A_3g、A_6g、B_3g、B_6g)分别计算均值和标准差,不会合并不同Strain的数据,避免了DT_plotB的潜在错误。
内容的提问来源于stack exchange,提问作者JVGen
相关产品推荐
相关产品推荐

