Całkowicie usuń etykiety facet_wrap

86

Chciałbym całkowicie usunąć etykiety z aspektów, aby stworzyć coś w rodzaju miniatury , ponieważ dla odbiorców etykiety są nieistotne, najlepsze, co mogę wymyślić, to:

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))

Czy mogę więc całkowicie pozbyć się (teraz pustego) strip.background, aby zapewnić więcej miejsca na „wykresy przebiegu w czasie”?

Albo czy jest lepszy sposób na uzyskanie efektu „ wykresu przebiegu w czasie ” dla dużej liczby szeregów czasowych o wartości binarnej, takich jak ten?

Sean
źródło

Odpowiedzi:

135

W przypadku ggplot w wersji 2.1.0 lub nowszej użyj element_blank()do usunięcia niechcianych elementów:

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()
)

W tym przypadku wywoływany jest element, który próbujesz usunąć strip.

Rysunek ggplot2 bez tytułów paneli


Alternatywa przy użyciu układu grob ggplot

W starszych wersjach ggplot(przed wersją 2.1.0) pasek tekstowy zajmuje wiersze w układzie gtable.

element_blank usuwa tekst i tło, ale nie usuwa miejsca zajmowanego przez wiersz.

Ten kod usuwa te wiersze z układu:

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)
Sandy Muspratt
źródło
ktoś inny dostaje Error in apply(strip_mat, 1, max_height) : dim(X) must have a positive length?
PatrickT
25

Używam programu ggplot2 w wersji 1 i wymagane polecenia uległy zmianie. Zamiast

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

teraz używasz

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

Więcej szczegółów można znaleźć pod adresem http://docs.ggplot2.org/current/theme.html

hibernado
źródło
8

Zaktualizowana odpowiedź Sandy wydaje się dobra, ale może została unieważniona przez aktualizacje ggplot? Z tego, co mogę powiedzieć, następujący kod (uproszczona wersja oryginalnej odpowiedzi Sandy'ego) odtwarza oryginalny wykres Seana bez dodatkowej spacji:

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())

Używam ggplot 2.0.0.

Nicholas G Reich
źródło
4

O ile wiem, odpowiedź Sandy jest prawidłowa, ale myślę, że warto wspomnieć, że wydaje się, że istnieje niewielka różnica między szerokością działki bez fasetek a szerokością działki bez fasetek.

Nie jest to oczywiste, chyba że tego szukasz, ale jeśli układasz wykresy przy użyciu układów rzutni, które Wickham zaleca w swojej książce, różnica staje się widoczna.

CW Dillon
źródło
1
Czy możesz to rozwinąć na przykładzie?
mnel
Zaczynamy - wypróbuj link . Używam zestawu danych „diamentów” ggplot, więc powinien działać dla każdego. Zwróć uwagę, że prawy margines wykresu fasetowego jest nieco węższy niż wykres nieakreślony.
CW Dillon,
To nie jest dobre porównanie, ponieważ przełącza się na facet_grid (z testem panelu z boku) z facet_wrap (z panelami na górze, w pytaniu OP). Kluczową kwestią jest to, że tekst panelu nie daje się kompresować: jeśli zmienisz rozmiar okna dla qplot w pytaniu OP, możesz łatwo zobaczyć problem, jaki może spowodować tekst panelu. Ponieważ oś X ma często znane wcześniej wartości, a oś Y często ma nieznane wcześniej wartości, jest to szczególnie niefortunne.
MattBagg