如何在xp轴中将条形图和线条图组合为matplotlib中的日期时间

时间:2018-04-11 07:20:50

标签: python pandas dataframe matplotlib bar-chart

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

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

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)

看似简单的任务变得极具挑战性。实际上,经过网上广泛搜索,我仍然没有找到任何干净的解决方案。

我试图同时使用pandas plot和matplotlib。 主要问题来自于条形图似乎难以处理日期时间索引(更喜欢整数,在某些情况下它会绘制日期,但在Epoch 1970-1-1样式中相当于0)。

1 个答案:

答案 0 :(得分:2)

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

  • 在同一图表上合并条形图和折线图
  • 在x轴上使用日期时间
  • 正确且动态地显示x-ticks时间标签(同时放大和缩小)

工作示例:

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