You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用ggplot2将上三角矩阵图斜向旋转并调整Y轴文本间距?

上三角矩阵热力图的斜向旋转与Y轴文本间距优化

问题1:实现上三角矩阵图的斜向旋转

通过坐标转换将原矩阵行列映射为斜向排列的坐标,配合geom_tile即可实现斜向旋转效果,完整代码如下:

library(ggplot2)
library(reshape2)
library(dplyr)

# 原始矩阵数据
eSim <- c(1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,1)
dim(eSim) <- c(4,4)
rownames(eSim)=c("PosLong\n1200", "PosLong\n1800", "Neglong\n1200", "Neglong\n1800")
colnames(eSim)=c("PosLong\n1200", "PosLong\n1800", "Neglong\n1200", "Neglong\n1800")

# 提取上三角矩阵并转换为长格式
get_upper_tri <- function(cormat){
  cormat[lower.tri(cormat)]<- NA
  return(cormat)
}
eSim_upper <- get_upper_tri(eSim)
melted_eSim_upper <- melt(eSim_upper, na.rm = TRUE)

# 转换为斜向坐标:x = 列索引 + 行索引,y = 列索引 - 行索引
melted_eSim_upper <- melted_eSim_upper %>%
  mutate(
    var1_idx = as.integer(Var1),
    var2_idx = as.integer(Var2),
    x = var2_idx + var1_idx,
    y = var2_idx - var1_idx
  )

# 绘制斜向旋转的上三角热力图
ggplot(data = melted_eSim_upper, aes(x, y, fill = as.factor(value)))+
  geom_tile(color = "black", size=0.8, width = 1.8, height = 1.8)+ # 调整宽高适配斜向排列
  scale_fill_manual(values=c("#8DD3C7", "#FB8072"))+
  # 绑定原行列名称到转换后的坐标轴
  scale_x_continuous(breaks = unique(melted_eSim_upper$x), 
                     labels = unique(melted_eSim_upper$Var2))+
  scale_y_continuous(breaks = unique(melted_eSim_upper$y), 
                     labels = unique(melted_eSim_upper$Var1))+
  theme_minimal()+
  theme(
    axis.text.x = element_text(angle = 45, vjust = 1, size = 12, hjust = 1),
    axis.text.y = element_text(angle = 45, vjust = 1, size = 12, hjust = 1),
    axis.title.x = element_blank(),
    axis.title.y = element_blank(),
    panel.background = element_blank(), 
    panel.grid.major = element_blank(),
    panel.border = element_blank()
  )

问题2:让Y轴文本进一步远离矩阵区域

通过调整axis.text.y的边距参数,同时补充绘图区域外边距避免文本截断,修改后的主题代码如下:

theme(
  axis.text.x = element_text(angle = 45, vjust = 1, size = 12, hjust = 1),
  # 增大Y轴文本左边距,可根据需求调整l值
  axis.text.y = element_text(angle = 45, vjust = 1, size = 12, hjust = 1, 
                             margin = margin(t = 0, r = 0, b = 0, l = 80)),
  axis.title.x = element_blank(),
  axis.title.y = element_blank(),
  panel.background = element_blank(), 
  panel.grid.major = element_blank(),
  panel.border = element_blank(),
  # 增加绘图区域左边距,防止文本被画布截断
  plot.margin = margin(t = 20, r = 20, b = 20, l = 100)
)

内容的提问来源于stack exchange,提问作者Catherine

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 22:05:27