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

Комментарии (4)


  1. MaratCdek
    02.08.2023 11:45
    +1

    Сразу вспоминается старый анекдот:
    -- Кто на доске жопу нарисовал?


    1. v0br23 Автор
      02.08.2023 11:45

      чего-чего, а такого комментария не ожидал


      1. jpegqs
        02.08.2023 11:45
        +1

        Даже в xkcd об этом шутили.


        1. v0br23 Автор
          02.08.2023 11:45

          Вот это смешно. Все таки ссылка на источник решает