2015-02-13 10 views
5

Widziałem podobne pytania i tę dyskusję o dodaniu funkcjonalności do ggplotSetting x/y lim in facet_grid. W moich badaniach często chcę tworzyć kilka wykresów paneli, powiedzmy dla różnych prób symulacyjnych, gdzie ograniczenia osi pozostają takie same, aby podkreślić różnice między próbami. Jest to szczególnie przydatne przy wyświetlaniu paneli wydruku w prezentacji. W każdej powierzchni panelu I produkują poszczególne działki wymagają niezależnych osi Y, ponieważ są one często zmienne pogoda, temperatura, wilgotność względna, prędkość wiatru, itd. Korzystaniezestaw granic x/y w facet_wrap z wagą = 'wolny'

ggplot() + ... + facet_wrap(~ ..., scales = 'free_y') 

działa świetnie, jak można łatwo produkować panele fabuła inna zmienne pogodowe. example weather variable plot panel Kiedy porównuję różne panele, dobrze jest mieć spójne osie. Niestety ggplot nie daje możliwości ustawienia indywidualnych limitów dla każdego wykresu w obrębie działek panelu. Domyślnie używa zakresu danych. Omówiona powyżej dyskusja dotycząca Grupy dyskusyjnej Google omawia tę niedogodność, ale nie udało mi się znaleźć żadnych aktualizacji, które mogłyby zostać dodane. Czy istnieje sposób na oszukanie ggplot, aby ustawić indywidualne limity?

Odpowiedz

6

Pierwsza sugestia, że ​​nieco pomija rozwiązanie szukam jest połączyć wszystkie moje dane w jednej tabeli danych i używać facet_grid w moim zmiennej i symulacji

ggplot() + ... + facet_grid(variable~simulation, scales = 'free_y') 

Daje to znakomitą patrząc działkę wyświetla dane na jednej figurze, ale może stać się nieporęczny przy wielu symulacjach. facet_grid solution

Aby "zhakować" spisek w produkcję tego, co chcę, najpierw ustaliłem, które granice pożądane dla każdej zmiennej pogodowej. Limity te zostały ustalone na podstawie największego zakresu wszystkich symulacji będących przedmiotem zainteresowania. Po ustaleniu stworzyłem małą tabelę danych z tymi samymi kolumnami co moje dane symulacyjne i dołączyłem ją do końca. Moje dane symulacja miała strukturę

'year' 'month' 'variable' 'run' 'mean' 
    1973  1  'rhmax'  1 65.44 
    1973  2  'rhmax'  1 67.44 
    ...  ...  ...  ... ... 
    2011 12 'windmin' 200 0.4 

Więc stworzyliśmy nową tabelę danych z tych samych kolumn

ylims.sims <- data.table(year = 1, month = 13, 
    variable = rep(c('rhmax','rhmin','sradmean','tmax','tmin','windmax','windmin'), each = 2), 
    run = 201, mean = c(20, 100, 0, 80, 100, 350, 25, 40, 12, 32, 0, 8, 0, 2)) 

co daje

'year' 'month' 'variable' 'run' 'mean' 
     1  13  'rhmax' 201 20 
     1  13  'rhmax' 201 100 
     1  13  'rhmin' 201 0 
     1  13  'rhmin' 201 80 
     1  13 'sradmean' 201 100 
     1  13 'sradmean' 201 350 
     1  13  'tmax'  201 25 
     1  13  'tmax'  201 40 
     1  13  'tmin'  201 12 
     1  13  'tmin'  201 32 
     1  13 'windmax' 201 0 
     1  13 'windmax' 201 8 
     1  13 'windmin' 201 0 
     1  13 'windmin' 201 2 

Chociaż wybór roku i metę jest aribtrary, wybór miesiąc nee d być kimkolwiek poza 1:12. Następnie dodawana to na przetwarzanie danych symulacyjnych

sim1data.ylims <- rbind(sim1data, ylims) 
    ggplot() + geom_boxplot(data = sim1data.ylims, aes(x = factor(month), y = mean)) + 
    facet_wrap(~variable, scale = 'free_y') + xlab('month') + 
    xlim('1','2','3','4','5','6','7','8','9','10','11','12') 

Kiedy wykreślić te dane z ograniczeń T ograniczę wartości oś X jak w pierwotnych danych. Dołączona tabela danych z limitami y ma miesiąc wartości 13. Ponieważ ggplot wciąż skaluje osie do całego zbioru danych, nawet gdy osie są ograniczone, daje mi to moje granice, których pragnę. Ważne jest, aby pamiętać, że jeśli są wartości danych większe niż określone przez Ciebie limity, to nie zadziała.

Przed: Należy zauważyć różnice w limitach y dla każdej zmiennej pogodowej między panelami.

before sims before sims covars

Po: Teraz granice y pozostają spójne dla każdej zmiennej pogody pomiędzy panelami. enter image description here

enter image description here

Mam nadzieję, edytować ten post w najbliższych dniach i dodać powtarzalne przykład dla lepszego wyjaśnienia. Proszę o komentarz, jeśli słyszałeś coś o dodaniu tej funkcji do ggplot.

+0

Wierzę, że jeśli zamierzasz pokazać linię trendu lub jakieś statystyki, powinieneś użyć scale_x_discrete (llmits = ...). xlim jest skrótem dla coord_cartesian, który jest w zasadzie tylko powiększeniem, więc ggplot obliczyłby stat z dodanymi danymi. może ktoś może potwierdzić. – Dominik

Powiązane problemy