Comment modifier la légende de la teinte?

Aug 23 2020

J'ai un ensemble de données qui représente l'homme et la femme en binaire. Les hommes sont représentés par 0 tandis que les femmes sont représentées par 1. Ce que j'espère faire est de changer 0 en Homme et 1 en Femme dans la légende de l'intrigue. J'ai essayé de suivre ce post , mais cela n'a pas fonctionné.

Cela me donne un message d'erreur qui ressemble à ceci:

AttributeError                            Traceback (most recent call last)
<ipython-input-11-b3c99d4311ab> in <module>
     23 # plot the legend
     24 plt.legend()
---> 25 legend = g._legend
     26 new_labels = ['Female', 'Male']
     27 for t, l in zip(legend.texts, new_labels): t.set_text(l)

AttributeError: 'AxesSubplot' object has no attribute '_legend'

Voici à quoi ressemble mon code actuel:

## store them in different variable names
X = salary['years']
y = salary['salary']
g = salary['gender']

# prepare the scatterplot
sns.set()
plt.figure(figsize=(10,10))
g = sns.scatterplot(x=salary.years, y=salary.salary, data=salary, hue='gender')

# equations of the models
model1 = 50 + 2.776962335386217*X
model2 = 60.019802 + 2.214645*X
model3_male = 60.014922 + 2.179305*X + 1.040140*1
model3_female = 60.014922 + 2.179305*X + 1.040140*0

# plot the scatterplots
plt.plot(X, model1, color='r', label='Model 1')
plt.plot(X, model2, color='g', label='Model 2')
plt.plot(X, model3_male, color='b', label='Model 3(Male)')
plt.plot(X, model3_female, color='y', label='Model 3(Female)')

# plot the legend
plt.legend()
legend = g._legend
new_labels = ['Female', 'Male']
for t, l in zip(legend.texts, new_labels): t.set_text(l)

# set the title
plt.title('Scatterplot of salary and model fits')
plt.show()

Réponses

1 Ynjxsjmh Aug 23 2020 at 15:00

Je n'ai pas vos données, donc j'en génère moi-même:

gender salary years
male 40000 1
male 32000 2
male 45000 3
male 54000 4
female 72000 5
female 62000 6
female 92000 7
female 55000 8
female 35000 9
female 48000 10
import seaborn as sns
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt


salary = pd.read_csv("1.csv", delim_whitespace=True)

print(salary)

X = salary['years']
y = salary['salary']
g = salary['gender']


# prepare the scatterplot
sns.set()
plt.figure(figsize=(10,10))
g = sns.scatterplot(x=salary.years, y=salary.salary, data=salary, hue='gender')

# equations of the models
model1 = 50 + 2.776962335386217*X
model2 = 60.019802 + 2.214645*X
model3_male = 60.014922 + 2.179305*X + 1.040140*1
model3_female = 60.014922 + 2.179305*X + 1.040140*0

# plot the scatterplots
plt.plot(X, model1, color='r', label='Model 1')
plt.plot(X, model2, color='g', label='Model 2')
plt.plot(X, model3_male, color='b', label='Model 3(Male)')
plt.plot(X, model3_female, color='y', label='Model 3(Female)')

# plot the legend
plt.legend()

# set the title
plt.title('Scatterplot of salary and model fits')

plt.show()

Ça fonctionne bien. Donc, je suppose que les valeurs de votre gendercolonne sont 0ou 1. Dans ce cas, vous pouvez effectuer les opérations suivantes avant g = salary['gender']de remplacer 0par maleet 1par female:

salary['gender'] = salary['gender'].map({1: 'female', 0: 'male'})

Revenons à votre erreur:

---> 25 legend = g._legend
     26 new_labels = ['Female', 'Male']
     27 for t, l in zip(legend.texts, new_labels): t.set_text(l)

AttributeError: 'AxesSubplot' object has no attribute '_legend'

grenvoyé par sns.scatterplotis class matplotlib.axes.Axes. Pour obtenir un objet lengend, vous devez utiliser ax.get_legend()ou ax.legend()plutôt que ax._legend. Vous pouvez suivre la documentation du guide officail Legend .

legend = g.legend()

new_labels = ['Female', 'Male']
for t, l in zip(legend.texts[-2:], new_labels): t.set_text(l)