web-dev-qa-db-fra.com

Données de cluster dans la carte thermique dans R ggplot

S'il vous plaît voir mon intrigue ci-dessous: enter image description here

mon 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="")

Existe-t-il un moyen de regrouper le graphe de manière à ce qu'il affiche la dynamique dans le cours du temps. Je voudrais utiliser le clustering qui sort de:

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

enter image description here

13
user3741035

Vous pouvez y parvenir en définissant l'ordre des points horaires dans un dendrogramme après avoir appliqué hclust à vos données: 

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

La seule chose à faire est de transformer votre colonne Time en une variable factor, dans laquelle les niveaux de facteurs sont classés par ord:

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") )

Le reste est fait par ggplot automatiquement:

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

enter image description here

10
Beasterfield

Je ne pense pas que ggplot accepte cette option, mais vous pouvez utiliser heatmap:

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

enter image description here

Notez que cela ne vous ressemblera pas car j'utilise simplement la head de vos données, et non la totalité.

Ici, nous spécifions la classification manuellement avec un dendogramme dérivé de votre hclust avec l'argument Colv. Vous pouvez également spécifier la mise en cluster manuellement via l'argument Colv si celui utilisé par défaut ne correspond pas à ce que vous voulez.

3
BrodieG

Bien que vous n'ayez pas besoin de transformer les colonnes du code data.frame en facteurs, vous pouvez utiliser la fonction scale_*_discrete de ggplot pour définir l'ordre de traçage des axes. Définissez simplement l'ordre de traçage en utilisant l'argument limits et les étiquettes en utilisant l'argument labels comme indiqué ci-dessous. 

data<-read.table(text="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", header = TRUE, stringsAsFactors = FALSE)
data <- scale(t(data))
ord <- hclust( dist(data, method = "euclidean"), method = "ward.D" )$order
pd <- as.data.frame( data )
pd$Time <- sub("_.*", "", rownames(pd))
pd.m <- melt( pd, id.vars = "Time", variable.name = "Gene" )
ggplot( pd.m, aes(Time, Gene) ) +
  geom_tile(aes(fill = value)) +
  scale_x_discrete(limits=pd.m$Time[ord], labels = c("0h", "0.25h", "0.5h","1h","2h","3h","6h","12h","24h","48h"))+
  scale_y_discrete(limits=colnames(data), labels = seq_along(colnames(data)))+
  scale_fill_gradient2(low=muted("blue"), high=muted("red"))

 enter image description here

0
Alex Thomas