2012-08-29 4 views
12

Ich habe etwas ähnliche Fragen gesehen, aber ich möchte meine konkrete Frage stellen so direkt wie ich kann:Transfarbskala, aber halten eine schöne Legende mit ggplot2

Ich habe ein Streudiagramm mit einem „z“ Variable in einer Farbskala kodiert:

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) 

Welche dies erzeugt: bad version

Wie Sie sehen können, da die „z“ Variable normalverteilt ist, nur sehr wenige der Punkte mit den sind farbig "extreme" Farben der Verteilung. Das ist so, wie es sein sollte, aber ich bin daran interessiert, Unterschiede zu betonen. Eine Möglichkeit, dies zu tun wäre, zu verwenden:

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

Welche dies erzeugt: better version

Durch die Anwendung Rang(), um die „z“ Variable, bekomme ich einen viel größeren Wert auf geringe Unterschiede innerhalb der " z "variabel. Man könnte sich vorstellen, hier irgendeine Transformation anstelle des Rangs zu verwenden, aber man bekommt die Idee.

Meine Frage ist im Wesentlichen, was ist der einfachste Weg, oder die "wahre ggplot2" Weg, eine Legende in den ursprünglichen Einheiten (Einheiten von z, im Gegensatz zu dem Rang von z) zu bekommen, während beibehalten die umgewandelte Version der farbigen Punkte?

Ich habe das Gefühl, dies verwendet rescaler() irgendwie, aber es ist mir nicht klar, wie rescaler() mit beliebigen Transformationen usw. zu verwenden ist. Im Allgemeinen wären klarere Beispiele nützlich.

Vielen Dank im Voraus für Ihre Zeit.

+3

+1 für ein reproduzierbares Beispiel, klares Ziel und eine interessante Visualisierungsfrage. –

Antwort

6

Werfen Sie einen Blick auf das Paket scales besonders ?trans

Ich denke, dass eine Transformation, die die Farbe angemessen sein (im Grunde pnorm(z))

I gegeben bildet die Wahrscheinlichkeit, den Wert bekommen oder extremer sollte denke, dass scale_colour_continuous(trans = probability_trans(distribution = 'norm') sollte funktionieren, aber es wirft Warnungen.

So definiert ich eine neue Transformation

(?trans_new sehen) muss ich

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

mit dem mitgelieferten probability_trans eine Warnung wirft und hat eine Transformation und eine inverse definieren nicht scheinen zu arbeiten

# 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

Das ist eine wirklich nützliche Antwort, danke. Die Dokumentation des Waagenpakets für trans_new() enthält kein Beispiel, also vielen Dank für die Bereitstellung. Auch pnorm() ist definitiv die richtige Funktion für mich. – isDotR

+0

Aber jetzt habe ich eine neue Frage: Aus einer Laune, versuchte ich badVersion + geom_point() + scale_x_continuous (trans = "Norm"), und es hat nicht funktioniert.Die Verwendung von badVersion + geom_point() + scale_x_continuous (trans = 'log') führt zu Ergebnissen. Irgendwelche Ideen, warum? – isDotR

+0

Hmmmm .... Das ist interessant - ich werde darüber nachdenken ... vielleicht werden die Achsenskalen anders behandelt, aber das wäre seltsam. Es ist wahrscheinlicher, dass ich falsch verstehe, wie die Transformationen funktionieren. – mnel

Verwandte Themen