2016-06-14 11 views
4

aus dem folgende Beispiel starten:Pandas - Streudiagramm mit verschiedener Farb-Legende für jeden Punkt

fig, ax = plt.subplots() 

df = pd.DataFrame({'n1':[1,2,1,3], 'n2':[1,3,2,1], 'l':['a','b','c','d']}) 

for label in df['l']: 

    df.plot('n1','n2', kind='scatter', ax=ax, s=50, linewidth=0.1, label=label) 

, was ich erhielt die folgenden Scatterplot:

enter image description here

ich jetzt versuchen, Legen Sie für jeden der vier Punkte eine andere Farbe fest. Ich weiß, dass ich kann Schleife über eine Reihe von zum Beispiel vier Farben in einer Liste wie:

colorlist = ['b','r','c','y'] 

aber da meine reale Datenmenge mindestens 20 verschiedene Punkte umfasst, wurde ich für eine Art „Farbgenerator suche "um darin zu schleifen.

Antwort

2

Die folgende Methode eine Liste von Farben, solange Ihre Datenrahmen erstellen, und dann Zeichnen Sie einen Punkt mit einem Etikett mit jeder Farbe:

import matplotlib.pyplot as plt 
import matplotlib.cm as cm 
import matplotlib.colors as colors 
import numpy as np 
import pandas as pd 

fig, ax = plt.subplots() 

df = pd.DataFrame({'n1':[1,2,1,3], 'n2':[1,3,2,1], 'l':['a','b','c','d']}) 

colormap = cm.viridis 
colorlist = [colors.rgb2hex(colormap(i)) for i in np.linspace(0, 0.9, len(df['l']))] 

for i,c in enumerate(colorlist): 

    x = df['n1'][i] 
    y = df['n2'][i] 
    l = df['l'][i] 

    ax.scatter(x, y, label=l, s=50, linewidth=0.1, c=c) 

ax.legend() 

plt.show() 

enter image description here

2

Wie wäre es damit,

enter image description here


Hier ist der Quellcode,

import matplotlib.pyplot as plt 
import pandas as pd 
import numpy as np 
from matplotlib import cm 

fig, ax = plt.subplots() 

df = pd.DataFrame({'n1':[1,2,1,3], 'n2':[1,3,2,1], 'l':['a','b','c','d']}) 

#colors = ['b','r','c','y'] 
nrof_labels = len(df['l']) 
colors = cm.rainbow(np.linspace(0, 1, nrof_labels))  # create a bunch of colors 

for i, r in df.iterrows(): 
    ax.plot(r['n1'], r['n2'], 'o', markersize=10, color=colors[i], linewidth=0.1, label=r['l']) 

ax.set_xlim(0.5, 3.5) 
ax.set_ylim(0.5, 3.5) 
plt.legend(loc='best') 

plt.show() 
+0

Danke, ich war mir dieser Technik bewusst, aber da meine Punkte in der Länge variieren können, suchte ich nach etwas allgemeinerem, das nicht mit einer festen Anzahl von Punkten zusammenhängt. –

+0

@FabioLamanna, benutze 'colors = cm.rainbow (np.linspace (0, 1, len (d ['f'])))), um eine Reihe von Farben zu erzeugen. Ich habe gerade meine Antwort aktualisiert. – SparkAndShine

2

IIUC Sie es auf diese Weise tun können:

import matplotlib.pyplot as plt 
from matplotlib import colors 
import pandas as pd 

colorlist = list(colors.ColorConverter.colors.keys()) 
fig, ax = plt.subplots() 
[df.iloc[[i]].plot.scatter('n1', 'n2', ax=ax, s=50, label=l, 
         color=colorlist[i % len(colorlist)]) 
for i,l in enumerate(df.l)] 

color:

In [223]: colorlist 
Out[223]: ['m', 'b', 'g', 'r', 'k', 'y', 'c', 'w'] 

enter image description here

PS colorlist[i % len(colorlist)] - sollte in der Liste immer bleiben begrenzt

Verwandte Themen