Chciałbym umieścić dwa wykresy obok siebie za pomocą pakietu ggplot2 , tzn. Zrobić odpowiednik par(mfrow=c(1,2))
.
Na przykład chciałbym, aby następujące dwa wykresy były wyświetlane obok siebie w tej samej skali.
x <- rnorm(100)
eps <- rnorm(100,0,.2)
qplot(x,3*x+eps)
qplot(x,2*x+eps)
Czy muszę umieścić je w tych samych data.frame?
qplot(displ, hwy, data=mpg, facets = . ~ year) + geom_smooth()
r
visualization
ggplot2
Christopher DuBois
źródło
źródło
Odpowiedzi:
Wszelkie ggploty obok siebie (lub n wykresów na siatce)
Funkcja
grid.arrange()
wgridExtra
pakiecie połączy wiele wykresów; w ten sposób umieścisz dwa obok siebie.Jest to przydatne, gdy dwa wykresy nie są oparte na tych samych danych, na przykład jeśli chcesz wykreślić różne zmienne bez użycia reshape ().
Spowoduje to wykreślenie wyniku jako efektu ubocznego. Aby wydrukować efekt uboczny w pliku, określ sterownik urządzenia (np
pdf
,png
itp), npalbo użyj
arrangeGrob()
w połączeniu zggsave()
,Jest to odpowiednik zrobienia dwóch różnych wykresów
par(mfrow = c(1,2))
. To nie tylko oszczędza czas na porządkowanie danych, jest to konieczne, gdy chcesz mieć dwa różne wykresy.Dodatek: Korzystanie z aspektów
Aspekty są pomocne w tworzeniu podobnych wykresów dla różnych grup. Jest to wskazane poniżej w wielu odpowiedziach poniżej, ale chcę podkreślić to podejście za pomocą przykładów równoważnych z powyższymi wykresami.
Aktualizacja
plot_grid
funkcja wcowplot
to warto sprawdzić jako alternatywagrid.arrange
. Zobacz odpowiedź @ claus-wilke poniżej i tę winietę dla równoważnego podejścia; ale funkcja ta pozwala na dokładniejsze sterowanie lokalizacją i rozmiarem działki w oparciu o tę winietę .źródło
?grid.arrange
każe mi myśleć, że ta funkcja nazywa się teraz arrangeGrob. Byłem w stanie zrobić to, co chciałem, robiąca <- arrangeGrob(p1, p2)
i wtedyprint(a)
.grid.arrange
jest nadal prawidłową, nieaktualną funkcją. Próbowałeś użyć tej funkcji? Co się stanie, jeśli nie to, czego się spodziewałeś.Wadą rozwiązań opartych na
grid.arrange
tym, że utrudniają oznaczanie działek literami (A, B itp.), Jak wymaga większość czasopism.Napisałem pakiet cowplot , aby rozwiązać ten (i kilka innych) problemów, w szczególności funkcję
plot_grid()
:Obiekt, który
plot_grid()
wraca to kolejny obiekt ggplot2, można zapisać goggsave()
jak zwykle:Alternatywnie możesz użyć funkcji cowplot
save_plot()
, która jest cienkim owinięciem wokółggsave()
, co ułatwia uzyskanie prawidłowych wymiarów dla połączonych wykresów, np .:(
ncol = 2
Argument mówi,save_plot()
że istnieją dwa wykresy obok siebie isave_plot()
sprawia, że zapisany obraz jest dwukrotnie szerszy.)Bardziej szczegółowy opis układania wykresów w siatce znajduje się w tej winiecie. Istnieje również winieta wyjaśniająca, jak tworzyć fabuły ze wspólną legendą.
Często mylone jest to, że pakiet cowplot zmienia domyślny motyw ggplot2. Pakiet zachowuje się w ten sposób, ponieważ został pierwotnie napisany do użytku wewnętrznego w laboratorium i nigdy nie używamy domyślnego motywu. Jeśli powoduje to problemy, możesz zastosować jedno z następujących trzech podejść, aby je obejść:
1. Ustaw motyw ręcznie dla każdej działki. Myślę, że dobrą praktyką jest zawsze określanie konkretnego tematu dla każdej fabuły, tak jak to zrobiłem
+ theme_bw()
w powyższym przykładzie. Jeśli określisz konkretny motyw, domyślny motyw nie ma znaczenia.2. Przywróć domyślny motyw z powrotem do domyślnego ggplot2. Możesz to zrobić za pomocą jednego wiersza kodu:
3. Wywołaj funkcje cowplot bez dołączania pakietu. Nie można również wywoływać
library(cowplot)
lubrequire(cowplot)
zamiast tego wywoływać funkcje cowplot, przygotowująccowplot::
. Na przykład powyższy przykład wykorzystujący domyślny motyw ggplot2 wyglądałby następująco:Aktualizacje:
źródło
Z książki kucharskiej R Winstona Changa można skorzystać z następującej
multiplot
funkcjiźródło
Korzystając z pakietu patchwork , możesz po prostu użyć
+
operatora:źródło
Tak, uważa, że musisz odpowiednio uporządkować swoje dane. Jednym ze sposobów byłoby:
Jestem pewien, że są lepsze sztuczki w plyr lub przekształceniu - wciąż nie jestem zbyt szybki na tych wszystkich potężnych pakietach Hadley.
źródło
Korzystając z pakietu zmiany kształtu, możesz zrobić coś takiego.
źródło
Warto też wspomnieć o pakiecie konfiguracji wielopanelowej . Zobacz także tę odpowiedź .
Utworzono 06.07.2018 przez pakiet reprezentx (v0.2.0.9000).
źródło
ggplot2 opiera się na grafice siatki, która zapewnia inny system do rozmieszczania wykresów na stronie.
par(mfrow...)
Polecenie nie ma bezpośredniego odpowiednika jako obiekty siatka (zwane grobs ) nie są koniecznie narysowane bezpośrednio, lecz mogą być przechowywane i manipulacji, jak zwykłe obiekty R, po czym przekształca się w produkcji graficznej. Umożliwia to większą elastyczność niż teraz w losowaniu modelu grafiki podstawowej, ale strategia jest z konieczności nieco inna.Napisałem,
grid.arrange()
aby zapewnić prosty interfejs jak najbliżejpar(mfrow)
. W najprostszej formie kod wyglądałby następująco:Więcej opcji opisano szczegółowo w tej winiecie .
Jednym z powszechnych zarzutów jest to, że wykresy niekoniecznie są wyrównane, np. Gdy mają etykiety osi o różnych rozmiarach, ale jest to z założenia:
grid.arrange
nie podejmuje prób specjalnych obiektów ggplot2 i traktuje je jednakowo do innych obiektów (na przykład wykresy sieci ). Po prostu umieszcza obiekty w prostokątnym układzie.Dla szczególnego przypadku obiektów ggplot2 napisałem inną funkcję
ggarrange
o podobnym interfejsie, która próbuje wyrównać panele wykresów (w tym wykresy fasetowane) i stara się przestrzegać proporcji, gdy jest zdefiniowany przez użytkownika.Obie funkcje są kompatybilne z
ggsave()
. Aby uzyskać ogólny przegląd różnych opcji i kontekst historyczny, ta winieta zawiera dodatkowe informacje .źródło
Aktualizacja: Ta odpowiedź jest bardzo stara.
gridExtra::grid.arrange()
jest teraz zalecanym podejściem. Zostawiam to tutaj na wypadek, gdyby było to przydatne.Stephen Turner opublikował
arrange()
funkcję na blogu Getting Genetics Done (instrukcje dotyczące aplikacji znajdują się w poście)źródło
grid.arrange
(szkoda, że nie opublikowałem go w tym czasie na listach mailingowych - nie ma możliwości aktualizacji tych zasobów online), wersja spakowana jest lepszym wyborem, jeśli mnie o to poprosiszUżywanie
tidyverse
:źródło
Powyższe rozwiązania mogą nie być wydajne, jeśli chcesz wykreślić wiele wykresów ggplot za pomocą pętli (np. Jak tutaj: Tworzenie wielu wykresów w ggplot o różnych wartościach osi Y za pomocą pętli ), co jest pożądanym krokiem w analizie nieznanego ( lub duże) zestawy danych (np. gdy chcesz wykreślić Liczby wszystkich zmiennych w zestawie danych).
Poniższy kod pokazuje, jak to zrobić za pomocą wspomnianego powyżej „multiplikatora ()”, którego źródło znajduje się tutaj: http://www.cookbook-r.com/Graphs/Multiple_graphs_on_one_page_(ggplot2) :
Teraz uruchom funkcję - aby uzyskać Liczby dla wszystkich zmiennych drukowanych za pomocą ggplot na jednej stronie
Należy zauważyć, że:
użycie
aes(get(strX))
, którego normalnie używasz w pętlach podczas pracyggplot
, w powyższym kodzie zamiastaes_string(strX)
NIE narysuje pożądanych wykresów. Zamiast tego wykreśli ostatni wątek wiele razy. Nie dowiedziałem się, dlaczego - może to zrobićaes
iaes_string
zostaną wezwaniggplot
.W przeciwnym razie mam nadzieję, że funkcja okaże się przydatna.
źródło
plots
obiekty, wfor-loop
których jest wysoce nieefektywny i nie jest zalecany wR
. Zapoznaj się z tymi świetnymi postami, aby dowiedzieć się, jak to zrobić lepiej: Efektywna akumulacja w R , Zastosowanie funkcji nad wierszami ramki danych i Zorientowanetidy evaluation
podejścia, które jest dostępne odggplot2 v.3.0.0
stackoverflow.com/a/52045613/786542Z mojego doświadczenia gridExtra: grid.arrange działa idealnie, jeśli próbujesz generować wykresy w pętli.
Krótki fragment kodu:
źródło
cowplot
Pakiet daje piękny sposób to zrobić, w sposób odpowiadający publikacji.źródło