【问题标题】:How to plot time series that consists of different dates but same timestamps on one graph in matplotlib如何在 matplotlib 的一张图上绘制由不同日期但相同时间戳组成的时间序列
【发布时间】:2015-03-12 15:24:06
【问题描述】:

我的数据显示了在三个不同日期收集的一些值:2015-01-08、2015-01-09 和 2015-01-12。对于每个日期,都有几个具有时间戳的数据点。

日期/时间在列表中,如下所示:

['2015-01-08-09:00:00', '2015-01-08-10:00:00', '2015-01-08-11:00:00', '2015-01-08-12:00:00', '2015-01-08-13:00:00', '2015-01-09-14:00:00', '2015-01-09-15:00:00', '2015-01-09-16:00:00', '2015-01-12-09:00:00', '2015-01-12-10:00:00', '2015-01-12-11:00:00']

另一方面,我在另一个列表中有相应的值(浮点数):

[12210.0, 12210.0, 12180.0, 12240.0, 12250.0, 12420.0, 12390.0, 12400.0, 12380.0, 12450.0, 12460.0]

为了将所有这些放在一起并绘制图表,我使用以下代码:

import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import matplotlib.dates as md
import dateutil
from matplotlib.font_manager import FontProperties

timestamps = ['2015-01-08-09:00:00', '2015-01-08-10:00:00', '2015-01-08-11:00:00', '2015-01-08-12:00:00', '2015-01-08-13:00:00', '2015-01-09-14:00:00', '2015-01-09-15:00:00', '2015-01-09-16:00:00', '2015-01-12-09:00:00', '2015-01-12-10:00:00', '2015-01-12-11:00:00']

ticks = [12210.0, 12210.0, 12180.0, 12240.0, 12250.0, 12420.0, 12390.0, 12400.0, 12380.0, 12450.0, 12460.0]

plt.subplots_adjust(bottom=0.2)
plt.xticks( rotation=90 )

dates = [dateutil.parser.parse(s) for s in timestamps]

ax=plt.gca()
ax.set_xticks(dates)
ax.tick_params(axis='x', labelsize=8)

xfmt = md.DateFormatter('%H:%M:%S')
ax.xaxis.set_major_formatter(xfmt)

plt.plot(dates, ticks, label="Price")

plt.xlabel("Date and time", fontsize=12)
plt.ylabel("Price", fontsize=12)
plt.suptitle("Price during last three days", fontsize=12)

plt.legend(loc=0,prop={'size':8})

plt.savefig("figure.pdf")

当我尝试绘制这些日期时间和值时,我得到一个混乱的图表,线条来回走动。

看起来日期被忽略了,只考虑了时间戳,这就是图表混乱的原因。我试图编辑日期时间以具有相同的日期和连续的时间戳,并修复了图表。但是,我也必须有日期..

我做错了什么?

【问题讨论】:

  • 嗨阿卡,欢迎来到 Stack Overflow!我删除了您的长介绍,如果您愿意,可以将其作为评论重新发布,但这不是问题的必要条件。我们尽量只保留问题中的重要部分,以便以后发现它的其他人可以直接找到好东西!

标签: python datetime graph matplotlib plot


【解决方案1】:

当我尝试绘制这些日期时间和值时,我得到一个混乱的图表,线条来回走动。

你的情节到处都是,因为plt.plot 按照你给它的顺序连接了点。如果这个顺序在 x 中不是单调递增的,那么它看起来很“混乱”。您可以先按 x 对点进行排序以解决此问题。这是一个最小的例子:

import numpy as np
import pylab as plt

X = np.random.random(20)
Y = 2*X+np.random.random(20)

idx = np.argsort(X)
X2 = X[idx]
Y2 = Y[idx]

fig,ax = plt.subplots(2,1)
ax[0].plot(X,Y)
ax[1].plot(X2,Y2)
plt.show()

【讨论】:

  • 感谢您的快速回复!问题是,如果我用 1、2、3、4、... 11 替换“时间戳”列表中的元素,那么一切都会好起来的。这使我得出结论,python 忽略了日期并且只查看时间。因此,它为 1 月 8 日的一个绘制 09:00、10:00 等,然后在 X 轴上的同一位置再次回到 1 月 9 日的 09:00、10:00 等。
  • @Aka 当我绘制您提供的数据时,因此我试图回答所述问题。我没看到你在说什么。您能否编辑您的问题以提供带有图片最小示例?我知道你还不能发帖,放一个 imgur 链接,我们可以为你编辑。
  • 我想做的是连续绘制 Jan-8 09:00, Jan-8 10:00 ... etc .. Jan-9 09:00, Jan-9 10:00 。 .. Jan-12 09:00, Jan-12 10:00 等在 x 轴上,而不必按日期分解我的图表。是否可以绘制以便同时考虑日期和时间?
  • 是的,因为datetime 对象之间具有排序关系。您是否尝试使用我提供的示例对“日期”进行排序?
  • 还没有机会。但是,如果您可以在最初的帖子中看到该列表已经很好地排序,我不知道为什么它需要任何额外的排序。 python 不会从 index=0 项开始获取元素吗?
猜你喜欢
  • 1970-01-01
  • 2012-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-03
  • 2021-07-16
相关资源
最近更新 更多