2013-12-12 6 views
12

Ich habe Daten zuzuordnen, die wie folgt aussieht:Wie Sie Ihre Farbskala auf Rohdaten in heatmap.2()

      Name h1 h2 h3 h4 h5 
1   1420468_at_Asb17 0.000 2.328 0.000 0.000 0.000 
2 1430261_at_1700024J04Rik 1.236 2.050 0.000 0.000 0.000 
3   1431788_at_Fabp12 0.000 2.150 0.000 0.000 0.587 
4 1433187_at_B230112I24Rik 0.000 2.240 1.343 0.000 1.383 
5  1434430_s_at_Adora2b 0.000 2.006 1.459 0.000 1.272 
6   1435217_at_Gm7969 0.727 2.350 1.494 0.976 0.000 
7   1436717_x_at_Hbb-y 0.000 2.712 0.000 0.000 0.000 
8   1440859_at_Akap6 0.000 2.053 0.000 0.000 1.840 
9    1442625_at_--- 0.000 2.064 1.173 0.000 1.035 
10   1443715_at_Rbm24 0.969 2.219 0.000 0.000 0.000 
11    1445520_at_--- 0.000 2.497 0.000 0.000 0.000 
12   1446035_at_Gm7173 0.000 3.869 0.000 0.000 0.000 
13 1446597_at_6820445E23Rik 1.000 2.000 0.000 0.000 0.000 
14   1448925_at_Twist2 0.000 2.089 0.938 0.000 0.000 
15  1449711_at_Atp6v1e1 0.605 2.363 2.350 1.094 0.976 
16   1455931_at_Chrna3 0.000 2.354 0.000 0.000 0.000 
17 1457647_x_at_1600023N17Rik 0.000 2.734 0.000 0.000 1.812 
18    1458975_at_--- 0.000 2.079 0.000 0.000 0.000 
19    1459862_at_--- 0.727 2.606 0.000 0.000 1.151 

Hinweis in diese Daten (und die tatsächliche ein) gibt es keine negativen Werte und die positive Werte können so groß wie 100 oder so sein.

Was ich tun möchte, ist Heatmap mit meiner eigenen zugeordneten Farbskala und Schema zeichnen:

  1. Wenn der Wert 0 gesetzt es in Weiß.
  2. Wenn der Wert == 1 ist, setze ihn in Schwarz.
  3. Wenn der Wert> 1 ist, setzen Sie ihn in Rotschattierung.
  4. Wenn der Wert < ist 1 und> 0 setzen Sie es in den Schatten der Greens.

auch ohne Verwendung von Datenskalierung oder integrierte Z-Score-Transformation. Wie kann ich das erreichen?

Mein aktueller Code ist dies:

library(gplots) 

# Read data 
dat <- read.table("http://dpaste.com/1501148/plain/",sep="\t",header=T); 
rownames(dat) <- dat$Name 
dat <- dat[,!names(dat) %in% c("Name")] 

# Clustering and distance measure functions 
hclustfunc <- function(x) hclust(x, method="complete") 
distfunc <- function(x) dist(x,method="maximum") 

# Define colours 
hmcols <- rev(redgreen(2750)); 

# Plot 
pdf("~/Desktop/tmp.pdf",height=10) 
heatmap.2(as.matrix(dat),Colv=FALSE,dendrogram="row",scale="row",col=hmcols,trace="none", margin=c(5,10), hclust=hclustfunc,distfun=distfunc,lwid=c(1.5,2.0),keysize=1); 
dev.off() 

Welche die folgende Handlung erzeugt, wo es die Z-Score Reihe Skalierung Standard verwendet.

enter image description here

+0

Bitte bereinigen Sie die Frage und entfernen Sie nicht benötigte Teile, es ist jetzt schwer zu verstehen. –

Antwort

10

Der Schlüssel hier ist zu verstehen, dass heatmap.2 das mit dem breaks Argumente col Argument in Kombination verwendet.

Werfen Sie einen Blick auf den Code und Abbildung unten, um zu sehen, was ich meine.

