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

Posted

技术标签:

【中文标题】带有geom_tile的热图如何在不使用构面的情况下根据另一个因素进行划分和重新排序【英文标题】:Heatmap with geom_tile how to divide and reorder based on another factor without using facets 【发布时间】:2021-12-03 03:03:30 【问题描述】:

我有 100 个样本,我用 9 种不同的测试对它们进行测试,这些测试来自几个不同的组。 我想用 X 轴上的样本和 Y 轴上的测试制作热图。

然后我想根据组因子对样本进行分组...并使用“自定义”顺序(例如,在以下示例中) c("c","b","a").)

使用构面很容易,但我计划稍后使其成为圆形(使用 coord_polar),因此我需要将它们保持在一起。

library(tidyverse)

df <- tribble(
  ~sample, ~test, ~group, ~result,
  1, "alpha", "a", 1,
  1, "beta", "a", 1,
  1, "gamma", "a", 1,
  2, "alpha", "a", 0,
  2, "beta", "a", 1,
  2, "gamma", "b", 0,
  3, "alpha", "b", 0,
  3, "beta", "b", 1,
  3, "gamma", "b", 0,
  4, "alpha", "a", 1,
  4, "beta", "a", 1,
  4, "gamma", "a", 0,
  5, "alpha", "b", 0,
  5, "beta", "b", 0,
  5, "gamma", "b", 1,
  6, "alpha", "c", 0,
  6, "beta", "c", 0,
  6, "gamma", "c", 0,
)

df %>%
  mutate(across(c(sample, test, group), as.factor)) %>%
  ggplot(aes(sample, test, fill=result, color=group))+
    geom_tile()+
    theme_void()+
    coord_polar()

谢谢!

【问题讨论】:

【参考方案1】:

我认为问题出在您的数据上,请尝试在 map 函数中更改您的虚拟数据,并将平均值设为 1(例如)

value = unlist(map(c(10000, 10000, 10000), ~ rnorm(3, mean = 1)))

set.seed(1)
# create dummy data
df <- expand_grid(
  color = c("red", "green", "blue"),
  temperature = c("cold", "neutral", "hot")
) %>% mutate(
  value = unlist(map(c(10000, 10000, 10000), ~ rnorm(3, mean = 1)))
)
knitr::kable(df)

# plot with manual breaks
df %>% 
  ggplot() +
  geom_tile(aes(color, temperature, fill = value)) +
  scale_fill_gradientn(#values = c(1, 0, -1) , 
                       colours= rev(c("blue","white", "red"))) +
  ggtitle('Manual values')

【讨论】:

以上是关于带有geom_tile的热图如何在不使用构面的情况下根据另一个因素进行划分和重新排序的主要内容,如果未能解决你的问题,请参考以下文章

我可以在地理地图上叠加 ggplot 热图吗?

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

通过 geom_tile ggplot R 的热图 - 正确组织每月因子的 y 轴水平

R 数据可视化 —— 聚类热图 pheatmap

r中的热图足球比赛

更改 geom_tile() 中的中断