2016-07-14 3 views
2

Я стараюсь следовать этому вопросу How to make custom legend in matplotlib ВОПРОС, но я думаю, что некоторые вещи теряются в переводе. Я использовал настраиваемое цветовое сопоставление для разных классов точек на моем сюжете, и я хочу, чтобы можно было разместить таблицу с этими парами ярлыков цветов. Я сохранил информацию в словаре D_color_label, а затем сделал 2 параллельных списка colors и labels. Я попытался использовать его в ax.legend, но он, похоже, не работал.Пользовательская легенда для 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

ответ

2

Согласно http://matplotlib.org/users/legend_guide.html вы должны положить функции легенды художников, которые будут помечены. Для того, чтобы использовать scatter_plot индивидуально вам нужно сгруппировать ваши данные по цвету и сюжет каждые данные одного цвета по отдельности, чтобы установить свою собственную метку для каждого художника:

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

Смежные вопросы