如何用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
相关产品推荐
相关产品推荐

