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

Reorder axis of heatmap based on non-numeric third variable - ggplot2

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

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

我的热图显示了 Terms 与 Treatments,但每个 Term 都有一个源数据库 - 这就是我想要订购 Terms 的地方。 如您所见,术语 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()

一个快速的解决方案是添加 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)]))