【问题标题】:How to use correctly matplotlib's pcolor?如何正确使用 matplotlib 的 pcolor?
【发布时间】:2020-11-17 03:39:05
【问题描述】:

我有一个使用 matplotlib 和数据框绘制的二维图。

我在这个问题中遵循了公认的答案:How to change pyplot background colour in region of interest?

在我最后一次 Arch Linux 更新之前,我的代码一直按预期工作。 从那时起,我的代码不再工作,我收到以下错误:

[1493 rows x 5 columns]
Traceback (most recent call last):
  File "eco.py", line 148, in _show_alert
    ax.pcolor(df.index, ax.get_ylim(),df['alert'].values[np.newaxis])
  File "/usr/lib/python3.8/site-packages/matplotlib/__init__.py", line 1447, in inner
    return func(ax, *map(sanitize_sequence, args), **kwargs)
  File "/usr/lib/python3.8/site-packages/matplotlib/axes/_axes.py", line 5821, in pcolor
    X, Y, C, shading = self._pcolorargs('pcolor', *args, shading=shading,
  File "/usr/lib/python3.8/site-packages/matplotlib/axes/_axes.py", line 5590, in _pcolorargs
    Nx = X.shape[-1]
AttributeError: 'list' object has no attribute 'shape'

代码:

cmap = ListedColormap(['white','red'])
ax.pcolor(df.index, ax.get_ylim(),df['alert'].values[np.newaxis],
              cmap=cmap, alpha=0.5, linewidth=1, antialiased=True)

其中 df 是 pandas 的数据框实例,df.index 时间戳索引和 df['alert'] 值可以是 0 或 1(因此我可以在 alert=1 时映射红色)。 预期的最终结果是具有白色背景或红色背景的二维图形 (df['val']),具体取决于 df['alert']。

我做错了什么? 如果它以前有效,我很幸运吗? API是否改变了?如果是这样,我怎么会知道这种东西?

【问题讨论】:

    标签: python pandas matplotlib


    【解决方案1】:

    根据所提供的信息,很难理解您做错了什么。这是一个简单的工作示例。尝试找出与您的实现的差异,尤其是变量的类型。

    from matplotlib import dates as mdates
    from matplotlib.colors import ListedColormap
    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    
    data = pd.DataFrame({
        'date': ['10/25/2005','10/29/2002','01/01/2001','01/01/2000','01/01/1999','01/01/1997'],
        'A': [0,5,-1,3,4,0],
        'alert': [0,0,0,1,1,1]
    })
    
    # convert to type datetime
    data['date'] = pd.to_datetime(data['date'])
    data = data.set_index('date')
    
    fig, ax = plt.subplots()
    cmap = ListedColormap(['white','red'])
    ax.plot(data['A'])
    ax.set_xlabel('')
    plt.xticks(rotation = 30)
    ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d'))
    
    ax.pcolor(data.index, ax.get_ylim(),data['alert'].values[np.newaxis],
                  cmap=cmap, alpha=0.5, linewidth=1, antialiased=True)
    
    plt.axhline(y = 0, color = 'black')
    plt.tight_layout()
    

    【讨论】:

    • 您的代码中有 4 行无用的行(未使用 df),但您的代码正在运行。我仍然不明白为什么我的代码不起作用。在调用 pcolor 之前,我有几个 df.plot 调用。我不得不将它们更改为 ax.plot 并知道它正在工作。所以我同意,我稍后会调查。谢谢
    猜你喜欢
    • 1970-01-01
    • 2013-04-06
    • 2012-08-18
    • 1970-01-01
    • 2019-04-28
    • 2015-01-21
    • 1970-01-01
    • 2015-01-20
    相关资源
    最近更新 更多