Почему установка оттенка на графике морского побережья меняет размер точки? - PullRequest
1 голос
/ 13 февраля 2020

Сюжет, который я пытаюсь составить, требует достижения 3 вещей.

  1. Если тест проводится в тот же день с тем же счетом, этот балл должен быть больше.
  2. Если два теста перекрывают друг друга, то должно быть некоторое дрожание, чтобы мы могли видеть все точки.
  3. Каждый тест должен иметь свой собственный цвет

Вот как я собираюсь it.

 import seaborn as sns
 import pandas as pd
 data = {'Quiz': [1, 1, 2, 1, 2, 1],
         'Score': [7.5, 5.0, 10, 10, 10, 10],
         'Day': [2, 5, 5, 5, 11, 11],
         'Size': [115, 115, 115, 115, 115, 355]}

 df = pd.DataFrame.from_dict(data)

sns.lmplot(x = 'Day', y='Score', data = df, fit_reg=False, x_jitter = True, scatter_kws={'s': df.Size})
plt.show()

enter image description here

Установка оттенка, который почти все, что мне нужно, приводит к этому.

 import seaborn as sns
 import pandas as pd
 data = {'Quiz': [1, 1, 2, 1, 2, 1],
         'Score': [7.5, 5.0, 10, 10, 10, 10],
         'Day': [2, 5, 5, 5, 11, 11],
         'Size': [115, 115, 115, 115, 115, 355]}

 df = pd.DataFrame.from_dict(data)

sns.lmplot(x = 'Day', y='Score', data = df, fit_reg=False, hue = 'Quiz', x_jitter = True, scatter_kws={'s': df.Size})
plt.show()

enter image description here

Есть ли способ, которым я могу иметь оттенок, сохраняя размер моих очков?

1 Ответ

2 голосов
/ 14 февраля 2020

Это не работает, потому что когда вы используете hue, seaborn делает два отдельных графика рассеяния, и поэтому аргумент размера, который вы передаете с помощью scatter_kws=, больше не выравнивается с содержимым фрейма данных.

Вы можете воссоздать тот же эффект вручную, однако:

x_col = 'Day'
y_col = 'Score'
hue_col = 'Quiz'
size_col = 'Size'
jitter=0.2

fig, ax = plt.subplots()
for q,temp in df.groupby(hue_col):
    n = len(temp[x_col])
    x = temp[x_col]+np.random.normal(scale=0.2, size=(n,))
    ax.scatter(x,temp[y_col],s=temp[size_col], label=q)
ax.set_xlabel(x_col)
ax.set_ylabel(y_col)
ax.legend(title=hue_col)

enter image description here

...