Это ошибка параметра оттенка seaborn.lineplot? - PullRequest
2 голосов
/ 25 мая 2020

С помощью этого фрагмента кода я ожидаю линейного графика с одной строкой на оттенок, который имеет следующие различные значения: [1, 5, 10, 20, 40].

import math
import pandas as pd
import seaborn as sns

sns.set(style="whitegrid")

TANH_SCALING = [1, 5, 10, 20, 40]
X_VALUES = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
COLUMNS = ['x', 'y', 'hue group']

tanh_df = pd.DataFrame(columns=COLUMNS)

for sc in TANH_SCALING:
    data = {
        COLUMNS[0]: X_VALUES,
        COLUMNS[1]: [math.tanh(x/sc) for x in X_VALUES],
        COLUMNS[2]: len(X_VALUES)*[sc]}
    tanh_df = tanh_df.append(
        pd.DataFrame(data=data, columns=COLUMNS),
        ignore_index=True
    )

sns.lineplot(x=COLUMNS[0], y=COLUMNS[1], hue=COLUMNS[2], data=tanh_df);

Однако, я получаю легенду оттенка со значениями [0, 15, 30, 45] и дополнительную строку, например:

enter image description here

Это ошибка или я упустил что-то очевидное?

Ответы [ 2 ]

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

Это известная ошибка seaborn, когда оттенок можно преобразовать в целые числа. Вы можете добавить префикс к оттенку, чтобы преобразование в целые числа не удавалось:

for sc in TANH_SCALING:
    data = {
        COLUMNS[0]: X_VALUES,
        COLUMNS[1]: [math.tanh(x/sc) for x in X_VALUES],
        COLUMNS[2]: len(X_VALUES)*[f'A{sc}']}             # changes here
    tanh_df = tanh_df.append(
        pd.DataFrame(data=data, columns=COLUMNS),
        ignore_index=True
    )

Вывод:

enter image description here

Или после того, как вы создали ваши данные:

# data creation
for sc in TANH_SCALING:
    data = {
        COLUMNS[0]: X_VALUES,
        COLUMNS[1]: [math.tanh(x/sc) for x in X_VALUES],
        COLUMNS[2]: len(X_VALUES)*[f'A{sc}']}
    tanh_df = tanh_df.append(
        pd.DataFrame(data=data, columns=COLUMNS),
        ignore_index=True
    )


# hue manipulation
sns.lineplot(x=COLUMNS[0], y=COLUMNS[1], 
             hue='A_' + tanh_df[COLUMNS[2]].astype(str), # change hue here
             data=tanh_df);
0 голосов
/ 25 мая 2020

Как говорится в комментарии @ LudvigH к другому ответу, это не ошибка, даже если поведение по умолчанию в этом случае удивительно. Как объяснено в docs :

Обработка по умолчанию оттенка (и, в меньшей степени, размера) semanti c, если присутствует, зависит от того, является ли переменная предполагается, что они представляют «числовые» или «категориальные» данные. В частности, переменные numeri c по умолчанию представлены последовательной цветовой картой, а записи легенды показывают регулярные «галочки» со значениями, которые могут существовать или не существовать в данных. Этим поведением можно управлять с помощью различных параметров, как описано и проиллюстрировано ниже.

Вот два конкретных c способа управления поведением.

Если вы хотите сохранить числовые значения c сопоставление цветов, но легенда показывает точные значения в ваших данных, установите legend="full":

sns.lineplot(x=COLUMNS[0], y=COLUMNS[1], hue=COLUMNS[2], data=tanh_df, legend="full")

enter image description here

Если вы хотите пусть seaborn обрабатывает уровни параметра hue как дискретные категориальные значения, передает именованную категориальную цветовую карту или список или словарь определенных c цветов, которые вы хотите использовать:

sns.lineplot(x=COLUMNS[0], y=COLUMNS[1], hue=COLUMNS[2], data=tanh_df, palette="deep")

enter image description here

...