У меня есть два формата моих данных о смертности, один в виде списка, который вы получаете из базы данных о человеческой смертности, с мужскими, женскими и комбинированными данными в столбцах. Другой формат разделен на мужские и женские матрицы, где в каждой матрице указаны только возраст, год и коэффициент смертности.
Первый формат по линиям
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(.)
Кто-нибудь знает, как лучше создать тепловую карту или что я здесь сделал не так?
Ответ 1 · рейтинг 1 · Heroka
Это хоть как-то полезно? Я основал его на том, как выглядят ваши данные, и сгенерировал некоторые данные для сопоставления. Затем я начал с графика с "годом" по оси 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
Ответ 2 · рейтинг 1 · Tgsmith61591
Из исходного кода:
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), и вы увидите, что это min и max переданного вами breaks arg (который в данном случае равен -1 и 1 соответственно). Параметр by во внутренней функции seq принимает значение 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 (т. е. если это значение равно 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 пустым или указать одно значение, вы не должны столкнуться с этой проблемой.