循环生成子图时出错

Posted

技术标签:

【中文标题】循环生成子图时出错【英文标题】:Error when looping to produce subplots 【发布时间】:2013-11-26 00:41:23 【问题描述】:

我有一个关于从数据框中循环绘制多个子图时收到的错误的问题。

我的数据框有很多列,我遍历其中的每列都有一个子图。

这是我的代码

 def plot(df):
    channels=[]
    for i in df:
        channels.append(i)

    fig, ax = plt.subplots(len(channels), sharex=True, figsize=(50,100))

    plot=0    
    for j in df: 

        ax[plot].plot(df["%s" % j])
        ax[plot].set_xlabel('%s' % j)
        plot=plot+1

    plt.tight_layout()
    plt.show() 

我得到的情节很好,但也是一个空框架和错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Users\AClayton\WinPython-64bit-2.7.5.3\python-2.7.5.amd64\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 538, in runfile
    execfile(filename, namespace)
  File "C:/Users/AClayton/Desktop/Data/TS.py", line 67, in <module>
    plot(all_data)
  File "C:/Users/AClayton/Desktop/Data/TS.py", line 49, in plot
    ax[plot].plot(reader["%s" % j])
TypeError: 'AxesSubplot' object does not support indexing

如果第一个图制作得很好,我看不出这个错误来自哪里,或者为什么会产生第二个图?

感谢您的任何见解

【问题讨论】:

【参考方案1】:

如果您绘制多个子图,plt.subplots() 将返回数组中的轴,该数组允许像使用 ax[plot] 一样进行索引。当仅创建 1 个子图时,默认情况下它返回轴本身,而不是数组中的轴。

所以当len(channels) 等于 1 时会发生错误。您可以通过在.subplots() 命令中设置squeeze=False 来抑制此行为。这迫使它始终返回一个带有轴的“Rows x Cols”大小的数组,即使它只有一个。

所以:

 def plot(df):
    channels=[]
    for i in df:
        channels.append(i)

    fig, ax = plt.subplots(len(channels),1, sharex=True, figsize=(50,100), squeeze=False)

    plot=0    
    for j in df: 

        ax[plot,0].plot(df["%s" % j])
        ax[plot,0].set_xlabel('%s' % j)
        plot=plot+1

    plt.tight_layout()
    plt.show() 

通过添加squeeze 关键字,您始终会得到一个二维数组作为回报,因此子图的索引更改为ax[plot,0]。我还专门添加了列数(在本例中为 1)。

【讨论】:

以上是关于循环生成子图时出错的主要内容,如果未能解决你的问题,请参考以下文章

使用绘图子图时绘制自定义误差线

为啥当我做子图时窗口正在切割我的桌子?

尝试使用 .NET Core GraphQL 联合子图时,Apollo 联合网关返回错误

Matplotlib:获取子图以填充图形

与 matplotlib 子图不一致的刻度标签字体

如何在 spring-data 中使用子图(使用休眠)?