2017-02-01 1 views
1

Ich versuche eine manuelle Skalierung für die Farben in einem meiner Plots zu erstellen. Meine Daten reichen von 0 bis 10, und ich habe einige sehr kleine Zahlen. Wichtig, ich möchte zwei Farbverläufe. Eine für Punkte mit Werten < 1, und eine für Punkte mit Werten> = 1. Da ich ziemlich viele sehr kleine Zahlen habe, möchte ich, dass der Farbverlauf auf einer logarithmischen Skala liegt (divergierend bei 1).Manuelle Werte für die Skalierung angeben _ * _ gradienten mit transformierter Farbe/Füllvariable ggplot2

Simulierte Daten:

library(cowplot) 
df <- data_frame(xs = rnorm(1000), 
       ys = rnorm(1000), 
       color_vals =c(runif(500, 0,.001), runif(500, .01,10))) 

Ich weiß, dass ich dies wie so automatisch tun kann (ich weiß es nicht sinnvoll, einen weißen Punkt zu haben, aber das ist nur ein Spielzeug Beispiel für meine komplexere Karte Plot):

ggplot(df, aes(x=xs, y=ys, color=color_vals)) + geom_point() + 
     scale_color_gradient2(low="blue", high = "red", mid = "white", trans="log10") 

enter image description here

ich aber nicht diese Art von Gradienten wollen, denn ich will zwei zunehmende Steigungen, Split im Verhältnis 1: (1) von grau bis blau und (2) von gelb nach rot.

Ich weiß, dass ich dies mit scale_color_gradientn auf diese Weise angeben:

ggplot(df, aes(x=xs, y=ys, color=color_vals)) + geom_point() + 
     scale_color_gradientn(colors = c("grey", "blue", "yellow", "red"), 
          values = scales::rescale(c(0,1,1.000001, max(df$colors)))) 

enter image description here

aber wenn ich versuche, dies mit der Log-in Tandem zu tun verwandeln, wird die Steigung nicht korrekt herausstellen.

ggplot(df, aes(x=xs, y=ys, color=color_vals)) + geom_point() + 
     scale_color_gradientn(trans = "log10", 
          colors = c("grey", "blue", "yellow", "red"), 
          values = scales::rescale(c(0.000001,1,1.000001, max(df$colors)))) 

enter image description here

Die nächstgelegene ich bekommen habe ist, die Zahlen innerhalb rescale zur Anmeldung zu verwandeln, um zu versuchen, aber das nicht richtig funktioniert (obwohl es in der Nähe ist).

ggplot(df, aes(x=xs, y=ys, color=color_vals)) + geom_point() + 
     scale_color_gradientn(trans = "log10", 
          colors = c("grey", "blue", "yellow", "red"), 
          values = scales::rescale(log10(c(0.000001,1,1.000001, max(df$colors))))) 

enter image description here

So wie kann ich die richtigen Werte für meine zwei Steigungen angeben, wenn ich auch die Steigungen wollen umgewandelt werden log?

+0

Was funktioniert bei dem letzten Versuch nicht richtig? Ist es der Farbbalken selbst oder die gezeigten Farben (oder beides)? – aosmith

+0

Es sind die Farben selbst. Sie können sehen, dass einige Werte über 1 immer noch blau gefärbt sind. Idealerweise würde die blaue Farbe bei 1 aufhören und alles über 1 wäre auf dem gelben bis roten Gradienten. Die erste Handlung macht das, aber wenn ich es auf der logarithmischen Skala mache, funktioniert es nicht mehr. – sjfox

+0

Wie sieht es aus, wenn Sie den kleinsten Wert im Dataset verwenden, 'min (df $ colors)' als Ausgangspunkt für die log10-Skalierung anstelle von .000001? – aosmith

Antwort

1

Sie geben nur die Grenzwerte für 2 Farben an, aber Sie haben 4 Farben. Es benötigt einen Start- und Endpunkt für jede Farbe. Versuche Folgendes. Sie können die Parameter ändern, je nachdem, wo Sie Ihre Start/Stopp-Punkte wollen:

ggplot(df, aes(x = xs, y = ys, color = color_vals)) + 
geom_point() + 
scale_color_gradientn(trans = "log10", 
        colors = c("grey", "blue", "yellow", "red"), 
        values = scales::rescale(log10(
         c(0, 1, #grey parameters 
         1.000001, 2, #blue parameters 
         2.1, 3, #yellow parameters 
         3.1, max(df$color_vals))))) #red parameters 

Da Sie erwähnt nur zwei Farben zeichnen möchten, würden Sie die beiden mittleren Wert Parameter löschen und löschen zwei der Farboptionen wie folgt:

ggplot(df, aes(x = xs, y=ys, color = color_vals)) + 
    geom_point() + 
    scale_color_gradientn(trans = "log10", 
        colors = c("blue", "pink"), 
        values = scales::rescale(log10(
         c(min(df$color_vals), 1, # <1 (blue) parameters 
         1, max(df$color_vals))))) # >1 (pink) parameters 
+0

Ja ich denke, das funktioniert, danke! In meinen Tests scheint es, als ob Sie immer noch das "log10" zwischen der Neuskalierungsfunktion und den Farbwerten benötigen. Wenn das auch für Sie funktioniert und Sie Ihre Antworten so ändern, dass ich Ihre Antwort akzeptiere. Ich danke dir sehr! – sjfox

+0

Ja, das funktioniert auch für mich. Erledigt! – jesstme

+0

Hey @jesstme, ich habe tatsächlich eine andere Bedingung dafür gefunden. Es scheint nicht zu funktionieren, wenn einer der Werte im Log10 0 ist, weil Rescale nicht gut mit -Inf-Werten umgehen kann. Ich musste meinen Code so ändern, dass er so aussah wie: 'min (df $ color_vals [df $ color_vals! = 0]', anstatt 'min (df $ color_vals)', so dass keine 0s enthalten waren. Das war nicht ' t ein Problem mit meiner wiederholbaren Antwort, weil keiner der Werte genau Null war, aber in meiner tatsächlichen Handlung ein Problem ist Könnten Sie das bitte in beiden Beispielen korrigieren? – sjfox

Verwandte Themen