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

科研数据可视化

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

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

技能简介

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

📊 三大可视化工具对比

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

💡 使用场景

📈

散点图 + 回归线

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

📊

箱线图 + 显著性标注

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

🔥

相关性热图

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

交互式生存曲线

悬停显示详情,可导出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)

⚠️ 注意事项

投稿格式要求

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

配色选择

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

代码复用

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

🔗 相关技能链接

📦

下载完整代码包

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

立即下载

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