Given a distance matrix - does anybody have any suggestions for software for producing heatmaps that is compatible with Linux. I have tried in R but it just doesn't look 'nice'.
Thanks, D.
Given a distance matrix - does anybody have any suggestions for software for producing heatmaps that is compatible with Linux. I have tried in R but it just doesn't look 'nice'.
Thanks, D.
Nice is a relative term, what you probably mean that you want to customize it in a way that is not immediately available with the existing heatmap.
As it has been already mentioned by Michael in a comment (I'll add it here since I'd consider that an answer as well) you might want to consider alternative plotting libraries such as:
Here is an awesome function using ggplot to generate a heatmap(ggheat) and producing visually appealing heatmaps. Available at this post: http://rforcancer.drupalgardens.com/content/ggheat-ggplot2-style-heatmap-function
## m=matrix(data=sample(rnorm(100,mean=0,sd=2)), ncol=10)
## this function makes a graphically appealing heatmap (no dendrogram) using ggplot
## whilst it contains fewer options than gplots::heatmap.2 I prefer its style and flexibility
ggheat=function(m, rescaling='none', clustering='none', labCol=T, labRow=T, border=FALSE,
heatscale= c(low='blue',high='red'))
{
## the function can be be viewed as a two step process
## 1. using the rehape package and other funcs the data is clustered, scaled, and reshaped
## using simple options or by a user supplied function
## 2. with the now reshaped data the plot, the chosen labels and plot style are built
require(reshape)
require(ggplot2)
## you can either scale by row or column not both!
## if you wish to scale by both or use a different scale method then simply supply a scale
## function instead NB scale is a base funct
if(is.function(rescaling))
{
m=rescaling(m)
}
else
{
if(rescaling=='column')
m=scale(m, center=T)
if(rescaling=='row')
m=t(scale(t(m),center=T))
}
## I have supplied the default cluster and euclidean distance- and chose to cluster after scaling
## if you want a different distance/cluster method-- or to cluster and then scale
## then you can supply a custom function
if(is.function(clustering))
{
m=clustering(m)
}else
{
if(clustering=='row')
m=m[hclust(dist(m))$order, ]
if(clustering=='column')
m=m[,hclust(dist(t(m)))$order]
if(clustering=='both')
m=m[hclust(dist(m))$order ,hclust(dist(t(m)))$order]
}
## this is just reshaping into a ggplot format matrix and making a ggplot layer
numrows=dim(m)[1]
numcols=dim(m)[2]
melt.m=cbind(rowInd=rep(1:numrows, times=numcols), colInd=rep(1:numcols, each=numrows) ,melt(m))
g=ggplot(data=melt.m)
## add the heat tiles with or without a white border for clarity
if(border==TRUE)
g2=g+geom_rect(aes(xmin=colInd-1,xmax=colInd,ymin=rowInd-1,ymax=rowInd, fill=value),colour='white')
if(border==FALSE)
g2=g+geom_rect(aes(xmin=colInd-1,xmax=colInd,ymin=rowInd-1,ymax=rowInd, fill=value))
## add axis labels either supplied or from the colnames rownames of the matrix
if(length(labCol)==numcols)
{
g2=g2+scale_x_continuous(breaks=(1:numcols)-0.5, labels=labCol)
}else
{
if(labCol==T)
g2=g2+scale_x_continuous(breaks=(1:numcols)-0.5, labels=colnames(m))
if(labCol==F)
g2=g2+scale_x_continuous(breaks=(1:numcols)-0.5, labels=rep('',numcols))
}
if(length(labRow)==numrows)
{
g2=g2+scale_y_continuous(breaks=(1:numrows)-0.5, labels=labRow)
}else
{
if(labRow==T)
g2=g2+scale_y_continuous(breaks=(1:numrows)-0.5, labels=rownames(m))
if(labRow==F)
g2=g2+scale_y_continuous(breaks=(1:numrows)-0.5, labels=rep('',numrows))
}
## get rid of grey panel background and gridlines
g2=g2+opts(panel.grid.minor=theme_line(colour=NA), panel.grid.major=theme_line(colour=NA),
panel.background=theme_rect(fill=NA, colour=NA))
## finally add the fill colour ramp of your choice (default is blue to red)-- and return
return(g2+scale_fill_continuous("", heatscale[1], heatscale[2]))
}
Usage:(ripped from the same page)
data(mtcars)
x=as.matrix(mtcars)
ggheat(x, clustering='column', rescaling='row', heatscale=c(low='red', high='yellow'))
I have found the following web app / source code to be a great way to visualize data as a heatmap. It is customizable enough for my needs while having almost no learning curve. Platform independant as well as it is written in C.
http://www.bioinformatics.ubc.ca/matrix2png/index.html
Update: If you are not opposed to doing a little programming, the python graphing class matlibplot has a nice heatmap output. An example with code can be found here: http://stackoverflow.com/questions/2369492/generate-a-heatmap-in-matplotlib-using-a-scatter-data-set
Use of this site constitutes acceptance of our User Agreement and Privacy Policy.
in short: use ggplot (or heatmap.2) instead of the standard heatmap command
What do you mean by not nice, which function did you use, how do you want it to look?
There were some tools listed in these questions: