简体   繁体   中英

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. 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". 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. I was also hoping to separate these groups using facet_wrap but it seems that the function does not work with 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. 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.

First, helpful links:

  • How to order factor variables in ggplot2 by Kohske [ link ]
  • 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.

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

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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