Answer : You can achieve this by defining the order of Timepoints in a dendrogram after you have applied hclust  to your data:   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   The only thing you have to do then is transforming your Time-column to a factor  where the factor levels are ordered by 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") )   The rest is done by ggplot  automatically:   ggplot( pd....