您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# 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进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。