2017-02-08 16 views
5

W ggplot2, układ współrzędnych coord_fixed() zapewnia zachowanie proporcji danych przy danej wartości. Kształt panelu zmienia się, aby zachować kształt danych. Tymczasem coord_flip() zamienia osie wykresu. Jednak wykres w ggplot2 musi mieć dokładnie jeden układ współrzędnych, więc tych funkcji nie można łączyć.ggplot2: Odwróć osie i zachowaj proporcje danych

Moje pytanie brzmi:

Czy istnieje sposób na połączenie zachowań coord_fixed() i coord_flip(), w wyniku układu współrzędnych z osi x i y wymieniane i stałą proporcje danych?

Jest to popularne pytanie jednak wspólna odpowiedź jest niepoprawna:

Powszechnie sugeruje odpowiedź jest użycie coord_flip() wraz z theme(aspect.ratio = 1) zamiast coord_fixed() . Jednak zgodnie z dokumentacją ggplot2 ustawienie to odnosi się do "współczynnika kształtu panelu". W ten sposób dane zmienią kształt, aby zachować kształt panelu.

Podejrzewam, że jest to funkcja, która obecnie nie istnieje w ggplot2. Ale co ważniejsze, uważam, że należy udokumentować prawidłowe rozwiązanie lub przynajmniej odpowiedź na to pytanie.

Szybkie minimalny przykładem kwestii:

library(ggplot2) 
x <- 1:100; data <- data.frame(x = x, y = x * 2) 
p <- ggplot(data, aes(x, y)) + geom_point() 

p # by default panel and data both fit to device window 
p + coord_fixed() # panel changes shape to maintain shape of data 
p + theme(aspect.ratio = 1) # data changes shape to maintain shape of panel 
p + coord_fixed() + coord_flip() # coord_flip() overwrites coord_fixed() 

# popular suggested answer does not maintain aspect ratio of data: 
p + coord_flip() + theme(aspect.ratio = 1) 

Odpowiedz

3

Zgadzam się, że nie jest to rozwiązanie themenaprawdę właściwa jeden. Oto rozwiązanie, które działa programowo poprzez obliczenie aspekt od rzeczywistych zakresów osi przechowywanych w obiekcie działce, ale to trwa kilka linijek kodu:

ranges <- ggplot_build(p)$layout$panel_ranges[[1]][c('x.range', 'y.range')] 
sizes <- sapply(ranges, diff) 
aspect <- sizes[1]/sizes[2] 

p + coord_flip() + theme(aspect.ratio = aspect) 

enter image description here

Rozwiązanie to pewnie używać w praktyce należy używać poziomych geomów w pakiecie ggstance (chociaż nie zawsze jest to wykonalne).

Uwaga: To daje tylko dokładnie poprawną odpowiedź dla dwóch skalach ciągłych z równą multiplikatywnego extend argumentu (czyli ustawienie domyślne).

+0

Pozdrawiam, myślę, że to rozwiązanie jest najlepsze, jakie obecnie istnieje. (Ale w odniesieniu do twojego pierwszego zdania - rozwiązanie "tematu" jest po prostu błędne, nie ma potrzeby kwalifikacji.) Patrzę na dane przestrzenne i bardzo ważne jest, aby wiedzieć, czy dane są pokazywane w ich prawdziwej postaci. mają odwrotny skutek i zniekształcają dane dalej.) – mb7744

+0

@ mb7744 Mówiłem tylko o tym, że dla wielu osób (ale na pewno nie dla wszystkich) oryginalne rozwiązanie jest w porządku. Nie zgadzam się z tobą (dlatego odpowiedziałem na pytanie). – Axeman

+0

Oczywiście - ale to, co dostaję, to to, że może to być dobre dla ludzi, którzy nie zauważają różnicy i źle interpretują ich spisek. Myślę, że właśnie dlatego dwa ostatnie pytania na ten temat na temat SO mają nieprawidłowe odpowiedzi. Ale to tylko ja czepiam się. Doceniam twoje rozwiązanie! – mb7744

Powiązane problemy