我有一个带有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)。
答案 0 :(得分:2)
我终于找到了使用mdates和date2num的方法。解决方案不是很干净,但提供了有效的解决方案:
工作示例:
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()
示例输出: