2016-07-14 3 views
2

Ich habe versucht, diese How to make custom legend in matplotlib SO Frage zu folgen, aber ich denke, ein paar Dinge sind in der Übersetzung verloren. Ich habe ein benutzerdefiniertes Farb-Mapping für die verschiedenen Punkteklassen in meinem Plot verwendet und möchte eine Tabelle mit diesen Farb-Label-Paaren erstellen können. Ich habe die Informationen in einem Wörterbuch D_color_label gespeichert und dann 2 parallele Listen colors und labels gemacht. Ich habe versucht, es in der ax.legend zu verwenden, aber es schien nicht zu funktionieren.Benutzerdefinierte Legende für Seaborn regplot (Python 3)

np.random.seed(0) 

# Create dataframe 
DF_0 = pd.DataFrame(np.random.random((100,2)), columns=["x","y"]) 

# Label to colors 
D_idx_color = {**dict(zip(range(0,25), ["#91FF61"]*25)), 
       **dict(zip(range(25,50), ["#BA61FF"]*25)), 
       **dict(zip(range(50,75), ["#916F61"]*25)), 
       **dict(zip(range(75,100), ["#BAF1FF"]*25))} 

D_color_label = {"#91FF61":"label_0", 
       "#BA61FF":"label_1", 
       "#916F61":"label_2", 
       "#BAF1FF":"label_3"} 

# Add color column 
DF_0["color"] = pd.Series(list(D_idx_color.values()), index=list(D_idx_color.keys())) 

# Plot 
fig, ax = plt.subplots(figsize=(8,8)) 
sns.regplot(data=DF_0, x="x", y="y", scatter_kws={"c":DF_0["color"]}, ax=ax) 

# Add custom legend 
colors = list(set(DF_0["color"])) 
labels = [D_color_label[x] for x in set(DF_0["color"])] 

# If I do this, I get the following error: 
# ax.legend(colors, labels) 
# UserWarning: Legend does not support '#BA61FF' instances. 
# A proxy artist may be used instead. 

enter image description here

Antwort

2

http://matplotlib.org/users/legend_guide.html Nach Sie Legende Funktion Künstler setzen müssen, der markiert werden soll. Zur Nutzung scatter_plot einzeln Sie gruppieren haben, indem Sie Ihre Daten durch Farbe und zeichnen Sie alle Daten einer Farbe individuell ein eigenes Label für jeden Künstler zu setzen:

import pandas as pd 
import numpy as np 
import matplotlib.pylab as plt 
import seaborn as sns 

np.random.seed(0) 

# Create dataframe 
DF_0 = pd.DataFrame(np.random.random((100,2)), columns=["x","y"]) 
DF_0['color'] = ["#91FF61"]*25 + ["#BA61FF"]*25 + ["#91FF61"]*25 + ["#BA61FF"]*25 
#print DF_0 

D_color_label = {"#91FF61":"label_0", 
       "#BA61FF":"label_1", 
       "#916F61":"label_2", 
       "#BAF1FF":"label_3"} 
colors = list(set(DF_0["color"])) 
labels = [D_color_label[x] for x in set(DF_0["color"])] 

ax = sns.regplot(data=DF_0, x="x", y="y", scatter_kws={'c':DF_0['color'], 'zorder':1}) 

# Make a legend 
# groupby and plot points of one color 
ind = 0 
for i, grp in DF_0.groupby(['color']): 
    grp.plot(kind = 'scatter', x = 'x', y = 'y', c = i, ax = ax, label = labels[ind], zorder = 0) 
    ind += 1  
ax.legend(loc=2) 

plt.show() 

enter image description here