【问题标题】:Heat map of binary data using R or Python使用 R 或 Python 的二进制数据热图
【发布时间】:2012-05-01 11:43:55
【问题描述】:

我有一个 0 和 1 的二进制数据集,其中 0 表示不存在,1 表示存在事件。

数据集的样本如下所示:

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

我想通过从文件中读取数据,以热图的形式获得此数据的红白相间的图片。

【问题讨论】:

  • 我为此使用 MeV 软件,但不知何故(我认为是因为数据的二进制性质)结果要么是全红,要么是全白。
  • @Angelo 我假设您希望看到pythonR 解决方案的标签。如果是这样,下次请在问题中说明。
  • 看看 ggplot2 中的平铺几何图形是一个不错的选择。
  • 我猜从文件部分读取数据是已知的还是单独的问题?

标签: python r


【解决方案1】:

编辑:针对下面的 cmets,这里是一个示例数据文件(以“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

【讨论】:

  • 如何读取二进制矩阵,而不是键入 A = [[0,1],[1,0],[0,0]] ?
  • @Angelo 是文件中的数据,它与您的问题中发布的内容完全一致吗?如果是这样,我将编辑我的问题以显示如何从文件中读取 - 如果没有,请告诉我您的数据是什么样的。就目前而言,A 二进制矩阵(即零和一的二维数组)。
  • 它是一种类似的 133 行 4 列数据矩阵,其中 column1 包含事件,而列 2,3,4 包含二进制数据(0 或 1),指示是否发生了事件是否在那个国家。
  • @Angelo 我已经编辑了答案以更准确地反映您的数据。您现在可以将“data.txt”更改为您想要的任何内容,应从第一列抓取标签,并正确拉出后续列。
  • 图片不错但是很小。如何增加图片尺寸?
【解决方案2】:

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

这给了

要反过来得到热图,转置dat (image(z = t(dat), ....)) 并进行axis() 调用,将第一个调用中的side 更改为2,第二个调用更改为1 (并将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)

【讨论】:

  • 我怎样才能读取一个文件,就像问题中的文件一样,仍然得到相同的结果。
  • 查看 ?read.table 了解大多数分隔类型。如果您的“文件”更复杂,则有 R Data Import/Export 手册。在 CRAN 上查找手册。
【解决方案3】:

在 R 中使用 reshape 和 ggplot2

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

【讨论】:

  • 我怎样才能将输入作为文件而不是 dat
【解决方案4】:

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

【讨论】:

  • 如何增加字体大小?这就是我正在做的 1. dat_matrix
  • labsize=2 将使文本大小为 2。尝试不同的大小以获得您想要的,即 visweb(mat,type="None",labsize=2)
  • 我认为可以用plotsize=12控制绘图大小
【解决方案5】:

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

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

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

【讨论】:

    猜你喜欢
    • 2018-09-25
    • 1970-01-01
    • 2015-04-15
    • 1970-01-01
    • 2012-11-30
    • 1970-01-01
    • 2014-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多