R 在ggplot中添加注释后重新排序有序绘图
我刚开始使用ggplot,在创建我需要的方面已经取得了相当大的进步。但是,当我添加带有重要注释的数据框时,刻面的顺序会发生变化。 可能有太多的步骤导致重新排序,因此如果您有任何建议来解决问题并简化代码,请让我知道 我的代码是:R 在ggplot中添加注释后重新排序有序绘图,r,ggplot2,facet-grid,R,Ggplot2,Facet Grid,我刚开始使用ggplot,在创建我需要的方面已经取得了相当大的进步。但是,当我添加带有重要注释的数据框时,刻面的顺序会发生变化。 可能有太多的步骤导致重新排序,因此如果您有任何建议来解决问题并简化代码,请让我知道 我的代码是: ggplot(cdata, aes(x= reorder(Speaker_Group, -Overall_Severity), y=Overall_Severity)) geom_bar(aes (fill = Speaker_Group), stat="ide
ggplot(cdata, aes(x= reorder(Speaker_Group, -Overall_Severity), y=Overall_Severity))
geom_bar(aes (fill = Speaker_Group), stat="identity", position=position_dodge())
geom_errorbar(aes(ymin=Overall_Severity-se, ymax=Overall_Severity+se), width=.2, position=position_dodge(.9))
facet_grid(Training_Group_f ~ ., scales = "free_y", space = "free") + scale_fill_manual(values = c("darkgreen", "darkred", "darkcyan", "black"), labels = c("ALS", "PD", "OA", "YA"))
theme(panel.grid.major.y = element_blank(),panel.grid.minor.y = element_blank(), panel.grid.major.x = element_blank(),panel.grid.minor.x = element_blank())
theme(axis.title.x = element_blank(), axis.text.x = element_text(face = "bold", color = "black", size = 10),axis.title.y = element_text(face = "bold", color = "black", size = 10))
theme(panel.spacing = unit(1, "lines"))
geom_signif(data = annotation1_df, aes(xmin = start, xmax = end, annotations = label, y_position = y), textsize = 4, vjust = 1.2, manual = TRUE)
如果我删除geom\u signif
调用,则面顺序是准确的(No\u Training,Pre\u Training,Post\u Training
),但一旦我添加,它会重新排序面(No\u Training,Post\u Training,Pre\u Training
)
注释1\u df
由以下公式给出:
annotation1_df <- data.frame(Training_Group_f = c("No_Training", "No_Training", "No_Training", "Pre_Training", "Pre_Training", "Pre_Training", "Post_Training", "Post_Training", "Post_Training"),
start = c("ALS", "ALS", "ALS", "ALS", "ALS", "ALS", "ALS", "ALS", "ALS"),
end = c("PD", "OA", "YA", "PD", "OA", "YA", "PD", "OA", "YA"),
y = c(95, 90, 90, 90, 80, 80, 80, 70, 70),
label = c("p<.0001", "p<.0001", "p<.0001", "p<.0001", "p<.0001", "p<.0001", "p<.0001", "p<.0001", "p<.0001")
)
annotation1_df
作品。当我仔细阅读你的详细问题时,以下注释似乎非常重要: 如果我删除
geom_signif
调用,则面的顺序为
准确(无培训、培训前、培训后),但一旦我添加
它重新安排了各个方面(无培训、培训后,
学前培训)
正如您已经理解的,方面顺序是通过ggplot2
中的两种方式之一确定的:
- 如果您正在刻面离散值,并且列已经是因子,则刻面的顺序将根据该因子的级别顺序设置
- 如果您正在刻面不是因子的离散值,则该列将转换为因子,并且顺序将默认为字母数字顺序
geom_signif()
的第一个绘图是准确的,那么问题应该在于该代码。让我们看看这一行:
geom_signif(
data = annotation1_df,
aes(xmin = start, xmax = end, annotations = label, y_position = y),
textsize = 4, vjust = 1.2, manual = TRUE)
这就是问题所在。您在引用data=cdata
之前的绘图代码,并且您正在cdata$Training\u Group\u f
上刻面。对geom\u signif()
的调用引用了data=annotation1\u df
,其中还包含annotation\u df$Training\u Group\u f
。Plotting会创建一个ggplot
对象,该对象结合了一个数据集cdata
(其中Training\u Group\u f
方面的级别设置正确)和annotation1\u df
,其中的级别显然没有设置
答案应该是首先确保在两个数据集中,cdata
和注释1\u df
将Training\u f
的列设置为具有相同级别的因子。您需要执行这两行,然后您的方面顺序应该正确:
cdata$Training_Group_f = factor(cdata$training,
levels=c("No_Training","Pre_Training","Post_Training"))
annotation1_df$Training_Group_f = factor(annotation1_df$training,
levels=c("No_Training","Pre_Training","Post_Training"))
注:由于y=0位于绘图的左下角,您实际上可能会看到级别反转。。。此时我记不起面是否是这样定位的,但如果是这样,请颠倒两个面的级别顺序。感谢您花时间阅读冗长的说明并提供解决方案。成功了!虽然图例显示的顺序不正确(尽管颜色、值等与因子/级别一致),但我想我可以删除图例。再次感谢@Chemdork123请随意将图例作为另一个问题发布-对如何解决这一问题有一种感觉,但如果您这样做,请提供一些示例数据以制作一个可复制的示例(所有信息都在您的问题中)。很高兴我能帮忙。
cdata$Training_Group_f = factor(cdata$training,
levels=c("No_Training","Pre_Training","Post_Training"))
annotation1_df$Training_Group_f = factor(annotation1_df$training,
levels=c("No_Training","Pre_Training","Post_Training"))