Полностью удалить метки facet_wrap


85

Я хотел бы полностью удалить метки для граней, чтобы создать своего рода эффект спарклайна , поскольку для аудитории метки не имеют значения, лучшее, что я могу придумать, это:

library(MASS)
library(ggplot2)
qplot(week,y,data=bacteria,group=ID, geom=c('point','line'), xlab='', ylab='') + 
     facet_wrap(~ID) + 
     theme(strip.text.x = element_text(size=0))

Так могу ли я полностью избавиться от (теперь пустого) strip.background, чтобы освободить больше места для «спарклайнов»?

Или, в качестве альтернативы, есть лучший способ получить этот эффект « спарклайна » для большого количества таких временных рядов с двоичными значениями?

Ответы:


134

Для ggplot v2.1.0 или выше используйте element_blank()для удаления нежелательных элементов:

library(MASS) # To get the data
library(ggplot2)

qplot(
  week,
  y,
  data = bacteria,
  group = ID,
  geom = c('point', 'line'),
  xlab = '',
  ylab = ''
) + 
facet_wrap(~ ID) + 
theme(
  strip.background = element_blank(),
  strip.text.x = element_blank()
)

В этом случае вызывается элемент, который вы пытаетесь удалить strip.

рисунок ggplot2 без заголовков панелей


Альтернатива с использованием макета ggplot grob

В более старых версиях ggplot(до v2.1.0) текст полосы занимает строки в макете gtable.

element_blank удаляет текст и фон, но не удаляет пространство, занимаемое строкой.

Этот код удаляет эти строки из макета:

library(ggplot2)
library(grid)

p <- qplot(
  week,
  y,
  data = bacteria,
  group = ID,
  geom = c('point', 'line'),
  xlab = '',
  ylab = ''
) + 
facet_wrap(~ ID)

# Get the ggplot grob
gt <- ggplotGrob(p)

# Locate the tops of the plot panels
panels <- grep("panel", gt$layout$name)
top <- unique(gt$layout$t[panels])

# Remove the rows immediately above the plot panel
gt = gt[-(top-1), ]

# Draw it
grid.newpage()
grid.draw(gt)

кто-нибудь еще получает Error in apply(strip_mat, 1, max_height) : dim(X) must have a positive length?
— PatrickT

25

Я использую ggplot2 версии 1, и требуемые команды изменились. Вместо

ggplot() ... + 
opts(strip.background = theme_blank(), strip.text.x = theme_blank())

вы теперь используете

ggplot() ... + 
theme(strip.background = element_blank(), strip.text = element_blank())

Подробнее см. Http://docs.ggplot2.org/current/theme.html.


8

Обновленный ответ Сэнди кажется хорошим, но, возможно, он стал устаревшим из-за обновлений ggplot? Из того, что я могу сказать, следующий код (упрощенная версия исходного ответа Сэнди) воспроизводит исходный график Шона без лишнего места:

library(ggplot2)
library(grid)
qplot(week,y,data=bacteria,group=ID, geom=c('point','line'), xlab='', ylab='') + 
 facet_wrap(~ID) + 
 theme(strip.text.x = element_blank())

Я использую ggplot 2.0.0.


4

Насколько я могу судить, ответ Сэнди верен, но я думаю, что стоит упомянуть, что, похоже, есть небольшая разница в ширине графика без граней и ширине графика с удаленными гранями.

Это неочевидно, если вы не ищете, но если вы складываете графики, используя макеты области просмотра, которые Уикхэм рекомендует в своей книге, разница становится очевидной.


1
Можете ли вы пояснить это на примере?
— mnel

Ну вот ... Попробуйте ссылку . Я использую набор данных ggplot 'diamonds', поэтому он должен работать для всех. Обратите внимание, что правое поле фасетного графа немного уже, чем не фасетированного графа.
— CW Dillon

Это не очень хорошее сравнение, поскольку оно переключается на facet_grid (с панельным тестом сбоку) из facet_wrap (с панелями вверху, в вопросе OP). Ключевой проблемой является то, что текст панели не сжимается: если вы измените размер окна для qplot в вопросе OP, вы можете легко увидеть проблему, которую может вызвать текст панели. Поскольку ось X часто имеет ранее известные значения, а ось Y часто имеет ранее неизвестные значения, это особенно прискорбно.
— MattBagg
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.