为什么 geom_raster() 没有在我的热图中显示好的列顺序?

问题描述 投票:0回答:1

我使用双三角矩阵 (10x10) 表示这些变量之间的 2 种相关性。 数据集就像这样(4x4)。

ff <- data.frame(Var1=as.factor(c("V1", "V2", "V3","V4", "V1", "V2", "V3","V4", "V1", "V2", "V3","V4", "V1", "V2","V3","V4")),
                 Var2=as.factor(c("V1", "V1", "V1", "V1", "V2", "V2", "V2", "V2", "V3", "V3","V3","V3", "V4", "V4", "V4","V4")),
                 value=c(NA, 0.1, 0.2, 0.2, 
                         0.4, NA, 0.3, 0.4, 
                         0.5, 0.5, NA, 0.3,
                         0.2, 0.3, 0.3, NA))

然后我使用 ggplot2 中的 geom_raster 函数获得 2 个色阶(每个三角矩阵 1 个)+ 灰色单位对角线的颜色(即不存在的同一变量 (NA) 之间的相关性)。我使用了与上一篇文章相同的代码(具有不同颜色和比例 R 的两个对称矩阵上的单个热图

ggplot(ff, aes(Var1, Var2)) +
  # The first layer, with its own fill scale
  geom_raster(
    data = ~ subset(.x, as.numeric(Var1) > as.numeric(Var2)),
    aes(fill = value)
  ) +
  scale_fill_distiller(palette = "Blues") +
  # Declare new fill scale for the second layer
  new_scale_fill() +
  geom_raster(
    data = ~ subset(.x, as.numeric(Var1) < as.numeric(Var2)),
    aes(fill = value)
  ) +
  scale_fill_distiller(palette = "Reds", direction=-1) +
  # I'm not sure what to do with the diagonal. Make it grey?
  new_scale_fill() +
  geom_raster(
    data = ~ subset(.x, as.numeric(Var1) == as.numeric(Var2)),
    aes(fill = value)
  ) +
  scale_fill_distiller(palette = "Greys", guide = "none")

但是,我有点失望,因为正如您在我的输出中看到的(如下),我得到的图表的最终显示存在问题:

heatmap obtained where the last column appearing should be the 1st one I would expect

正如你所看到的,我期望的第一栏现在是最后一栏,我不知道该怎么办。 我尝试重新排序因子变量的级别,但它没有解决问题。 如果有人能帮助我应对这个挑战(对我来说!),我将非常感激

提前非常感谢!

r heatmap correlation geom-raster
1个回答
0
投票

问题来自于绘制热图的第一部分 (Var1 > Var2)。在这种情况下,Var1(x 轴)从 V2 开始。然后,当您绘制第二个时,因为 x 轴是离散的,所以它向右,V1 向右。

首先,一种巧妙的方法是绘制灰色(或您想要的任何颜色)热图作为背景,然后绘制三角形热图:

ggplot(ff, aes(Var1, Var2)) +
    geom_raster(fill = "darkgrey") +
    # The first layer, with its own fill scale
    geom_raster(
        data = ~ subset(.x, as.numeric(Var1) > as.numeric(Var2)),
        aes(fill = value)
    ) +
    scale_fill_distiller(palette = "Blues") +
    # Declare new fill scale for the second layer
    new_scale_fill() +
    geom_raster(
        data = ~ subset(.x, as.numeric(Var1) < as.numeric(Var2)),
        aes(fill = value)
    ) +
    scale_fill_distiller(palette = "Reds", direction=-1)

第二种方法是使用scale_x_discrete重新排序x轴:

ggplot(ff, aes(Var1, Var2)) +
    # The first layer, with its own fill scale
    geom_raster(
        data = ~ subset(.x, as.numeric(Var1) > as.numeric(Var2)),
        aes(fill = value)
    ) +
    scale_fill_distiller(palette = "Blues") +
    # Declare new fill scale for the second layer
    new_scale_fill() +
    geom_raster(
        data = ~ subset(.x, as.numeric(Var1) < as.numeric(Var2)),
        aes(fill = value)
    ) +
    scale_fill_distiller(palette = "Reds", direction=-1) +
    scale_x_discrete(limits = c("V1", "V2", "V3", "V4"))

抱歉,我丢失了对角线部分,它在我的计算机上不起作用,但在第一个示例中,您可以自定义以对角线结束的背景颜色。

我希望这能解决您的问题。

© www.soinside.com 2019 - 2024. All rights reserved.