Рубрики
Без рубрики

Matplotlib Скрипичный сюжет – Учебник и примеры

В этом уроке мы рассмотрим, как построить скрипичный сюжет в Matplotlib и Python. Мы рассмотрим все, что вам нужно знать, чтобы построить и настроить скрипичные сюжеты.

Автор оригинала: Dan Nelson.

Вступление

В Python существует множество библиотек визуализации данных, но Matplotlib-самая популярная библиотека из всех. Популярность Matplotlib объясняется его надежностью и полезностью – он способен создавать как простые, так и сложные графики с небольшим количеством кода. Вы также можете настроить графики различными способами.

В этом уроке мы рассмотрим как строить скрипичные графики в Matplotlib .

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

Скрипичные графики показывают ту же сводную статистику, что и коробочные графики, но они также включают оценки плотности ядра, которые представляют форму | распределение данных.

Импорт Данных

Прежде чем мы сможем создать скрипичный сюжет, нам понадобятся некоторые данные для построения. Мы будем использовать набор данных Gapminder .

Мы начнем с импорта необходимых библиотек, включая Pandas и Matplotlib:

import pandas as pd
import matplotlib.pyplot as plt

Мы проверим, нет ли пропущенных записей данных, и распечатаем заголовок набора данных, чтобы убедиться, что данные были загружены правильно. Обязательно установите тип кодировки в ISO-8859-1 :

dataframe = pd.read_csv("gapminder_full.csv", error_bad_lines=False, encoding="ISO-8859-1")
print(dataframe.head())
print(dataframe.isnull().values.any())
       country  year  population continent  life_exp     gdp_cap
0  Afghanistan  1952     8425333      Asia    28.801  779.445314
1  Afghanistan  1957     9240934      Asia    30.332  820.853030
2  Afghanistan  1962    10267083      Asia    31.997  853.100710
3  Afghanistan  1967    11537966      Asia    34.020  836.197138
4  Afghanistan  1972    13079460      Asia    36.088  739.981106

Построение скрипичного сюжета в Matplotlib

Чтобы создать график скрипки в Matplotlib, мы вызываем функцию violin plot() либо в экземпляре Axes , либо в самом экземпляре PyPlot:

import pandas as pd
import matplotlib.pyplot as plt

dataframe = pd.read_csv("gapminder_full.csv", error_bad_lines=False, encoding="ISO-8859-1")

population = dataframe.population
life_exp = dataframe.life_exp
gdp_cap = dataframe.gdp_cap

# Extract Figure and Axes instance
fig, ax = plt.subplots()

# Create a plot
ax.violinplot([population, life_exp, gdp_cap])

# Add title
ax.set_title('Violin Plot')
plt.show()
matplotlib скрипичный сюжет

Когда мы создадим первый график, мы сможем увидеть распределение наших данных, но мы также заметим некоторые проблемы. Поскольку масштабы функций настолько различны, практически невозможно распределение столбцов Ожидаемая продолжительность жизни и ВВП .

По этой причине мы хотим построить каждый столбец на своем собственном подзаголовке.

Мы сделаем небольшую сортировку и нарезку фрейма данных, чтобы упростить сравнение столбцов набора данных. Мы сгруппируем фрейм данных по “стране” и выберем только самые последние/последние записи для каждой из стран.

Затем мы отсортируем по численности населения и отбросим записи с наибольшей численностью населения (большие выбросы численности населения), чтобы остальная часть кадра данных находилась в более близком диапазоне и сравнение было проще:

dataframe = dataframe.groupby("country").last()
dataframe = dataframe.sort_values(by=["population"], ascending=False)
dataframe = dataframe.iloc[10:]
print(dataframe)

Теперь фрейм данных выглядит примерно так:

                       year  population continent  life_exp       gdp_cap
