2012-08-02 6 views
5

Ich versuche ein Diagramm zu erstellen, in dem Farbe die Kombination mehrerer Werte darstellt. Im folgenden Beispiel verwende ich steigende Werte für Rot, die mit der x-Koordinate verknüpft sind, und steigende Werte für blau in Verbindung mit der y-Koordinate.Wie kann man 2 oder mehr Farbpaletten mischen, um einen kombinierten Farbwert anzuzeigen

#required function 'val2col' from: http://www.menugget.blogspot.de/2011/09/converting-values-to-color-levels.html 

val2col<-function(z, zlim, col = heat.colors(12), breaks){ 
if(!missing(breaks)){ 
    if(length(breaks) != (length(col)+1)){stop("must have one more break than colour")} 
} 
if(missing(breaks) & !missing(zlim)){ 
    zlim[2] <- zlim[2]+c(zlim[2]-zlim[1])*(1E-3)#adds a bit to the range in both directions 
    zlim[1] <- zlim[1]-c(zlim[2]-zlim[1])*(1E-3) 
    breaks <- seq(zlim[1], zlim[2], length.out=(length(col)+1)) 
} 
if(missing(breaks) & missing(zlim)){ 
    zlim <- range(z, na.rm=TRUE) 
    zlim[2] <- zlim[2]+c(zlim[2]-zlim[1])*(1E-3)#adds a bit to the range in both directions 
    zlim[1] <- zlim[1]-c(zlim[2]-zlim[1])*(1E-3) 
    breaks <- seq(zlim[1], zlim[2], length.out=(length(col)+1)) 
} 
colorlevels <- col[((as.vector(z)-breaks[1])/(range(breaks)[2]-range(breaks)[1]))*(length(breaks)-1)+1] # assign colors to heights for each point 
colorlevels 
} 


#data 
x <- seq(100) 
y <- seq(100) 
grd <- expand.grid(x=x,y=y) 

#assign colors to grd levels 
pal1 <- colorRampPalette(c("white", rgb(1,0,0)), space = "rgb") 
col1 <- val2col(x, col=pal1(10)) 
pal2 <- colorRampPalette(c("white", rgb(0,0,1)), space = "rgb") 
col2 <- val2col(y, col=pal2(10)) 
col3 <- NA*seq(nrow(grd)) 
for(i in seq(nrow(grd))){ 
    xpos <- grd$x[i] 
    ypos <- grd$y[i] 
    coltmp <- (col2rgb(col1[xpos])/2) + (col2rgb(col2[ypos])/2) 
    col3[i] <- rgb(coltmp[1], coltmp[2], coltmp[3], maxColorValue = 255) 
} 

    #plot 
png("2_color_scales.png", width=6, height=4, units="in", res=200) 
layout(matrix(c(1,2,3), nrow=1, ncol=3), widths=c(4,1,1), heights=4, respect=T) 
par(mar=c(4,4,2,2)) 
plot(grd,col=col3, pch=19) 
par(mar=c(4,0,2,5)) 
image(x=1, y=x, z=t(as.matrix(x)), col=pal1(10), xaxt="n", yaxt="n", xlab="", ylab="") 
box() 
axis(4) 
mtext("x", side=4, line=3, cex=0.7) 
par(mar=c(4,0,2,5)) 
image(x=1, y=y, z=t(as.matrix(y)), col=pal2(10), xaxt="n", yaxt="n", xlab="", ylab="") 
box() 
axis(4) 
mtext("y", side=4, line=3, cex=0.7) 
dev.off() 

enter image description here

Das Ergebnis ist technisch korrekt, dass, wenn x = 1 und y = 10, das Mischen von Farben „Weiß“ und „Blau“, die jeweils die hellere Blauton zurückkehren. Ich möchte jedoch, dass diese Position als "blau" wie das dunkelste Blau des y-Farbbalkens aussieht. Ich stelle mir vor, dass man Transparenz für niedrigere Werte anstelle der Farbe Weiß verwenden müsste. Hat jemand Vorschläge, wie dies erreicht werden könnte? Das Hinzufügen von zwei Farben, einschließlich ihrer Transparenz, geht über mich hinaus ... Ich dachte, man könnte den Transparenzwert als Gewichtung im Mischschritt verwenden?

Danke für Ihre Hilfe.

Antwort

6

Da ich vertrauter bin mit ggplot, zeige ich eine Lösung mit ggplot. Dies hat den Vorteil, dass der Code ggplot sehr einfach ist. Daher können wir uns eher auf das Thema Farbmanagement als auf R-Code konzentrieren.

  1. Starten von expand.grid unter Verwendung eines Datenrahmens dat mit dem Gitter von roten und blauen Eingangswerten zu schaffen.
  2. Verwenden Sie die Funktion rgb(), um den Farbmix zu erstellen, und weisen Sie ihn dat$mix
  3. zu.

Der Code:

dat <- expand.grid(blue=seq(0, 100, by=10), red=seq(0, 100, by=10)) 
dat <- within(dat, mix <- rgb(green=0, red=red, blue=blue, maxColorValue=100)) 

library(ggplot2) 
ggplot(dat, aes(x=red, y=blue)) + 
    geom_tile(aes(fill=mix), color="white") + 
    scale_fill_identity() 

enter image description here


Sie werden feststellen, dass die Farbskala unterscheidet von dem, was Sie vorgeschlagen, aber vielleicht mehr intuitiv.

Beim Mischen von Licht, gibt Abwesenheit von Farbe schwarz, und Anwesenheit aller Farben ergibt weiß.

Dies wird deutlich durch die Handlung angezeigt, die ich ziemlich intuitiv zu interpretieren finde.

+0

+1 Dank Andre - es ist ziemlich intuitiv. Sehr kompakter Code auch. Wäre es für Sie einfach, die entsprechenden Farbskalen zu einem solchen Diagramm hinzuzufügen? Ich denke, dass ich dachte, dass ein subtraktives Cyan-Magenta-Gelb-Farbmodell (d. H. Gleich Weiß, wenn keine Farben angewendet werden) zum Drucken besser sein könnte als ein additives RGB-Farbmodell. –

+0

@Marcinthebox Mein Verdacht ist, dass jeder Versuch, zwei Elemente in einer einzigen Farbskala zu mischen, ziemlich schwierig zu interpretieren ist. Was versuchst du zu planen? Können Sie stattdessen eine andere Ästhetik verwenden, z. Größe oder Form, um ein zweites Element anzuzeigen? – Andrie

+0

Ich dachte über die Verwendung einer solchen Darstellung bei der Darstellung von drei Nährstoffkonzentrationen in Oberflächengewässern (d.h. räumlich) nach. Ich hatte gehofft, dass eine solche Karte eine intuitive Möglichkeit sein könnte, diese räumlichen Muster zu sehen. Ich stellte mir vor, dass der entsprechende Farbschlüssel ein Tri-Plot ist, der den Farbverlauf für die drei Nährstoffkonzentrationen zeigt. –

Verwandte Themen