2017-08-04 11 views
0

Je me bats avec ggplot2 en dépit de trouver une question assez similaire, je n'ai pas réussi à le faire fonctionner. Je souhaite réorganiser par colonne et ligne une carte thermique basée sur un clustering hiérarchique.ggplot2 réécriture base de heatmap sur la classification hiérarchique

ici mon code actuel:

# import 
library("ggplot2") 
library("scales") 
library("reshape2") 

# data loading 
data_frame = read.csv(file=input_file, header=TRUE, row.names=1, sep='\t') 

# clustering with hclust on row and on column 
dd.col <- as.dendrogram(hclust(dist(data_frame))) 
dd.row <- as.dendrogram(hclust(dist(t(data_frame)))) 

# ordering based on clustering 
col.ord <- order.dendrogram(dd.col) 
row.ord <- order.dendrogram(dd.row) 


# making a new data frame reordered 
new_df = as.data.frame(data_frame[col.ord, row.ord]) 
print(new_df) # when mannualy looking new_df it seems working 

# get the row name 
name = as.factor(row.names(new_df)) 

# reshape 
melte_df = melt(cbind(name, new_df)) 

# the solution is here to reorder the name column factors levels. 
melte_df$name = factor(melte_df$name, levels = row.names(data_frame)[as.vector(row.ord)]) 

# ggplot2 dark magic 
(p <- ggplot(melte_df, aes(variable, name)) + geom_tile(aes(fill = value), 
colour = "white") + scale_fill_gradient(low = "white", 
high = "steelblue") + theme(text=element_text(size=12), 
axis.text.y=element_text(size=3))) 

# save fig 
ggsave(file = "test.pdf") 

# result is ordered as only by column what I have missed? 

Je suis tout à fait Newby avec R si vous pouvez développer votre réponse, vous serez les bienvenus.

Répondre

1

Sans un ensemble de données exemple à reproduire, je ne suis pas sûr à 100% c'est la raison, mais je suppose que votre problème repose sur cette ligne:

name = as.factor(row.names(new_df)) 

Lorsque vous utilisez un facteur, l'ordre est basé sur l'ordre des niveaux de ce facteur. Vous pouvez réorganiser votre cadre de données autant que vous le souhaitez, l'ordre utilisé lors du tracé sera l'ordre de vos niveaux.

Voici un exemple:

data_frame <- data.frame(x = c("apple", "banana", "peach"), y = c(50, 30, 70)) 
data_frame 
     x y 
1 apple 50 
2 banana 30 
3 peach 70 

data_frame$x <- as.factor(data_frame$x) # Make x column a factor 

levels(data_frame$x) # This shows the levels of your factor 
[1] "apple" "banana" "peach" 

data_frame <- data_frame[order(data_frame$y),] # Order by value of y 
data_frame 
    x y 
2 banana 30 
1 apple 50 
3 peach 70 

# Now let's plot it: 
p <- ggplot(data_frame, aes(x)) + geom_bar(aes(weight=y)) 
p 

Ceci est le résultat:

example-result

Voir? Ce n'est pas ordonné par la valeur y que nous voulions. Il est ordonné par les niveaux du facteur. Maintenant, si c'est vraiment là où réside votre problème, il y a des solutions ici R - Order a factor based on value in one or more other columns.

Un exemple appliqué de la solution avec dplyr:

library(dplyr) 
data_frame <- data_frame %>% 
     arrange(y) %>%   # sort your dataframe 
     mutate(x = factor(x,x)) # reset your factor-column based on that order 

data_frame 
     x y 
1 banana 30 
2 apple 50 
3 peach 70 

levels(data_frame$x) # Levels of the factor are reordered! 
[1] "banana" "apple" "peach" 

p <- ggplot(data_frame, aes(x)) + geom_bar(aes(weight=y)) 
p 

Ceci est le résultat aujourd'hui:

enter image description here

J'espère que cette aide, sinon, vous voudrez peut-être donner un exemple de votre jeu de données original!

+0

Votre réponse était vraiment utile pour signaler les problèmes. Mais à la fin, je trouve un moyen plus pratique. en réordonnant les niveaux de facteurs. Je vais éditer ma question pour ajouter ce qui fonctionne, mais merci encore pour votre aide. –