2012-03-23 8 views
23

Używam zestawu danych "tips" w ggplot2. Jeśli wykonamWarunkowo zmienić tło panelu z facet_grid?

sp = ggplot(tips,aes(x=total_bill, y = tip/total_bill)) + 
     geom_point(shape=1) + 
     facet_grid(sex ~ day) 

Wykres wygląda dobrze. Ale teraz chcę zmienić tło panelu tylko dla działek pod "Fri". Czy jest jakiś sposób na zrobienie tego?

Czy mogę jeszcze bardziej warunkowo zmieniać kolory, przekazując parametry? Na przykład, jeśli więcej niż 3 punkty są poniżej 0,1, to zmień tło panelu (tylko dla tego panelu) na określony kolor, a pozostałe pozostaną domyślnie jasnoszare?

Odpowiedz

50

Ogólna reguła robi nic w ggplot2 jest,

  1. utworzyć ramkę danych, który koduje informacje, które chcesz wykreślić
  2. przekazać tę ramkę danych do GEOM

Jest to nieco bardziej skomplikowane w tym przypadku ze względu na szczególny aspekt wykresu, który chcesz zmienić. Moce, które mają być zaprojektowane ggplot2 w sposób, który oddziela elementy danych z działki (to znaczy od elementów geologicznych) od elementów innych niż dane (to jest motywów), a tak się składa, że ​​tło wykresu należy do kategorii "inne niż dane".

Zawsze istnieje możliwość modyfikowania podstawowej siatki obiektu manually ale jest to żmudne i dane mogą ulec zmianie z różnymi wersjami ggplot2. Zamiast tego użyjemy "hacka", o którym Hadley mówi w pytaniu this.

#Create a data frame with the faceting variables 
# and some dummy data (that will be overwritten) 
tp <- unique(tips[,c('sex','day')]) 
tp$total_bill <- tp$tip <- 1 

#Just Fri 
ggplot(tips,aes(x=total_bill, y = tip/total_bill)) + 
     geom_rect(data = subset(tp,day == 'Fri'),aes(fill = day),xmin = -Inf,xmax = Inf, 
      ymin = -Inf,ymax = Inf,alpha = 0.3) + 
     geom_point(shape=1) + 
     facet_grid(sex ~ day) 

enter image description here

#Each panel 
ggplot(tips,aes(x=total_bill, y = tip/total_bill)) + 
     geom_rect(data = tp,aes(fill = day),xmin = -Inf,xmax = Inf, 
      ymin = -Inf,ymax = Inf,alpha = 0.3) + 
     geom_point(shape=1) + 
     facet_grid(sex ~ day) 

enter image description here

+0

Dzięki znacznie za pomoc. Zdecydowanie przydatny. – broccoli

+3

Należy zauważyć, że ustawienie panel.background i powyższe geom_rect zachowują się inaczej, gdy za geom_raster, ponieważ optymalizacja może mieć miejsce, gdy za rastrem jest "nic". Zapisany jako plik pdf, wersja geom_rect jest znacznie większym plikiem i praktycznie nie do otwarcia dla większości przeglądarek pdf! – momeara

+0

Czy można to zrobić za pomocą funkcji ciągłej i skali? – UnivStudent

1

nie mogę jeszcze skomentować .. więc tutaj jest dodatkowym odpowiedź Jøran jego odpowiedź.

Jeśli masz problemy z ustawieniem przezroczystości, np. Ustawienie alfa = 0.2, ale nie zauważysz żadnej różnicy, może to być spowodowane danymi, które podajesz ggplot.

"Dziękuję za wyjaśnienie pytania, to było dla mnie zagadkowe, więc poszedłem do google i skończyło się na tym, że nauczyłem się czegoś nowego (po obejrzeniu kilku kaprysów w ich przykładach). Najwyraźniej to, co robisz, rysuje wiele prostokątów na top od siebie, skuteczne uniemożliwienie pół przejrzystości chcesz. Więc jedyne sposoby przezwyciężenia tego są do ciężkiej kodu prostokąt współrzędnych w oddzielnym df”

ta odpowiedź pochodzi z geom_rect and alpha - does this work with hard coded values?

Powiązane problemy