Скрипичные диаграммы могут эффективно отображать распределение данных, сравнивать различные наборы данных и выявлять аномалии (выбросы) и тенденции. В этой статье мы рассмотрим четыре различных стиля скрипичных диаграмм 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)
MaratCdek
Сразу вспоминается старый анекдот:
-- Кто на доске жопу нарисовал?
v0br23 Автор
чего-чего, а такого комментария не ожидал
jpegqs
Даже в xkcd об этом шутили.
v0br23 Автор
Вот это смешно. Все таки ссылка на источник решает