05 · 课题常用工具包与语法概览
本章目标
了解科研常用 Python 包的功能与基本用法,掌握高频语法模式(列表推导式、lambda、apply、链式调用等),为进入实际课题研究做好准备。
0. 小白导读:这些"包"到底是什么?
1. 科研绘图包
1.1 matplotlib——基础绘图(必学)
matplotlib 是 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 论文图的基本配置:
# 全局设置(写在脚本开头,统一风格) 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 默认不支持中文,需设置中文字体:
> plt.rcParams["font.sans-serif"] = ["SimHei", "Microsoft YaHei"] # 或 ["Arial Unicode MS"](Mac) > plt.rcParams["axes.unicode_minus"] = False # 解决负号显示为方块 >
1.2 seaborn——统计绘图(必学)
seaborn 基于 matplotlib,用更少的代码做出更好看的统计图。
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 图(鼠标悬停、缩放、平移),适合探索性分析和汇报展示。
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——统计检验(必学)
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——回归与高级统计
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——机器学习(储备)
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——网络分析
网络药理学中构建蛋白互作网络、成分-靶点网络时用到。
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(了解)
from Bio import SeqIO # 序列读取、格式转换
3.3 mygene——基因 ID 转换
import mygene mg = mygene.MyGeneInfo() result = mg.query("TP53", fields="symbol,name,uniprot")
3.4 gseapy——富集分析
import gseapy as gp # 基于基因列表的富集分析 enr = gp.enrichr(gene_list=["TP53", "AKT1", "EGFR"], gene_sets="KEGG_2021_Human") print(enr.results.head())
4. 常见语法模式
4.1 列表推导式
# 科研场景:对基因表达量批量处理 values = [3.2, 5.8, 1.5, 7.1] log2_values = [np.log2(v) for v in values if v > 0]
4.2 lambda 函数
# 科研场景:按浓度排序药物 drugs = [("丹参", 3.2), ("川芎", 5.8), ("黄芪", 1.5)] drugs_sorted = sorted(drugs, key=lambda x: x[1], reverse=True)
4.3 apply / map 链式调用
# 科研场景:批量处理列 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 随机种子设置
# 每次必写 np.random.seed(42)
4.5 模型保存与读取
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 个)
进阶练习
- 用 matplotlib 绘制一条正弦曲线 + 一条余弦曲线,两条线在同一张图上,区分颜色,加图例。
- 用 seaborn 绘制箱线图 + 散点叠加,对比两组数据。
- 用 scipy.stats 对两组数据做 t 检验,输出 t 值和 P 值。
- 用 scikit-learn 训练一个随机森林分类器,计算 AUC。
上一章:04 · 包管理与项目版本管理 | 下一章:06 · 生物统计与实验数据分析