Pandas python用日期绘制多个条形图范围

Pandas python用日期绘制多个条形图范围,pandas,datetime,matplotlib,bar-chart,Pandas,Datetime,Matplotlib,Bar Chart,我有两个数据帧: x1=[{"dates":'2018-01-31',"rev":-2}, {"dates":'2018-02-28',"rev":-5}, {"dates":'2018-03-31',"rev":-7}, {"dates":'2018-04-30',"rev":-8}, {"dates":'2018-

我有两个数据帧:

x1=[{"dates":'2018-01-31',"rev":-2},
{"dates":'2018-02-28',"rev":-5},
{"dates":'2018-03-31',"rev":-7},
{"dates":'2018-04-30',"rev":-8},
{"dates":'2018-05-31',"rev":-9},
{"dates":'2018-06-30',"rev":-2},
{"dates":'2018-07-31',"rev":1},
{"dates":'2018-08-31',"rev":2},
{"dates":'2018-09-30',"rev":3},
{"dates":'2018-10-31',"rev":4},
{"dates":'2018-11-30',"rev":4},
{"dates":'2018-12-31',"rev":5}]


x2=[{"dates":'2018-01-31',"rev":-5},
{"dates":'2018-02-28',"rev":-9},
{"dates":'2018-03-31',"rev":-9},
{"dates":'2018-04-30',"rev":-6},
{"dates":'2018-05-31',"rev":-1},
{"dates":'2018-06-30',"rev":-2},
{"dates":'2018-07-31',"rev":-14},
{"dates":'2018-08-31',"rev":2},
{"dates":'2018-09-30',"rev":3},
{"dates":'2018-10-31',"rev":4},
{"dates":'2018-11-30',"rev":-4},
{"dates":'2018-12-31',"rev":5}]


df1=pd.DataFrame(x1)
df1["dates"]=pd.to_datetime(df1.dates)
df2=pd.DataFrame(x2)
df2["dates"]=pd.to_datetime(df2.dates)
(谢谢)

我想画一个条形图。matplotlib指南建议执行以下操作:

width = 0.35  
fig, ax = plt.subplots()
rects1 = ax.bar(x - width/2, y1, width, label='y1')
rects2 = ax.bar(x + width/2, y2, width, label='y2')
然而,这似乎与日期无关。事实上,我尝试过:

ax = plt.axes()
widthb = 10
rects1 = ax.bar(df1.dates - widthb/2, df1.rev,color='blue', width=widthb)
rects2 = ax.bar(df2.dates + widthb/2, df2.rev,color='red',  width=widthb)
ax.xaxis_date()
正如预期的那样,我得到了以下错误:

unsupported operand type(s) for -: 'DatetimeIndex' and 'float'
你有什么建议来克服这个问题,同时拥有一个美丽的情节


谢谢

让我们尝试合并并绘图:

ax = df1.merge(df2, on='dates', how='outer').plot.bar(x='dates')
# other format with `ax`
ax.xaxis_date()
输出:


为什么不使用pandas的绘图方法,也就是说,因为pandas不像matplolib那样可自定义。您可以创建
并将其传递给pandas,让pandas完成大部分绘图工作,然后使用matplotlib自定义输出到您的核心内容。除非没有matplotlib的一些重要功能,否则很难做到这一点。例如,我将一列命名为“ex_ax”。由于我想根据latex样式(matplotlib.rc('text',usetex=True))进行绘图,pandas无法在plot.bar中处理它。非常感谢。我将使用此解决方案,尽管我更喜欢使用ax和matplolib功能进行绘图。@diedro
ax
是matplolib axis实例。可以对其他axis实例执行所有操作
ax.xaxis_date()
就是一个例子。