跳转至

可视化对比:ggplot2/matplotlib/plotly

一句话概述:ggplot2是R语言的"图形语法"(发表级静态图首选),matplotlib是Python绑定可视化的基础库(最灵活),plotly做交互式图表最方便——论文发表用ggplot2,Python项目用matplotlib+seaborn,网页展示用plotly。

核心知识点速查表

概念说明
ggplot2R语言图形语法系统(白话:用公式搭积木做图)
matplotlibPython可视化基础库(白话:Python画图的"万能工具箱")
seabornmatplotlib的高级封装(统计图更方便)
plotly交互式可视化库(R+Python都支持)
图形语法aes(映射)+geom(几何)+scale(标度)+theme(主题)

一、四大工具对比

特性ggplot2matplotlibseabornplotly
语言RPythonPythonR+Python
图表类型★丰富★最丰富统计图交互式
学习曲线中等陡峭★简单简单
发表质量★最佳好(需调)一般
交互性无(plotly转)有限★最佳
自定义★最高中等中等
扩展生态★超丰富丰富有限丰富
生信专用★ComplexHeatmap等★scanpy/squidpyclustermapdash

二、常用生信图表代码对比

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推荐用途
火山图EnhancedVolcanomatplotlib差异表达
热图ComplexHeatmapseaborn表达模式
生存曲线survminerlifelines生存分析
箱线图ggpubrseaborn组间比较
PCAggplot2matplotlib降维
UMAPSeurat::DimPlotscanpy.pl单细胞
分类树ggtreeETE3进化树
韦恩图VennDiagrammatplotlib_venn基因交集
网络图igraphNetworkX基因网络

四、面试高频考点

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 foundaes中变量名错误检查列名拼写
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