从死亡率数据创建热图?

Creating a heatmap from Mortality Data?

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

第一种格式是

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

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

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

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

这有什么帮助吗?我基于你的数据看起来像什么,并生成了一些数据来匹配。 然后我开始绘制 x 轴为 'year'、y 轴为 'age' 的图,每个点都有一个正方形 (geom_tile)。这些方块根据 'total' 着色。它没有像您给出的示例那样的任何多边形,但我认为使用您的真实数据可以让您寻找同类群组效应。

#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

来自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 arg 的最小值和最大值(在本例中分别为 -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(.)

这里有两个含义:首先,您发现了一个破坏该代码的 cornercase,这是一个可能应该在 github repository 上报告的错误(即,如果它的计算结果为 0 ,使用一些预定义的 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 留空或提供单个值,您应该不会遇到此问题。