Этикетки легенды морского барборда теряют цвет - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть коробочный участок Seaborn, который, когда я пытаюсь использовать plt.legend («Strings») для изменения названия ярлыков, теряет цвет ярлыков.Мне нужно изменить метки, сохраняя цветовое кодирование, но я не знаю, как это сделать после поиска ответа.

Легенда оттенков 1-4 соответствует от 1 = Очень интересует политика до 4 = нетна все заинтересованы.Я хочу изменить метки оттенка легенды с 1-4 на то, насколько они заинтересованы в политике.

Мой код:

Пакеты

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

Я не знал, каксоздать фрейм данных любым более простым способом, поэтому я сделал это

a1 = {'Reads Newspapers': 0, 'Interest in Politics': 1}
a2 = {'Reads Newspapers': 0, 'Interest in Politics': 2}
a3 = {'Reads Newspapers': 0, 'Interest in Politics': 3}
a4 = {'Reads Newspapers': 0, 'Interest in Politics': 4}
b1 = {'Reads Newspapers': 1, 'Interest in Politics': 1}
b2 = {'Reads Newspapers': 1, 'Interest in Politics': 2}
b3 = {'Reads Newspapers': 1, 'Interest in Politics': 3}
b4 = {'Reads Newspapers': 1, 'Interest in Politics': 4}

df1 = pd.DataFrame(data=a1, index=range(1))
df1 = pd.concat([df1]*23)
df2 = pd.DataFrame(data=a2, index=range(1))
df2 = pd.concat([df2]*98)
df3 = pd.DataFrame(data=a3, index=range(1))
df3 = pd.concat([df3]*99)
df4 = pd.DataFrame(data=a4, index=range(1))
df4 = pd.concat([df4]*18)
b1 = pd.DataFrame(data=b1, index=range(1))
b1 = pd.concat([b1]*468)
b2 = pd.DataFrame(data=b2, index=range(1))
b2 = pd.concat([b2]*899)
b3 = pd.DataFrame(data=b3, index=range(1))
b3 = pd.concat([b3]*413)
b4 = pd.DataFrame(data=b4, index=range(1))
b4 = pd.concat([b4]*46)
data = pd.concat([df1,df2,df3,df4,b1,b2,b3,b4])

Фактическое построение, которое выдает ошибку

plt.figure(figsize=(10,8))
g = sns.barplot(data=data, x='Reads Newspapers', estimator=len,y='Interest in Politics', hue='Interest in Politics' )
plt.ylabel("Sample Size")
ax = plt.subplot()
ax = ax.set_xticklabels(["No","Yes"])

#plt.legend(["very interested","somewhat interested", "only a little interested", "not at all interested "],)
#plt.savefig('Newspaper policy')

Seaborn Boxplot about interest in politics

Я пытался использовать plt.legend, нометки легенды теряют свой цвет, когда я делаю это, поэтому они становятся строками без цветовой ассоциации, что делает его еще хуже, чем раньше.

Теперь я полностью отредактировал свой сценарий.

https://github.com/HenrikMorpheus/Newspaper-reading-survey/blob/master/politicalinterest.ipynb Он загружается с ошибкой по какой-то причине, которую я не знаю, но вы должны иметь возможность открыть записную книжку в jupyter.

1 Ответ

0 голосов
/ 12 декабря 2018

Использовать выделенный столбец данных.

Можно создать новый столбец в кадре данных с соответствующими метками и использовать этот столбец в качестве ввода для hue, чтобы автоматически создавались нужные метки.,

import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd


df = pd.DataFrame({"reads" : ["Yes"] * 250 + ["No"]*150,
                  "interest" : [4,2,2,2,2,3,3,1,1,1]*40})

labels=["very interested","somewhat interested", 
        "only a little interested", "not at all interested"]
# Create new dataframe column with the labels instead of numbers
df["Interested in politics"] = df["interest"].map(dict(zip(range(1,5), labels)))

plt.figure(figsize=(10,8))
# Use newly created dataframe column as hue
ax = sns.barplot(data=df, x='reads', estimator=len,y='interest', 
                 hue='Interested in politics', hue_order=labels)
ax.set_ylabel("Sample Size")

plt.show()

enter image description here

Установка меток вручную.

Вы можете получить ручки и метки для легенды с помощью ax.get_legend_handles_labels() ииспользуйте их для создания новой легенды с метками из списка.

import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd

df = pd.DataFrame({"reads" : ["Yes"] * 250 + ["No"]*150,
                  "interest" : [4,2,2,2,2,3,3,1,1,1]*40})

labels=["very interested","somewhat interested", 
        "only a little interested", "not at all interested"]

plt.figure(figsize=(10,8))
ax = sns.barplot(data=df, x='reads', estimator=len,y='interest', hue='interest' )
ax.set_ylabel("Sample Size")

h, l = ax.get_legend_handles_labels()
ax.legend(h, labels, title="Interested in politics")
plt.show()

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...