🎯
技能简介
还在用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
配色选择
- • 使用色盲友好的配色方案
- • 避免红绿配色(色盲难以区分)
- • 打印测试(确保灰度打印可读)
代码复用
- • 将常用图表样式封装成函数
- • 使用配置文件管理全局参数
- • 建立自己的图表模板库