Скрипичные диаграммы могут эффективно отображать распределение данных, сравнивать различные наборы данных и выявлять аномалии (выбросы) и тенденции. В этой статье мы рассмотрим четыре различных стиля скрипичных диаграмм Seaborn, включая обычную, сгруппированную, горизонтальную и улучшенную версии, и разберемся в случаях их применения, преимуществах и недостатках. Мы также покажем, как улучшить код, чтобы нарисовать индивидуальную скрипичную диаграмму.
Обычная скрипичная диаграмма
Обычная скрипичная диаграмма является достаточно распространенным способом визуализации данных и подходит для отображения данных одной переменной. Код приведенный ниже, подробно объясняет сценарии ее применения, преимущества и недостатки.
# Импорт основаных библтотек import seaborn as sns import matplotlib.pyplot as plt # Установите стиль темы sns.set_theme(style="whitegrid") # Загрузить выборочный набор данных df = sns.load_dataset("brain_networks", header=[0, 1, 2], index_col=0) # Выберите конкретное подмножество used_networks = [1, 3, 4, 5, 6, 7, 8, 11, 12, 13, 16, 17] used_columns = (df.columns.get_level_values("network") .astype(int) .isin(used_networks)) df = df.loc[:, used_columns] # Вычислите корреляционную матрицу и усредните ее по данным подмножества corr_df = df.corr().groupby(level="network").mean() corr_df.index = corr_df.index.astype(int) corr_df = corr_df.sort_index().T # Нарисуйте обычную скрипичную диаграмму f, ax = plt.subplots(figsize=(14, 8)) sns.violinplot(data=corr_df, palette="Set3_r", bw=.2, cut=1, linewidth=1.5, inner="quartile") sns.stripplot(data=corr_df, color="gray", size=4, jitter=True) ax.set(ylim=(-.7, 1.05)) plt.xticks(rotation=45) sns.despine(left=True, bottom=True) plt.show()

Сценарии применения:
Обычные скрипичные диаграммы подходят для визуализации распределения данных с одной переменной, особенно для демонстрации сравнений между несколькими категориями, например, для демонстрации распределения корреляций между различными нейронными связями в исследованиях мозга.
Преимущества:
-
Четко отображается распределение данных, включая медиану, квартиль и значения выбросов.
-
Данные из нескольких категорий могут быть сопоставлены одновременно, что помогает наблюдать различия между категориями.
-
Поддерживайте пользовательские цветовые палитры и стили, чтобы сделать диаграмму более красивой.
Недостатки:
-
Он не подходит для сравнения между несколькими переменными, и необходимо использовать другие стили, такие как сгруппированная скрипичная диаграмм.
-
При большом объеме данных диаграмма может казаться переполненной и не подходить для отображения слишком большого количества категорий.
Предложения по улучшению:
-
Параметр bandwidth определяет плавность скрипичной диаграммы. Вы можете попробовать настроить значение этого параметра, чтобы просмотреть распределение данных на разных уровнях плавности.
sns.violinplot(data=corr_df, palette="Set3_r", bw=0.1, cut=1, linewidth=1.5, inner="quartile")
-
Для обычных скрипичных диаграмм подбор цветов важен с точки зрения эстетики и читабельности диаграммы. Вы можете попробовать использовать другие предопределенные цветовые палитры, такие как «Paired», «tab10» и т.д., или использовать более подходящий пользовательский список цветов, основанный на конкретных характеристиках данных, чтобы сделать диаграмму более персонализированной.
sns.violinplot(data=corr_df, palette="tab10", bw=0.2, cut=1, linewidth=1.5, inner="quartile")
Сгруппированная скрипичная диаграмма
Далее воспользуемся библиотекой Seaborn, чтобы нарисовать сгруппированную скрипичную диаграмму. Код реализации выглядит следующим образом:
# Подгружаем seaborn и задаем стиль темы import seaborn as sns sns.set_theme(style="whitegrid") # Загружаем выборочный набор данных tips = sns.load_dataset("tips") # Используем пользовательский список цветов (одинаковая длина и количество категорий) custom_palette = ["#FF5733", "#33FF57"] # Используйте различные предопределенные цветовые палитры для отображения сгруппированных скрипичных диаграмм sns.violinplot(data=tips, x="day", y="total_bill", hue="smoker", split=True, inner="quart", linewidth=1, palette=custom_palette) sns.despine(left=True) plt.show()

