for循环生成matplotlib子图报错:numpy.ndarray对象无plot属性
错误原因
- 调用
plt.subplots(3, (measurements+2)//3)创建的是3行3列的子图网格,此时返回的axs是形状为(3, 3)的二维numpy数组,而非一维的子图对象数组 - 代码中直接写
axs[0].plot()时,axs[0]取到的是第一行3个子图组成的数组,不是单个Axes绘图对象,自然没有plot方法 - 之前生成3个子图时运行正常,是因为当时子图为3行1列或1行3列的单维布局,
axs本身就是一维数组,按索引取到的就是单个Axes对象
修正方案
先将二维的axs数组展平为一维,再按索引匹配对应的子图和DataFrame,同时可以将所有dfrld存入列表简化重复代码:
measurements = 9 # 将所有dfrld存入列表,避免重复写9次调用代码 dfrld_list = [dfrld_1, dfrld_2, dfrld_3, dfrld_4, dfrld_5, dfrld_6, dfrld_7, dfrld_8, dfrld_9] fig, axs = plt.subplots(3,(measurements+2)//3, sharey=False, gridspec_kw={'wspace': 0.1},figsize =(20, 10)) # 将二维子图数组按行展平为一维,顺序为第一行左到右、第二行左到右、第三行左到右 axs_flat = axs.flatten() for i in range(measurements): current_ax = axs_flat[i] current_dfrld = dfrld_list[i] try: # 注意:列名从1开始,所以需要i+1匹配列名 current_ax.plot(current_dfrld[f'RLD date({i+1})'], current_dfrld['Depth'], lw=2, color=next(red1)) except KeyError: pass plt.show()
如果不想展平数组,也可以直接通过行、列索引定位子图,替换current_ax = axs_flat[i]为:
row_idx = i // 3 col_idx = i % 3 current_ax = axs[row_idx, col_idx]
两种写法效果完全一致。
内容的提问来源于stack exchange,提问作者Etiende
相关产品推荐
相关产品推荐

