Matplotlib绘图时出现索引错误

12

我基本上有以下的脚本。但在运行过程中出现以下错误:TypeError: 'Figure'对象不支持索引 在第axarr [0] .plot(x,y) 行。我尝试搜索,但发现与创建子图时类似的错误...而我只是添加/替换数据(我不确定,因为它是Matlab文件的副本,而我没有Matlab)。

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(0, 2, 0.01)
for idx in range(1, 10):
    a = 1 + (idx - 1) / 10

    y = a ** x

    axarr, fig = plt.subplots(1,1)
    axarr[0].plot(x,y)
    axarr.axis([0, 4, 0, 85])
    axarr[0].grid(True)
    plt.show()

可能我之所以出现这个错误是因为我在循环中使用了一个 figure,但似乎它在第一次迭代就失败了。那么我做错了什么,或者有什么更好的方法让它工作(与 matlab 文件几乎相等,请参见下面脚本的部分)?
希望有人能帮忙。

与 matlab 文件相同的样本文件如下:

x = 0:0.01:4;
for idx = 1:10 
a = 1 + (idx-1)/10;

y = a.^x;
z = 2 * y
subplot(111)
plot(x,y)
hold on
plot(x(1:400),z)
axis([0 4 0 85])
pause
hold off

end

1
你的图形和坐标轴顺序颠倒了--应该是fix,axarr = plt.subplots(1,1)(可以省略1,1部分)。 - Thomas Kühn
1个回答

25

这里有两个问题:

  1. plt.subplots的返回值是一个由 (Figure, array of Axes) 组成的元组,所以赋值语句应该写成

    fig, axarr = plt.subplots(1,1)
    
    上述方法并不能完全解决问题,因为你会遇到类似的错误(TypeError: 'AxesSubplot' object does not support indexing)。这是因为默认情况下,当只使用一列和一行时,plt.subplots 会将 数组中的Axes 缩减为单个轴。此行为由 squeeze 参数控制。因此,使用 plt.subplots 的有效方法包括:
    fig, axarr = plt.subplots(1,1)
    axarr.plot(x,y)
    
    或者
    fig, axarr  = plt.subplots(1,1, squeeze=False)
    axarr[0,0].plot(x,y)
    

    请注意,您不需要将1,1作为参数,因为这些是默认值。


1
所以如果子图是(n,1),其中n可能等于1,并且您想要迭代不同的内容以绘制所有索引,则所有索引将变为axarr[j, 0] - akozi
3
squeeze=False 会产生很大的不同! - Yury Wallet

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