python - 使用 sharex=True 绘制日期会导致 ValueError : ordinal must be >= 1

标签 python numpy matplotlib

在进行一些分析时,我偶然发现了一个 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 和日期给出相同错误的问题。这是同一个错误吗?这似乎是一个早就知道的错误,但尚未解决。

最佳答案

如果您在第二个轴上绘制某些内容,则可以避免该错误:

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()

关于python - 使用 sharex=True 绘制日期会导致 ValueError : ordinal must be >= 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13539868/

相关文章:

python - 循环遍历大型 .tif 堆栈(图像光栅)并提取位置

java - 最大独立组重量

python - 类型错误 : descriptor 'replace' requires a 'str' object but received a 'NoneType '

python - Cython 并行计算中可变数量的 worker

python - 无法使用 OpenShift 安装 Pandas

python - 使 Python 能够利用所有内核来拟合 scikit-learn 模型

python - 在 matplotlib 中,如何在由两组不同数组定义的两条曲线之间进行填充?

python - 是否可以使用 matplotlib 在单独的窗口中显示多个图?

python - Django CMS错误: modules are not found despite being installed

python - 如何基于ylim缩放颜色条