【问题标题】:Plotting dates with sharex=True leads to ValueError: ordinal must be >= 1使用 sharex=True 绘制日期会导致 ValueError: ordinal must be >= 1
【发布时间】:2012-11-24 09:14:34
【问题描述】:

在进行一些分析时,我偶然发现了一个 ValueError,我可以将其归结为以下简单示例,该示例可以重现我得到的错误:

import numpy as np
import matplotlib.pyplot as plt
import datetime as dt

x = np.array([dt.datetime(2012, 10, 19, 10, 0, 0),
              dt.datetime(2012, 10, 19, 10, 0, 1),
              dt.datetime(2012, 10, 19, 10, 0, 2),
              dt.datetime(2012, 10, 19, 10, 0, 3)])

y = np.array([1, 3, 4, 2])

当尝试绘制这个简单的 x 和 y 数组时,我没有遇到任何问题:

fig, ax = plt.subplots()
ax.plot(x, y)

fig, (ax1, ax2) = plt.subplots(nrows=2)
ax1.plot(x, y)

但在添加sharex=True 时,出现错误:

fig, (ax1, ax2) = plt.subplots(nrows=2, sharex=True)
ax1.plot(x, y)

错误信息:

Traceback (most recent call last):
  File "C:\Python27\lib\site-packages\matplotlib\backend_bases.py", line 2445, in home
    self._update_view()
  File "C:\Python27\lib\site-packages\matplotlib\backend_bases.py", line 2818, in _update_view
    self.draw()
  File "C:\Python27\lib\site-packages\matplotlib\backend_bases.py", line 2796, in draw
    loc.refresh()
  File "C:\Python27\lib\site-packages\matplotlib\dates.py", line 758, in refresh
    dmin, dmax = self.viewlim_to_dt()
  File "C:\Python27\lib\site-packages\matplotlib\dates.py", line 530, in viewlim_to_dt
    return num2date(vmin, self.tz), num2date(vmax, self.tz)
  File "C:\Python27\lib\site-packages\matplotlib\dates.py", line 289, in num2date
    if not cbook.iterable(x): return _from_ordinalf(x, tz)
  File "C:\Python27\lib\site-packages\matplotlib\dates.py", line 203, in _from_ordinalf
    dt = datetime.datetime.fromordinal(ix)
ValueError: ordinal must be >= 1

我从 matplotlib (https://github.com/matplotlib/matplotlib/issues/162) 中发现了一个关于使用 twinx 的问题,并且日期给出了相同的错误。是同一个bug吗?这似乎是一个早已为人所知的错误,但尚未解决。

【问题讨论】:

    标签: python numpy matplotlib


    【解决方案1】:

    如果您在第二个轴上绘制一些东西,则可以避免错误:

    import matplotlib.pyplot as plt
    import numpy as np
    import datetime as dt
    
    x = np.array([dt.datetime(2012, 10, 19, 10, 0, 0),
                  dt.datetime(2012, 10, 19, 10, 0, 1),
                  dt.datetime(2012, 10, 19, 10, 0, 2),
                  dt.datetime(2012, 10, 19, 10, 0, 3)])
    
    y = np.array([1, 3, 4, 2])
    
    fig, (ax1, ax2) = plt.subplots(nrows = 2, sharex = True)
    ax1.plot(x, y, 'b-')
    ax2.plot(x, 1.0/y, 'r-')
    plt.show()
    

    【讨论】:

    • 啊哈!谢谢。然后我想我的代码中还有另一个错误,阻止了第二个轴的数据被绘制,所以我看到了这个错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-29
    • 2017-01-27
    • 2022-09-03
    • 2022-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多