country
Philippines            2007    91077287      Asia    71.688   3190.481016
Vietnam                2007    85262356      Asia    74.249   2441.576404
Germany                2007    82400996    Europe    79.406  32170.374420
Egypt                  2007    80264543    Africa    71.338   5581.180998
Ethiopia               2007    76511887    Africa    52.947    690.805576
...                     ...         ...       ...       ...           ...
Montenegro             2007      684736    Europe    74.543   9253.896111
Equatorial Guinea      2007      551201    Africa    51.579  12154.089750
Djibouti               2007      496374    Africa    54.791   2082.481567
Iceland                2007      301931    Europe    81.757  36180.789190
Sao Tome and Principe  2007      199579    Africa    65.528   1598.435089

Отлично! Теперь мы можем создать фигуру и три объекта осей с помощью функции subplots () . Каждая из этих осей будет иметь скрипичный сюжет. Поскольку сейчас мы работаем над гораздо более управляемым масштабом, давайте также включим аргумент show medians , установив его в Правда .

Это ударит по горизонтальной линии в середине наших скрипичных сюжетов:

# Create figure with three axes
fig, (ax1, ax2, ax3) = plt.subplots(nrows=1, ncols=3)

# Plot violin plot on axes 1
ax1.violinplot(dataframe.population, showmedians=True)
ax1.set_title('Population')

# Plot violin plot on axes 2
ax2.violinplot(life_exp, showmedians=True)
ax2.set_title('Life Expectancy')

# Plot violin plot on axes 3
ax3.violinplot(gdp_cap, showmedians=True)
ax3.set_title('GDP Per Cap')

plt.show()

Запуск этого кода теперь дает нам:

matplotlib скрипичный сюжет показать медианы

Теперь мы можем получить хорошее представление о распределении наших данных. Центральная горизонтальная линия в Скрипках-это место, где находится медиана наших данных, а минимальные и максимальные значения обозначаются позициями линий на оси Y.

Настройка скрипичных сюжетов в Matplotlib

Теперь давайте посмотрим, как мы можем настроить скрипичные сюжеты.

Добавление тиков X и Y

Как вы можете видеть, хотя графики были успешно сгенерированы, без меток тиков на осях X и Y может быть трудно интерпретировать график. Люди интерпретируют категориальные значения гораздо легче, чем числовые.

Мы можем настроить график и добавить метки к оси X с помощью функции set_xticks() :

fig, ax = plt.subplots()
ax.violinplot(gdp_cap, showmedians=True)
ax.set_title('violin plot')
ax.set_xticks([1])
ax.set_xticklabels(["Country GDP",])
plt.show()

Это приводит к:

добавьте тики x и y к скрипичным сюжетам в matplotlib

Здесь мы установили Xticks из диапазона в один, посередине, и добавили метку, которую легко интерпретировать.

Построение горизонтального скрипичного графика в Matplotlib

При желании мы могли бы также изменить ориентацию графика, изменив параметр vert . vert управляет тем, отображается ли график вертикально или нет, и он установлен в True по умолчанию:

fig, ax = plt.subplots()
ax.violinplot(gdp_cap, showmedians=True, vert=False)
ax.set_title('violin plot')
ax.set_yticks([1])
ax.set_yticklabels(["Country GDP",])
ax.tick_params(axis='y', labelrotation = 90)
plt.show()
сюжет горизонтальный скрипичный сюжет в matplotlib

Здесь мы установили метки тиков по оси Y и их частоту вместо оси X. Мы также повернули этикетки на 90 градусов

Отображение средств набора данных в скрипичных графиках

У нас также есть некоторые другие параметры настройки, доступные нам. Мы можем выбрать отображение средних, в дополнение к медианам, используя параметр snowman .

Давайте попробуем визуализировать средства в дополнение к медианам:

fig, (ax1, ax2, ax3) = plt.subplots(nrows=1, ncols=3)
ax1.violinplot(population, showmedians=True, showmeans=True, vert=False)
ax1.set_title('Population')

