Отдельные линии на графике FacetGrid, так что все линии соединяются только с соответствующей группой - PullRequest
0 голосов
/ 25 апреля 2019

Я пытаюсь воссоздать этот сюжет, используя Python 2.7 и Seaborn:

enter image description here

Как вы можете видеть, у каждого фасета есть график временных рядов для каждой страны на этом континенте, и линии соединяют только точки внутри своей страны (группы).

Вот мой код, по какой-то причине я не могу понять, как заставить линии соединяться только внутри своей группы, а не все соединяться друг с другом:

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

url = 'https://python-graph-gallery.com/wp-content/uploads/gapminderData.csv'

def add_cols(grp):
  grp['popl'] = grp['pop'].apply(lambda x: x/10**5)
  grp['gdp_wt'] = np.average(grp['gdpPercap'], weights = grp['pop'])
  grp['pop_wt'] = sum(grp['pop'])
  return grp

dat = (pd.read_csv(url)
         .query('country != "Kuwait"')
         .groupby(['year','continent'])
         .apply(add_cols))

f = sns.FacetGrid(dat, col='continent', hue='continent')
f = f.map(plt.plot, 'year', 'gdpPercap', marker='o', group=dat.country) # Attempting to assign group here but it's not working
f = f.map(plt.plot, 'year', 'gdp_wt', c='k', marker='o')
plt.show()
plt.clf()

Вот мой текущий сюжет, и вы можете видеть, что я имею в виду под всеми связанными точками:

enter image description here

Этот рисунок был изначально создан с использованием R и ggplot2. Моей следующей попыткой будет создание черных линий с взвешенной переменной в моем наборе данных. Я не уверен, что это невозможно, используя Seaborn. Кроме того, как известно, я знаю о модуле ggplot, доступном для Python, но не хочу использовать его в настоящее время.

1 Ответ

1 голос
/ 25 апреля 2019

Установите hue на country и используйте палитру:

# map continental to color
colors = {con:color for con, color in zip(df.continent.unique(), ['r','b','g','m', 'b'])}

# create palette by country name
pal = {country:colors[con] for country, con in set(zip(df.country, df.continent))}

# use the palette
f = sns.FacetGrid(dat, col='continent', hue='country', palette=pal)
f = f.map(plt.plot, 'year', 'gdpPercap', marker='o') # Attempting to assign group here but it's not working
f = f.map(plt.plot, 'year', 'gdp_wt', color='k', marker='o')
plt.show()
plt.clf()

Выход:

enter image description here

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