
本文介绍如何将字典中每个键值对的数据统一绘制为子图,按每行 4 列自动排布,避免逐个弹窗显示,并确保布局紧凑、标签清晰。
本文介绍如何将字典中每个键值对的数据统一绘制为子图,按每行 4 列自动排布,避免逐个弹窗显示,并确保布局紧凑、标签清晰。
在使用 Matplotlib 进行批量可视化时,若数据以字典形式组织(如 sequences = {'seq1': 'acgt...', 'seq2': 'ggcc...', ...}),常需为每个键值对生成一个独立子图。原始代码中采用 plt.plot() + plt.show() 循环调用,会导致窗口逐个弹出,既不高效也不便于对比分析。理想方案是统一生成一个包含所有子图的复合图形,且支持自适应行数、固定每行 4 列的网格布局。
实现的关键在于:
- 使用 plt.subplot(nrows, ncols, index) 显式获取每个子图的 Axes 对象;
- 行数由 math.ceil(len(sequences) / 4) 动态计算,确保容纳全部子图;
- index 从 1 开始递增(subplot 的索引不支持 0 起始);
- 所有绘图操作均作用于 ax 对象(如 ax.plot()、ax.set_title()),而非全局 plt;
- 最后统一调用 plt.tight_layout() 自动调整子图间距与标签位置,防止重叠;
- plt.show() 仅在循环外执行一次。
以下是完整可运行示例(含必要导入与模拟辅助函数):
Matplotlib Linux版 3.11.1 官方下载,来自 PyPI 官方发布,适合 Python 图表绘制、数据分析、科研可视化和 Jupyter Notebook 环境安装。
import matplotlib.pyplot as plt
import math
# 示例数据(实际中 sequences 来自你的分析流程)
sequences = {
'chr1': 'acgtgcgcatatgcgc',
'chr2': 'ggccggccggccggcc',
'chr3': 'atatacgtacgtacgt',
'chr4': 'cgcgcgcgcgcgcgcg',
'chr5': 'agtcagtcagtcagtc'
}
# 模拟辅助函数(请替换为你实际的 win_size 和 get_windows 实现)
def win_size(): return 4
def get_windows(seq):
return [seq[i:i+win_size()] for i in range(len(seq) - win_size() + 1)]
# 主绘图逻辑
n_plots = len(sequences)
n_cols = 4
n_rows = math.ceil(n_plots / n_cols)
fig = plt.figure(figsize=(12, 3 * n_rows)) # 按行数缩放高度,提升可读性
id = 1
for k, v in sequences.items():
x = range(len(v) - win_size() + 1)
y = []
for window in get_windows(v):
gc_proportion = (window.count("g") + window.count("c")) / len(window)
y.append(gc_proportion)
ax = plt.subplot(n_rows, n_cols, id)
ax.plot(x, y, linewidth=1.2)
ax.set_title(k, fontsize=10, pad=6)
ax.set_xlabel("nucleotide position", fontsize=9)
ax.set_ylabel("GC proportion", fontsize=9)
ax.grid(True, alpha=0.3)
id += 1
plt.tight_layout()
plt.show()
⚠️ 注意事项:
- 若字典为空,math.ceil(0/4) 返回 0,将导致 subplot(0, 4, 1) 报错——建议增加 if not sequences: raise ValueError("Empty dictionary") 防御;
- plt.subplot() 在复杂布局中可能不如 plt.subplots() 灵活;如需更高控制力(如共享坐标轴、精确宽高比),推荐改用 fig, axes = plt.subplots(n_rows, n_cols, figsize=...) 并展平 axes 数组处理;
- 中文标题需提前设置字体:plt.rcParams['font.sans-serif'] = ['SimHei', 'Arial Unicode MS'];
- 大量子图时,建议限制 figsize 或使用 plt.savefig('all_subplots.png', dpi=150, bbox_inches='tight') 替代交互显示。
通过该方法,你不仅能高效呈现全部序列的 GC 含量滑动窗口分析,还能轻松扩展至其他字典型数据(如不同实验条件、基因组区域或模型预测结果),真正实现“数据驱动、布局自适应”的专业可视化流程。










