2016-08-22 5 views
1

Ich habe eine Zeitreihe in einem Pandas DataFrame (df.data im Beispiel) und möchte das Diagramm basierend auf den Werten einer anderen Spalte (df.colors im Beispiel; Werte sind 0, 1 und 2 in diesem Fall, aber es wäre gut/mehr tragbar, wenn es auch mit float s funktionieren würde).Farbzeitreihen basierend auf Spaltenwerten in Pandas

import pandas as pd 
n = 10 
seed(1) 
df = pd.DataFrame(data={"data":randn(n), "colors":randint(0,3,n)}, 
        index=pd.date_range(start="2016-01-01", periods=n)) 

df.data.plot(style=".", ms=10) 

Uncolored time-series plot

Was ich suche ist so etwas wie

df.data.plot(style=".", color=df.colors) 

(was nicht funktioniert), um ein Grundstück so zu produzieren:

Colored time-series plot

Hier sind die Marker rot, orange, und grün, für colors==0, 1 bzw. 2. Es ist relativ einfach, dies manuell für wenige Daten und wenige Farben zu tun, aber gibt es eine direkte Möglichkeit, dies automatisch zu tun?

Es scheint eine Lösung mit plt.scatter und Farbtabellen zu sein, als zu How to use colormaps to color plots of Pandas DataFrames in der Antwort gezeigt, aber mit einem Datetime-Index plt.scatter Verwendung zerstört die bequeme automatische Achsenskalierung df.data.plot(...) der Verwendung. Gibt es eine Möglichkeit, diese Notation zu verwenden?

Antwort

2

Eine Möglichkeit, dies zu erreichen, wäre die Verwendung von DF.replace und die Erstellung eines verschachtelten dictionary zur Festlegung der Farbwerte für die int/float Werte, die zugeordnet werden sollen.

plt.style.use('seaborn-white') 
df.replace({'colors':{0:'red',1:'orange',2:'green'}}, inplace=True) 

Sie könnten dann DF.groupby auf sie führen Sie die Farben für jede Untergruppe des groupby Objekt auf jedem Iterationsschritt gleich zu halten.

for index, group in df.groupby('colors'): 
    group['data'].plot(style=".", x_compat=True, ms=10, color=index, grid=True) 

Image

Verwandte Themen