使用facet_wrap时重新排序geom_bar(reordering geom_bar when

2019-07-05 05:12发布

我尽量做到为具有由每个面板给定变量下令吧。

一个简单的例子:

    library(ggplot2)
    library(plyr)

    df <- data.frame(fac = c("a", "b", "c", "e", "b", "c", "d"),             
                  val = c(1, 2, 7, 4, 5, 3, 1),
                  group = c(1, 1, 1, 1, 2, 2, 2))

    p1 <- ggplot(df, aes(x = fac, y = val)) + geom_bar() + facet_wrap(~ group, scales = "free") + coord_flip()
    p1

    p2 <- ggplot(df, aes(x = reorder(fac, val), y = val)) + geom_bar() + facet_wrap(~ group, scales = "free") + coord_flip()
    p2

P2不会产生我想要的东西,因为不是每个“因子水平”出现在所有面板。 是否已有一个简单的解决这个问题?

一种解决方案,我发现是以下(计算每组各因子水平秩)。

df2 <- ddply(df, .(group), transform, fac2 = rank(val))
df2$fac2 <- factor(df2$fac2)
p3 <- ggplot(df2, aes(x = fac2, y = val)) + facet_wrap(~ group, scales = "free") + geom_bar(stat = "identity") + coord_flip() +
  opts(panel.margin = unit(2, "lines"))
p3

我有我自己这里设置的标签。 一个可能的解决方案是以下的(硬编码在这个例子中):

grid.newpage()
grob <- ggplotGrob(p3)
object.path <- grid.ls(getGrob(grob, "axis.text.y", grep = TRUE, global = TRUE), print = FALSE)$name
grob <- grid::editGrob(grob, object.path[1], label = c("ABDQ", "M", "A", "B"))
grob <- grid::editGrob(grob, object.path[2], label = c("A", "B", "EEEEX"))
grid.draw(grob)

但还有另一个问题。 我有我自己现在设置panel.margin,它似乎是不可能这样做,因为我只能够设置一个“全球性” panel.margin和我需要的是一个对所有4个方面(或至少2)。

问题1:是否有使用重拨一个简单的解决方案?

问题2:有没有使用scale_x_discrete来得到所需的轴的解决方案?

问题3:我是不是能找到所需要的网格对象,以操作panel.margins视口。 有一个简单的方法来处理相应的网格对象?

有任何想法吗?

Answer 1:

我认为grid.arrange是这一个更好的工具比试图免费尺度硬塞到刻面的框架:

library(gridExtra)
q1 <- ggplot(subset(df,group == 1),aes(x = reorder(fac,val),y = val)) + 
        geom_bar() + 
        facet_wrap(~group) + 
        coord_flip()

q2 <- q1 %+% subset(df,group == 2)

grid.arrange(q1,q2,nrow = 1)



文章来源: reordering geom_bar when using facet_wrap
标签: r ggplot2