首页 > 解决方案 > 绘制日期时间数据框会导致错误视图限制最小值 -36495.50013946759 小于 1

问题描述

我想使用 matplotlib 绘制数据框。

为什么在绘制数据框时会出现错误?

ds 列应该只包含日期时间值。这至少是我所期望的。

import pandas as pd
import numpy as np
import datetime
import matplotlib.pyplot as plt
np.random.seed(42)
start = pd.datetime(2000, 1, 1, 0, 0, 1)
ds = start
value = 10.0
df = pd.DataFrame(columns=["ds", "y"])

for runner in range(5):
    df.loc[len(df)] = [ds, value]
    value = value * (1 + np.random.normal(0, 0.01)) + 1
    ds = ds + datetime.timedelta(minutes=1)
df.head()
                   ds          y
0 2000-01-01 00:00:01  10.000000
1 2000-01-01 00:01:01  11.049671
2 2000-01-01 00:02:01  12.034394
3 2000-01-01 00:03:01  13.112339
4 2000-01-01 00:04:01  14.312044
plt.plot(df, "-o", markersize=2)
plt.show()

堆栈跟踪的结尾显示:

  `File "/home/user/anaconda3/lib/python3.6/site-packages/matplotlib/dates.py", line 1026, in viewlim_to_dt
    .format(vmin))
ValueError: view limit minimum -36495.50013946759 is less than 1 and is an invalid Matplotlib date value. This often happens if you pass a non-datetime value to an axis that has datetime units`

标签: pythonpandasmatplotlib

解决方案


plot如果您提供一个参数,它是一个多列数据框,则还不清楚应该绘制什么。因此它将其解释为将每一列绘制为数据帧索引的函数。您的第一列是日期时间,您的第二列是浮点数。我认为尝试以相同的比例绘制它们是没有意义的。相反,您可能希望将第一列用作 x 轴,将第二列用作 y 轴值。

您可以通过使第一列成为索引来做到这一点(然后有效地绘制一列)

plt.plot(df.set_index("ds"), "-o", markersize=2)

或者您可以将每一列提供给 的前两个参数plot

plt.plot(df.ds, df.y, "-o", markersize=2)

您也可以直接使用 pandas 进行绘图,从而导致 x 轴格式略有不同

df.set_index("ds").plot(marker="o", markersize=2)

推荐阅读