首页 AI科研技能库 数据可视化
第09期 ⭐⭐ 进阶

科研数据可视化

从Excel图表到论文级专业图表,掌握Python三大可视化工具

学习时间:约20分钟 难度:进阶
⚠️
免责声明: 本内容仅供医学学习参考,不作为临床诊断依据。 实际临床决策请结合患者具体情况和多学科意见。
🎯

技能简介

还在用Excel画图?论文图表太丑怎么办? Python数据可视化可以帮你绘制专业级的科研图表。 从基础的散点图、折线图,到统计图表、热图,再到交互式图表, 掌握matplotlib + seaborn + plotly三大工具, 让你的论文图表脱颖而出。

📊 三大可视化工具对比

工具 特点 适用场景
matplotlib Python可视化基础库 折线图、散点图、柱状图
seaborn 统计数据可视化专家 箱线图、热图、小提琴图
plotly 交互式图表 交互式生存曲线、3D图

🧾 出图前先准备这 4 类信息

数据表结构

先整理成长表或宽表,并明确变量名、分组变量、单位和缺失值处理方式,后面画图才不会反复返工。

统计结果

显著性标注、回归线、相关系数、置信区间都应来自已完成的统计分析,而不是画图时临时“顺手补一个”。

目标版式

提前确定是单图、组图还是补充材料图,并想清楚期刊对尺寸、字体、分辨率和色彩模式的要求。

视觉编码规则

同一个分组在全文中应保持同一颜色、符号和顺序;图例规则先定好,整篇图表才会看起来像一个项目。

📦 一套可投稿图版至少交付这 4 样

可复用绘图脚本

至少保留 Python 脚本或 notebook,后续改颜色、补数据、重跑分组时才能快速复现。

导出图文件

建议同时提供 PDF/SVG 等矢量版和 PNG/TIFF 位图版,避免到投稿时才发现图不能编辑。

图注与标注清单

写清楚每张图的统计方法、样本量、误差线含义、显著性符号和缩写解释,投稿时会省很多力气。

组图排版方案

如果要拼多面板图,最好同步给出 A/B/C/D 编排草图和统一字号、边距规则,而不是只交几张单图。

💡 使用场景

📈

散点图 + 回归线

展示两变量关系,添加回归线和置信区间。

📊

箱线图 + 显著性标注

组间比较,自动计算统计显著性。

🔥

相关性热图

展示多变量相关性,支持聚类。

交互式生存曲线

悬停显示详情,可导出HTML。

🛠️ 核心技能调用

1 matplotlib - 散点图 + 回归线

import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
import pandas as pd

# 调用可视化技能
scientific-skills:matplotlib

# 示例:年龄和血压的散点图
# 输入:"用matplotlib画一个散点图,
#    展示年龄和血压的关系,
#    添加回归线和置信区间"

# 生成的代码
plt.figure(figsize=(8, 6))
sns.regplot(data=df, x='age', y='bp',
      scatter_kws={'alpha':0.5},
      line_kws={'color':'red'})
plt.xlabel('Age (years)', fontsize=12)
plt.ylabel('Blood Pressure (mmHg)', fontsize=12)
plt.title('Age vs Blood Pressure', fontsize=14)
plt.tight_layout()
plt.savefig('scatter_plot.pdf', dpi=300)

💡 论文格式输出: 使用 savefig() 时指定 DPI=300 或更高, 选择 PDF 或 TIFF 格式,确保期刊投稿要求。

2 seaborn - 箱线图 + 显著性标注

import matplotlib.pyplot as plt
import seaborn as sns

# 调用可视化技能
scientific-skills:seaborn

# 示例:三组患者生存时间比较
# 输入:"用seaborn画一个箱线图,
#    比较三组患者的生存时间,
#    添加显著性标注(*p<0.05, **p<0.01)"

# 生成的代码
plt.figure(figsize=(8, 6))
ax = sns.boxplot(data=df, x='group', y='survival_time',
           order=['Control', 'Treatment A', 'Treatment B'])

# 添加显著性标注
from statannotations import Annotator
pairs = [(('Control', 'Treatment A'), '**'),
     (('Control', 'Treatment B'), '***'),
     (('Treatment A', 'Treatment B'), 'ns')]
annotator = Annotator(ax, pairs, data=df, x='group', y='survival_time')
annotator.configure(test='Mann-Whitney').apply_and_annotate()

plt.ylabel('Survival Time (days)', fontsize=12)
plt.tight_layout()

3 seaborn - 相关性热图

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd

# 调用可视化技能
scientific-skills:seaborn

# 示例:10个变量的相关性热图
# 输入:"用seaborn画一个相关性热图,
#    展示10个变量之间的相关系数,
#    用红蓝色阶,标注数值"

# 计算相关系数矩阵
corr_matrix = df.corr()

# 绘制热图
plt.figure(figsize=(10, 8))
sns.heatmap(corr_matrix,
      annot=True,      # 显示数值
      cmap='RdBu_r',    # 红蓝配色
      center=0,       # 中心值为0
      fmt='.2f',      # 保留两位小数
      cbar_kws={'label': 'Correlation'})
plt.title('Correlation Matrix', fontsize=14)
plt.tight_layout()

4 plotly - 交互式生存曲线

