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 将(数字)值重新排序为字母的主要内容,如果未能解决你的问题,请参考以下文章

使用 ggplot2 在 r 中为热图准备数据框

ggplot2 热图绘制

R语言与医学统计图形-17ggplot2几何对象之热图

热图绘制

如何制作带有大矩阵的热图?

使用 ggplot2 将显着性级别添加到矩阵相关热图