05 · 课题常用工具包与语法概览

数据科学⭐⭐⭐⭐重要储备|约 6 分钟7 节1 图
本章目标

了解科研常用 Python 包的功能与基本用法,掌握高频语法模式(列表推导式、lambda、apply、链式调用等),为进入实际课题研究做好准备。

本章路线
科研 Python 包生态图
图 05-1科研 Python 包生态图
05 · 课题常用工具包与语法概览

0. 小白导读:这些"包"到底是什么?

🍚生活化比喻

先听懂:Python 的"包"(library)就像你厨房里现成的工具——不用自己造,拿来就用。

  • matplotlib = 一支基础画笔。什么图都能画,但比较"素",需要自己调细节。

  • seaborn = 一支带美颜的画笔。基于 matplotlib,几行代码就能画出好看的统计图(箱线图、热图)。

  • scipy.stats = 一本统计检验手册。t 检验、方差分析、相关分析,翻到对应页就能用。

  • scikit-learn = 一台机器学习工具箱。分类、回归、特征选择,都是现成的。

一句话:这一章就是带你"认识厨房里有哪些工具、各自能干什么",不需要全部精通,先知道"遇到什么问题该用哪个"。


1. 科研绘图包

1.1 matplotlib——基础绘图(必学)

matplotlib 是 Python 最基础的绘图库,几乎所有其他绘图库都基于它。

python
import matplotlib.pyplot as plt
import numpy as np

# 基本折线图
x = np.linspace(0, 10, 100)
y = np.sin(x)

plt.figure(figsize=(8, 4))
plt.plot(x, y, label="sin(x)", color="teal", linewidth=2)
plt.xlabel("Time (s)")
plt.ylabel("Amplitude")
plt.title("正弦波")
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()

SCI 论文图的基本配置

python
# 全局设置(写在脚本开头,统一风格)
plt.rcParams.update({
    "font.family": "Arial",                # 字体
    "font.size": 12,                        # 字号
    "axes.linewidth": 1.5,                  # 坐标轴线宽
    "xtick.major.width": 1.5,               # 刻度线宽
    "ytick.major.width": 1.5,
    "lines.linewidth": 2,                   # 线条宽度
    "figure.dpi": 300,                      # 输出分辨率
    "savefig.dpi": 300,
    "savefig.bbox_inches": "tight"          # 保存时紧密裁剪
})

# 子图
fig, axes = plt.subplots(2, 2, figsize=(10, 8))
axes[0, 0].plot(x, np.sin(x))
axes[0, 1].plot(x, np.cos(x))
axes[1, 0].plot(x, np.tan(x))
axes[1, 1].plot(x, np.exp(-x) * np.sin(x))
plt.tight_layout()
plt.savefig("figure.png", dpi=300)  # 保存为高分辨率图
注意

图中文字显示中文:matplotlib 默认不支持中文,需设置中文字体:

python
> plt.rcParams["font.sans-serif"] = ["SimHei", "Microsoft YaHei"]  # 或 ["Arial Unicode MS"](Mac)
> plt.rcParams["axes.unicode_minus"] = False  # 解决负号显示为方块
>

1.2 seaborn——统计绘图(必学)

seaborn 基于 matplotlib,用更少的代码做出更好看的统计图。

python
import seaborn as sns
import pandas as pd

# 创造模拟数据
df = pd.DataFrame({
    "group": ["control"] * 10 + ["model"] * 10,
    "value": np.random.normal(5, 1, 20)
})
df.loc[10:, "value"] += 2  # model 组均值高一些

# 箱线图 + 散点叠加(科研论文经典组合)
plt.figure(figsize=(6, 4))
sns.boxplot(data=df, x="group", y="value", width=0.4, palette="Set2")
sns.stripplot(data=df, x="group", y="value", color="black", alpha=0.5, size=6)
plt.title("两组比较")
plt.show()

# 热图(网络药理学常用)
data = np.random.randn(10, 8)
sns.heatmap(data, cmap="RdBu_r", center=0, annot=True, fmt=".1f",
            xticklabels=[f"Gene{i}" for i in range(1, 9)],
            yticklabels=[f"Sample{i}" for i in range(1, 11)])
plt.show()

1.3 plotly——交互式绘图(可选)

plotly 生成可交互的 HTML 图(鼠标悬停、缩放、平移),适合探索性分析和汇报展示。

python
import plotly.express as px

# 交互式散点图
df = px.data.iris()
fig = px.scatter(df, x="sepal_width", y="sepal_length", color="species",
                 title="Iris 数据集")
fig.show()  # 在浏览器中打开交互图

2. 统计与机器学习包

2.1 scipy.stats——统计检验(必学)

python
from scipy import stats

# 正态性检验
data = np.random.normal(5, 1, 30)
stat, p = stats.shapiro(data)       # Shapiro-Wilk 检验
print(f"W = {stat:.4f}, p = {p:.4f}")

# 独立样本 t 检验
group1 = np.random.normal(5, 1, 20)
group2 = np.random.normal(6, 1, 20)
t_stat, p_val = stats.ttest_ind(group1, group2)
print(f"t = {t_stat:.4f}, p = {p_val:.4f}")

# Mann-Whitney U 检验(非参数替代)
u_stat, p_val = stats.mannwhitneyu(group1, group2)

# Pearson / Spearman 相关
r, p_val = stats.pearsonr(group1, group2)

# 单因素方差分析
f_stat, p_val = stats.f_oneway(group1, group2, np.random.normal(5.5, 1, 20))

2.2 statsmodels——回归与高级统计

