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