ax2.violinplot(life_exp, showmedians=True, showmeans=True, vert=False)
ax2.set_title('Life Expectancy')

ax3.violinplot(gdp_cap, showmedians=True, showmeans=True, vert=False)
ax3.set_title('GDP Per Cap')
plt.show()
show dataset means in violin plot in matplotlib

Однако обратите внимание, что, поскольку медианы и средние значения по существу выглядят одинаково, может стать неясным, какая вертикальная линия здесь относится к медиане, а какая к среднему.

Настройка оценки плотности ядра для скрипичных графиков

Мы также можем изменить количество точек данных, которые модель учитывает при создании оценок плотности гауссовского ядра, изменив параметр points .

Количество рассматриваемых точек по умолчанию равно 100. Предоставляя функции меньшее количество точек данных для оценки, мы можем получить менее репрезентативное распределение данных.

Давайте изменим это число, скажем, на 10:

fig, ax = plt.subplots()
ax.violinplot(gdp_cap, showmedians=True, points=10)
ax.set_title('violin plot')
ax.set_xticks([1])
ax.set_xticklabels(["Country GDP",])
plt.show()
настройка оценки плотности ядра для скрипичных графиков в matplotlib

Обратите внимание, что форма скрипки менее гладкая, так как было отобрано меньше точек.

Как правило, вы хотите увеличить количество точек, используемых для лучшего понимания распределения. Это может быть не всегда так, если 100 просто достаточно. Давайте построим 10-точечный, 100-точечный и 500-точечный сэмплированный скрипичный сюжет:

fig, (ax1, ax2, ax3) = plt.subplots(nrows=1, ncols=3)
ax1.violinplot(gdp_cap, showmedians=True, points=10)
ax1.set_title('GDP Per Cap, 10p')

ax2.violinplot(gdp_cap, showmedians=True, points=100)
ax2.set_title('GDP Per Cap, 100p')

ax3.violinplot(gdp_cap, showmedians=True, points=500)
ax3.set_title('GDP Per Cap, 500p')
plt.show()

Это приводит к:

различные размеры выборки KDE для скрипичного сюжета

Нет никакой очевидной разницы между вторым и третьим сюжетом, хотя между первым и вторым есть существенная разница.

Вывод

В этом уроке мы рассмотрели несколько способов построения скрипичного сюжета с помощью Matplotlib и Python. Мы также рассмотрели, как настроить их, добавив тики X и Y, построив горизонтальную диаграмму, показав средние значения набора данных, а также изменив выборку точек KDE.

Если вы заинтересованы в визуализации данных и не знаете, с чего начать, обязательно ознакомьтесь с нашей связкой книг on :

Визуализация данных в Python с Matplotlib и Pandas – это книга, предназначенная для того, чтобы познакомить абсолютных новичков с Pandas и Matplotlib, обладающих базовыми знаниями Python, и позволить им создать прочную основу для продвинутой работы с библиотеками тезисов- от простых сюжетов до анимированных 3D-сюжетов с интерактивными кнопками.

Он служит углубленным руководством, которое научит вас всему, что вам нужно знать о пандах и Matplotlib, включая то, как создавать типы сюжетов, которые не встроены в саму библиотеку.

Визуализация данных в Python , книга для начинающих и промежуточных разработчиков Python, проведет вас через простые манипуляции с данными с Пандами, охватит основные библиотеки построения графиков, такие как Matplotlib и Seaborn, и покажет вам, как использовать преимущества декларативных и экспериментальных библиотек, таких как Altair. Более конкретно, в течение 11 глав эта книга охватывает 9 библиотек Python: Pandas, Matplotlib, Seaborn, Bokeh, Altair, Plotly, GGPlot, GeoPandas и VisPy.

Он служит уникальным практическим руководством по визуализации данных, в изобилии инструментов, которые вы могли бы использовать в своей карьере.