python - 如何在 matplotlib 中将 x 轴作为日期时间的条形图和线图结合起来

标签 python pandas dataframe matplotlib bar-chart

我有一个带有 datetimeIndex 的数据帧和两列带有 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)

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

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

最佳答案

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

  • 在同一图表上合并条形图和折线图
  • 在 x 轴上使用日期时间
  • 正确、动态地显示 x 刻度时间标签(放大和缩小时也是如此)

工作示例:

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

关于python - 如何在 matplotlib 中将 x 轴作为日期时间的条形图和线图结合起来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49768866/

相关文章:

python - Pandas Holidays to Dataframe with Holiday Name

r - R 中的 Grep(零或任何字符)

python-3.x - Python Pandas 前向填充特定时间范围内的缺失数据

python - 处理字典两点之间的距离

python - 是否可以将双矩阵列转换为列表或配对?

python - 合并具有不同维度和相关数据的数据框

python - 从具有不同值和类型的一列创建新的数据框列

python - 使用 1 个字典作为基础在 Python 中合并一个字典

java - android python 完全集成

python - pyplot.hist histt​​ype = 'step' 故障取决于数据