首页 > 解决方案 > 如何重新排序具有特定因子顺序的 ggplot 对象

问题描述

我正在尝试在 ggplot 中制作成对热图。我试图避免使用其他相关绘图程序,因为一些下游美学变化不受 ggplot 支持的方式支持。

我可以使用默认级别生成所需的图:

library(reshape2)
library(dplyr)

mat <- round(cor(mtcars[,2:length(mtcars)]),2)
mat[lower.tri(mat)] <- NA
df <- melt(mat) %>% drop_na()
ggplot(data=df, aes(x=Var1, y=Var2, fill=value)) + geom_tile()

在此处输入图像描述

但是,假设由于某种原因,这些成对比较的顺序是相关的,而我真正需要绘制的是不同的顺序。我对其他地块所做的方法是使用factor(df$x, levels = c("some", "particular", "order),但是如果我在这种情况下尝试类似的方法,那么地块的图块顺序现在也被翻转了。

mat <- round(cor(mtcars[,2:length(mtcars)]),2)
mat[lower.tri(mat)] <- NA
df <- melt(mat) %>% drop_na()
DesiredOrder <- c("cyl", "carb", "disp", "hp", "drat", "wt", "qsec", "vs", "am", "gear")
df$Var1 <- factor(df$Var1, levels = DesiredOrder)
df$Var2 <- factor(df$Var2, levels = DesiredOrder)
ggplot(data=df, aes(x=Var1, y=Var2, fill=value)) + geom_tile()

在此处输入图像描述

似乎这个问题与提供给dcast命令的矩阵的顺序有关,但也许还有另一种方法可以在事后控制最终的绘图顺序。

我将不胜感激有关固定绘图顺序的策略的任何见解,无论是在ggplot命令中还是在创建传递给绘图函数的数据框对象之前重新排序矩阵中的某些内容。

谢谢

标签: rggplot2

解决方案


类似于 Calum You 的回答,除了我gather首先使用矩阵,并使用filter删除对应于下三角形的行:

library(tidyverse)
mat <- round(cor(mtcars[,2:length(mtcars)]),2)
DesiredOrder <- c("cyl", "carb", "disp", "hp", "drat", "wt", "qsec", "vs", "am", "gear")

mat %>%
  as_tibble(rownames = "var1") %>%
  gather(var2, value, -var1) %>%
  mutate_at(vars(var1, var2), ~ factor(., levels = DesiredOrder)) %>%
  filter(as.integer(var1) <= as.integer(var2)) %>%
  ggplot() +
  geom_tile(aes(x = var1, y = var2, fill = value))

我相信结果图应该是相同的,至少基于这个例子。

阴谋


推荐阅读