Повністю видаліть ярлики 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.