如何为matplotlib的4行2列子图添加每行统一的行标题?
报错原因分析
- 第一个报错
'numpy.ndarray' object has no attribute 'get_subplotspec':你创建的是4行2列的子图,axs是形状为(4,2)的二维numpy数组,axs[0]取的是第一行的两个子图对象组成的一维数组,自然没有子图专属的get_subplotspec方法,你后续改成axs[0,0]的写法已经解决了这个问题。 - 第二个报错
'Figure' object has no attribute 'add_subfigure':add_subfigure是Matplotlib 3.4.0版本才新增的API,你的本地Matplotlib版本低于这个要求,所以找不到该方法。
方案1:低版本兼容方案(无需升级Matplotlib,推荐)
无需修改原有绘图逻辑,直接在每行子图上方添加跨列居中文本作为行标题即可,代码如下:
# 保留你原来的绘图代码 fig, axs = plt.subplots(4, 2, figsize=(15,25)) y_labels = ['k0', 'k1'] for x in range(4): for y in range(2): axs[x, y].scatter([i[x] for i in X_vals], [i[y] for i in y_vals]) axs[x, y].set_xlabel('Loss') axs[x, y].set_ylabel(y_labels[y]) # 新增行标题逻辑 for row in range(4): # 计算当前行两个子图的水平中点坐标,作为标题的横向位置 x_mid = (axs[row, 0].get_position().x0 + axs[row, 1].get_position().x1) / 2 # 计算当前行子图顶部的位置,加偏移量避免标题和子图重叠 y_top = axs[row, 0].get_position().y1 + 0.01 # 绘制行标题,颜色、字号可按需调整匹配你要的黄色样式 fig.text(x_mid, y_top, f'Subplot row title {row}', ha='center', fontsize=14, color='gold', fontweight='bold') # 调整子图间距,避免行标题被画布边缘遮挡 plt.subplots_adjust(top=0.95, hspace=0.3) plt.show()
方案2:subfigure实现方案(需先升级Matplotlib到3.4.0及以上)
如果要使用你参考的subfigure方案,先执行pip install --upgrade matplotlib升级版本,再调整代码逻辑从创建阶段就拆分行级subfigure:
import matplotlib.pyplot as plt fig = plt.figure(figsize=(15,25)) # 先把整个画布拆分为4行1列的subfigure,每一行对应一个subfigure subfigs = fig.subfigures(nrows=4, ncols=1, hspace=0.3) y_labels = ['k0', 'k1'] for row, subfig in enumerate(subfigs): # 为当前行subfigure设置行标题 subfig.suptitle(f'Subplot row title {row}', fontsize=14, color='gold', fontweight='bold') # 在每个行subfigure内创建2列子图 axs = subfig.subplots(nrows=1, ncols=2) for y in range(2): axs[y].scatter([i[row] for i in X_vals], [i[y] for i in y_vals]) axs[y].set_xlabel('Loss') axs[y].set_ylabel(y_labels[y]) plt.show()
内容的提问来源于stack exchange,提问作者Ravish Jha
相关产品推荐
相关产品推荐

