R:我正在从矩阵制作热图,但 ggplot2 geom_raster 将(数字)值重新排序为字母
Posted
技术标签:
【中文标题】R:我正在从矩阵制作热图,但 ggplot2 geom_raster 将(数字)值重新排序为字母【英文标题】:R: I am making a heatmap from a matrix, but ggplot2 geom_raster reorders the (numerical) values to alphabetic 【发布时间】:2022-01-19 13:53:54 【问题描述】:我正在尝试制作一个显示超过 100 天的直方图的热图。我的数据如下:
>head(dat_from_hist)
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
[1,] 2 3 11 20 16 17 13 10 6 1 1 1 0 0 0
[2,] 2 3 12 26 18 19 7 6 4 3 1 1 0 0 0
[3,] 0 6 8 16 18 15 11 13 7 4 2 1 0 0 0
[4,] 1 6 12 13 14 19 15 12 7 3 3 1 0 0 0
[5,] 1 2 10 17 23 16 14 10 3 3 2 1 0 0 0
[6,] 1 9 11 16 17 18 6 11 4 6 2 0 1 0 0
在此矩阵中,列表示频率(一天内的联系人数),行表示天数。现在原则上,这个矩阵中的数据已经按照我想要的顺序排列了,我只是想用热图/平铺图来表示它。
我尝试使用以下代码用 ggplot2 geom_raster() 绘制它:
dat_from_hist %>%
as.data.frame() %>%
rownames_to_column("Day") %>%
pivot_longer(-c(Day), names_to = "contacts", values_to = "counts") %>%
ggplot(aes(x=contacts, y=Day, fill=counts)) +
geom_tile() +
scale_fill_viridis_c()
但是,像这样绘制它会导致以下情节(因为这是我的第一篇文章,它必须通过链接发布): histogram of contacts over time
主要问题是日期和联系人轴按字母顺序重新排序,我想要两个轴的数字顺序([1,2,3,...] 而不是 [1,10,11,... ])。除了这个问题,剧情正是我想要的。
我已经尝试了多个其他热图/平铺绘图仪,但这个似乎非常接近,必须有一种方法来修复它。对于 geom_raster,我尝试过使用 sort() 和 order()。有谁知道如何解决这个问题并将矩阵绘制成热图而不对列/行进行任何重新排序?
非常感谢任何帮助
【问题讨论】:
将contacts
列转换为pivot_longer
之后的数字。你也可以使用pivot_longer(... , names_transform = list(contacts = as.numeric)
来做到这一点。当然,您可能还必须在值列中这样做。
【参考方案1】:
dat_from_hist %>%
as.data.frame() %>%
rownames_to_column("Day") %>%
pivot_longer(-c(Day), names_to = "contacts", values_to = "counts") %>%
ggplot(aes(x=as.numeric(contacts), y=as.numeric(Day), fill=counts)) +
geom_tile() +
scale_fill_viridis_c()
添加 as.numeric 确实修复了它!谢谢
【讨论】:
以上是关于R:我正在从矩阵制作热图,但 ggplot2 geom_raster 将(数字)值重新排序为字母的主要内容,如果未能解决你的问题,请参考以下文章