R语言ggplot2怎样画带有空白格的热图

发布时间:2021-11-22 15:12:56 作者:柒染
来源:亿速云 阅读:525
# R语言ggplot2怎样画带有空白格的热图

## 引言

热图(Heatmap)是数据可视化中常用的工具,能够直观地展示矩阵型数据的分布和模式。在实际应用中,我们经常遇到数据矩阵中存在缺失值或需要刻意留白的情况。本文将详细介绍如何使用R语言中的`ggplot2`包绘制带有空白格的热图,涵盖数据预处理、基础热图绘制、空白格处理技巧以及高级定制化方法。

---

## 一、准备工作

### 1.1 安装和加载必要包
```r
install.packages(c("ggplot2", "reshape2", "tidyverse"))
library(ggplot2)
library(reshape2)  # 用于数据长宽格式转换
library(tidyverse)  # 提供数据操作支持

1.2 创建示例数据

我们生成一个包含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

二、基础热图绘制

2.1 数据转换

ggplot2需要长格式数据,使用melt()函数转换:

data_long <- melt(data_matrix, na.rm = FALSE)
colnames(data_long) <- c("Row", "Column", "Value")

2.2 最简单的热图

ggplot(data_long, aes(x = Column, y = Row, fill = Value)) +
  geom_tile() +
  scale_fill_gradient2(low = "blue", mid = "white", high = "red") +
  theme_minimal()

三、处理空白格的三种方法

3.1 自动隐藏NA值(默认显示为灰色)

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)

3.2 完全透明化空白格

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)

3.3 自定义空白格样式

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)

四、高级定制技巧

4.1 添加单元格文本标签

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")

4.2 分面热图(Facet Heatmap)

当需要按分组绘制热图时:

# 添加分组列
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))

4.3 非对称热图布局

处理行列数不一致的情况:

# 创建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)  # 调整纵横比

五、实际案例演示

5.1 基因表达矩阵可视化

# 加载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))

5.2 商业数据仪表板

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)

六、常见问题解答

Q1: 如何调整色阶范围?

ggplot(data_long, aes(Column, Row, fill = Value)) +
  geom_tile() +
  scale_fill_gradient2(
    limits = c(-3, 3),  # 固定色阶范围
    na.value = "grey90"
  )

Q2: 如何处理超大矩阵?

建议: 1. 使用geom_raster()代替geom_tile()提升性能 2. 对数据进行聚合或采样 3. 考虑使用ComplexHeatmap等专业包

Q3: 如何导出高清图片?

ggsave("heatmap.png", plot = last_plot(), 
       width = 10, height = 8, dpi = 300)

结语

本文系统介绍了使用ggplot2绘制带空白格热图的全流程方法。通过灵活运用na.value参数和分层绘图思想,可以创建出高度定制化的热图可视化效果。建议读者结合自身数据特点,选择合适的空白格处理策略,并尝试文中提供的高级定制技巧来提升图表表现力。

注意:所有代码已在R 4.2.0 + ggplot2 3.4.0环境下测试通过 “`

推荐阅读:
  1. 怎么在R语言中使用ggplot2画图
  2. 如何用R语言ggplot2画环状柱形图

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

r语言

上一篇:android中页面切换和常用方法执行顺序是怎么样的

下一篇:c语言怎么实现含递归清场版扫雷游戏

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》