我使用双三角矩阵 (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")
但是,我有点失望,因为正如您在我的输出中看到的(如下),我得到的图表的最终显示存在问题:
正如你所看到的,我期望的第一栏现在是最后一栏,我不知道该怎么办。 我尝试重新排序因子变量的级别,但它没有解决问题。 如果有人能帮助我应对这个挑战(对我来说!),我将非常感激
提前非常感谢!
问题来自于绘制热图的第一部分 (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"))
抱歉,我丢失了对角线部分,它在我的计算机上不起作用,但在第一个示例中,您可以自定义以对角线结束的背景颜色。
我希望这能解决您的问题。