library(gplots) 
set.seed(100) 
dat = matrix(rexp(25,1/2), ncol=5) 
breaks = 0:5 
col = c("green","blue","red","yellow","brown") 
heatmap.2(dat, breaks=breaks, col=col) 

enter image description here

Wie Sie sehen können, muss es n-1 Farben für n Pausen sein. Für Ihre spezielle Frage besteht das Problem darin, den Unterbrechungen die richtigen Farben zuzuordnen. Ich verwende die scale="none" Option, wie @josilber wies darauf hin.

breaks = seq(0,max(dat),length.out=1000) 
gradient1 = colorpanel(sum(breaks[-1]<=1), "white", "green", "black") 
gradient2 = colorpanel(sum(breaks[-1]>1), "black", "red") 
hm.colors = c(gradient1,gradient2) 

heatmap.2(as.matrix(dat),scale="none",breaks=breaks,col=hm.colors, 
      Colv=FALSE,dendrogram="row",trace="none", 
      margin=c(5,10), hclust=hclustfunc,distfun=distfunc,lwid=c(1.5,2.0)) 

enter image description here

Eine weitere Alternative wäre, zwei Steigungen haben: grün-> schwarz und schwarz-> rot. Dann könnten Sie die Nullwerte manuell auf Weiß setzen, indem Sie sie NA und na.color="white" setzen.

breaks = seq(0,max(dat),length.out=1000) 
gradient1 = colorpanel(sum(breaks[-1]<=1), "green", "black") 
gradient2 = colorpanel(sum(breaks[-1]>1), "black", "red") 
hm.colors = c(gradient1,gradient2) 

dat[dat==0] = NA 
heatmap.2(as.matrix(dat),scale="none",breaks=breaks,col=hm.colors,na.color="white", 
      Colv=FALSE,dendrogram="row",trace="none", 
      margin=c(5,10), hclust=hclustfunc,distfun=distfunc,lwid=c(1.5,2.0)) 

Und schließlich könnten Sie nur manuell den Gradienten für die Nullwerte bearbeiten.

breaks = seq(0,max(dat),length.out=1000) 
gradient1 = colorpanel(sum(breaks[-1]<=1), "green", "black") 
gradient2 = colorpanel(sum(breaks[-1]>1), "black", "red") 
hm.colors = c(gradient1,gradient2) 
hm.colors[1] = col2hex("white") 

heatmap.2(as.matrix(dat),scale="none",breaks=breaks,col=hm.colors,na.color="white", 
      Colv=FALSE,dendrogram="row",trace="none", 
      margin=c(5,10), hclust=hclustfunc,distfun=distfunc,lwid=c(1.5,2.0)) 

enter image description here

Log Falte ändert

Auf einer anderen Anmerkung, es scheint, dass Sie bei fold Änderungen oder irgendeine Art von Verhältnis könnte suchen. Es ist ziemlich üblich, die Änderungen der Protokollfaltung aufzuzeichnen, wenn eine Heatmap erstellt wird. Ich habe die Nullwerte "ausgegraut".

dat[dat==0] = NA 
heatmap.2(as.matrix(log2(dat)), col=greenred(100), 
      scale="none", na.color="grey",symbreaks=TRUE, 
      Colv=FALSE,dendrogram="row",trace="none", 
      margin=c(5,10), hclust=hclustfunc,distfun=distfunc,lwid=c(1.5,2.0)) 

enter image description here

Für eine Erklärung der schönen Lösung des @ josilber:

