Категория заговора означает в морском категориальном заговоре - PullRequest
0 голосов
/ 09 января 2020

У меня есть график с качественными переменными на оси x и точками рассеяния по вертикали для каждой категории, используя sns.stripplot. Я хотел бы указать среднее значение для каждой категории. Возможно короткая горизонтальная линия в среднем значении y для каждой категории. Как я могу это сделать?

1 Ответ

1 голос
/ 09 января 2020

Вы можете использовать matplotlib.pyplot.hlines с некоторым учетом ширины и расположения линий. Вот пример, использующий набор данных seaborn tips

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

tips = sns.load_dataset("tips")
sns.stripplot(x="day", y="total_bill", data=tips)
labels = [e.get_text() for e in plt.gca().get_xticklabels()]
ticks = plt.gca().get_xticks()
w = 0.1
for day, idx in enumerate(labels):
    idx = labels.index(day)
    plt.hlines(tips[tips['day'] == day]['total_bill'].mean(), ticks[idx]-w, ticks[idx]+w)
plt.show()

enter image description here


Некоторые пояснения

labels = [e.get_text() for e in plt.gca().get_xticklabels()]

Экстракты текст из меток, который автоматически генерируется sns.stripplot, это более полезно, чем tips['day'].unique(), поскольку порядок меток не обязательно соответствует порядку, возвращенному из tips['day'].unique. Это связано с тем, что если аргумент order не указан, порядок будет

[...] выводиться из объектов данных.

plt.hlines(tips[tips['day'] == day]['total_bill'].mean(), ticks[idx]-w, ticks[idx]+w)

Dr aws горизонтальные линии длиной w*2 вокруг центра "полосы" и на высоте среднего значения столбца 'total_bill', где значение 'day' этой строки равно текущий день.

...