2017-06-23 5 views
1

ich eine große Pandas Datenrahmen, die ich einen Plot erstellen möchten - hier ist ein vereinfachtes Beispiel:Farbcode ein Pandas Plot basiert auf Spaltenwerte

import pandas as pd 
import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib.cm as cm 
colors = iter(cm.rainbow(np.linspace(0, 1, 4))) 


sample = pd.DataFrame({'X': [1,2,3,1,2,3,1,2,1,2,3], 
        'Y': [1,1,1,2,2,2,3,3,4,4,4]}) 

Ich möchte eine farbcodierte Liniendiagramm erstellen, mit Farbe auf X Spaltenwerte basierend Ändern (X-Werte sind immer die gleichen Zahlen wiederholt, aber die Länge ist nicht immer gleich) - der Standard-Diagramm ist:

plt.plot(sample['X'], sample['Y'], linestyle = '-') 

enter image description here

, aber ich möchte den Prozess automatisieren, so dass jedes Mal X-Spalte startet eine neue Farbe zu haben - das ist das Ergebnis, das ich

plt.plot(sample['X'][0:3], sample['Y'][0:3], linestyle = '-', color = next(colors)) 
plt.plot(sample['X'][3:6], sample['Y'][3:6], linestyle = '-', color = next(colors)) 
plt.plot(sample['X'][6:8], sample['Y'][6:8], linestyle = '-', color = next(colors)) 
plt.plot(sample['X'][8:], sample['Y'][8:], linestyle = '-', color = next(colors)) 

jeder Vorschlag, wie dies zu erreichen haben?

enter image description here

Antwort

1

ich bauen würde, was Sie bereits vorgeschlagen:

slices = [slice(0, 3), slice(3, 6), slice(6, 8), slice(8, None)] 
for _slice, color in zip(slices, colors): 
    plt.plot(sample['X'][_slice], sample['Y'][_slice], c=color) 
plt.show() 

alternativ, wenn Sie eine zusätzliche Spalte, um Ihre Daten hinzufügen:

sample2 = pd.DataFrame({'X': [1,2,3,1,2,3,1,2,1,2,3], 
         'Y': [1,1,1,2,2,2,3,3,4,4,4], 
         'G': [0,0,0,1,1,1,2,2,3,3,3]}) 

colors = cm.rainbow(np.linspace(0, 1, 4)) 
for name, group in sample2.groupby(['G']): 
    plt.plot(group['X'], group['Y'], c=colors[name]) 
plt.show() 
+0

Dank - Ihre alternative Lösung gearbeitet Ich (ich habe Zeitstempel, so kann ich eine eindeutige ID-Spalte für jede Reihe von Zahlen) – Dimitris