2017-02-26 3 views
3

Ich verwende derzeit das Python-Paket von statsmodels, um ein Autokorrelationsdiagramm für zwei Assets zu zeichnen, die ich habe (es ist für eine Finanzaufgabe als Teil meines Masters), aber ich bin Probleme mit dem Festlegen einer Legende haben, sodass die Markierungen den tatsächlichen Assets entsprechen. Zum Beispiel entspricht der blaue Marker "Asset A", während der grüne Marker "Asset B" entspricht. In der Legende erscheinen jedoch immer noch zwei weitere Zeilen, und ich kann sie irgendwie nicht loswerden! Alles, was ich tun möchte, ist eine Legende mit zwei Markern, die jedem Asset entsprechen, aber der Umgang mit Plots für dieses Paket war bisher ein absoluter Albtraum und war wesentlich schwieriger als der Umgang mit Matplotlib oder irgendetwas, über das ich je gestolpert bin Vor! Mein aktueller Code ist wie folgt:Schwierigkeit, eine Legende mit statsmodels Python-Paket

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 

Es ist sehr nützlich zu wissen, dass

returns_assetA, returns_assetB 

sind einfach die Renditen für mein Vermögen innerhalb eines Pandas Datenrahmen enthalten ist.

Und so sieht der Plot, den ich erhalte, aus (ignoriere den 'Asset C' Teil der Legende - ich füge das einfach hinzu, weil ich gezwungen bin, vier Eingaben für meine Legende einzufügen, damit das Grün erscheint Marker zeigen):

Jede über diese Legende Ausgabe Hilfe Art würde sehr geschätzt mit dem gehen. Vielen Dank im Voraus!

Antwort

1

Die plot_acf Funktion 3-Objekte auf der Leinwand erzeugt:
[ZL] eine Linie auf Null,
[P] die Punkte der Korrelation,
[VL] die Verbindungs ​​vertikalen Linien die Punkte auf Null.

Die Art, wie sie in der Legende angezeigt ist
[ZL1] [P1] [ZL2] [P2] .. [ZLn] [Pn] [VL1] [VL2] .. [VLn]

enter image description here

Die Idee wäre daher, nur die gewünschten Griffe auszuwählen. Daher würden wir zuerst alle Griffe bekommen und Etiketten

handles, labels= ax1.get_legend_handles_labels() 

und dann zuerst die letzten len(handles)//3 Artikel fallen (die vertikalen Linien).

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

Das würden wir nur jedes zweite Element auszuwählen, beginnend bei 1.

handles=handles[1::2] 

Dies ist dann, wie die komplette Lösung aussehen könnte:

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

Thank dich so sehr! Es hat endlich funktioniert! Ich wünschte mir nur, dass die Entwickler von statsmodels den Plot-Aspekt des Pakets etwas benutzerfreundlicher machen würden. – Jayjay95

+0

Sie können einen Fehlerbericht oder eine Feature-Anfrage auf der [statsmodel developement page] (https://github.com/statsmodels/statsmodels/issues) öffnen. – ImportanceOfBeingErnest

+0

Danke, ich werde es tun :) – Jayjay95