Сценарии применения:
Сгруппированные скрипичные диаграммы подходит для сравнительного анализа между несколькими переменными, в частности для сравнения распределения данных по нескольким группам, например, в данных о потреблении в ресторанах, где можно сравнить влияние различных дат приема пищи и курения на общий счет.
Преимущества:
-
Распределение данных нескольких переменных может быть показано одновременно, что облегчает сравнение различных наборов данных.
-
Поддержка отображения различий между двумя группами на одной диаграмме, что помогает визуально наблюдать различия между группами.
-
Более персонализированного внешнего вида диаграммы можно добиться с помощью настраиваемого списка цветов.
Недостатки:
-
Отсутствие работы со слишком большим количеством категорий данных может сделать диаграммы слишком переполненными и трудной для интерпретации.
-
Для сравнения нескольких групп рекомендуется соответствующим образом отрегулировать размер и цвет диаграммы, чтобы обеспечить визуальный эффект.
Предложения по улучшению:
-
Если параметру split присвоено значение true, сгруппированная скрипичная диаграмма будет разделена на две части в соответствии с классификацией hue, отображая различные наборы данных. Если имеется большое количество наборов данных, вы можете установить значение split равным False, чтобы объединить все данные в одну скрипичную диаграмму, и сделать диаграмму более краткой и удобной для чтения.
sns.violinplot(data=tips, x="day", y="total_bill", hue="smoker", split=False, inner="quart", linewidth=1, palette=custom_palette)
-
Для сгруппированной скрипичной диаграммы сочетание цветов очень важно. Можно попробовать использовать другие заранее определенные цветовые палитры, такие как «Set2», «Blues» и т.д., или использовать более подходящий список цветов для конкретных характеристик данных, чтобы сделать диаграмму более читабельной и красивой.
sns.violinplot(data=tips, x="day", y="total_bill", hue="smoker", split=True, inner="quart", linewidth=1, palette="Blues")
Горизонтальная скрипичная диаграмма
Воспользуемся Seaborn для горизонтального отображения обычной скрипичной диаграммы с помощью следующего кода:
# Импорт основаных библтотек import numpy as np import seaborn as sns # Создайте случайный набор данных с несколькими переменными rs = np.random.default_rng(0) n, p = 40, 8 d = rs.normal(0, 2, (n, p)) d += np.log(np.arange(1, p + 1)) * -5 + 10 # Используйте разные цветовые палитры, чтобы показать распределение каждой переменной и одновременно отобразить точки данных sns.violinplot(data=d, palette="PRGn_r", inner="points", orient="h")