Dieser Code hmcols <- c(colfunc1(200), colfunc2(200*(max(dat) - 1))) macht einen Zeichenvektor der Länge 774 (gesehen von length(hmcols)). Das bedeutet, dass 775 Pausen definiert werden müssen. Die heatmap.2 Funktion macht standardmäßig n+1 bricht wo n ist die Länge des Vektors in der col Argument verwendet. So ist die Nummer der Pausen und Farben ausgearbeitet, aber wie bildet hmcols <- c(colfunc1(200), colfunc2(200*(max(dat) - 1))) die Farben zu den Pausen korrekt ab? Der Trick ist in cleverer Weise, dass der Vektor hmcols erstellt wurde. Die Anzahl der Farben im ersten Farbverlauf beträgt 200. Da breaks nicht explizit definiert wurde, wissen wir, dass die Abstände gleichmäßig verteilt sind. Da der erste Gradient von 0 nach 1 geht und es 200 Pausen gibt, sollte die Breite jeder Pause 0,005 (oder 1/200) betragen. Da der zweite Gradient von 1 bis 3.869 (max(dat)) geht, sollte es 2.869/0.005 = 573.8 Pausen geben (574 Pausen beim Aufrunden). Beachten Sie, dass die 200*(max(dat) - 1)) diese Berechnung durchführt; es gibt 573.8 aus. Somit werden dann 200 + 574 Farben den richtigen Pausen zugeordnet und alles funktioniert!

4

Ich denke, es gibt zwei Dinge hier. Die erste ist, wie man die Z-Scores los wird. Dies kann mit dem scale="none" Parameter zu heatmap.2 erfolgen.

Die andere Frage umgibt Ihre gewünschte Steigung. Ich verließ mich für diesen Teil auf colorRampPalette. Im Folgenden konstruiere ich einen Gradienten, der für die Werte 0 bis 1 weiß -> grün -> schwarz wird und dann schwarz wird -> rot für Werte 1 ->max(dat).

library(gplots) 

# Read data 
dat <- read.table("http://dpaste.com/1501148/plain/",sep="\t",header=T); 
rownames(dat) <- dat$Name 
dat <- dat[,!names(dat) %in% c("Name")] 

# Clustering and distance measure functions 
hclustfunc <- function(x) hclust(x, method="complete") 
distfunc <- function(x) dist(x,method="maximum") 

# Define colours 
colfunc1 <- colorRampPalette(c("white", "green", "black")) 
colfunc2 <- colorRampPalette(c("black", "red")) 
hmcols <- c(colfunc1(200), colfunc2(200*(max(dat) - 1))) 

# Plot 
pdf("~/Desktop/tmp.pdf",height=10) 
heatmap.2(as.matrix(dat),Colv=FALSE,dendrogram="row",scale="none",col=hmcols,trace="none", margin=c(5,10), hclust=hclustfunc,distfun=distfunc,lwid=c(1.5,2.0),keysize=1); 
dev.off() 

enter image description here

3

Das Hauptthema hier ist, Breaks und spezifische Farben für jeden Bruch zu definieren. Dies kann durch Verwendung der Heatmap.2-Funktion erreicht werden.

library(gplots) 
library(RColorBrewer) 

#Table formatting 
rownames(df)<-df[,1] #setting row names 
df<-as.matrix(df[,-1]) 

# Defining breaks for the color scale! 
##defining color scale 

myCol <- c("white",colorRampPalette(c("green","darkgreen"))(100),"black",colorRampPalette(c("red","darkred")) (100)) 
#you can change the colors here. 
#It is important to have the total number of colors defined for all the breaks. 
#i.e if the number of breaks is 100, then there should be 99 colors defined. 
#You can change the gradient of the shades by changing no of splots, 
#I have used 100 here 

##defining breaks 
myBreaks <- c(-1,0,seq(1e-5,1-1e-5,length=100),1,seq(1+1e-3,200,length=100)) 

#set your break start/end and the length here 
# I have set it as per your requirements here. Teh shades 

#Plotting heatmap 

pdf("temporal_data.pdf",width=8,height=8) 
hm <- heatmap.2(df, scale="none", Colv=NA, 
       col = myCol, ## using your colors 
       breaks = myBreaks, ## using your breaks 
       dendrogram = "row", ## row dendograms 
       , cexRow=1, cexCol=1, key=FALSE, 
       margins = c(2, 12),trace="none") 
legend("topleft", fill = c("white","green","black","red"), 
     legend = c("0", "0.0001 to 0.999", "1",">1"),cex=1,horiz =TRUE) 
dev.off() 
Verwandte Themen