【问题标题】:Creating a heatmap from Mortality Data?从死亡率数据创建热图?
【发布时间】:2015-11-04 15:30:41
【问题描述】:

我的死亡率数据有两种格式,一种是您从人类死亡率数据库中获得的列表形式,男性、女性和综合数据都在列中。另一种格式分为男性和女性矩阵,每个矩阵中只有年龄、年份和死亡率。

第一种格式类似于

Year Age   Female     Male    Total  
1961  99     0.3       0.4     0.3  
1961  98     0.4       0.5     0.4  

等等。

我分离出来获取数据的第二种格式是:

 Age 1961  1962  1963 .....  
  0  0.02  0.02  0.02 ...  
  1  0.002 0.002 0.002....  

等等。

我希望能够绘制热图,以便查看队列效应等。

我尝试了通过在线搜索找到的各种方法,但这些方法不适用于我的数据呈现方式。我制作的热图完全是红色的。有人可以帮忙吗?

我试过这个:

rnames <- France[,1]   #assign labels in column 1 to "rnames"
mat_data <- data.matrix(France[,2:ncol(France)])
rownames(mat_data) <- rnames #assign row names
col_breaks = c(seq(-1,0,length=100),  # for red
  seq(0,0.8,length=100),              # for yellow
  seq(0.8,1,length=100))              # for green
my_palette <- colorRampPalette(c("red", "yellow", "green"))(n = 299)
png("location",    # create PNG for the heat map        
  width = 5*300,        # 5 x 300 pixels
  height = 5*300,
  res = 300,            # 300 pixels per inch
  pointsize = 8)        # smaller font size

heatmap.2(mat_data,
cellnote=mat_data,
main="Correlation",
notecol="black",
trace="none",
margins =c(12,9),
col=my_palette,
breaks=col_breaks,
dendrogram="row",
Colv="NA")
dev.off()

这会创建一个纯红色热图,底部列出年份,然后是年份旁边的单词 Age,然后是 y 轴列出的实际年龄。它还给了我一个错误代码:

Error in seq.default(min.raw, max.raw, by = min(diff(breaks)/4)) : 
invalid (to - from)/by in seq(.)

有谁知道生成热图的更好方法或我在这里做错了什么?

【问题讨论】:

  • 请阅读How to Ask 以及如何创建reproducible example in R。这包括(一些)数据,最好是调用 dput 的输出,以及您自己的代码。
  • @Heroka 我不确定要包含什么,因为我尝试过的所有代码都很长并且失败了这么多?
  • 我们至少需要查看数据示例以及您尝试过的内容。如果事情失败了,我们需要看看错误在哪里以及是什么。
  • @Emma 至少需要一些数据。如果您已经尝试过很多代码,您当然不需要发布所有代码,但也许是最近一次尝试?
  • @Emma 你也可以发布模拟数据,如果版权是一个问题。如果这样做,请确保类型/变量名称匹配。

标签: r heatmap


【解决方案1】:

这有什么帮助吗?我根据你的数据是什么样的,并生成了一些数据来匹配。 然后我从 x 轴上带有“年份”和 y 轴上带有“年龄”的绘图开始,每个点都有一个正方形 (geom_tile)。这些方块根据“总数”着色。它没有像您提供的示例那样的任何多边形,但我认为使用您的真实数据可以让您寻找同期群效应。

#generate some data ranging from 0 to 0.1
set.seed(1000)
France <- expand.grid(Year=1961:2000,Age=20:98)
France$Female <- runif(nrow(France),0,0.05)
France$Male <- runif(nrow(France),0,0.05)
France$Total <- France$Male + France$Female


library(ggplot2)

p1 <- ggplot(France, aes(x=Year,y=Age,fill=Total)) + 
  geom_tile()+ 
  scale_fill_gradientn(colours=rainbow(10))
p1

【讨论】:

  • 好的,所以我尝试为我的数据运行代码,但它显示 Error in eval(expr, envir, enclos) : object 'year' not found ,年份来自我的数据吗?我试过France$year,年龄和总数也一样,但结果是Error in exists(name, envir = env, mode = mode) : argument "env" is missing, with no default,你知道这是什么意思吗?
  • 这意味着我在大写方面很草率。将修复(我使用没有大写的变量名)。
  • 哦,但这正是我想要的!
  • 现在工作得很好,谢谢!配色方案有哪些选择,由于大多数死亡率在 0 到 0.1 之间,因此颜色非常红!不过,我想您对此无能为力。好像0-0.1是红色的还有0.45以上?
  • 我的错误,我根据另一个解决方案的想法(这是错误的)错误地调用了scale_gradientn。你可以玩弄它,使用不同的颜色。
【解决方案2】:

来自source code

z <- seq(min.raw, max.raw, by=min(diff(breaks)/4))

heatmap.2 代码在内部调用 seq 函数并产生您遇到的错误:

Error in seq.default(min.raw, max.raw, by = min(diff(breaks)/4)) : 
    invalid (to - from)/by in seq(.)

min.rawmax.raw 是什么?向上滚动一点(第 640 行),您会看到它们是您传入的 breaks 参数的最小值和最大值(在本例中分别为 -1 和 1)。内部seq 函数中的by 参数计算结果为0:

min(diff(breaks)/4)

事实上,如果您尝试使用这些参数构造seq 函数,您可以复制此错误:

> seq(-1, 1, by=0)
Error in seq.default(-1, 1, by = 0) : invalid (to - from)/by in seq(.)

这里有两个含义:首先,您发现了一个破坏该代码的极端情况,这是一个可能应该在 github repository 上报告的错误(即,如果计算结果为 0,请使用一些 pre -定义by参数)。其次,您可以使用统一的break 参数或不定义它。毕竟,它是一个可选参数。来自文档:

breaks
(optional) Either a numeric vector indicating the splitting points for binning x
into colors, or a integer number of break points to be used, in which case the break
points will be spaced equally between min(x) and max(x).

通过将breaks 留空或提供单个值,您应该不会遇到此问题。

【讨论】:

  • 非常感谢,当您说将breaks 留空时,您究竟是什么意思?我要设置breaks=0,将其留空还是删除?或者完全是什么?
  • 只需从通话中完全删除breaks=col_breaks。所以应该是:heatmap.2(mat_data, cellnote=mat_data, main="Correlation", notecol="black", trace="none", margins =c(12,9), col=my_palette, dendrogram="row", Colv="NA") 试试看会发生什么。
  • 没有任何输出了吗?我试着做p &lt;- heatmap.2(mat_data, cellnote=mat_data, main="Correlation", notecol="black", trace="none", margins =c(12,9), col=my_palette, dendrogram="row", Colv="NA") 然后做p 但它只是想出了很多数字!
猜你喜欢
  • 2022-11-10
  • 2017-12-25
  • 1970-01-01
  • 1970-01-01
  • 2020-02-17
  • 2016-10-25
  • 2020-07-13
  • 2018-10-05
  • 2020-04-08
相关资源
最近更新 更多