2017-04-26 3 views
2

Ich suche eine Heat-Map von Werten zu haben. Ich möchte, dass die Heatmap von Blau für niedrige Werte (0 in meinem Beispielcode) zu Grün für hohe Werte (75 in meinem Beispielcode) wechselt. Die Daten enthalten jedoch Werte größer als 75. Ich möchte, dass alle Werte größer als 75 rot ausgefüllt werden.ggplot2 Skala Füllgradient mit diskreten Kappe

Also, ich möchte die Füllung von 0 oben 75 in blau zu grün mit einem Wert größer als 75 gefüllt in rot skaliert werden. Der Code, den ich jetzt habe, macht das, aber skaliert immer noch von grün nach rot in Werten von 76-100, anstatt dass sie alle rot sind.

Ich habe die Antwort von Brian Diggs in der Post verwendet (ggplot2 heatmap with colors for ranged values), aber diese Antwort deckt nicht ab, was mit dem Füllen aller Werte jenseits eines Cap-Werts für eine Gradient-Skala zu tun ist.

Der Beitrag (ggplot geom_point() with colors based on specific, discrete values) scheint eine sehr ähnliche Frage für geom_point zu beantworten, aber ich habe Probleme, ihn an geom_tile anzupassen.

Mein Beispielcode ist unten und jede Hilfe wird geschätzt!

#Check packages to use in library 
{ 
    library('ggplot2') 
    library('scales') 
} 

#Data 

horizontal_position <- c(-2, -1, 0, 1, 2) 
vertical_position <- c(-2, -2, -2, -2, -2, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2) 
data_val <- sample(0:100, 25) 
all_data <-data.frame(horizontal_position, vertical_position, data_val) 

    all_data %>% 
     ggplot(aes(horizontal_position, vertical_position)) + 
     geom_tile(aes(fill = data_val), colour = "transparent") + 
     geom_text(aes(label = data_val),colour="white")+ 
     scale_fill_gradientn(colours = c("blue", "lightblue", "lightgreen", "green", "red"), 
          breaks=c(0,25,50,75,Inf), 
          guide = "colorbar") 

Antwort

2

Hier ist eine Teillösung, die Figur, die Farben, sondern lässt die Legende nicht ganz korrekt:

all_data %>% 
    mutate(val2 = replace(data_val, data_val > 75, NA)) %>% 
    ggplot(aes(horizontal_position, vertical_position)) + 
    geom_tile(aes(fill = val2), colour = "transparent") + 
    geom_text(aes(label = data_val),colour="white")+ 
    scale_fill_gradientn(colours = c("blue", "lightblue", "lightgreen", "green"), 
         breaks=c(0,25,50,75,Inf), 
         na.value = "red") 

enter image description here

Der Trick Ihre Out-of-bounds Werte NA setzt, Das hat einen besonderen fakultativen Wert in den meisten ästhetischen Skalen. Natürlich bricht dies zusammen, wenn Ihre tatsächlichen Daten echte NAs haben, und wie ich bereits erwähnt habe, ist es ein weiterer Morast, es in der Farbleiste erscheinen zu lassen.

Edited hinzufügen: eine schnelle Suche einige Lösungen gebracht: Add a box for the NA values to the ggplot legend for a continous map

+1

Diese Lösung funktioniert gut, mein einziger Kommentar ist, dass der Schatten eines besonderen Wert auf den anderen Werten abhängt. Mit anderen Worten: Wenn Sie diese Lösung auf 2 Elemente mit jeweils 25 Datenpunkten von 0 bis 100 erweitern, kann ein Wert von 43 für Element 1 einen anderen Farbton aufweisen als für Element 2 in Abhängigkeit von 43 auf was die anderen 24 Datenpunkte sind. Dies scheint die Farbzuweisung nicht anhand des Datenwerts zu skalieren, sondern anhand seiner Position relativ zu den anderen Datenpunkten. Ich öffne eine andere Frage für dieses Problem. – User247365

+1

Die einfache Lösung besteht darin, nach 'breaks = c (0,25,50,75, Inf)' 'limits = c (0,75)' hinzuzufügen. Dadurch wird die Skalierung so eingeschränkt, dass immer dieselbe Farbleiste zurückgegeben wird. Aber ich denke, Ihre Beobachtung ist nicht korrekt: 43 wird immer auf 72% des Weges von "hellblau" zu "hellgrün" wie geschrieben stehen, unabhängig von den anderen Werten. Der einzige Unterschied besteht darin, ob die anderen Werte in der Farbleiste angezeigt werden. – Brian

+0

Nachdem du damit herumgespielt hast, warst du bei deiner Beobachtung richtig, aber die "Grenzen" sind immer noch die richtige Lösung. – Brian

Verwandte Themen