2017-02-26 46 views
3

私は現在持っている2つの資産の自己相関グラフをプロットするためにstatsmodels Pythonパッケージを使用しています(私のマスターの一部として財務割り当て用です)。マーカーが実際の資産に対応するように凡例を設定することに問題があります。例えば、青色のマーカーは「資産A」に対応し、緑色のマーカーは「資産B」に対応する。しかし、さらに2本の線が伝説に残っているので、何とかそれらを取り除くことはできません!私がしたいのは、各資産に対応する2つのマーカーを持つ伝説ですが、このパッケージのためのプロットを扱うことはこれまでの絶対的な悪夢であり、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'部分を無視したようなものです。グリーンのために私の凡例に4つの入力を含めることを余儀なくされているのでマーカー表示する):

この伝説の問題について行くのヘルプの任意の種類は非常にいただければ幸いです。事前にどうもありがとうございました!

答えて

1

plot_acf関数は3つのキャンバス上のオブジェクトを作成する:
[ZL]ゼロのライン、
[P]相関の点、
[VL]接続垂直線をポイントは0になります。

それらが凡例に表示される方法が
ある[ZL1] [P1] [ZL2] [P2] .. [ZLN] [PN] [VL1] [VL2] .. [VLN]

enter image description here

したがって、考えられるハンドルだけを選択することが考えられます。そこで私たちは、最初にすべてのハンドルを取得し、

handles, labels= ax1.get_legend_handles_labels() 

にラベルを付けた後、最初の最後len(handles)//3アイテム(垂直線)をドロップすると思います。

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

感謝:

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

ザ・我々は唯一1.これは完全なソリューションは次のようになりますどのようにしてある

handles=handles[1::2] 

で始まる他のすべての項目を選択すると思いますあなたはそんなに!それはついに働いた!私はちょうどスタジオデベロッパーがパッケージのプロット面をユーザーフレンドリーにすることを望みます。 – Jayjay95

+0

[statsmodel開発ページ](https://github.com/statsmodels/statsmodels/issues)でバグレポートまたは機能リクエストを開くことができます。 – ImportanceOfBeingErnest

+0

ありがとう、私はそうする:) – Jayjay95

関連する問題