R语言ggplot2实现上三角热图45度旋转及侧边色条添加
R语言上三角矩阵旋转45度及自定义色条实现方案
原有代码存在两个核心问题导致旋转结果不符合预期:
- 旋转中心默认为坐标原点(0,0),而非10×10矩阵的中心位置,导致旋转后整体位置偏移
- 对旋转后的坐标使用
round()舍入,导致多个格子映射到相同坐标,出现重叠和内部缺失值
以下是可直接运行的完整实现代码:
1. 加载依赖包
library(tidyverse) library(patchwork)
2. 生成上三角矩阵基础数据
# 基础数据生成(和原有逻辑一致) x <- 1:10 y <- 1:10 data <- expand.grid(X=x, Y=y) data$X <- as.numeric(data$X) data$Y <- as.numeric(data$Y) data$Z <- 1:(10*10) # 生成上三角矩阵 zz <- t(matrix(data$Z, 10, 10)) zz[lower.tri(zz)] <- NA data$zz <- c(t(zz))
3. 修正旋转逻辑
# 修正旋转函数:以矩阵中心为旋转原点,不做坐标舍入避免重叠 rotate_around_center <- function(df, degree, mat_size = 10) { dfr <- df degree <- pi * degree / 180 # 计算10*10矩阵的中心坐标 center <- (mat_size + 1)/2 # 平移坐标到中心为原点 x_trans <- df$X - center y_trans <- df$Y - center # 顺时针旋转指定角度 dfr$X <- x_trans * cos(degree) + y_trans * sin(degree) dfr$Y <- -x_trans * sin(degree) + y_trans * cos(degree) return(dfr) } data_rot <- rotate_around_center(data, 45)
4. 绘制旋转后热图
p_heatmap <- ggplot(data_rot, aes(X, Y, fill= zz)) + geom_tile() + coord_fixed() + # 保证格子为正方形 scale_fill_gradient(low = "#132B43", high = "#56B1F7", space = "Lab", na.value="white") + theme_void() + theme(legend.position = "none") # 隐藏默认图例,使用自定义侧边色条
5. 生成自定义侧边色条
# 5种颜色,每种覆盖相邻2行,匹配10行数据需求 color_bar_data <- data.frame( y = 1:10, group = rep(1:5, each = 2), fill = rep(c("#E41A1C", "#377EB8", "#4DAF4A", "#984EA3", "#FF7F00"), each = 2) ) p_colorbar <- ggplot(color_bar_data, aes(x = 1, y = y, fill = fill)) + geom_tile() + scale_fill_identity() + theme_void() + theme(legend.position = "none")
6. 拼接热图与色条
# 调整宽度比例,热图占9份,色条占1份 p_final <- p_heatmap + p_colorbar + plot_layout(widths = c(9, 1)) print(p_final)
补充说明
- 可直接修改
color_bar_data的fill字段自定义色条颜色 - 若需要调整色条位置,可修改拼接顺序或
plot_layout的参数 theme_void()替代了原代码中多元素隐藏逻辑,效果一致更简洁
内容的提问来源于stack exchange,提问作者Patrick
相关产品推荐
相关产品推荐

