21

我和这个用户有同样的问题:我想facet_grid用一个离散的 x 轴绘制一个图,我想让 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")

在此处输入图像描述

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

当所有 x 轴实际上都相同时,有没有办法在每个方面获取 x 轴标签,使用facet_grid

4

2 回答 2

19

您可以在 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)

在此处输入图像描述

于 2013-07-15T18:32:47.930 回答
1

使用以下脚本可以更简单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)
于 2018-10-03T00:04:55.263 回答