r - 如何重新排序具有特定因子顺序的 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
命令中还是在创建传递给绘图函数的数据框对象之前重新排序矩阵中的某些内容。
谢谢
解决方案
类似于 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))
我相信结果图应该是相同的,至少基于这个例子。
推荐阅读
- java - 为什么我不能在迭代时添加到 ListIterator?
- python - 如何测试用户是否可以显示他的个人资料?
- multithreading - XPages:使用线程实现 Java PubSub 订阅
- mysql - 如何将数据从一个数据库迁移到另一个具有不同结构的数据库?
- reactjs - 当我在 input 中使用 value 时,我无法在 input 中输入文本
- wordpress - 尝试在正文中使用带有标题的帖子来实现 axios
- node.js - Api 路由被事件循环中的巨大进程阻塞
- android - 使用 android 构建环境映像和 ruby 运行管道
- php - SYMFONY 4 从我的表单中恢复数据不起作用
- amazon-web-services - 如何更改 Deeplens 在线时间