简体   繁体   English

ggplot2:以向量指定的顺序显示间隔,并使用geom_pointrange()和coord_flip()将各个组(例如facet_wrap)分开

[英]ggplot2: Show intervals in order specified by a vector and separate groups (e.g. with facet_wrap) using geom_pointrange() and coord_flip()

I have been trying to create a plot containing a comparison of "N1", "NON-N1" groups in a specific order. 我一直试图创建一个包含以特定顺序比较“ N1”,“ NON-N1”组的图。 My data contains different groups called "A", "N1", "NON-N1", "Comb", and I am trying to show first the group with all called "A", then the groups "N1", "NON-N1" in a specific order, and finally the group called "Comb". 我的数据包含名为“ A”,“ N1”,“ NON-N1”,“ Comb”的不同组,我试图先显示所有名为“ A”的组,然后再显示“ N1”,“ NON- N1”以特定顺序显示,最后一个组称为“ Comb”。 I would like to show the "N1" versus (on top of) "NON-N1" in all comparisons but I have failed with everything I have tried. 我想在所有比较中都显示“ N1”与“ NON-N1”的对比,但是我尝试过的一切都失败了。 I was also hoping to separate these groups using facet_wrap but it seems that the function does not work with coord_flip(). 我也希望使用facet_wrap分隔这些组,但似乎该功能不适用于coord_flip()。 But that is even secondary as I have not even been able to solve my first problem. 但这只是次要的,因为我什至无法解决我的第一个问题。 I can reorder the data frame but the ggplot does not obey. 我可以对数据帧重新排序,但ggplot不服从。 Please help me understand how to solve this. 请帮助我了解如何解决此问题。 Thank you! 谢谢!

library(ggplot2)

df = structure(list(CI1 = c(-3.2, -2, -2.1, -4.4, -2.0, -2.0, -4.4, -2.0, -4.6, -4.6, -0.5, 2.3, 2.0, -2.0, 1.2, 0.01, 2.0), OR = c(-2.2, 2, -2.1, -2.4, 0.04, 0.004, -2.4, 0.26, -2.6, -2.6, 0.24, 2.4, 2.5, 0.02, 1.5, 0.15, 2.4), CI2 = c(4.34247, 5.05772, 4.96875, 5.26578, 1.91331, 1.87162, 3.78027, 4.55967, 4.07937, 4.50965, 3.54538, 3.97742, 3.5491, 2.41067, 2.73239, 2.3767, 3.55664), Label = structure(1:17, .Label = c("N1_A", "NON-N1_A", "N1_B", "NON-N1_B", "N1_C", "NON-N1_C", "N1_D", "NON-N1_H", "N1_H", "NON-N1_D", "N1_E", "NON-N1_E", "N1_F", "NON-N1_F", "N1_G", "NON-N1_G", "Comb"), class = "factor"), group = c("N1", "NON-N1", "N1", "NON-N1", "N1", "NON-N1", "N1", "NON-N1", "N1", "NON-N1", "N1", "NON-N1", "N1", "NON-N1", "A", "A", "Comb")), .Names = c("CI1", "OR", "CI2", "Label", "group"), class = "data.frame", row.names = c(12L, 4L, 8L, 11L, 10L, 13L, 9L, 5L, 6L, 7L, 3L, 2L, 1L, 14L, 17L, 16L, 18L))

# order wanted using the column "Label":
ordered.names = c("N1_G", "NON-N1_G", "N1_C", "NON-N1_C", "N1_F", "NON-N1_F", "N1_A", "NON-N1_A","N1_B", "NON-N1_B","N1_H", "NON-N1_H","N1_D", "NON-N1_D","N1_E", "NON-N1_E", "Comb")

df$group = factor(df$group, levels =c("A", "N1", "NON-N1", "Comb"))
# df <- transform(df, category2 = factor(Label))
df$Label = factor(df$Label, levels=ordered.names)
# df = df[order(df$Label),]
# df$Label <- factor(rev(df$Label), levels=rev(levels(df$Label)))

ggplot(df, aes(x=Label, y=OR, ymin=CI1, ymax=CI2, group=group, color=group)) + geom_pointrange() + coord_flip() 
# + facet_wrap(~group, scale="free_x")

Assuming your question is: How can you plot groups in a specific order (A, N1, NON-N1, Comb) from top to bottom. 假设您的问题是:如何从上到下按特定顺序(A,N1,NON-N1,Comb)绘制组。

First, helpful links: 首先,有用的链接:

  • How to order factor variables in ggplot2 by Kohske [ link ] 如何通过Kohske在ggplot2中对因子变量进行排序[ 链接 ]
  • Order data frame by two columns [ link ] 按两列订购数据框[ 链接 ]

The approach below uses both those links. 下面的方法使用了这两个链接。 First reorder your data according to group then Label (in descending order since you want Label displayed in reverse order (ie top to bottom after coord_flip() ). Second, new factor Label2 is ordered according to appearance in the data frame. 首先根据组别对数据进行重新排序,然后按Label降序排列(因为您希望Label以相反的顺序显示(即coord_flip()之后的coord_flip() );第二,根据数据框中的外观对新因子Label2进行排序。

df2 <- df[with(df, rev(order(Label, factor(group, Label)))),]  #Reverse reorder
df2$Label2 <- factor(df2$Label, as.character(df2$Label))       #Order of appearance

ggplot(df2, aes(x=Label2, y=OR, ymin=CI1, ymax=CI2, group=group, color=group)) + 
    geom_pointrange() + coord_flip()

以相反的顺序重新排列因子

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM