2016-03-01 8 views
6

Czy istnieje sposób zmiany wysokości/długości osi Y dla poszczególnych aspektów w facet_grid lub facet_wrap?Dopasowywanie względnej przestrzeni paneli w siatce-faceta/facet_wrap w ggplot2

Przykładowo

library(ggplot2) 
ggplot(economics_long[economics_long$variable %in% c("pop", "uempmed"),], aes(date, value)) + 
    geom_line() + 
    facet_grid(variable~., scales = "free_y") + 
    theme(strip.background = element_blank()) 

enter image description here

W powyżej wykresu, ja jak czas pop wysokość serii oś y/długość być, na przykład, dwa razy większą od uempmed Y- długość osi (2: 1), niezależnie od tego, czy dwie serie czasowe mają różne skale osi y.

Jak to, co robi tutaj Kohske, w znacznie starszej wersji ggplot2, która nie działa w ggplot> = 2.0.0:

https://kohske.wordpress.com/2010/12/25/adjusting-the-relative-space-of-a-facet-grid/

wiem, że mogę podać argument space = "free" w facet_grid , ale nie sądzę, że ten argument może być użyty do ustawienia stosunku osi Y na 2: 1?

Ja także nie chcę używać rozwiązania typu "grid.arrange" do zestawiania osobno utworzonych ggplots (gdzie mogę wykonać 2 oddzielne wątki o różnych długościach osi Y), ponieważ chciałbym idealnie zrobić wykorzystanie interaktywnych funkcji ggplot2 Shiny'ego w tym jednym pojedynczym wykresie facet_wrap (np. interaktywny przykład błyszczącej ściany z pędzlem jest w połowie tej strony tutaj: http://shiny.rstudio.com/articles/selecting-rows-of-data.html).

+1

Czy kiedykolwiek znalazł rozwiązanie swojego problemu? Pytam, ponieważ mam dokładnie to samo pytanie. A co zrobić, gdy masz 3 siatki i chcesz je w proporcji (2, 1, 1). Jest to całkiem łatwe do zrobienia z grid_extra i parametrem heights, ale nie wyrównują się one dobrze w pionie – Franky

+0

Niestety jeszcze nie. Być może jest na to sposób, zwłaszcza jeśli chodzi o aktualizacje ggplot2 w ciągu ostatniego roku, ale nie jestem tego świadomy. Zgaduję, że prawdopodobnie nadal wymaga implementacji w źródle ggplot2, którego nie znam. – FXQuantTrader

Odpowiedz

1

Istnieje wiele opcji.

Dzięki facets można użyć wartości facet_grid(..., space='free_y'), aby wysokość każdego wiersza była dostosowana do długości skali y. W zestawie danych dolny rząd jest jednak zminimalizowany do pojedynczej linii (0-25 vs. 200 000 - 320 000).

Gdy obiekty ggplot2 są drukowane/drukowane, najpierw są konwertowane na obiekty gtable. Zapisując działkę pod numerem p, możemy zadzwonić pod numer ggplotGrob, aby uzyskać obiekt gtable. Jest to procedura jednokierunkowa; po przekonwertowaniu nie można przekonwertować metryki z powrotem na obiekt ggplot2!

(g <- ggplotGrob(p)) 
TableGrob (12 x 8) "layout": 18 grobs 
    z   cells  name         grob 
1 0 (1-12, 1- 8) background  rect[plot.background..rect.3766] 
2 1 (6- 6, 4- 4) panel-1-1    gTree[panel-1.gTree.3696] 
3 1 (8- 8, 4- 4) panel-1-2    gTree[panel-2.gTree.3711] 
4 3 (5- 5, 4- 4) axis-t-1       zeroGrob[NULL] 
5 3 (9- 9, 4- 4) axis-b-1 absoluteGrob[GRID.absoluteGrob.3725] 
6 3 (6- 6, 3- 3) axis-l-1 absoluteGrob[GRID.absoluteGrob.3733] 
7 3 (8- 8, 3- 3) axis-l-2 absoluteGrob[GRID.absoluteGrob.3741] 
8 3 (6- 6, 6- 6) axis-r-1       zeroGrob[NULL] 
9 3 (8- 8, 6- 6) axis-r-2       zeroGrob[NULL] 
10 2 (6- 6, 5- 5) strip-r-1       gtable[strip] 
11 2 (8- 8, 5- 5) strip-r-2       gtable[strip] 
12 4 (4- 4, 4- 4)  xlab-t       zeroGrob[NULL] 
13 5 (10-10, 4- 4)  xlab-b titleGrob[axis.title.x..titleGrob.3714] 
14 6 (6- 8, 2- 2)  ylab-l titleGrob[axis.title.y..titleGrob.3717] 
15 7 (6- 8, 7- 7)  ylab-r       zeroGrob[NULL] 
16 8 (3- 3, 4- 4) subtitle zeroGrob[plot.subtitle..zeroGrob.3763] 
17 9 (2- 2, 4- 4)  title  zeroGrob[plot.title..zeroGrob.3762] 
18 10 (11-11, 4- 4) caption zeroGrob[plot.caption..zeroGrob.3764] 

Wszystkie elementy są ustawione w układzie przypominającym kratkę. Wysokość każdego wiersza w układzie jest przez g$heights:

> g$heights 
[1] 5pt     0cm     0cm     0cm     0cm     1null    5pt     1null    0.396281911581569cm 1grobheight   
[11] 0cm     5pt  

Mecz współrzędna „panel-1-1” i „Panel-1-2” na tych wysokościach, a przekonasz się 6 i 8 element są oba 1null. Możesz je zmienić na dowolną jednostkę, cm, in, pt, ... 1null to po prostu to, co pozostało po pozostałych elementach i podzielone między nimi. Tak więc możemy zmienić 6th heigth do 2null (Zwróć uwagę na użycie podwójnych nawiasach):

> g$heights[[6]] <- unit(2, 'null') 
> grid.draw(g) 

enter image description here

+0

Dzięki, jestem świadomy tego podejścia do tworzenia ggplots (wspomniałem rozwiązania typu 'grid.arrange' w pytaniu). Ale nie sądzę, że to faktycznie odpowiada na moje konkretne pytanie ... Chciałbym ostatecznie móc dopasować oś y w faceci_wrap, dzięki czemu mogę korzystać z interaktywnych wykresów ggplot2 w Shiny ... Zobacz przykład pędzelków z "facet_wrap" w linku rstudio, który mam w pytaniu. Nie jestem świadomy, że coś takiego jest możliwe nawet przy użyciu 'grob's – FXQuantTrader

+0

Nie jest jasne, jak działa brushedPoints; Domyślam się, że nie rozpoznaje on poszczególnych punktów na wykresie, ale ekstrapoluje omówione współrzędne X i Y i zwraca dowolny punkt z podanego parametru data.frame, który należy do regionu. Zauważ, że funkcja nie odczytuje danych.frame z obiektu ggplot, ale musi być podana jawnie; dodatkowo musisz określić, które aspekty są w użyciu. Będziesz miał dużo pracy, jeśli spróbujesz połączyć te dwie funkcje w sposób, w jaki próbujesz; zamiast tego spróbuj użyć dwóch oddzielnych gadżetów wydruku wyjściowego. – MrGumble