2012-08-29 16 views
12

widziałem nieco podobne do tego pytania, ale chciałbym zapytać moje konkretne pytanie jak bezpośrednio, jak tylko mogę:Transform skalę kolorów, ale zachować piękny legendę z ggplot2

Mam wykres punktowy z zmienna „z” zakodowane w skali barw:

library(ggplot2) 
myData <- data.frame(x = rnorm(1000), 
        y = rnorm(1000)) 
myData$z <- with(myData, x * y) 

badVersion <- ggplot(myData, 
       aes(x = x, y = y, colour = z)) 
badVersion <- badVersion + geom_point() 
print(badVersion) 

która produkuje to: bad version

Jak widać, gdyż zmienna „z” ma rozkład normalny, bardzo niewielu z punktów są kolorowe z "skrajne" barwy rozkładu. Tak właśnie powinno być, ale jestem zainteresowany uwypukleniem różnicy. Jednym ze sposobów, aby to zrobić byłoby użyć:

betterVersion <- ggplot(myData, 
         aes(x = x, y = y, colour = rank(z))) 
betterVersion <- betterVersion + geom_point() 
print(betterVersion) 

która produkuje to: better version

Stosując Rank() do zmiennej „Z”, otrzymuję dużo większy nacisk na niewielkie różnice w ramach " z "zmienna. Można sobie wyobrazić użycie jakiejkolwiek transformacji tutaj, zamiast rangi, ale masz pomysł.

Moje pytanie jest w istocie, co jest najprostszym sposobem, lub najbardziej "prawdziwym sposobem ggplot2", uzyskania legendy w oryginalnych jednostkach (jednostki z, w przeciwieństwie do rangi z), przy jednoczesnym zachowaniu przekształcona wersja kolorowych punktów?

Mam przeczucie, że w jakiś sposób używa on funkcji rescaler(), ale nie jest dla mnie jasne, jak używać funkcji rescaler() z dowolnymi przekształceniami itp. Ogólnie rzecz biorąc, bardziej przejrzyste przykłady byłyby użyteczne.

Z góry dziękuję za poświęcony czas.

+3

+1 za odtwarzalny przykład, jasny cel i interesujące pytanie wizualizacyjne. –

Odpowiedz

6

Wystarczy popatrzeć na opakowaniu scales szczególnie ?trans

myślę, że transformacja że odwzorowuje kolor ze względu na prawdopodobieństwo uzyskania wartości lub bardziej skrajne powinny być rozsądne (w zasadzie pnorm(z))

I uważam, że powinno działać scale_colour_continuous(trans = probability_trans(distribution = 'norm'), ale generuje ostrzeżenia.

Więc zdefiniowany nowy transformacji (patrz ?trans_new)

muszę zdefiniować transformację, a odwrotna

library(scales) 
norm_trans <- function(){ 
    trans_new('norm', function(x) pnorm(x), function(x) qnorm(x)) 
} 

badVersion + geom_point() + scale_colour_continuous(trans = 'norm')) 

enter image description here

użyciu dostarczonego probability_trans generuje ostrzeżenie i nie Wydaje się działać

# this throws a warning 
badVersion + geom_point+ 
    scale_colour_continuous(trans = probability_trans(distribution = 'norm')) 

## Warning message: 
## In qfun(x, ...) : NaNs produced 

enter image description here

+0

To naprawdę przydatna odpowiedź, dzięki. Dokumentacja pakietu wagi dla trans_new() jest pozbawiona przykładu, więc dziękuję za jej dostarczenie. Również pnorm() jest zdecydowanie odpowiednią funkcją do użycia. – isDotR

+0

Ale teraz mam nowe pytanie: na kaprys, próbowałem badVersion + geom_point() + scale_x_continuous (trans = "norm"), i nie działa.Używanie badVersion + geom_point() + scale_x_continuous (trans = 'log') daje wyniki. Jakieś pomysły, dlaczego? – isDotR

+0

Hmmmm .... To ciekawe - podzielę się z nimi pewną myślą ... może skale osiowe są traktowane inaczej, ale to byłoby dziwne. Bardziej prawdopodobne jest, że nie rozumiem, jak działają transformacje. – mnel

Powiązane problemy