可视化对比:ggplot2/matplotlib/plotly
一句话概述:ggplot2是R语言的"图形语法"(发表级静态图首选),matplotlib是Python绑定可视化的基础库(最灵活),plotly做交互式图表最方便——论文发表用ggplot2,Python项目用matplotlib+seaborn,网页展示用plotly。
核心知识点速查表
| 概念 | 说明 |
|---|
| ggplot2 | R语言图形语法系统(白话:用公式搭积木做图) |
| matplotlib | Python可视化基础库(白话:Python画图的"万能工具箱") |
| seaborn | matplotlib的高级封装(统计图更方便) |
| plotly | 交互式可视化库(R+Python都支持) |
| 图形语法 | aes(映射)+geom(几何)+scale(标度)+theme(主题) |
一、四大工具对比
| 特性 | ggplot2 | matplotlib | seaborn | plotly |
|---|
| 语言 | R | Python | Python | R+Python |
| 图表类型 | ★丰富 | ★最丰富 | 统计图 | 交互式 |
| 学习曲线 | 中等 | 陡峭 | ★简单 | 简单 |
| 发表质量 | ★最佳 | 好(需调) | 好 | 一般 |
| 交互性 | 无(plotly转) | 有限 | 无 | ★最佳 |
| 自定义 | 高 | ★最高 | 中等 | 中等 |
| 扩展生态 | ★超丰富 | 丰富 | 有限 | 丰富 |
| 生信专用 | ★ComplexHeatmap等 | ★scanpy/squidpy | clustermap | dash |
二、常用生信图表代码对比
2.1 火山图
# === ggplot2 火山图 ===
library(ggplot2)
library(ggrepel)
ggplot(deg_results, aes(x=log2FoldChange, y=-log10(padj))) +
geom_point(aes(color=significance), size=1, alpha=0.7) + # 散点
scale_color_manual(values=c("grey","blue","red")) + # 颜色
geom_hline(yintercept=-log10(0.05), linetype="dashed") + # 水平线
geom_vline(xintercept=c(-1,1), linetype="dashed") + # 垂直线
geom_text_repel(data=top_genes, aes(label=gene), # 标注
size=3, max.overlaps=20) +
labs(x="log2(Fold Change)", y="-log10(FDR)", # 标签
title="Volcano Plot") +
theme_minimal() + # 简洁主题
theme(legend.position="bottom") # 图例位置
# === matplotlib 火山图 ===
import matplotlib.pyplot as plt
import numpy as np
fig, ax = plt.subplots(figsize=(8, 6)) # 创建画布
colors = ['grey' if p > 0.05 else ('red' if fc > 1 else 'blue')
for fc, p in zip(df['logFC'], df['padj'])] # 颜色映射
ax.scatter(df['logFC'], -np.log10(df['padj']), # 散点
c=colors, s=5, alpha=0.7)
ax.axhline(y=-np.log10(0.05), color='grey', linestyle='--') # 水平线
ax.axvline(x=1, color='grey', linestyle='--') # 垂直线
ax.axvline(x=-1, color='grey', linestyle='--')
ax.set_xlabel('log2(Fold Change)') # x轴标签
ax.set_ylabel('-log10(FDR)') # y轴标签
plt.tight_layout()
plt.savefig('volcano.png', dpi=300) # 保存
2.2 热图
# === R: ComplexHeatmap(生信热图金标准) ===
library(ComplexHeatmap)
Heatmap(
expr_matrix, # 表达矩阵
name = "Z-score", # 图例名
col = colorRampPalette(c("blue","white","red"))(100), # 颜色
row_km = 3, # 行聚类分3组
column_km = 2, # 列聚类分2组
show_row_names = FALSE, # 不显示行名
top_annotation = HeatmapAnnotation( # 顶部注释
Group = sample_info$group,
col = list(Group=c(A="red", B="blue"))
)
)
# === Python: seaborn clustermap ===
import seaborn as sns
g = sns.clustermap(
expr_matrix, # 表达矩阵
method='ward', # 聚类方法
cmap='RdBu_r', # 颜色方案
standard_scale=0, # 行标准化
figsize=(10, 12), # 图大小
col_colors=group_colors # 列颜色注释
)
g.savefig('heatmap.png', dpi=300)
2.3 PCA/降维图
# === ggplot2 PCA图 ===
library(ggplot2)
pca_df <- data.frame(PC1=pca$x[,1], PC2=pca$x[,2], Group=sample_info$group)
ggplot(pca_df, aes(x=PC1, y=PC2, color=Group)) +
geom_point(size=3) + # 散点
stat_ellipse(level=0.95) + # 95%置信椭圆
labs(x=paste0("PC1 (", var_pct[1], "%)"),
y=paste0("PC2 (", var_pct[2], "%)")) +
theme_bw()
2.4 交互式图表
# === plotly 交互式(R版) ===
library(plotly)
p <- ggplot(data, aes(x=x, y=y, color=group, text=label)) +
geom_point()
ggplotly(p) # ggplot→交互式(一行搞定!)
# === plotly 交互式(Python版) ===
import plotly.express as px
fig = px.scatter(df, x='PC1', y='PC2',
color='Group', # 颜色映射
hover_data=['sample_id'], # 悬停显示
title='PCA Plot')
fig.write_html('pca_interactive.html') # 保存为HTML
fig.show() # 显示
三、生信常用图类型速查
| 图类型 | ggplot2推荐 | Python推荐 | 用途 |
|---|
| 火山图 | EnhancedVolcano | matplotlib | 差异表达 |
| 热图 | ComplexHeatmap | seaborn | 表达模式 |
| 生存曲线 | survminer | lifelines | 生存分析 |
| 箱线图 | ggpubr | seaborn | 组间比较 |
| PCA | ggplot2 | matplotlib | 降维 |
| UMAP | Seurat::DimPlot | scanpy.pl | 单细胞 |
| 分类树 | ggtree | ETE3 | 进化树 |
| 韦恩图 | VennDiagram | matplotlib_venn | 基因交集 |
| 网络图 | igraph | NetworkX | 基因网络 |
四、面试高频考点
Q1: 论文发表用什么可视化工具?
- 首选ggplot2:多数生信期刊接受度最高
- 配合cowplot/patchwork拼图
- 导出格式:PDF(矢量图)或300+dpi的PNG/TIFF
- 字体大小≥8pt,线宽≥0.5pt
Q2: ggplot2的图形语法核心?
ggplot(data, aes(x, y, color)) + # 数据+映射
geom_point() + # 几何对象(点/线/柱)
scale_color_manual() + # 标度(颜色/大小)
facet_wrap() + # 分面(多面板)
theme_minimal() # 主题(外观)
Q3: matplotlib和seaborn的关系?
- matplotlib是底层引擎(像PS可以画任何东西但复杂)
- seaborn是高层封装(像美图秀秀一键美化统计图)
- seaborn底层调用matplotlib,可以混合使用
五、常见报错
| 报错 | 原因 | 解决 |
|---|
ggplot2: object not found | aes中变量名错误 | 检查列名拼写 |
matplotlib: no display | 服务器无图形界面 | 加plt.switch_backend('Agg') |
| 中文乱码 | 缺少中文字体 | 设置字体参数 |
| 图片模糊 | DPI太低 | 设置dpi=300+ |
速查表
# === 可视化速查 ===
# 论文发表: ggplot2 + cowplot拼图 + PDF导出
# Python项目: matplotlib + seaborn统计图
# 交互展示: plotly (R/Python都有)
# 生信热图: ComplexHeatmap(R) / seaborn.clustermap(Python)
# 生存曲线: survminer(R) / lifelines(Python)
# 单细胞: Seurat::DimPlot(R) / scanpy.pl(Python)
# 导出: ggsave("fig.pdf", width=8, height=6) # R
# plt.savefig("fig.png", dpi=300, bbox_inches='tight') # Python