2014-08-27 8 views
10

Sehen Sie bitte mein Grundstück unter: enter image description hereCluster-Daten in Heatmap in R ggplot

mein Code:

> head(data) 
       X0  X1  X2  X3  X4  X5  X6  X7  X8  X9 
NM_001001144 6.52334 9.75243 5.62914 6.833650 6.789850 7.421440 8.675330 12.117600 11.551500 7.676900 
NM_001001327 1.89826 3.74708 1.48213 0.590923 2.915120 4.052600 0.758997 3.653680 1.931400 2.487570 
NM_001002267 1.70346 2.72858 2.10879 1.898050 3.063480 4.435810 7.499640 5.038870 11.128700 22.016500 
NM_001003717 6.02279 7.46547 7.39593 7.344080 4.568470 3.347250 2.230450 3.598560 2.470390 4.184450 
NM_001003920 1.06842 1.11961 1.38981 1.054000 0.833823 0.866511 0.795384 0.980946 0.731532 0.949049 
NM_001003953 7.50832 7.13316 4.10741 5.327390 2.311230 1.023050 2.573220 1.883740 3.215150 2.483410 

pd <- as.data.frame(scale(t(data))) 
pd$Time <- sub("_.*", "", rownames(pd)) 
pd.m <- melt(pd) 
pd.m$variable <- as.numeric(factor(pd.m$variable, levels =  rev(as.character(unique(pd.m$variable))), ordered=F)) 
p <- ggplot(pd.m, aes(Time, variable)) 
p + geom_tile(aes(fill = value)) + scale_fill_gradient2(low=muted("blue"), high=muted("red")) + 
    scale_x_discrete(labels=c("0h", "0.25h", "0.5h","1h","2h","3h","6h","12h","24h","48h")) + 
    theme_bw(base_size=20) + theme(axis.text.x=element_text(angle=0, vjust=0.5, hjust=0, size=12), 
    axis.text.y=element_text(size=12), strip.text.y=element_text(angle=0, vjust=0.5, hjust=0.5, size=12), 
    strip.text.x=element_text(size=12)) + labs(y="Genes", x="Time (h)", fill="") 

Gibt es eine Möglichkeit, das Grundstück clustern, so dass die Handlung, die Dynamik in der anzeigt Zeitablauf. Ich möchte das Clustering verwenden, die aus kommt:

hc.cols <- hclust(dist(t(data))) 

enter image description here

+0

Gerade FYI, ich denke, es auf auf SO verpönt ist „gelöst“ auf den Titel Ihrer Frage hinzufügen. Ich habe es entfernt. –

+0

danke! wusste nicht – user3741035

Antwort

9

Sie können dies erreichen, indem die Reihenfolge der Zeitpunkte, in einem Dendrogramm definieren, nachdem Sie hclust auf Ihre Daten angewendet haben:

data <- scale(t(data)) 
ord <- hclust(dist(data, method = "euclidean"), method = "ward.D")$order 
ord 
[1] 2 3 1 4 8 5 6 10 7 9 

Das einzige, was Sie dann tun müssen, ist die Umwandlung der Time-Spalte zu einer factor wo die Faktorstufen werden durch ord bestellt:

pd <- as.data.frame(data) 
pd$Time <- sub("_.*", "", rownames(pd)) 
pd.m <- melt(pd, id.vars = "Time", variable.name = "Gene") 

pd.m$Gene <- factor(pd.m$Gene, levels = colnames(data), labels = seq_along(colnames(data))) 
pd.m$Time <- factor(pd.m$Time, levels = rownames(data)[ord], labels = c("0h", "0.25h", "0.5h","1h","2h","3h","6h","12h","24h","48h")) 

Der Rest von ggplot automatisch erfolgt:

ggplot(pd.m, aes(Time, Gene)) + 
    geom_tile(aes(fill = value)) + 
    scale_fill_gradient2(low=muted("blue"), high=muted("red")) 

enter image description here

+0

genial, genau das, was ich wollte. Sah gut auf den gesamten Datensatz. – user3741035

+0

Entschuldigung, in der ersten Version wurden die Daten durch Gene gruppiert. Dies ist jetzt behoben. Aber beachte, dass die Zeitachse jetzt natürlich nicht in Ordnung ist. Vielleicht möchten Sie also nach Genclustern gruppieren, statt nach Zeit zu gruppieren. Sofern Sie nicht mit der Zeit wiederkehrende Effekte erwarten, wäre dies auch sinnvoller für mich. – Beasterfield

+0

Ich möchte eigentlich die Version, wo es pünktlich geclustert ist. – user3741035

3

ich das nicht glaube, ggplot unterstützt die Box aus, aber Sie können heatmap verwenden:

heatmap(
    as.matrix(dat), Rowv=NA, 
    Colv=as.dendrogram(hclust(dist(t(as.matrix(dat))))) 
) 

enter image description here

Beachten Sie, dass dies nicht wie Ihres aussieht, weil ich nur die head von Ihnen verwende r Daten, nicht die ganze Sache.

Hier spezifizieren wir das Clustering manuell mit einem Dendogramm, das von Ihrem hclust mit dem Colv Argument abgeleitet ist. Sie können das Clustering auch manuell über das Argument Colv angeben, wenn das standardmäßig verwendete nicht mit dem übereinstimmt, was Sie möchten.

+0

Wie setze ich Rowv wie das Dendrogramm oben. – user3741035

+0

Versuchen Sie: 'heatmap (als.matrix (dat), Rowv = NA, Colv = als.dendrogram (hclust (dist (t (as.matrix (dat)))))' – BrodieG

+0

@ user3741035, auch, ich meine, ich meine 'Colv', nicht' Rowv' – BrodieG