position_dodge 在条形图上叠加点(和误差线)
Overlay points (and error bars) over bar plot with position_dodge
我一直在努力寻找我的特定问题的答案,但我没有成功,所以我刚刚在这里 post 做了一个 MWE。
我尝试了 here 的答案,但没有成功。
我想做的任务看起来很简单,但我想不通,得到的结果让我有一些基本的问题...
我只想在条形图上叠加点和误差条,使用 ggplot2
。
我有一个长格式数据框,如下所示:
> mydf <- data.frame(cell=paste0("cell", rep(1:3, each=12)),
scientist=paste0("scientist", rep(rep(rep(1:2, each=3), 2), 3)),
timepoint=paste0("time", rep(rep(1:2, each=6), 3)),
rep=paste0("rep", rep(1:3, 12)),
value=runif(36)*100)
我试图通过以下方式获得我想要的情节:
myPal <- brewer.pal(3, "Set2")[1:2]
myPal2 <- brewer.pal(3, "Set1")
outfile <- "test.pdf"
pdf(file=outfile, height=10, width=10)
print(#or ggsave()
ggplot(mydf, aes(cell, value, fill=scientist )) +
geom_bar(stat="identity", position=position_dodge(.9)) +
geom_point(aes(cell, color=rep), position=position_dodge(.9), size=5) +
facet_grid(timepoint~., scales="free_x", space="free_x") +
scale_y_continuous("% of total cells") +
scale_fill_manual(values=myPal) +
scale_color_manual(values=myPal2)
)
dev.off()
但是我得到了这个:
问题是,每个 "scientist" 柱应该有 3 个 "rep" 值,但这些值是按 "rep" 排序的(它们应该是 1,2,3,1 ,2,3,而不是 1,1,2,2,3,3)。
此外,我想用 geom_errorbar
添加错误栏,但我没能得到一个工作示例...
此外,叠加的实际值指向条形图,这让我想知道这里实际绘制的是什么......如果每个条形图的值都正确,以及为什么最大值(或者看起来如此)默认绘制。
我认为应该正确绘制的方法是使用中位数(或均值),在箱线图中添加误差线,例如胡须(最小值和最大值)。
知道如何...
- ... "rep" 值点的顺序是否正确?
- ...将条形显示的值从最大值更改为中值?
- ...添加带有最大值和最小值的误差线?
我稍微调整了您的绘图代码,使事情变得更容易。
秘诀是使用适当的分组(否则可以从 fill
和 color
中推断出来)。此外,由于您要在多个级别上躲避,因此必须使用 dodge2
。
当您不确定 bar/column 图表中的 "what is plotted where" 时,添加选项 color="black"
总是有帮助的,因为您的使用 dodge
而不是 dodge2
.
p = ggplot(mydf, aes(x=cell, y=value, group=paste(scientist,rep))) +
geom_col(aes(fill=scientist), position=position_dodge2(.9)) +
geom_point(aes(cell, color=rep), position=position_dodge2(.9), size=5) +
facet_grid(timepoint~., scales="free_x", space="free_x") +
scale_y_continuous("% of total cells") +
scale_fill_brewer(palette = "Set2")+
scale_color_brewer(palette = "Set1")
ggsave(filename = outfile, plot=p, height = 10, width = 10)
给出:
关于误差线
因为只有三个重复,我会展示原始数据点,也许还有小提琴图。为了完整起见,我还添加了一个 geom_errorbar
.
ggplot(mydf, aes(x=cell, y=value,group=paste(cell,scientist))) +
geom_violin(aes(fill=scientist),position=position_dodge(),color="black") +
geom_point(aes(cell, color=rep), position=position_dodge(0.9), size=5) +
geom_errorbar(stat="summary",position=position_dodge())+
facet_grid(timepoint~., scales="free_x", space="free_x") +
scale_y_continuous("% of total cells") +
scale_fill_brewer(palette = "Set2")+
scale_color_brewer(palette = "Set1")
给予
评论后更新
正如我在下面的评论中提到的,百分比的叠加会导致不良结果。
ggplot(mydf, aes(x=paste(cell, scientist), y=value)) +
geom_bar(aes(fill=rep),stat="identity", position=position_stack(),color="black") +
geom_point(aes(color=rep), position=position_dodge(.9), size=3) +
facet_grid(timepoint~., scales="free_x", space="free_x") +
scale_y_continuous("% of total cells") +
scale_fill_brewer(palette = "Set2")+
scale_color_brewer(palette = "Set1")
我一直在努力寻找我的特定问题的答案,但我没有成功,所以我刚刚在这里 post 做了一个 MWE。
我尝试了 here 的答案,但没有成功。
我想做的任务看起来很简单,但我想不通,得到的结果让我有一些基本的问题...
我只想在条形图上叠加点和误差条,使用 ggplot2
。
我有一个长格式数据框,如下所示:
> mydf <- data.frame(cell=paste0("cell", rep(1:3, each=12)),
scientist=paste0("scientist", rep(rep(rep(1:2, each=3), 2), 3)),
timepoint=paste0("time", rep(rep(1:2, each=6), 3)),
rep=paste0("rep", rep(1:3, 12)),
value=runif(36)*100)
我试图通过以下方式获得我想要的情节:
myPal <- brewer.pal(3, "Set2")[1:2]
myPal2 <- brewer.pal(3, "Set1")
outfile <- "test.pdf"
pdf(file=outfile, height=10, width=10)
print(#or ggsave()
ggplot(mydf, aes(cell, value, fill=scientist )) +
geom_bar(stat="identity", position=position_dodge(.9)) +
geom_point(aes(cell, color=rep), position=position_dodge(.9), size=5) +
facet_grid(timepoint~., scales="free_x", space="free_x") +
scale_y_continuous("% of total cells") +
scale_fill_manual(values=myPal) +
scale_color_manual(values=myPal2)
)
dev.off()
但是我得到了这个:
问题是,每个 "scientist" 柱应该有 3 个 "rep" 值,但这些值是按 "rep" 排序的(它们应该是 1,2,3,1 ,2,3,而不是 1,1,2,2,3,3)。
此外,我想用 geom_errorbar
添加错误栏,但我没能得到一个工作示例...
此外,叠加的实际值指向条形图,这让我想知道这里实际绘制的是什么......如果每个条形图的值都正确,以及为什么最大值(或者看起来如此)默认绘制。
我认为应该正确绘制的方法是使用中位数(或均值),在箱线图中添加误差线,例如胡须(最小值和最大值)。
知道如何...
- ... "rep" 值点的顺序是否正确?
- ...将条形显示的值从最大值更改为中值?
- ...添加带有最大值和最小值的误差线?
我稍微调整了您的绘图代码,使事情变得更容易。
秘诀是使用适当的分组(否则可以从 fill
和 color
中推断出来)。此外,由于您要在多个级别上躲避,因此必须使用 dodge2
。
当您不确定 bar/column 图表中的 "what is plotted where" 时,添加选项 color="black"
总是有帮助的,因为您的使用 dodge
而不是 dodge2
.
p = ggplot(mydf, aes(x=cell, y=value, group=paste(scientist,rep))) +
geom_col(aes(fill=scientist), position=position_dodge2(.9)) +
geom_point(aes(cell, color=rep), position=position_dodge2(.9), size=5) +
facet_grid(timepoint~., scales="free_x", space="free_x") +
scale_y_continuous("% of total cells") +
scale_fill_brewer(palette = "Set2")+
scale_color_brewer(palette = "Set1")
ggsave(filename = outfile, plot=p, height = 10, width = 10)
给出:
关于误差线
因为只有三个重复,我会展示原始数据点,也许还有小提琴图。为了完整起见,我还添加了一个 geom_errorbar
.
ggplot(mydf, aes(x=cell, y=value,group=paste(cell,scientist))) +
geom_violin(aes(fill=scientist),position=position_dodge(),color="black") +
geom_point(aes(cell, color=rep), position=position_dodge(0.9), size=5) +
geom_errorbar(stat="summary",position=position_dodge())+
facet_grid(timepoint~., scales="free_x", space="free_x") +
scale_y_continuous("% of total cells") +
scale_fill_brewer(palette = "Set2")+
scale_color_brewer(palette = "Set1")
给予
评论后更新
正如我在下面的评论中提到的,百分比的叠加会导致不良结果。
ggplot(mydf, aes(x=paste(cell, scientist), y=value)) +
geom_bar(aes(fill=rep),stat="identity", position=position_stack(),color="black") +
geom_point(aes(color=rep), position=position_dodge(.9), size=3) +
facet_grid(timepoint~., scales="free_x", space="free_x") +
scale_y_continuous("% of total cells") +
scale_fill_brewer(palette = "Set2")+
scale_color_brewer(palette = "Set1")