matplotlib带日期的条形图

47

我知道plot_date(),但是有没有bar_date()呢?

一般的方法是使用set_xticksset_xticklabels,但我想要一个可以处理从几个小时到几年的时间尺度的东西(这意味着涉及到主要和次要刻度来使事情可读)。

我正在绘制与特定时间间隔相关联的值(条形跨度)。这是我使用的基本解决方案:

import matplotlib.pyplot as plt
import datetime
t = [datetime.datetime(2010, 12, 2, 22, 0), datetime.datetime(2010, 12, 2, 23, 0),
     datetime.datetime(2010, 12, 10, 0, 0), datetime.datetime(2010, 12, 10, 6, 0)]
y = [4, 6, 9, 3]
interval = 1.0 / 24.0  #1hr intervals, but maplotlib dates have base of 1 day
ax = plt.subplot(111)
ax.bar(t, y, width=interval)
ax.xaxis_date()
plt.show()
2个回答

61

plot_date 函数的作用是绘图,并调用 ax.xaxis_date()

你只需要这样做:

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

x = [datetime.datetime(2010, 12, 1, 10, 0),
    datetime.datetime(2011, 1, 4, 9, 0),
    datetime.datetime(2011, 5, 5, 9, 0)]
y = [4, 9, 2]

ax = plt.subplot(111)
ax.bar(x, y, width=10)
ax.xaxis_date()

plt.show()

带有X日期的条形图


感谢!具体来说,我正在绘制与特定时间间隔(柱状图跨度)相关联的值。我现在想我已经弄清楚了 - 我会编辑上面的内容。 - Adam Greenhall

0
在较新的matplotlib版本(例如3.7.1)中,plt.plot()plt.bar()可以直接处理datetime输入,无需使用date2num等。因此,如果x轴是datetime,则可以将时间差直接传递为条形图的宽度。
import matplotlib.pyplot as plt
import datetime

t = [datetime.datetime(2010, 12, 2, 22, 0), datetime.datetime(2010, 12, 2, 23, 0),
     datetime.datetime(2010, 12, 10, 0, 0), datetime.datetime(2010, 12, 10, 6, 0)]
y = [4, 6, 9, 3]

interval = datetime.timedelta(hours=1)     # <----- timedelta of 1 hour

fig, ax = plt.subplots()
ax.bar(t, y, width=interval)
fig.autofmt_xdate()

result


在原帖和@Joe Kington的回答中,使用了xaxis_date()。如果传递给x轴的数据已经是日期时间格式(如上面的代码),则不需要使用它。但是,如果传递给x轴的数据是数字,但您想将其视为日期时间,则需要使用它。
t = [14946.25, 14946.29, 14953.33, 14953.58] # <---- numbers instead of datetime
y = [4, 6, 9, 3]
interval = 1 / 24                            # <---- has to be numeric because `t` is numeric

fig, ax = plt.subplots()
ax.bar(t, y, width=interval)
ax.xaxis_date()                              # <---- treat x-ticks as datetime
fig.autofmt_xdate()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接