Полностью удалить метки 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

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

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

CW Диллон
источник
1
Можете ли вы пояснить это на примере?
mnel
Ну вот ... Попробуйте ссылку . Я использую набор данных ggplot 'diamonds', поэтому он должен работать для всех. Обратите внимание, что правое поле фасетного графа немного уже, чем не фасетированного графа.
CW Dillon
Это не очень хорошее сравнение, поскольку оно переключается на facet_grid (с панельным тестом сбоку) из facet_wrap (с панелями вверху, в вопросе OP). Ключевой проблемой является то, что текст панели не сжимается: если вы измените размер окна для qplot в вопросе OP, вы можете легко увидеть проблему, которую может вызвать текст панели. Поскольку ось X часто имеет ранее известные значения, а ось Y часто имеет ранее неизвестные значения, это особенно прискорбно.
MattBagg