Подтвердить что ты не робот

Как вставить статистические аннотации (звезды или р-значения) в графики matplotlib/seaborn?

Это кажется тривиальным вопросом, но я искал какое-то время и не могу найти ответа. Это также похоже на то, что должно быть стандартной частью этих пакетов. Кто-нибудь знает, есть ли стандартный способ включения статистической аннотации между графиками распределения в морском курорте?

Например, между двумя полями или роями?

Пример: распределение желтого цвета значительно отличается от остальных (по wilcoxon - как я могу визуально отобразить это?

4b9b3361

Ответ 1

Здесь, как добавить статистическую аннотацию к графику Seaborn:

import seaborn as sns, matplotlib.pyplot as plt

tips = sns.load_dataset("tips")
sns.boxplot(x="day", y="total_bill", data=tips, palette="PRGn")

# statistical annotation
x1, x2 = 2, 3   # columns 'Sat' and 'Sun' (first column: 0, see plt.xticks())
y, h, col = tips['total_bill'].max() + 2, 2, 'k'
plt.plot([x1, x1, x2, x2], [y, y+h, y+h, y], lw=1.5, c=col)
plt.text((x1+x2)*.5, y+h, "ns", ha='center', va='bottom', color=col)

plt.show()

И вот результат: аннотация аннотированного окна

Ответ 2

Также может быть интересно добавить несколько аннотаций к разным парам ящиков. В таком случае, возможно, будет полезно автоматически обрабатывать размещение различных строк и текстов по оси Y. Я и другие авторы написали небольшую функцию для обработки этих случаев (см. Github repo), которая правильно размещает строки друг над другом, не перекрывая друг друга. Аннотации могут быть как внутри, так и вне графика, и реализовано несколько статистических тестов: Манна-Уитни и t-критерий (независимый и парный). Вот один минимальный пример.

import matplotlib.pyplot as plt
import seaborn as sns
from statannot import add_stat_annotation

sns.set(style="whitegrid")
df = sns.load_dataset("tips")

x = "day"
y = "total_bill"
order = ['Sun', 'Thur', 'Fri', 'Sat']
ax = sns.boxplot(data=df, x=x, y=y, order=order)
add_stat_annotation(ax, data=df, x=x, y=y, order=order,
                    box_pairs=[("Thur", "Fri"), ("Thur", "Sat"), ("Fri", "Sun")],
                    test='Mann-Whitney', text_format='star', loc='outside', verbose=2)

example1

x = "day"
y = "total_bill"
hue = "smoker"
ax = sns.boxplot(data=df, x=x, y=y, hue=hue)
add_stat_annotation(ax, data=df, x=x, y=y, hue=hue,
                    box_pairs=[(("Thur", "No"), ("Fri", "No")),
                                 (("Sat", "Yes"), ("Sat", "No")),
                                 (("Sun", "No"), ("Thur", "Yes"))
                                ],
                    test='t-test_ind', text_format='full', loc='inside', verbose=2)
plt.legend(loc='upper left', bbox_to_anchor=(1.03, 1))

example2