对于facet_grid图的所有方面强制X轴文本

时间:2013-07-15 18:17:41

标签: r ggplot2 gtable

我遇到与this user相同的问题:我想制作一个带有离散x轴的facet_grid图,我想让x轴标签写下来每个方面而不是仅仅位于底行方面的下方。例如:

# Drop some factor levels to make the plot smaller 
diamondSub <- subset(diamonds, (cut=="Ideal" | cut=="Premium") & 
                     (color=="E" | color=="I"))

# Note that scales="free_x" has no practical effect here
ggplot(diamondSub, aes(x=clarity, y=price)) + 
  geom_blank()+ 
  geom_boxplot() +
  facet_grid(cut~color, scales="free_x")

enter image description here

但是,我不想使用该帖子中的解决方案,这只是使用facet_wrap而不是facet_grid,因为我更喜欢facet_grid标记条带文字的方式在列顶部有一个变量,在行的两侧有另一个变量。

当使用facet_grid时,当所有x轴实际上相同时,是否有办法在每个面下获取x轴标签?

2 个答案:

答案 0 :(得分:17)

您可以在gtable中插入轴的副本,

library(gtable)
g <- ggplotGrob(p)
# locate the panels
panels <- grep("panel", g$layout$name)
top <- unique(g$layout$t[panels])
# intersperse a copy of the bottom axes
all <- gtable:::rbind_gtable(gtable:::rbind_gtable(g[seq.int(min(top)), ], 
                                                   g[max(top)+1,], "first"), 
                             g[seq(min(top)+1, nrow(g)),], "first")
grid.newpage()
grid.draw(all)

enter image description here

答案 1 :(得分:0)

使用cbind.gtable可以使脚本简单得多:

library(gtable)
g <- ggplotGrob(p)
# locate the panels
panels <- grep("panel", g$layout$name)
top <- unique(g$layout$t[panels])

# intersperse a copy of the bottom axes
all <- gtable:::cbind.gtable(
    g[seq.int(min(top)), ], 
    g[max(top)+1,],
    g[seq(min(top)+1, nrow(g)),], 
    size = "first")
grid.newpage()
grid.draw(all)