Matplotlib:TypeError:'AxesSubplot'对象不可切片化。

37

我正在尝试制作一个简单的箱线图,来展示包含在两个数据框df1和df2中的变量'x'。为此,我使用了以下代码:

fig, axs = plt.subplots()
axs[0, 0].boxplot([df1['x'], df2['x']])
plt.show();

不过,我得到了这个:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-108-ce962754d553> in <module>()
----> 2 axs[0, 0].boxplot([df1['x'], df2['x']])
      3 plt.show();
      4 

TypeError: 'AxesSubplot' object is not subscriptable

有什么想法吗?

1个回答

69
fig, axs = plt.subplots()

返回一个只有一个子图的图形,所以axs已经持有它而不需要索引。
fig, axs = plt.subplots(3)

返回一个一维数组的子图。

fig, axs = plt.subplots(3, 2)

返回一个二维子图数组。
请注意,这只是由于kwarg的默认设置squeeze=True
通过将其设置为False,您可以强制结果成为一个二维数组,与子图的数量或排列无关。
import numpy
from PIL import Image
import matplotlib.pyplot as plt

imarray = numpy.random.rand(10,10,3) * 255
im = Image.fromarray(imarray.astype('uint8')).convert('RGBA')

#rows = 1; cols = 1;
#rows = 5; cols = 3;
rows = 1; cols = 5;
fig, ax = plt.subplots(rows, cols, squeeze=False)
fig.suptitle('random plots')
i = 0
for r in range(rows):
    for c in range(cols): 
        ax[r][c].imshow(im)
        i = i + 1     
plt.show()
plt.close()

27
这是可怕的编程实践。他们正在创造不必要的边缘情况。现在,我必须为仅有一个子图的情况编写不同的代码。 - MuhsinFatih
@MuhsinFatih 我想我能理解你的意思。你能描述一下,你需要以哪种具体方式编写不同的代码吗? - SpghttCd
这是我必须添加以处理边缘情况的内容: axs = np.array(axs); axs = np.reshape(axs, n). 其中n是形状变量。 - MuhsinFatih
唉...无法添加答案 :( 是因为它被标记为重复吗?就个人而言,我不同意这个重复标记,因为它的措辞完全不同且问题更简短。 - MuhsinFatih
5
@MuhsinFatih看一下我的修改,这应该会有所帮助。 - SpghttCd
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接