从死亡率数据创建热图?
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.raw
和 max.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
留空或提供单个值,您应该不会遇到此问题。
我的死亡率数据有两种格式,一种是从人类死亡率数据库中获取的列表形式,男性、女性和组合数据都在列中。另一种格式分为男性和女性矩阵,每个矩阵中只有年龄、年份和死亡率。
第一种格式是
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.raw
和 max.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
留空或提供单个值,您应该不会遇到此问题。