Многолинейный график Seaborn с одной цветной линией - PullRequest
1 голос
/ 26 мая 2020

Я пытаюсь построить многострочный график, используя sns, но сохраняю только линию США красным, а другие страны - серым

Это то, что у меня есть:

df = px.data.gapminder()
sns.lineplot(x = 'year', y = 'pop', data = df, hue = 'country', color = 'grey', dashes = False, legend = False)

Но при этом линии не становятся серыми. Я подумал, что после этого я мог бы добавить строку США красным цветом .....

Ответы [ 2 ]

1 голос
/ 26 мая 2020

Вы можете использовать pandas groupby для построения:

fig,ax=plt.subplots()
for c,d in df.groupby('country'):
    color = 'red' if c=='US' else 'grey'
    d.plot(x='year',y='pop', ax=ax, color=color)

ax.legend().remove()

output:

enter image description here

Или вы можете определить специфицировать c палитру как словарь:

palette = {c:'red' if c=='US' else 'grey' for c in df.country.unique()}

sns.lineplot(x='year', y='pop', data=df, hue='country', 
             palette=palette, legend=False)

Вывод:

enter image description here

0 голосов
/ 26 мая 2020

Вы можете использовать параметр palette для передачи пользовательских цветов для строк в sns.lineplot, например:

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

df = pd.DataFrame({'year': [2018, 2019, 2020, 2018, 2019, 2020, 2018, 2019, 2020, ], 
                   'pop': [325, 328, 332, 125, 127, 132, 36, 37, 38], 
                   'country': ['USA', 'USA', 'USA', 'Mexico', 'Mexico', 'Mexico',
                               'Canada', 'Canada', 'Canada']})

colors = ['red', 'grey', 'grey']
sns.lineplot(x='year', y='pop', data=df, hue='country', 
             palette=colors, legend=False)

plt.ylim(0, 350)
plt.xticks([2018, 2019, 2020]);

red-gray lineplot

Тем не менее, было бы полезно иметь легенду, поэтому вы также можете подумать о том, чтобы поработать со значениями альфа (последние значения в кортежах ниже), чтобы выделить США.

red = (1, 0, 0, 1)
green = (0, 0.5, 0, 0.2)
blue = (0, 0, 1, 0.2)
colors = [red, green, blue]

sns.lineplot(x='year', y='pop', data=df, hue='country', 
             palette=colors)

plt.ylim(0, 350)
plt.xticks([2018, 2019, 2020]);

various alpha example plot

...