基于非数字第三变量的热图轴重新排序 - ggplot2

Posted

技术标签:

【中文标题】基于非数字第三变量的热图轴重新排序 - ggplot2【英文标题】:Reorder axis of heatmap based on non-numeric third variable - ggplot2 【发布时间】:2021-08-20 12:52:57 【问题描述】:

我正在 ggplot2 中创建热图,我想重新排列 Y 轴。

查看过去的帖子后,我了解如何根据 X 轴和 Y 轴变量重新排序,但我想根据数据框中的第三个未绘制的非数字变量重新排序 Y 轴.

我的热图显示术语与治疗,但每个术语都有一个源数据库 - 这就是我想要订购术语的地方。 如您所见,术语 A 和 D 来自数据库 2,术语 B 来自数据库 1,术语 C 来自数据库 3。 所以y轴的顺序应该是Term B、Term A、Term D、Term C。 目前排序为 Term D, C, B, A

编辑:这实际上只是我的数据的一部分,我有很多术语,所以不想手动指定顺序。不过我没有太多数据库,所以很乐意手动订购。

library(ggplot2)
terms <- rep(c("Term A", "Term B", "Term C", "Term D"), 3)
treatments <- c(rep("Treatment 1", 4), rep("Treatment 2", 4), rep("Treatment 3", 4))
source <- rep(c("Database 2", "Database 1", "Database 3", "Database 2"), 3)
data <- c(1.923598e-06, 1.307195e-04, 1.307195e-01, 1.307195e-04, 1.740412e-03, 3.446243e-05, 3.834140e-02, 2.654140e-03, 2.976543e-04, 1.111198e-06, 1.376595e-04, 2.923598e-06)
df <- data.frame(terms, treatments, source, data)
ggplot(df, aes(x=treatments, y=terms, fill=-log10(data))) +
  geom_tile()

【问题讨论】:

【参考方案1】:

一个快速的解决方案是添加 scale_y_discrete 并使用 limits 参数,您可以使用源变量对 y 轴进行排序:

 ggplot(df, aes(x=treatments, y=terms, fill=-log10(data))) +
  geom_tile() +scale_y_discrete(limits=unique((df$terms)[order(df$source)]))

【讨论】:

这很好用——但我的问题是我实际上有大约 50 个术语,所以我真的不想手动订购它们。抱歉,我应该更清楚一点。 刚刚编辑了我的答案以适合您的大数据框

以上是关于基于非数字第三变量的热图轴重新排序 - ggplot2的主要内容,如果未能解决你的问题,请参考以下文章

更改seaborn热图的轴标签[重复]

如何分别为不同的列创建热图?

TensorFlow Keras 层中的重新排序轴

r 重新排序条形图或热图中的水平

根据 geom_tile() 热图中的两列值对行重新排序

带有geom_tile的热图如何在不使用构面的情况下根据另一个因素进行划分和重新排序