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

R语言ggplot2实现上三角热图45度旋转及侧边色条添加

R语言上三角矩阵旋转45度及自定义色条实现方案

原有代码存在两个核心问题导致旋转结果不符合预期:

  1. 旋转中心默认为坐标原点(0,0),而非10×10矩阵的中心位置,导致旋转后整体位置偏移
  2. 对旋转后的坐标使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 15:39:01