2012-07-20 11 views
22

Mam ramkę danych przechwytującą kilka miar w czasie, które chciałbym wizualizować jako aspekt 3x1. Jednak każdy środek zawiera różne jednostki/skale, które skorzystałyby z niestandardowych transformacji i schematów etykietowania.Narzędzie do formatowania etykiet osi na jeden aspekt w ggplot/R

Więc moje pytanie brzmi: Jeśli jednostki i wagi są różne w różnych aspektach, w jaki sposób można określić niestandardową formatowania lub transformacji (tj log10) do określonej osi w ramach aspektu?

Na przykład, powiedzmy, że mam dane:

df = data.frame(dollars=10^rlnorm(50,0,1), counts=rpois(50, 100)) 
melted.df = melt(df, measure.var=c("dollars", "counts")) 

Jak można by pójść na utworzenie aspekt 2x1 pokazując dolarów i liczy ponad indeksu z labels=dollars i scale_y_continuous(trans = "log10", ...) dla danych df$dollars?

Dziękujemy!

+0

Nie jest to łatwe, myślę ... –

+0

Tak. Shucks. Właśnie natknąłem się na ten link, gdy ktoś miał podobny problem: http://comments.gmane.org/gmane.comp.lang.r.ggplot2/4496. –

+0

Prawdopodobnie łatwiej jest zrobić dwie oddzielne działki i ułożyć je razem. –

Odpowiedz

40

Jak się zorientowaliście, nie ma na to łatwego rozwiązania, ale często pojawia się ono. Ponieważ tego typu rzeczy są często zadawane, uważam za pomocne wyjaśnienie, dlaczego jest to trudne i sugerują potencjalne rozwiązanie.

Moje doświadczenie jest takie, że ludzie, którzy przychodzą do ggplot2 lub kratowych grafiki zasadniczo rozumieją cel szlifowaniem (lub trellising w siatkowej). Ta funkcja została opracowana z myślą o konkretnym celu: wizualizacja danych w wielu grupach, które mają wspólną skalę wspólną skalę. Pochodzi z czegoś, co nazywa się zasadą małych wielokrotności, za którymi opowiada się Tufte i inni.

Umieszczanie paneli obok siebie o bardzo różnej skali jest czymś, czego unikną eksperci od wizualnych projektów, ponieważ może być w najlepszym przypadku mylące. (Nie krytykuję cię tutaj, tylko wyjaśniam uzasadnienie ...)

Ale, oczywiście, kiedy masz już to wspaniałe narzędzie, nigdy nie wiesz, jak ludzie go wykorzystają. Jest rozciągnięty: żądania przychodzą, aby umożliwić zmianę skal według panelu i ustawić różne aspekty wydruku oddzielnie dla każdego panelu. I tak faceting w ggplot2 został rozszerzony daleko poza pierwotne intencje.

Jedną z konsekwencji jest to, że niektóre rzeczy są trudne do wdrożenia tylko z powodu pierwotnej intencji projektu. Jest to prawdopodobnie jedna z takich sytuacji.

OK, wystarczające wyjaśnienie. Oto moje rozwiązanie.

Sztuką jest rozpoznanie, że użytkownik nie wykreśla wykresów, które mają podziałkę. Dla mnie oznacza to, że nie powinieneś nawet myśleć o używaniu faceting w ogóle. Zamiast zrobić każdą działkę osobno, i ustawić je razem w jednej działki:

library(gridExtra) 

p1 <- ggplot(subset(melted.df,variable == 'dollars'), 
       aes(x = value)) + 
      facet_wrap(~variable) + 
      geom_density() + 
      scale_x_log10(labels = dollar_format()) 

p2 <- ggplot(subset(melted.df,variable == 'counts'), 
       aes(x = value)) + 
      facet_wrap(~variable) + 
      geom_density() 

grid.arrange(p1,p2) 

enter image description here

Właśnie domyślić, co geom_* chcesz użyć, i jestem pewien, że to nie jest tak naprawdę co chciałeś knuć, ale przynajmniej ilustruje zasadę.

+0

Dziękuję za wnikliwą odpowiedź! Rozumiem całkowicie konsekwencje odejścia od pierwotnych zamierzeń projektowych dla ggplot2. Praktycznie rzecz biorąc, mam dwa zestawy danych, w których jeden ma rozkład normalny, podczas gdy drugi ma rozkład logarytmiczno-normalny, więc miałem nadzieję, że będę w stanie porównać te znormalizowane wizualnie dane w czasie. Czy masz wgląd w prawidłowe wyrównywanie obszarów działek? Wcześniej spotkałem się z biblioteką 'ggExtra', która podobno zapewnia pewną obsługę ad-hoc, ale byłbym wdzięczny za każdy jej kierunek. –

+0

@StefanNovak Cieszę się, że było pomocne! Chcę jeszcze raz podkreślić, że nie krytykuję twoich wyborów w zakresie projektowania. Jedną z zasad pytań SO jest to, że "żyją wiecznie", a więc powinny służyć nie tylko pierwotnemu pytającemu. Jak już powiedziałem, pojawia się to w kółko, więc moje wyjaśnienia były bardziej skierowane do przyszłych czytelników niż do ciebie. – joran

+1

@StefanNovak No cóż, hackowskim sposobem na to jest dostosowanie etykietek podziałki osi tak, aby miały taką samą liczbę cyfr, nawet jeśli oznacza to dopełnianie etykiet pustymi polami. Jestem pewien, że to też zostało zadane ... Zobaczę, czy uda mi się znaleźć cokolwiek innego. – joran

Powiązane problemy