2017-02-26 74 views
3

我目前使用statsmodels Python包为了绘制两个资产的自相关图(它是作为我的主人的一部分的财务任务),但是我在设置图例时存在问题,以便标记符合实际资产。例如,蓝色标记对应于“资产A”,而绿色标记对应于“资产B”。然而,另外两条线不断出现在传说中,我无法摆脱它们!我想要做的就是拥有一个带有两个标记的传说,这些标记对应于每个资产,但处理这个包的情节至今是绝对的噩梦,并且已经比处理matplotlib或我偶然发现的任何事情困难得多之前!我当前的代码如下:使用statsmodels设置图例时的困难Python包

acf_assetA=sm.tsa.stattools.acf(returns_assetA,nlags=40) 
acf_assetB=sm.tsa.stattools.acf(returns_assetB,nlags=40) 
legendA='Asset A' 
legendB='Asset B' 
legendC='Asset C' 
legendD='Asset B' 
autocorr_plot1,ax1=plt.subplots(figsize=(6,5)) 
ax1.set_xlabel('Lag') 
autocorr_plot1=sm.tsa.graphics.plot_acf(returns_assetA,ax=ax1,lags=np.arange(40),label='Asset A') 
autocorr_plot2=sm.tsa.graphics.plot_acf(returns_assetB,ax=ax1,lags=np.arange(40),label='Asset B') 
ax1.legend([legendA,legendB,legendC,legendD],loc='best',shadow=True) 

return autocorr_plot1, autocorr_plot2, acf_assetA, acf_assetB 

这是相当有用知道

returns_assetA, returns_assetB 

只是简单地包含一个数据帧的熊猫为内我的资产回报。

这就是我继续获得的情节的样子(忽略传说中的'资产C'部分 - 我只是简单地说,因为我一直被迫为我的传说包含四个输入以便为绿色标记来显示):

任何一种与要对这个传说问题的帮助将高度赞赏。非常感谢您提前!

回答

1

plot_acf功能在画布上创建3个对象:
[ZL]一个在零线,
[P]所述的相关性的点,
[VL]竖直线连接点数归零。

它们显示在图例的方式是
[ZL1] [P1] [ZL2] [P2]。[ZLN] [光合速率] [VL1] [VL2] .. [VLN]

enter image description here

因此,这个想法是从那些只有所需的手柄中选出。因此,我们会先把所有的手柄和标签

handles, labels= ax1.get_legend_handles_labels() 

,然后先删除最后一个len(handles)//3项目(垂直线)。

handles=handles[:-len(handles)//3] 

的我们就只能选择每其他项目从1开始的

handles=handles[1::2] 

这是那么完整的解决方案如何能够样子:

import numpy as np 
import statsmodels.tsa.stattools, statsmodels.graphics.tsaplots 
import matplotlib.pyplot as plt 

autocorr_plot1,ax1=plt.subplots(figsize=(6,5)) 
ax1.set_xlabel('Lag') 

autocorr_plot1=statsmodels.graphics.tsaplots.plot_acf(np.random.rand(16),ax=ax1, label='Asset A') 
autocorr_plot2=statsmodels.graphics.tsaplots.plot_acf(np.random.rand(16),ax=ax1, label='Asset B') 
#uncomment for testing purposes 
#autocorr_plot3=statsmodels.graphics.tsaplots.plot_acf(np.random.rand(16),ax=ax1, label='Asset C') 
#autocorr_plot4=statsmodels.graphics.tsaplots.plot_acf(np.random.rand(16),ax=ax1, label='Asset D') 

handles, labels= ax1.get_legend_handles_labels() 
handles=handles[:-len(handles)//3][1::2] 
labels =labels[:-len(handles)//3][1::2] 
ax1.legend(handles=handles, labels=labels,loc='best',shadow=True, numpoints=2) 

plt.show() 

enter image description here

+0

谢谢你真是太棒了!它终于奏效了!我只希望statsmodels的开发人员能够让这个软件包的绘图方面更加人性化。 – Jayjay95

+0

您可以在[statsmodel开发页面](https://github.com/statsmodels/statsmodels/issues)上打开错误报告或功能请求。 – ImportanceOfBeingErnest

+0

谢谢,我会这样做:) – Jayjay95