R 在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,在创建我需要的方面已经取得了相当大的进步。但是,当我添加带有重要注释的数据框时,刻面的顺序会发生变化。 可能有太多的步骤导致重新排序,因此如果您有任何建议来解决问题并简化代码,请让我知道

我的代码是:

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"))