2016-08-11 12 views
3

Ich bin mir sicher, dass ich hier etwas wirklich einfaches vermasseln, aber ich kann es nicht herausfinden. Ich versuche einfach, Datengruppen als Streudiagramme mit verschiedenen Farben für jede Gruppe darzustellen, indem ich durch einen Datenrahmen blättern und wiederholt ax.scatter aufrufen. Ein minimales Beispiel ist:Unerwartete Farben in mehreren Streudiagrammen in Matplotlib

import numpy as np; import pandas as pd; import matplotlib.pyplot as plt; import seaborn as sns 
%matplotlib inline 

df = pd.DataFrame({"Cat":list("AAABBBCCC"), "x":np.random.rand(9), "y":np.random.rand(9)}) 

fig, ax = plt.subplots() 
for i,cat in enumerate(df.Cat.unique()): 
    print i, cat, sns.color_palette("husl",3)[i] 
    ax.scatter(df[df.Cat==cat].x.values, df[df.Cat==cat].y.values, marker="h",s=70, 
       label = cat, color=sns.color_palette("husl",3)[i]) 
ax.legend(loc=2) 

ich die print Erklärung für meine eigene geistige Gesundheit hinzugefügt, um zu bestätigen, dass ich in die Tat durch die Gruppen am Radfahren und verschiedene Farben wählen. Die Ausgabe sieht jedoch wie folgt:

enter image description here

(Wenn dies etwas ist schwer zu sehen: die Gruppen A, B und C haben drei sehr ähnlichen Blues nach der Legende, aber alle scatterpoints haben unterschiedliche und scheinbar nicht verwandte Farben, die über die Gruppen hinweg nicht einmal identisch sind)

Was ist hier los?

Antwort

1

sollte ein bisschen mehr Zeit whittling Sie das Mindestarbeitsbeispiel ausgegeben. Stellt sich heraus, das Problem war mit dem Aufruf an sns.color_palette, die ein (float,float,float) Tupel zurückgibt, die scatter verwirrt, da es anscheinend eine der Zahlen als Alpha-Wert interpretiert.

Das Problem wird durch

ersetzt gelöst
color = sns.color_palette("husl",3)[i] 

mit

color = sns.color_palette("husl",3)[i] + (1.,) 

einen expliziten Wert für alpha hinzuzufügen.

+0

Wow! Gut, es selbst herauszufinden. –

1

Sie könnten scatter() Methode der pandas verwenden, indem die Ziel ax Spezifizierung und die Plots Wiederholen mehrere Spaltengruppen in einem einzelnen Achsen plotten, ax.

# set random seed 
np.random.seed(42)      

fig, ax = plt.subplots() 
for i,label in enumerate(df['Cat'].unique()): 
    # select subset of columns equal to a given label 
    df['X'] = df[df['Cat']==label]['x']  
    df['Y'] = df[df['Cat']==label]['y'] 
    df.plot.scatter(x='X',y='Y',color=sns.color_palette("husl",3)[i],label=label,ax=ax) 
ax.legend(loc=2) 

enter image description here

+0

In der Tat eine Möglichkeit, leider nicht für meinen Anwendungsfall, da ich auf einer Karte plane, also muss ich die 'scatter' Methode des' Basemap' Objektes verwenden. –

Verwandte Themen