Mam dwa wykresy gg, z którymi dopasowuję się w poziomie grid.arrange
. Przejrzałem wiele postów na forum, ale wszystko, czego próbuję, wydaje się być komendami, które są teraz zaktualizowane i mają inną nazwę.
Moje dane wyglądają tak;
# Data plot 1
axis1 axis2
group1 -0.212201 0.358867
group2 -0.279756 -0.126194
group3 0.186860 -0.203273
group4 0.417117 -0.002592
group1 -0.212201 0.358867
group2 -0.279756 -0.126194
group3 0.186860 -0.203273
group4 0.186860 -0.203273
# Data plot 2
axis1 axis2
group1 0.211826 -0.306214
group2 -0.072626 0.104988
group3 -0.072626 0.104988
group4 -0.072626 0.104988
group1 0.211826 -0.306214
group2 -0.072626 0.104988
group3 -0.072626 0.104988
group4 -0.072626 0.104988
#And I run this:
library(ggplot2)
library(gridExtra)
groups=c('group1','group2','group3','group4','group1','group2','group3','group4')
x1=data1[,1]
y1=data1[,2]
x2=data2[,1]
y2=data2[,2]
p1=ggplot(data1, aes(x=x1, y=y1,colour=groups)) + geom_point(position=position_jitter(w=0.04,h=0.02),size=1.8)
p2=ggplot(data2, aes(x=x2, y=y2,colour=groups)) + geom_point(position=position_jitter(w=0.04,h=0.02),size=1.8)
#Combine plots
p3=grid.arrange(
p1 + theme(legend.position="none"), p2+ theme(legend.position="none"), nrow=1, widths = unit(c(10.,10), "cm"), heights = unit(rep(8, 1), "cm")))
Jak wyodrębnić legendę z któregokolwiek z tych wątków i dodać ją na dole / środku połączonej fabuły?
Odpowiedzi:
Aktualizacja 2015-luty
Zobacz odpowiedź Stevena poniżej
Oto wynikowa fabuła:
źródło
arrangeGrob()
. Musisz także odwrócić wysokości (tj.heights=c(1,10)
Możesz także użyć ggarrange z pakietu ggpubr i ustawić "common.legend = TRUE":
źródło
print(ggarrangeobject)
jeden z moichggarrange
obiektów, gdy potrzebowałem, aby był wykreślony przez inną funkcję, która może być podobna do rozwiązania dla twojegorenderPlot()
?common.legend = TRUE
to wszystko, czego potrzebuję!Odpowiedź Rolanda wymaga aktualizacji. Widzieć: https://github.com/hadley/ggplot2/wiki/Share-a-legend-between-two-ggplot2-graphs
Ta metoda została zaktualizowana dla ggplot2 v1.0.0.
Zwróć uwagę na brak
ggplot_gtable
iggplot_build
.ggplotGrob
jest używany zamiast tego. Ten przykład jest nieco bardziej zawiły niż powyższe rozwiązanie, ale nadal go rozwiązał.źródło
grid_arrange_shared_legend
? Dziękuję Ci!ncol = 1
?Zastosować nowe, atrakcyjne rozwiązanie
patchwork
. Składnia jest bardzo prosta:Utworzony 13.12.2019 przez pakiet reprex (v0.2.1)
źródło
combined <- p1 + p2 + plot_layout(guides = "collect") & theme(legend.position = "bottom")
Sugeruję użycie cowplot. Z ich winiety R :
źródło
annotate_figure(ggarrange())
pomocą funkcji legend_b (). Dziękuję bardzo, niech Bóg cię błogosławi!@Giuseppe, możesz rozważyć to w celu elastycznej specyfikacji układu działek (zmodyfikowanej tutaj ):
Dodatkowe argumenty
nrow
incol
kontroluj układ ułożonych działek:źródło
Jeśli drukujesz te same zmienne na obu wykresach, najprostszym sposobem byłoby połączenie ramek danych w jedną, a następnie użycie funkcji facet_wrap.
Na przykład:
Kolejny przykład wykorzystujący zestaw danych diamentów. To pokazuje, że możesz nawet sprawić, by działało, jeśli masz tylko jedną wspólną zmienną między wykresami.
Jedyną trudną rzeczą w drugim przykładzie jest to, że zmienne czynnikowe są przekształcane na liczbowe, gdy łączysz wszystko w jedną ramkę danych. Idealnie byłoby więc zrobić to głównie wtedy, gdy wszystkie interesujące cię zmienne są tego samego typu.
źródło
@Guiseppe:
Nie mam pojęcia o Grobsach itp., Ale zhakowałem rozwiązanie dla dwóch wątków, powinno być możliwe rozszerzenie do dowolnej liczby, ale nie jest to seksowna funkcja:
źródło
Jeśli legenda jest taka sama dla obu wykresów, istnieje proste rozwiązanie polegające na użyciu
grid.arrange
(zakładając, że chcesz, aby legenda była wyrównana z obydwoma wykresami w pionie lub w poziomie). Po prostu zachowaj legendę dla dolnej lub skrajnej prawej działki, pomijając legendę dla drugiej. Dodanie legendy tylko do jednego wykresu zmienia jednak rozmiar jednego wykresu względem drugiego. Aby tego uniknąć, użyjheights
polecenia, aby ręcznie dostosować i zachować ten sam rozmiar. Możesz nawet użyćgrid.arrange
do tworzenia wspólnych tytułów osi. Zauważ, że będzie to wymagałolibrary(grid)
opróczlibrary(gridExtra)
. W przypadku działek pionowych:y_title <- expression(paste(italic("E. coli"), " (CFU/100mL)"))
grid.arrange(arrangeGrob(p1, theme(legend.position="none"), ncol=1), arrangeGrob(p2, theme(legend.position="bottom"), ncol=1), heights=c(1,1.2), left=textGrob(y_title, rot=90, gp=gpar(fontsize=20)))
Oto wynik dla podobnego wykresu dla projektu, nad którym pracowałem:
źródło