您好,登录后才能下订单哦!
密码登录
            
            
            
            
        登录注册
            
            
            
        点击 登录注册 即表示同意《亿速云用户服务条款》
        # R语言ggplot2怎样画带有空白格的热图
## 引言
热图(Heatmap)是数据可视化中常用的工具,能够直观地展示矩阵型数据的分布和模式。在实际应用中,我们经常遇到数据矩阵中存在缺失值或需要刻意留白的情况。本文将详细介绍如何使用R语言中的`ggplot2`包绘制带有空白格的热图,涵盖数据预处理、基础热图绘制、空白格处理技巧以及高级定制化方法。
---
## 一、准备工作
### 1.1 安装和加载必要包
```r
install.packages(c("ggplot2", "reshape2", "tidyverse"))
library(ggplot2)
library(reshape2)  # 用于数据长宽格式转换
library(tidyverse)  # 提供数据操作支持
我们生成一个包含NA值的10×10矩阵作为演示数据:
set.seed(123)
data_matrix <- matrix(rnorm(100), nrow = 10)
colnames(data_matrix) <- paste0("Col", 1:10)
rownames(data_matrix) <- paste0("Row", 1:10)
# 随机插入NA值模拟空白格
data_matrix[sample(1:100, 15)] <- NA
ggplot2需要长格式数据,使用melt()函数转换:
data_long <- melt(data_matrix, na.rm = FALSE)
colnames(data_long) <- c("Row", "Column", "Value")
ggplot(data_long, aes(x = Column, y = Row, fill = Value)) +
  geom_tile() +
  scale_fill_gradient2(low = "blue", mid = "white", high = "red") +
  theme_minimal()
p1 <- ggplot(data_long, aes(Column, Row, fill = Value)) +
  geom_tile(colour = "white") +
  scale_fill_gradient2(
    na.value = "grey90",  # 设置NA值的颜色
    low = "blue", mid = "white", high = "red"
  )
print(p1)
p2 <- ggplot(data_long, aes(Column, Row, fill = Value)) +
  geom_tile(colour = "white") +
  scale_fill_gradient2(
    na.value = "transparent",  # 透明处理
    low = "blue", mid = "white", high = "red"
  )
print(p2)
p3 <- ggplot(data_long, aes(Column, Row)) +
  geom_tile(aes(fill = Value), colour = "white") +
  geom_tile(
    data = subset(data_long, is.na(Value)),  # 单独处理NA值
    fill = "black", alpha = 0.3, colour = "white"
  ) +
  scale_fill_gradient2(low = "blue", mid = "white", high = "red")
print(p3)
ggplot(data_long, aes(Column, Row, fill = Value, label = round(Value, 1))) +
  geom_tile(colour = "white") +
  geom_text(data = subset(data_long, !is.na(Value)), size = 3) +
  scale_fill_gradient2(na.value = "grey90")
当需要按分组绘制热图时:
# 添加分组列
data_long$Group <- rep(c("A","B"), each = 50)
ggplot(data_long, aes(Column, Row, fill = Value)) +
  geom_tile() +
  facet_wrap(~Group, ncol = 2) +
  theme(axis.text.x = element_text(angle = 90))
处理行列数不一致的情况:
# 创建7×10的不规则矩阵
irreg_matrix <- matrix(rnorm(70), nrow = 7)
rownames(irreg_matrix) <- paste0("Row", 1:7)
irreg_long <- melt(irreg_matrix)
ggplot(irreg_long, aes(Var2, Var1, fill = value)) +
  geom_tile() +
  coord_fixed(ratio = 0.8)  # 调整纵横比
# 加载airway数据集
library(airway)
data(airway)
exprs <- assay(airway)[1:20, ]
# 处理NA值并转换
exprs_long <- exprs %>% 
  as.data.frame() %>%
  rownames_to_column("Gene") %>%
  pivot_longer(-Gene, names_to = "Sample", values_to = "Count")
ggplot(exprs_long, aes(Sample, Gene, fill = log2(Count+1))) +
  geom_tile(colour = "white") +
  scale_fill_viridis_c(na.value = "transparent") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))
sales_data <- data.frame(
  Product = rep(paste0("P", 1:5), each = 4),
  Quarter = rep(c("Q1","Q2","Q3","Q4"), 5),
  Revenue = c(NA, 230, 180, 205, 150, 160, NA, 210, 190, 220, 240, NA, 130, 140, 150, NA, 200, 180, 190, 210)
)
ggplot(sales_data, aes(Quarter, Product, fill = Revenue)) +
  geom_tile(colour = "black", size = 0.5) +
  geom_text(aes(label = Revenue), colour = "white", size = 4) +
  scale_fill_gradient(low = "steelblue", high = "darkred", na.value = "grey50") +
  labs(title = "季度销售热力图", x = "", y = "") +
  theme_minimal(base_size = 12)
ggplot(data_long, aes(Column, Row, fill = Value)) +
  geom_tile() +
  scale_fill_gradient2(
    limits = c(-3, 3),  # 固定色阶范围
    na.value = "grey90"
  )
建议:
1. 使用geom_raster()代替geom_tile()提升性能
2. 对数据进行聚合或采样
3. 考虑使用ComplexHeatmap等专业包
ggsave("heatmap.png", plot = last_plot(), 
       width = 10, height = 8, dpi = 300)
本文系统介绍了使用ggplot2绘制带空白格热图的全流程方法。通过灵活运用na.value参数和分层绘图思想,可以创建出高度定制化的热图可视化效果。建议读者结合自身数据特点,选择合适的空白格处理策略,并尝试文中提供的高级定制技巧来提升图表表现力。
注意:所有代码已在R 4.2.0 + ggplot2 3.4.0环境下测试通过 “`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。