Повністю видаліть ярлики facet_wrap


84

Я хотів би повністю видалити ярлики для граней, щоб створити якийсь ефект іскрового спалаху, оскільки для аудиторії ярлики не мають значення, найкраще, що я можу придумати, це:

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, щоб надати більше місця для "іскрових ліній"?

Або ж є кращий спосіб отримати цей ефект " іскрової лінії" для великої кількості двійкових часових рядів, подібних до цього?

Відповіді:


132

Для 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


7

Оновлена ​​відповідь Сенді здається непоганою, але, можливо, вона застаріла завдяки оновленням 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

Ось ми - Спробуйте посилання . Я використовую набір даних "diamonds" ggplot, тому він повинен працювати для всіх. Зверніть увагу, що праве поле гранованого графіка трохи вужче, ніж безгранного графіка.
CW Dillon,

Це невдале порівняння, оскільки він переходить на facet_grid (з тестом панелі збоку) з facet_wrap (з панелями зверху, у запитанні OP). Ключова проблема полягає в тому, що текст панелі не стискається: якщо ви зміните розмір вікна для qplot у запитанні OP, ви легко побачите проблему, яку може спричинити текст панелі. Оскільки вісь x часто має раніше відомі значення, а вісь y часто має раніше невідомі значення, це особливо прикро.
MattBagg
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.