Matplotlib熊猫日期时间绘图问题

时间:2020-09-10 19:35:31

标签: python pandas dataframe datetime matplotlib

我不确定这是怎么回事,但是当我尝试使用索引设置为日期时间的数据框进行散点图时,在x轴图中,我得到的日期范围更大。这是一个示例:

import matplotlib.pyplot as plt
import pandas as pd

datetimes = ['2020-01-01 01:00:00', '2020-01-01 01:00:05',
             '2020-01-01 01:00:10', '2020-01-01 01:00:15',
             '2020-01-01 01:00:20', '2020-01-01 01:00:25',
             '2020-01-01 01:00:30', '2020-01-01 01:00:35',
             '2020-01-01 01:00:40', '2020-01-01 01:00:45']
datetimes = pd.to_datetime(datetimes)
values = [1,2,3,4,5,6,7,8,9,10]
df = pd.DataFrame()
df['values'] = values
df = df.set_index(datetimes)

fig, ax = plt.subplots(figsize=(16,9))
ax.scatter(df.index, df.values)
plt.show()

我明白了: This does not plot correctly

但是,如果我进行绘图而不是分散绘图

fig, ax = plt.subplots(figsize=(16,9))
ax.plot(df)
plt.show()

我得到: This plots correctly

我不明白为什么x轴在散点图上有一个很大的日期范围,而我给出的日期时间范围却不包含该范围。使用plot似乎可以正常工作,但不能使用scatter。我猜想我在这里遗漏了一些明显的东西,但是我没有在谷歌搜索上取得任何成功。任何见识将不胜感激!

3 个答案:

答案 0 :(得分:2)

您的代码在我的机器(matplotlib 3.2.2和pandas 1.0.5)上运行得很好。您使用的是哪个版本的matplotlib和pandas?

尝试更新您的库或使用此方法:

ax.set_xlim(df.index[0], df.index[-1])

答案 1 :(得分:1)

未经研究,我不知道原因,但如果您使用plt.xlim(df.index[0], df.index[-1]),则可以继续: enter image description here

答案 2 :(得分:1)

我严格将您的代码缩短为:

datetimes = ['2020-01-01 01:00:00', '2020-01-01 01:00:05',
             '2020-01-01 01:00:10', '2020-01-01 01:00:15',
             '2020-01-01 01:00:20', '2020-01-01 01:00:25',
             '2020-01-01 01:00:30', '2020-01-01 01:00:35',
             '2020-01-01 01:00:40', '2020-01-01 01:00:45']
values = [1,2,3,4,5,6,7,8,9,10]
df = pd.DataFrame({'values': values}, index=pd.to_datetime(datetimes))
fig, ax = plt.subplots(figsize=(10,4))
ax.scatter(df.index, df['values'])
plt.show()

但这没关系。

另一个细节是, df.values 检索基础的 Numpy 数组, 而 df ['values'] (如我所写)仅检索感兴趣的列。

我得到的剧情完全符合预期:

enter image description here

也许是 Pandas 和/或 Pyplot 版本的问题。 我使用 Pandas 版本 1.0.3 Pyplot 版本 3.2.1 。 如果您使用的是旧版本,也许应该升级?

另一个选项:手动设置 x 轴限制:

plt.xlim(pd.to_datetime('2020-01-01 00:59:55'),
    pd.to_datetime('2020-01-01 01:00:50'))