Сценарии применения:
Горизонтальные скрипки подходят для сравнения распределения данных из нескольких переменных в ограниченном пространстве и особенно подходят для демонстрации сопоставления нескольких наборов данных, например, для сравнения эффектов различных групп в экспериментальных результатах.
Преимущества:
-
Распределение данных по нескольким переменным может быть показано одновременно, что облегчает визуальное сравнение.
-
Возможно отображение нескольких наборов данных в ограниченном пространстве, что приводит к экономии пространство на графике.
Недостатки:
-
При большом количестве переменных диаграммы могут показаться более переполненными, и необходимо соответствующим образом скорректировать размер и стиль диаграммы.
-
Горизонтальное отображение может не подходить для более длинных имен маркеров и может привести к неполному отображению некоторых маркеров.
Предложения по улучшению:
-
параметр orientation используется для определения направления скрипичной диаграммы, выбирая «v» для вертикального (по умолчанию) или «h» для горизонтального. В зависимости от реальных потребностей выберите подходящее направление для получения более четкой диаграммы.
sns.violinplot(data=d, palette="PRGn_r", inner="points", orient="v")
-
Отрегулируйте размер диаграммы в соответствии с фактическими потребностями, чтобы обеспечить четкую видимость точек данных и меток на диаграмме.
import matplotlib.pyplot as plt # Установите размер диаграммы plt.figure(figsize=(10, 6)) sns.violinplot(data=d, palette="PRGn_r", inner="points", orient="h") plt.show()
Улучшенная скрипичная диаграмма
Улучшенная скрипичная диаграмма добавляет больше статистической информации (такой как средние линии, доверительные интервалы и т.д.) к обычной скрипичной диаграмме, чтобы более полно отобразить характеристики данных. Код улучшенной скрипичной диаграммы приведен ниже:
# Импорт основаных библтотек import seaborn as sns import matplotlib.pyplot as plt # Установите стиль темы sns.set_theme(style="whitegrid") # Загрузить выборочный набор данных diamonds = sns.load_dataset("diamonds") clarity_ranking = ["I1", "SI2", "SI1", "VS2", "VS1", "VVS2", "VVS1", "IF"] # Установите размер диаграммы f, ax = plt.subplots(figsize=(8, 5)) # Используйте палитру оттенков серого и тонкие линии sns.boxenplot(x="clarity", y="carat", color="gray", order=clarity_ranking, palette="Set3", scale="linear", data=diamonds, linewidth=0.5) # Рассчитайте и постройте среднюю линию для каждой категории means = diamonds.groupby("clarity")["carat"].mean().loc[clarity_ranking] plt.plot(range(len(clarity_ranking)), means, marker="o", color="red", markersize=6, linestyle="--") # Улучшение графиков ax.set_xlabel("Clarity", fontsize=12) ax.set_ylabel("Carat", fontsize=12) ax.set_title("Boxen Plot of Diamond Carat by Clarity", fontsize=14) sns.despine(left=True) plt.xticks(ticks=range(len(clarity_ranking)), labels=clarity_ranking) plt.tight_layout() plt.show()

Сценарии применения:
Улучшенная версия скрипичной диаграммы подходит для ситуаций, когда требуется более полная характеристика данных, особенно для представления распределения данных по нескольким категориям, а также для выявления статистической информации, такой как средние значения, например, для сравнения влияния различных уровней чистоты к числу карат в исследованиях по классификации драгоценных камней.
Преимущества:
-
Показана дополнительная статистическая информация, включая средние линии, доверительные интервалы и т. д., чтобы помочь читателю лучше понять данные.
-
Вы можете сравнить распределение данных по нескольким категориям и одновременно выделить характеристики данных, что помогает быстро заметить различия в данных.
Недостатки:
-
Не подходит для ситуаций, когда данных мало, диаграмма может быть слишком сложной и трудной для интерпретации.
-
При большом количестве категорий отображение средней линии может пересекаться, и размер диаграммы должен быть скорректирован соответствующим образом.
Рекомендации по улучшению положения
-
В соответствии с фактическими потребностями, соответствующим образом корректируйте размер диаграммы и стиль линий, чтобы обеспечить ясность данных и визуальную красоту диаграммы.
plt.figure(figsize=(10, 6)) sns.boxenplot(x="clarity", y="carat", color="gray", order=clarity_ranking, palette="Set3", scale="linear", data=diamonds, linewidth=1)
-
Если категорий много и средние линии перекрываются, вы можете рассмотреть возможность использования других маркеров и стилей линий, или отобразить информацию о средних значениях в точках данных, чтобы облегчить читабельность диаграммы.
sns.boxenplot(x="clarity", y="carat", color="gray", order=clarity_ranking, palette="Set3", scale="linear", data=diamonds, linewidth=0.5) sns.stripplot(x="clarity", y="carat", data=diamonds, color="red", size=4, jitter=True)
ссылка на оригинал статьи https://habr.com/ru/articles/751898/
Добавить комментарий