python
import statsmodels.api as sm

# 线性回归
X = np.random.randn(100, 3)
y = 1 + 0.5 * X[:, 0] - 0.3 * X[:, 1] + np.random.randn(100) * 0.2

X = sm.add_constant(X)  # 加截距项
model = sm.OLS(y, X).fit()
print(model.summary())   # 完整回归结果表(含 R²、各系数 P 值)

2.3 scikit-learn——机器学习(储备)

python
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import roc_auc_score, classification_report

# 二分类示例
X = np.random.randn(200, 10)
y = (X[:, 0] + X[:, 1] > 0).astype(int)

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

model = RandomForestClassifier(n_estimators=100, random_state=42)
model.fit(X_train, y_train)

y_pred = model.predict(X_test)
y_prob = model.predict_proba(X_test)[:, 1]

print(f"AUC = {roc_auc_score(y_test, y_prob):.3f}")
print(classification_report(y_test, y_pred))

# 特征重要性
importances = model.feature_importances_
for i, imp in enumerate(importances):
    print(f"Feature {i}: {imp:.3f}")

3. 生物信息学相关包(了解)

3.1 networkx——网络分析

网络药理学中构建蛋白互作网络、成分-靶点网络时用到。

python
import networkx as nx

# 创建有向图
G = nx.Graph()
G.add_edge("AKT1", "TP53")
G.add_edge("AKT1", "EGFR")
G.add_edge("TP53", "EGFR")

# 计算度中心性
degree = nx.degree_centrality(G)
print(degree)  # {'AKT1': 0.666, 'TP53': 0.666, 'EGFR': 0.666}

3.2 biopython(了解)

python
from Bio import SeqIO  # 序列读取、格式转换

3.3 mygene——基因 ID 转换

python
import mygene
mg = mygene.MyGeneInfo()
result = mg.query("TP53", fields="symbol,name,uniprot")

3.4 gseapy——富集分析

python
import gseapy as gp
# 基于基因列表的富集分析
enr = gp.enrichr(gene_list=["TP53", "AKT1", "EGFR"],
                 gene_sets="KEGG_2021_Human")
print(enr.results.head())

4. 常见语法模式

4.1 列表推导式

🍚生活化比喻

先听懂:列表推导式就像一条"加工流水线"——[对每个元素做什么 for 每个元素 in 列表 if 条件]。一句话就能把"遍历 + 加工 + 筛选"三件事全做完,比写 for 循环短得多、也快得多。

python
# 科研场景:对基因表达量批量处理
values = [3.2, 5.8, 1.5, 7.1]
log2_values = [np.log2(v) for v in values if v > 0]

4.2 lambda 函数

python
# 科研场景:按浓度排序药物
drugs = [("丹参", 3.2), ("川芎", 5.8), ("黄芪", 1.5)]
drugs_sorted = sorted(drugs, key=lambda x: x[1], reverse=True)

4.3 apply / map 链式调用

python
# 科研场景:批量处理列
df["gene"] = df["gene"].str.strip().str.upper().str.replace(" ", "")

# 自定义函数应用到列
df["zscore"] = df["value"].apply(lambda x: (x - df["value"].mean()) / df["value"].std())

4.4 随机种子设置

python
# 每次必写
np.random.seed(42)

4.5 模型保存与读取

python
import joblib

# 保存模型
joblib.dump(model, "random_forest_model.pkl")

# 读取模型
model = joblib.load("random_forest_model.pkl")

5. 速查总表

包名 用途 常用函数示例 科研应用场景
matplotlib 基础绘图 plt.plot(), plt.scatter(), plt.bar(), plt.savefig() 所有论文图
seaborn 统计绘图 sns.boxplot(), sns.heatmap(), sns.pairplot() 组间比较箱线图、热图
plotly 交互绘图 px.scatter(), px.line(), fig.show() 探索性数据分析
scipy.stats 统计检验 ttest_ind(), shapiro(), mannwhitneyu(), f_oneway(), pearsonr() 所有假设检验
statsmodels 回归分析 sm.OLS().fit(), model.summary() 回归模型、协变量校正
scikit-learn 机器学习 RandomForestClassifier(), train_test_split(), roc_auc_score() 分类、特征选择、交叉验证
networkx 网络分析 nx.Graph(), nx.degree_centrality() 蛋白互作网络、成分-靶点网络
biopython 序列处理 SeqIO.read() 基因序列读取(了解)
mygene 基因名转换 mg.query() 基因 ID 转换
gseapy 富集分析 gp.enrichr() GO/KEGG 富集分析
joblib 模型持久化 joblib.dump(), joblib.load() 保存/加载机器学习模型

6. 练习与交付物

交付物(必做)

笔记

课题常用 Python 包速查表:整理一份个人速查表(Markdown 或 Obsidian 笔记),至少包含 8 个包,每个包包含:

  • 包名与用途

  • 常用函数(至少 3 个)

  • 科研应用示例代码片段(至少 1 个)

进阶练习

  1. 用 matplotlib 绘制一条正弦曲线 + 一条余弦曲线,两条线在同一张图上,区分颜色,加图例。
  2. 用 seaborn 绘制箱线图 + 散点叠加,对比两组数据。
  3. 用 scipy.stats 对两组数据做 t 检验,输出 t 值和 P 值。
  4. 用 scikit-learn 训练一个随机森林分类器,计算 AUC。

上一章:04 · 包管理与项目版本管理 | 下一章:06 · 生物统计与实验数据分析

配套学习资源

共 5 条 · 点击跳转