Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Создание тепловой карты на основе данных о смертности?

Автор вопроса: EmmaОтветов: 2

У меня есть два формата моих данных о смертности, один в виде списка, который вы получаете из базы данных о человеческой смертности, с мужскими, женскими и комбинированными данными в столбцах. Другой формат разделен на мужские и женские матрицы, где в каждой матрице указаны только возраст, год и коэффициент смертности.

Первый формат по линиям

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

Кто-нибудь знает, как лучше создать тепловую карту или что я здесь сделал не так?

  • Прочтите Как спросить и как создать воспроизводимый пример на R. Сюда входят (некоторые) данные, предпочтительно вывод вызова dput и ваш собственный код. Heroka 04.11.2015
  • @Heroka Я не был уверен, что включить, потому что весь код, который я пробовал, был очень длинным и так сильно не удался? Emma 04.11.2015
  • Нам нужно увидеть хотя бы пример данных и то, что вы пробовали. Если что-то не получается, нам нужно увидеть, где и в чем ошибка. Tgsmith61591 04.11.2015
  • @Emma хоть какие-то данные нужны. Если вы уже пробовали много кода, вам, конечно, не нужно публиковать его весь, но, может быть, это была последняя попытка? Heroka 04.11.2015
  • @Heroka Сейчас я включил свою ближайшую попытку, я скоро добавлю образец данных! Не уверен, что разрешено из-за законов об авторском праве и т. Д., Хотя Emma 04.11.2015
  • Какая линия его разрывает? R не нравится одна из ваших seq функций, но три, которые я вижу здесь, отлично работают с моей стороны. Есть ли в коде что-то, что не показано? Tgsmith61591 04.11.2015

rheatmap

Ответы

Ответ 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 пустым или указать одно значение, вы не должны столкнуться с этой проблемой.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы