难以使用statsmodels Python包设置图例

难以使用statsmodels Python包设置图例,python,matplotlib,plot,legend,statsmodels,Python,Matplotlib,Plot,Legend,Statsmodels,我目前正在使用statsmodels Python包,以便为我拥有的两项资产绘制一个自相关图(这是作为我的硕士课程的一部分的财务任务),但我在设置图例以使标记与实际资产相对应方面遇到了问题。例如,蓝色标记对应于“资产A”,而绿色标记对应于“资产B”。然而,传说中又出现了另外两行,我不知怎的无法摆脱它们!我想做的就是创建一个图例,其中每个资产对应两个标记,但到目前为止,处理此软件包的绘图绝对是一场噩梦,比处理matplotlib或任何我以前偶然发现的东西都要困难得多!我目前的代码如下: acf_a

我目前正在使用statsmodels Python包,以便为我拥有的两项资产绘制一个自相关图(这是作为我的硕士课程的一部分的财务任务),但我在设置图例以使标记与实际资产相对应方面遇到了问题。例如,蓝色标记对应于“资产A”,而绿色标记对应于“资产B”。然而,传说中又出现了另外两行,我不知怎的无法摆脱它们!我想做的就是创建一个图例,其中每个资产对应两个标记,但到目前为止,处理此软件包的绘图绝对是一场噩梦,比处理matplotlib或任何我以前偶然发现的东西都要困难得多!我目前的代码如下:

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”部分-我只是简单地说,因为我一直被迫为图例包含四个输入,以便显示绿色标记):


我们将非常感谢任何关于这个传奇问题的帮助。提前非常感谢

绘图功能在画布上创建3个对象:
[ZL]零位线,
[P]相关点,
[VL]将点连接到零的垂直线

它们在图例中的显示方式是
[ZL1][P1][ZL2][P2]。。[ZLn][Pn][VL1][VL2]。。[VLn]

因此,我们的想法是只从这些控制柄中选择所需的控制柄。因此,我们首先要得到所有的句柄和标签

handles, labels= ax1.get_legend_handles_labels()  
然后首先放下最后一个
len(句柄)//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()

非常感谢您!终于成功了!我只希望statsmodels开发人员能够使程序包的绘图方面更加用户友好。您可以在打开错误报告或功能请求。谢谢,我会这样做:)
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()