如何在Matplotlib中实现子图内嵌套横向子图(基于DataFrame列模式)
解决方案
要实现每个模式对应的子图拆分为6个横向独立子图(每个图例对应一个子图),你需要调整子图网格结构,并单独绘制每一列的曲线,具体修改如下:
修改后的代码
import matplotlib.pyplot as plt col_patterns = ['pattern1','pattern2'] # 调整子图网格:每行对应一个pattern,每行6个横向子图 fig, axs = plt.subplots(nrows=len(col_patterns), ncols=6, figsize=(30, 80)) plt.subplots_adjust(hspace=0.3, wspace=0.2) # 调整子图间距,避免重叠 fig.suptitle("Title", fontsize=18, y=0.95) for idx, col_pat in enumerate(col_patterns): # 获取当前pattern对应的所有列 col_pat_columns = [col for col in df.columns if col_pat in col] # 遍历当前行的每个子图和对应的列 for ax, col in zip(axs[idx], col_pat_columns): # 单独绘制当前列的曲线 df.plot(x='Week', y=col, ax=ax, legend=False) # 子图格式设置 ax.set_title(f"{col_pat.upper()} - {col}") ax.set_xlabel("") # 如果某个pattern的列数不足6,可以隐藏多余的空图 for idx in range(len(col_patterns)): current_cols = [col for col in df.columns if col_patterns[idx] in col] for ax in axs[idx][len(current_cols):]: ax.axis('off')
关键修改点
- 子图网格调整:将
ncols=1改为ncols=6,让每个pattern对应一行6个横向子图,整体形成2行6列的布局(对应你的2个pattern)。 - 单曲线独立绘制:不再一次性绘制所有曲线,而是遍历每个目标列,在对应的子图中单独绘制该列数据,确保每个子图只展示一条曲线。
- 空图处理:如果某个pattern对应的列数不足6,隐藏多余的空子图,避免界面杂乱。
- 间距优化:通过
plt.subplots_adjust()设置合适的间距,防止标题和坐标轴重叠。
内容的提问来源于stack exchange,提问作者Chronicles
相关产品推荐
相关产品推荐

