关于python:如何在matplotlib中将条形图和折线图与x轴作为日期时间组合

How to combine bar and line plots with x-axis as datetime in matplotlib

我有一个带有datetimeIndex的dataFrame和两个带有int值的列。 我想在同一张图Col1上绘制条形图,在Col2上绘制线形图。

重要功能是在放大时也要正确标记x轴为日期时间。 我认为使用DateFormatter的解决方案将不起作用,因为我需要动态的xtick标签。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import matplotlib.pyplot as plt
import pandas as pd
import datetime as dt
import numpy as np

startDate = dt.datetime(2018,1,1,0,0)
nrHours = 144
datetimeIndex = [startDate + dt.timedelta(hours=x) for x in  range(0,nrHours)]

dF = pd.DataFrame(index=datetimeIndex)
dF['Col1'] = np.random.randint(1,3,nrHours)
dF['Col2'] = np.random.randint(3,6,nrHours)

axes = dF[['Col1']].plot(kind='bar')
dF[['Col2']].plot(ax=axes)

看起来似乎很简单的任务却非常具有挑战性。 实际上,在网上进行大量搜索之后,我仍然没有找到任何干净的解决方案。

我试图同时使用熊猫图和matplotlib。
主要问题来自于似乎很难处理日期时间索引的条形图(首选整数,在某些情况下,它绘制日期,但采用的是Epoch 1970-1-1样式,它等于0)。


我终于找到了使用mdates和date2num的方法。 该解决方案不是很干净,但是提供了一种有效的解决方案:

  • 在同一图形上组合条形图和折线图
  • 在X轴上使用日期时间
  • 正确且动态显示x点时间标签(以及放大和缩小时)

工作示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import matplotlib.pyplot as plt
import matplotlib.dates  as mdates
import pandas as pd
import datetime as dt
import numpy as np

startDate = dt.datetime(2018,1,1,0,0)
nrHours = 144
datetimeIndex = [startDate + dt.timedelta(hours=x) for x in range(0, nrHours)]

dF = pd.DataFrame(index=datetimeIndex)
dF['Col1'] = np.random.randint(1,3,nrHours)
dF['Col2'] = np.random.randint(3,6,nrHours)

fig,axes = plt.subplots()
axes.xaxis_date()
axes.plot(mdates.date2num(list(dF.index)),dF['Col2'])
axes.bar(mdates.date2num(list(dF.index)),dF['Col1'],align='center',width=0.02)
fig.autofmt_xdate()

样本输出:

enter image description here