2017-01-13 3 views
1

Angenommen, ich habe diesen sehr einfachen 2x2 RGB Datenwürfel, die ich darstellen mag:Raster oder Würfel RGB-Daten Plotten mit Gittern Paket

set.seed(2017) 
dc <- array(runif(12), dim = c(2,2,3)) 

ich dies durch Rastern den Datacube nur zeichnen kann:

plot(as.raster(dc), interpolate = FALSE) 

Aber ich würde diesen Datenwürfel mit dem lattice Paket plotten (aus Gründen der Einheitlichkeit, da ich es hauptsächlich auch für andere Plotten verwende).

Ist das möglich? Ich sehe , aber ich bin nicht in der Lage, es funktionieren zu lassen.

Antwort

0

Ok, dies erwies sich als ein echtes Unterfangen mit levelplot.

Ich konvertiere die RGB-Hex-Farbwerte von Raster in Ganzzahlen und verwende dann diese Werte, um sie der Farbpalette des Rasters zuzuordnen.

set.seed(2017) 
dc <- array(runif(12), dim = c(2,2,3)) 
plot(as.raster(dc), interpolate = FALSE) 

# convert color hexadecimals to integers 
rgbInt <- apply(as.raster(dc), MARGIN = c(1,2), 
      FUN = function(str){strtoi(substring(str, 2), base = 16)}) 

rgbIntUnq <- unique(as.vector(rgbInt)) 

lattice::levelplot(x = t(rgbInt), # turn so rows become columns 
        at = c(0,rgbIntUnq), 
        col.regions = sprintf("#%06X", rgbIntUnq[order(rgbIntUnq)]), # to hex 
        ylim = c(nrow(rgbInt) + 0.5, 1 - 0.5), # plot from top to bottom 
        xlab = '', ylab = '') 

enter image description here

Die Legende kann auch mit colorkey = FALSE Eigenschaft entfernt werden.

Ich frage mich, ob es einfachere Möglichkeiten gibt, das Gleiche zu tun.

1

Das Problem, das Sie haben, ist, dass Gitter eine Matrix benötigt, dh eine numerische Matrix und Rastern von RGB-Faktor-Matrix werden:

r <-as.raster(dc) 
r 

dieses Ergebnis liefert:

 [,1]  [,2]  
[1,] "#ECC478" "#780AAC" 
[2,] "#89C546" "#4A6F01" 

zu verwenden es als Gitter Sie müssen dies in eine numerische Matrix zu verwandeln, sieht dies lang aus, aber es scheint, ist die einzige Möglichkeit, um sicherzustellen, um die Reihenfolge zu halten:

m <- matrix(as.numeric(as.factor(as.vector(as.matrix(r)))), ncol= 2) 

levelplot(m, panel = panel.levelplot.raster) 

enter image description here

Das Problem, das Sie hier bekommen werden, ist, dass Sie nicht die gleichen RGB-Farben behalten werden, aber es ist eine Gitterlösung.

+0

Danke, aber leider hielt die RGB-Farben war der ganze Punkt meiner Frage und Problem :(. Irgendwie mit einer anderen Farbpalette würde wahrscheinlich den Trick tun, aber ich konnte es nicht tun. Zum Beispiel, umwandeln die raster hexadezimal zu ganzzahligen farben und mit der entsprechenden farbpalette –

+0

Sorry, ich habe eine Idee, ich werde versuchen, es umzusetzen –

+0

Sie können die richtige Farbe in 'levelplot' mit dieser Option:' col.regions = as .raster (dc) '. Das Problem besteht darin, die Farbe von' dc' korrekt dem Farbraum zuzuordnen. –

Verwandte Themen