2016-03-29 13 views
1

Ich erstelle eine Reihe von Heatmaps in R, aber ich habe Probleme, wenn es darum geht, die Farbskala in Graphen konsistent zu halten.Farben über Plots/Heatmaps in R

Ich finde, dass die Farben innerhalb eines Graphen skaliert werden, gibt es eine Möglichkeit, Farben über Graphen konsistent zu machen? Ie. Also, dass der Farbunterschied zwischen einem Wert von 0,4 und 0,5 immer gleich ist? Beispiel

Code:

set.seed(123) 

d1 = matrix(rnorm(9, mean = 0.2, sd = 0.1), ncol = 3) 
d2 = matrix(rnorm(9, mean = 0.8, sd = 0.1), ncol = 3) 

mat = list(d1, d2) 

for(m in mat) 
    heatmap(m, Rowv = NA ,Colv = NA) 

Sie im Beispiel beachten werden, dass die Zelle (2,3) die erste grafische Darstellung ist ähnlich Zelle (1,3) in der zweiten, obwohl ~ 0.8 verschiedene

+0

Im 'heatmap'-Befehl (und anderen R heatmap-Paketen in R) gibt es' break'- und 'col'-Argumente, die Sie verwenden können. –

Antwort

4

Hier ist ein Weg, um es mit ggplot2 zu tun, wenn Sie offen sind nicht Basis Grafiken mit:

library(reshape2) 
library(ggplot2) 

# Set common limits for color scale 
limits = range(unlist(mat)) 

Hier ist der Code für zwei separa die Graphen. Die letzte Zeile des Codes für jede Kurve stellt sicher, dass sie die gleichen z Grenzen für die Einstellung der Farben verwenden:

ggplot(melt(mat[[1]]), aes(Var1, Var2, fill=value)) + 
    geom_tile() + 
    scale_fill_continuous(limits=limits) 

ggplot(melt(mat[[2]]), aes(Var1, Var2, fill=value)) + 
    geom_tile() + 
    scale_fill_continuous(limits=limits) 

enter image description here

Eine weitere Option ist es, beide Heatmaps in einem einzigen Diagramm zeichnen Facettierschritt verwenden, das automatisch gewährleistet, beide Graphen sind auf der gleichen Farbskala:

ggplot(melt(mat), aes(Var1, Var2, fill=value)) + 
    geom_tile() + 
    facet_grid(. ~ L1) 

enter image description here

ich verwendet habe, die Standardfarben hier, aber für jede Annäherung können Sie die Farbskala einstellen, um alles zu sein, was Sie wünschen. Zum Beispiel:

ggplot(melt(mat), aes(Var1, Var2, fill=value)) + 
    geom_tile() + 
    facet_grid(. ~ L1) + 
    scale_fill_gradient(low="red", high="green") 

enter image description here

3

könnten Sie verwenden die image Funktion direkt (heatmap verwendet image), obwohl es einige zusätzliche Formatierung erfordern die Ausgabe von heatmap anzupassen. Sie können zlim verwenden, um den Farbbereich festzulegen. Zitiert aus der ?image Seite:

die minimalen und maximalen z-Werte, für die sollte Farben aufgetragen werden, auf den Bereich der endlichen Werte von z säumigen. Jede der angegebenen Farben wird verwendet, um ein äquidistantes Intervall dieses Bereichs zu färben. Die Mittelpunkte der Intervalle decken den Bereich ab, so dass nur Werte außerhalb des Bereichs aufgetragen werden.

# define zlim min and max for all the plots 
minz = Reduce(min, mat) 
maxz = Reduce(max, mat) 

for(m in mat) { 
    image(m, zlim = c(minz, maxz), col = heat.colors(20)) 
} 

Um näher an die Formatierung von heatmap erzeugt, können Sie nur einen Code aus der heatmap Funktion wieder verwenden:

for(m in mat) { 
    labCol = dim(m)[2] 
    labRow = dim(m)[1] 
    image(seq_len(labCol), seq_len(labRow), m, zlim = c(minz, maxz), 
    col = heat.colors(20), axes = FALSE, xlab = "", ylab = "", 
    xlim = 0.5 + c(0, labCol), ylim = 0.5 + c(0, labRow)) 
    axis(1, 1L:labCol, labels = seq_len(labCol), las = 2, line = -0.5, tick = 0) 
    axis(4, 1L:labRow, labels = seq_len(labRow), las = 2, line = -0.5, tick = 0) 
} 

enter image description here

Mit dem breaks Argument image ist ein weiterer Möglichkeit.Es ermöglicht mehr Flexibilität als zlim bei der Einstellung der Haltepunkte für Farben. Zitiert aus der Hilfeseite, breaks ist

eine Reihe von endlichen numerischen Grenzwerten für die Farben: muss als Farbe einen mehr Haltepunkt hat und in aufsteigender Reihenfolge sein. Unsortierte Vektoren werden sortiert, mit einer Warnung.