使用 statsmodels Python 包设置图例很困难

Jay*_*y95 5 python plot matplotlib legend statsmodels

我目前正在使用 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
Run Code Online (Sandbox Code Playgroud)

知道这一点非常有用

returns_assetA, returns_assetB
Run Code Online (Sandbox Code Playgroud)

只是 Pandas 数据框中包含的资产的回报。

这就是我不断获得的图的样子(忽略图例的“资产 C”部分 - 我只是简单地这么说,因为我一直被迫为我的图例添加四个输入,以便显示绿色标记):

任何有关解决此传奇问题的帮助都将受到高度赞赏。预先非常感谢您!

Imp*_*est 2

plot_acf函数在画布上创建 3 个对象:
[ZL]零处的线,
[P] 相关点,
[VL]将点连接到零的垂直线。

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

在此输入图像描述

因此,我们的想法是从这些句柄中仅选择所需的句柄。因此我们首先获得所有的句柄和标签

handles, labels= ax1.get_legend_handles_labels()  
Run Code Online (Sandbox Code Playgroud)

然后首先放下最后一个len(handles)//3项目(垂直线)。

handles=handles[:-len(handles)//3]  
Run Code Online (Sandbox Code Playgroud)

我们只会选择从 1 开始的所有其他项目。

handles=handles[1::2]
Run Code Online (Sandbox Code Playgroud)

完整的解决方案如下所示:

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()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述