2013-07-18 6 views
7

Angenommen, ich habe dieses Grundstück:einfachste Möglichkeit, kontinuierliche Skalen für ggplot2 Farbskalen zu diskretisieren?

ggplot(iris) + geom_point(aes(x=Sepal.Width, y=Sepal.Length, colour=Sepal.Length)) + scale_colour_gradient()

was ist der richtige Weg, um die Farbskala, wie die Handlung unter der akzeptierten Antwort hier (gradient breaks in a ggplot stat_bin2d plot) gezeigt diskretisieren?

ggplot erkennt korrekt diskrete Werte und verwendet diskrete Skalen für diese, aber meine Frage ist, ob Sie kontinuierliche Daten haben und einen diskreten Farbbalken dafür wollen (wobei jedes Quadrat einem Wert entspricht und Quadrate in einem Farbverlauf gefärbt sind)), was ist der beste Weg, es zu tun? Sollte das Diskretisieren/Binning außerhalb von ggplot stattfinden und in den Datenrahmen als separate Spalte mit diskreten Werten eingefügt werden, oder gibt es eine Möglichkeit, dies innerhalb von ggplot zu tun? ein Beispiel dafür, was ich suche, ist ähnlich der Maßstab hier gezeigt: enter image description here

außer ich ein Streudiagramm bin Plotten und nicht so etwas wie geom_tile/Heatmap.

danke.

Antwort

9

Die Lösung ist etwas kompliziert, weil Sie eine diskrete Skala wollen. Sonst könnten Sie wahrscheinlich einfach round verwenden.

library(ggplot2) 

bincol <- function(x,low,medium,high) { 
    breaks <- function(x) pretty(range(x), n = nclass.Sturges(x), min.n = 1) 

    colfunc <- colorRampPalette(c(low, medium, high)) 

    binned <- cut(x,breaks(x)) 

    res <- colfunc(length(unique(binned)))[as.integer(binned)] 
    names(res) <- as.character(binned) 
    res 
} 

labels <- unique(names(bincol(iris$Sepal.Length,"blue","yellow","red"))) 
breaks <- unique(bincol(iris$Sepal.Length,"blue","yellow","red")) 
breaks <- breaks[order(labels,decreasing = TRUE)] 
labels <- labels[order(labels,decreasing = TRUE)] 


ggplot(iris) + 
    geom_point(aes(x=Sepal.Width, y=Sepal.Length, 
       colour=bincol(Sepal.Length,"blue","yellow","red")), size=4) + 
    scale_color_identity("Sepal.Length", labels=labels, 
         breaks=breaks, guide="legend") 

enter image description here

+0

Ist die Bestellung von Etikett funktionieren, wenn negative Zahlen in den Variablen existieren für die Färbung verwendet? – gvrocha

5

Sie könnten die folgende versuchen, ich habe Ihre Beispielcode entsprechend unten geändert:

#I am not so great at R, so I'll just make a data frame this way 
#I am convinced there are better ways. Oh well. 
df<-data.frame() 
for(x in 1:10){ 
    for(y in 1:10){ 
    newrow<-c(x,y,sample(1:1000,1)) 
    df<-rbind(df,newrow) 
    } 
} 
colnames(df)<-c('X','Y','Val') 


#This is the bit you want 
p<- ggplot(df, aes(x=X,y=Y,fill=cut(Val, c(0,100,200,300,400,500,Inf)))) 
p<- p + geom_tile() + scale_fill_brewer(type="seq",palette = "YlGn") 
p<- p + guides(fill=guide_legend(title="Legend!")) 

#Tight borders 
p<- p + scale_x_continuous(expand=c(0,0)) + scale_y_continuous(expand=c(0,0)) 
p 

Notiere die strategische Nutzung von Schnitt die Daten durch die Verwendung von Farbe gefolgt diskretisiert Brauer, um die Dinge hübsch zu machen.

Das Ergebnis sieht wie folgt aus.

2D heatmap with discretized colour

+0

Ich mag das, aber ich frage mich, ob es eine Möglichkeit gibt, die Skala zu markieren, wie im Beispiel in der Frage gezeigt. Genauer gesagt: Wie bekommen Sie die Extreme an den Schnittpunkten zwischen den Farbschichten? – gvrocha

Verwandte Themen