Принудительно включить текст по оси X для всех граней графика facet_grid

У меня та же проблема, что и у этого пользователя: я хотел бы сделать 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?

2 ответа

Решение

Вы можете вставить копию осей в 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)

Сценарий может быть намного проще, используя 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)
Другие вопросы по тегам