2011-08-19 11 views
14

Kontekst

Chcę wydrukować dwa ggplot2 na tej samej stronie z tą samą legendą. http://code.google.com/p/gridextra/wiki/arrangeGrob opisuje, jak to zrobić. To już wygląda dobrze. Ale ... W moim przykładzie mam dwa wykresy z tą samą osią x i różnymi osiami y. Gdy zakres osi y jest co najmniej 10 razy większy niż na innym wykresie (na przykład 10000 zamiast 1000), ggplot2 (lub siatka?) Nie wyrównuje krzywych prawidłowo (patrz wyjście poniżej).Wyrównaj wiele działek ggplot2 z siatką

Pytanie

Jak również wyrównać lewą część działki, przy użyciu dwóch różnych osi y?

Przykładowy kod

x = c(1, 2) 
y = c(10, 1000) 
data1 = data.frame(x,y) 
p1 <- ggplot(data1) + aes(x=x, y=y, colour=x) + geom_line() 

y = c(10, 10000) 
data2 = data.frame(x,y) 
p2 <- ggplot(data2) + aes(x=x, y=y, colour=x) + geom_line() 


# Source: http://code.google.com/p/gridextra/wiki/arrangeGrob 
leg <- ggplotGrob(p1 + opts(keep="legend_box")) 
legend=gTree(children=gList(leg), cl="legendGrob") 
widthDetails.legendGrob <- function(x) unit(3, "cm") 
grid.arrange(
    p1 + opts(legend.position="none"), 
    p2 + opts(legend.position="none"), 
    legend=legend, main ="", left = "") 

Wyjście

Example image

+1

Zobacz: http://stackoverflow.com/questions/13294952/left-align-two-g raph-edges-ggplot/13295880 # 13295880? –

Odpowiedz

7

Jeśli nie przeszkadza bezwstydny kludge, wystarczy dodać dodatkowy znak najdłuższej etykiecie p1, tak:

p1 <- ggplot(data1) + 
    aes(x=x, y=y, colour=x) + 
    geom_line() + 
    scale_y_continuous(breaks = seq(200, 1000, 200), 
         labels = c(seq(200, 800, 200), " 1000")) 

Mam dwa podstawowe pytania , Mam nadzieję, że wybaczysz, jeśli masz powody:

1) Dlaczego nie używać tej samej osi y na obu? Wydaje mi się, że jest to bardziej bezpośrednie podejście i można je łatwo osiągnąć w powyższym przykładzie, dodając scale_y_continuous(limits = c(0, 10000)) do p1.

2) Czy funkcja dostarczona przez facet_wrap jest niewystarczająca? Trudno wiedzieć, co struktura danych jest rzeczywiście podobny, ale tutaj jest przykład zabawki, jak bym to zrobić:

library(ggplot2) 

# Maybe your dataset is like this 
x <- data.frame(x = c(1, 2), 
       y1 = c(0, 1000), 
       y2 = c(0, 10000)) 

# Molten data makes a lot of things easier in ggplot 
x.melt <- melt(x, id.var = "x", measure.var = c("y1", "y2")) 

# Plot it - one page, two facets, identical axes (though you could change them), 
# one legend 
ggplot(x.melt, aes(x = x, y = value, color = x)) + 
    geom_line() + 
    facet_wrap(~ variable, nrow = 2) 
+3

Zgadzanie się na faceting wydaje się lepszym rozwiązaniem dla podanego przykładu. Możesz również dodać 'scale =" free_y "' jeśli OP będzie wymagał niezależnego skalowania osi y. – joran

+0

Dzięki @joran - nie pamiętam, jak to zrobić. –

+2

dodawanie spacji do etykiety działało tylko na wyjściu z. Raz uruchomiłem go przez tikzdevice, przestrzenie są ignorowane. – apepper

10

Czystsze sposób robi to samo, ale w sposób bardziej ogólny jest przy użyciu formater arg:

p1 <- ggplot(data1) + 
    aes(x=x, y=y, colour=x) + 
    geom_line() + 
    scale_y_continuous(formatter = function(x) format(x, width = 5)) 

Zrób to samo dla drugiej działki i upewnij się, aby ustawić szerokość> = najszerszej liczby można się spodziewać na obu wykresach.

+5

W mojej wersji ggplot2, argumentem było "[etykiety] (http://docs.ggplot2.org/current/scale_continuous.html)", a nie "formatter". – simlmx

7

1. Korzystanie cowplot pakiet:

library(cowplot) 
plot_grid(p1, p2, ncol=1, align="v") 

enter image description here


2. Korzystanie tracks od ggbio opakowaniu:

Uwaga: Wygląda na to, że istnieje błąd, x tyknięcia nie są wyrównane. (testowane w dniu 17.03.2016, ggbio_1.18.5)

library(ggbio) 
tracks(data1=p1,data2=p2) 

enter image description here

0

Rozwiązaniem w ggbio Twojego problemu jest ustalenie współrzędnych osi x dla oryginalnych działek w następujący sposób:

library(ggbio) 
p1 <- f() 
fixed(p1) <- TRUE 
p2 <- f() 
fixed(p2) <- TRUE 
tracks(p1,p2) 

Best,

Yatrosin

Powiązane problemy