Как мне создать многострочный сюжет, используя seaborn? - PullRequest
0 голосов
/ 13 сентября 2018

Я пытаюсь сделать Seaborn визуально лучше, чем matplotlib. У меня есть набор данных, в котором есть столбец «Год», который я хочу построить на оси X, а 4 столбца обозначают A, B, C, D на оси Y, используя разные цветные линии. Я пытался сделать это, используя метод sns.lineplot, но он учитывает только одну переменную на оси X и одну на оси Y. Я пытался сделать это

sns.lineplot(data_preproc['Year'],data_preproc['A'], err_style=None)
sns.lineplot(data_preproc['Year'],data_preproc['B'], err_style=None)
sns.lineplot(data_preproc['Year'],data_preproc['C'], err_style=None)
sns.lineplot(data_preproc['Year'],data_preproc['D'], err_style=None)

Но таким образом я не получаю легенду на графике, чтобы показать, какая цветная линия соответствует чему. Я попытался проверить документацию, но не смог найти правильный способ сделать это.

Ответы [ 3 ]

0 голосов
/ 24 ноября 2018

Это:

sns.lineplot(data=data_preproc)

будет делать то, что вы хотите.

0 голосов
/ 08 апреля 2019

Seaborn предпочитает «длинный формат» в качестве ввода. Ключевой компонент для преобразования вашего DataFrame из его «широкого формата» (один столбец для каждого типа измерения) в длинный формат (один столбец для всех значений измерения, один столбец для обозначения типа) - pandas.melt . Учитывая data_preproc, структурированный как ваш, заполненный случайными значениями:

num_rows = 20
years = list(range(1990, 1990 + num_rows))
data_preproc = pd.DataFrame({
    'Year': years, 
    'A': np.random.randn(num_rows).cumsum(),
    'B': np.random.randn(num_rows).cumsum(),
    'C': np.random.randn(num_rows).cumsum(),
    'D': np.random.randn(num_rows).cumsum()})

Один график с четырьмя линиями, по одной на тип измерения, получается с

sns.lineplot(x='Year', y='value', hue='variable', 
             data=pd.melt(data_preproc, ['Year']))

(Обратите внимание, что 'value' и 'variable' - это имена столбцов по умолчанию, возвращаемые melt, и могут быть адаптированы по вашему вкусу.)

0 голосов
/ 13 сентября 2018

См. документацию :

sns.lineplot(x="Year", y="signal", hue="label", data=data_preproc)

Вероятно, вам нужно реорганизовать ваш фрейм данных соответствующим образом, чтобы в нем был один столбец для данных x , один для данных y и один, в котором хранится метка для точки данных.

Вы также можете просто использовать matplotlib.pyplot. Если вы импортируете seaborn, большая часть улучшенного дизайна также используется для «обычных» графиков matplotlib. Seaborn действительно «просто» набор методов, которые удобно подают данные и параметры графиков в matplotlib.

...