import plotly.graph_objects as go
from lifelines import KaplanMeierFitter

# 调用可视化技能
scientific-skills:plotly

# 示例:交互式生存曲线
# 输入:"用plotly画一个交互式生存曲线,
#    可以悬停显示详细信息,
#    导出为HTML"

# 计算KM曲线
kmf = KaplanMeierFitter()
fig = go.Figure()

for group in df['treatment'].unique():
  group_data = df[df['treatment'] == group]
  kmf.fit(group_data['time'], group_data['event'], label=group)
  fig.add_trace(go.Scatter(
    x=kmf.survival_function_.index,
    y=kmf.survival_function_['KM_estimate'],
    mode='lines',
    name=group,
    hovertemplate='%{x}天: 生存率%.2f%%<extra></extra>'
  ))

fig.update_layout(
  title='Kaplan-Meier Survival Curve',
  xaxis_title='Time (days)',
  yaxis_title='Survival Probability',
  hovermode='x unified'
)

# 导出为HTML
fig.write_html('survival_curve.html')

📌 交互式图表用途: 交互式图表适合在线展示和探索性分析。 投稿论文仍需使用静态图(PNG/PDF)。

📋 常用图表速查

数据类型 推荐图表 工具
两变量关系 散点图 matplotlib
组间比较 箱线图/小提琴图 seaborn
相关性 热图 seaborn
时间序列 折线图 matplotlib
生存分析 KM曲线 plotly/lifelines
分布 直方图/密度图 seaborn
分类占比 饼图/条形图 matplotlib

📖 实战示例

示例1:论文级散点图配置
# 论文级图表配置
import matplotlib.pyplot as plt

# 设置全局参数
plt.rcParams.update({
  'font.size': 12,      # 字体大小
  'font.family': 'Arial',   # 字体
  'axes.linewidth': 1,    # 坐标轴线宽
  'xtick.major.width': 1,  # 刻度线宽
  'ytick.major.width': 1,
  'figure.dpi': 300,     # 默认DPI
})

# 创建图表
fig, ax = plt.subplots(figsize=(6, 4))

# 绘制数据
ax.scatter(x, y, alpha=0.6, s=50)

# 添加回归线
sns.regplot(x=x, y=y, ax=ax, scatter=False)

# 保存(300 DPI, TIFF格式)
fig.savefig('figure.tiff', dpi=300, bbox_inches='tight')
示例2:配色方案选择
# 推荐的配色方案
import seaborn as sns

# 1. 色盲友好配色
colors = sns.color_palette('colorblind')

# 2. 专业期刊配色
colors = sns.color_palette('deep')

# 3. 渐变配色(热图)
cmap = 'RdBu_r'  # 红-蓝渐变(反转)
cmap = 'viridis'  # 紫-黄渐变
cmap = 'plasma'   # 蓝-黄渐变

# 4. 分组配色
palette = {'Control': 'gray',
      'Treatment A': '#3498db',
      'Treatment B': '#e74c3c'}
示例3:多子图排版
import matplotlib.pyplot as plt

# 创建2x2子图
fig, axes = plt.subplots(2, 2, figsize=(10, 8))

# 子图A:散点图
axes[0, 0].scatter(x, y)
axes[0, 0].set_title('A', fontweight='bold')

# 子图B:箱线图
sns.boxplot(data=df, ax=axes[0, 1])
axes[0, 1].set_title('B', fontweight='bold')

# 子图C:热图
sns.heatmap(corr, ax=axes[1, 0])
axes[1, 0].set_title('C', fontweight='bold')

# 子图D:生存曲线
kmf.plot_survival_function(ax=axes[1, 1])
axes[1, 1].set_title('D', fontweight='bold')

plt.tight_layout()
fig.savefig('figure_panel.pdf', dpi=300)

🧯 科研作图最常见的 4 类翻车点

图很漂亮,但没回答问题

如果图表只是展示形状,却没对齐研究假设、比较关系和关键结论,再高级的配色也很难提升说服力。

统计标注和分析不一致

最常见的是图上写了星号,但正文方法段根本不是同一种检验,或比较对象和实际代码不对应。

颜色和图例编码混乱

一会儿蓝色代表对照,一会儿又代表治疗组,会让整篇论文看起来像拼贴;读者也更容易误读。

只导出位图,不留源文件

没有脚本、矢量图和可编辑排版文件时,后续修改字体、线宽或拼图往往比重画还痛苦。

⚠️ 注意事项

投稿格式要求

  • • 分辨率:至少300 DPI
  • • 格式:PDF(矢量)或 TIFF/PNG(位图)
  • • 字体:Arial 或 Helvetica
  • • 文件大小:通常要求小于10MB

配色选择

  • • 使用色盲友好的配色方案
  • • 避免红绿配色(色盲难以区分)
  • • 打印测试(确保灰度打印可读)

代码复用

  • • 将常用图表样式封装成函数
  • • 使用配置文件管理全局参数
  • • 建立自己的图表模板库

🔗 相关技能链接

📦

下载完整代码包

包含:示例代码、数据文件、结果图表 · 16个文件 · 44.0MB

立即下载

💡 代码包内含 README.md 文档,包含环境配置和运行说明。解压后即可使用。