Python:Legend在Pandas MultiIndex plot

时间:2016-03-15 23:17:54

标签: python pandas matplotlib legend

我正在尝试绘制来自2个单独MultiIndex的数据,其数据与每个数据中的数据相同。

目前,这是生成两个单独的图,我无法通过附加一些字符串来个性化图表上的每一行来自定义图例。任何帮助将不胜感激!

到目前为止,这是方法:

def plot_lead_trail_res(df_ante, df_post, symbols=[]):

if len(symbols) < 1:
    print "Try again with a symbol list. (Time constraints)"
else:
    df_ante = df_ante.loc[symbols]
    df_post = df_post.loc[symbols]
    ante_leg = [str(x)+'_ex-ante' for x in df_ante.index.levels[0]]
    post_leg = [str(x)+'_ex-post' for x in df_post.index.levels[0]]
    print "ante_leg", ante_leg
    ax = df_ante.unstack(0).plot(x='SHIFT', y='MUTUAL_INFORMATION', legend=ante_leg)
    ax = df_post.unstack(0).plot(x='SHIFT', y='MUTUAL_INFORMATION', legend=post_leg)
    ax.set_xlabel('Time-shift of sentiment data (days) with financial data')
    ax.set_ylabel('Mutual Information')

使用此函数调用:

sentisignal.plot_lead_trail_res(data_nasdaq_top_100_preprocessed_mi_res, data_nasdaq_top_100_preprocessed_mi_res_validate, ['AAL', 'AAPL'])

我得到了下图:

Current plots

理想情况下,两组线都在同一个图表上,具有相同的轴!

更新2 [连接解决方​​案]

我已经解决了使用连接从多个帧绘图的问题,但是图例与图表上的线条颜色不匹配。

没有对图例的特定调用,并且未使用plot()中的label参数。

代码:

df_ante = data_nasdaq_top_100_preprocessed_mi_res
df_post = data_nasdaq_top_100_preprocessed_mi_res_validate
symbols = ['AAL', 'AAPL']
df_ante = df_ante.loc[symbols]
df_post = df_post.loc[symbols]
df_ante.index.set_levels([[str(x)+'_ex-ante' for x in df_ante.index.levels[0]],df_ante.index.levels[1]], inplace=True)
df_post.index.set_levels([[str(x)+'_ex-post' for x in df_post.index.levels[0]],df_post.index.levels[1]], inplace=True)

df_merge = pd.concat([df_ante, df_post])
df_merge['SHIFT'] = abs(df_merge['SHIFT'])

df_merge.unstack(0).plot(x='SHIFT', y='MUTUAL_INFORMATION')

图像:

MultiIndex Plot Image

1 个答案:

答案 0 :(得分:0)

我认为,

ax = df_ante.unstack(0).plot(x='SHIFT', y='MUTUAL_INFORMATION', legend=ante_leg)

您将plot()的输出放在ax中,包括行,然后被第二个函数调用覆盖。我是对的,首先绘制的线条缺失了吗?

官方程序将类似于

fig = plt.figure(figsize=(5, 5)) # size in inch
ax = fig.add_subplot(111) # if you want only one axes

现在axes中有一个ax对象,可以将其作为下一个图的输入。