2012-05-01 45 views
1

我有一个0和1的二进制数据集,其中0是一个缺席,1是一个事件的存在。使用R或Python的二进制数据的热图

数据集的样本是这样的:

events germany Italy 
Rain  0   1 
hail  1   0 
sunny  0   0 

我想用从文件中读取数据,以得到这个数据在热图形式的红色和白色的画面。

+1

[你有什么尝试?](http://mattgemmell.com/2008/12/08/what-have-you-tried/) – mac

+0

我使用MeV软件,但以某种方式(我认为是因为二进制数据的性质)结果是完全红色或完全白色。 – Angelo

+2

@Angelo我通过标签假设你想看到一个'python'和'R'解决方案。如果是这样,下次请在问题中说明。 – Hooked

回答

2

随着改造并GGPLOT2 R中

library(reshape) 
library(ggplot2) 

dat <- data.frame(weather=c("Rain","Hail","Sunny"), Germany = c(0,1,0), Italy = c(1,0,0)) 

melt.data<-melt(dat, id.vars="weather", variable_name="country") 

qplot(data=melt.data, 
     x=country, 
     y=weather, 
     fill=factor(value), 
     geom="tile")+scale_fill_manual(values=c("0"="white", "1"="red")) 

enter image description here

+0

不错,谢谢 – Angelo

+0

我怎样才能把输入作为一个文件输入,而不是dat < - data.frame(weather = c(“Rain”,“Hail”,“Sunny”),Germany = c(0,1,0),Italy = c(1,0,0)) this例如,线 – Angelo

+0

。 ?read.csv或其他读取函数(readLines ...) –

4

请参阅?image。与您的数据

dat <- data.matrix(data.frame(Germany = c(0,1,0), Italy = c(1,0,0))) 
rownames(dat) <- c("Rain","Hail","Sunny") 

这会让我们接近:

image(z = dat, col = c("white","red")) 

而且更好地处理轴标签的将是不错...尝试:

op <- par(mar = c(5,5,4,2) + 0.1) 
image(z = dat, col = c("white","red"), axes = FALSE) 
axis(side = 1, labels = rownames(dat), 
    at = seq(0, by = 0.5, length.out = nrow(dat))) 
axis(side = 2, labels = colnames(dat), at = c(0,1), las = 1) 
box() 
par(op) 

其中给出

binary heatmap

要具备热图倒过来,转datimage(z = t(dat), ....)),并在axis()电话,在第二个电话的第一和1改变side2(和移动las = 1到其他呼叫。即:

op <- par(mar = c(5,5,4,2) + 0.1) 
image(z = t(dat2), col = c("white","red"), axes = FALSE) 
axis(side = 2, labels = rownames(dat2), 
    at = seq(0, by = 0.5, length.out = nrow(dat2)), las = 1) 
axis(side = 1, labels = colnames(dat2), at = c(0,1)) 
box() 
par(op) 
+0

如何读取文件,如问题中的文件,并仍然得到相同的结果。 – Angelo

+0

有关大多数分隔类型,请参阅?read.table。如果您的“文件”更复杂,则有“R数据导入/导出”手册。在CRAN上查找手册。 –

2

R中尝试:

library(bipartite) 
mat<-matrix(c(0,1,1,0,1,1),byrow=TRUE,nrow=3) 
rownames(mat)<-c("Rain","hail","sunny") 
colnames(mat)<-c("Germany","Italy") 
visweb(mat,type="None") 

的红色方块和标签尺寸控制:

visweb(mat,type="None",labsize=2,square="b",box.col="red") 
+0

如何增加字体大小?这是我在做什么1. dat_matrix <-data.matrix(dat)2. tiff(“presenceGene.tiff”)3. visweb(dat_matrix,type =“None”)4. dev.off()。我得到一个字体非常小的图像 – Angelo

+0

'labsize = 2'将使文本大小为2。尝试不同的大小以获得你想要的东西,即'visweb(mat,type =“None”,labsize = 2)' –

+0

阴谋的大小可以用'plotsize = 12'来控制我认为 –

5

编辑:针对下面的评论,这里是一个样本数据文件(作为“data.txt”保存在磁盘上):

Rain 0 0 0 0 1 0 1 0 0 1 
Hail 0 1 0 0 0 0 0 1 0 0 
Sunny 1 1 1 0 1 0 1 0 1 1 

在Python中,我们可以读到标签和绘制这个由 “热图”:

from numpy import loadtxt 
import pylab as plt 

labels = loadtxt("data.txt", usecols=[0,],dtype=str) 
A  = loadtxt("data.txt", usecols=range(1,10)) 

plt.imshow(A, interpolation='nearest', cmap=plt.cm.Reds) 
plt.yticks(range(A.shape[0]), labels) 

plt.show() 
import pylab as plt 

enter image description here

+0

我怎样才能读取二进制矩阵,而不是键入A = [[0,1],[1,0],[0,0]]? – Angelo

+0

@Angelo是一个文件中的数据,它看起来像什么发布在你的问题?如果是这样,我将编辑我的问题以显示如何从文件读取 - 如果不让我知道您的数据是什么样子的话。因为它表示'A' _is_是一个二进制矩阵(即一个零和一个二维数组)。 – Hooked

+0

它是一种133行4列的相似数据矩阵,列1包含事件,而列2,3,4包含二进制数据(0或1),表示该事件是否发生在该国。 – Angelo

0

可能基R中最简单的解决方案是:

rownames(dat) = dat$weather 
heatmap(as.matrix(dat[,2:3]), scale='none') 

......假设您的数据帧被称为dat。热图并不漂亮,但它快速简单。第一行不是必需的。它仅用于使天气标签显示在热图中。