【问题标题】:How to combine bar and line plots with x-axis as datetime in matplotlib如何在matplotlib中将条形图和线图与x轴结合为日期时间
【发布时间】:2018-09-20 23:20:24
【问题描述】:

我有一个带有 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)。

【问题讨论】:

  • 有一大堆类似的问题,here is a collection。他们都没有为您的问题提供解决方案?
  • 感谢您的回复。我已经查看了这些链接,虽然有些提供了非常有用的提示,但没有一个提供完整的解决方案。

标签: python pandas dataframe matplotlib bar-chart


【解决方案1】:

我终于找到了使用 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()

样本输出:

【讨论】:

  • 我冒昧地用示例输出来说明您的脚本。
  • 另一种处理和格式化日期的方法适用于 matplotlib 中的组合条+线图,请参见this answer
猜你喜欢
  • 2020-03-24
  • 2019-06-25
  • 2019-04-18
  • 1970-01-01
  • 2015-10-15
  • 2016-12-13
  • 2018-05-20
  • 2019-11-12
  • 1970-01-01
相关资源
最近更新 更多