Вступление
В 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()
Когда мы создадим первый график, мы сможем увидеть распределение наших данных, но мы также заметим некоторые проблемы. Поскольку масштабы функций настолько различны, практически невозможно распределение столбцов Ожидаемая продолжительность жизни и ВВП .
По этой причине мы хотим построить каждый столбец на своем собственном подзаголовке.
Мы сделаем небольшую сортировку и нарезку фрейма данных, чтобы упростить сравнение столбцов набора данных. Мы сгруппируем фрейм данных по “стране” и выберем только самые последние/последние записи для каждой из стран.
Затем мы отсортируем по численности населения и отбросим записи с наибольшей численностью населения (большие выбросы численности населения), чтобы остальная часть кадра данных находилась в более близком диапазоне и сравнение было проще:
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()
Запуск этого кода теперь дает нам:
Теперь мы можем получить хорошее представление о распределении наших данных. Центральная горизонтальная линия в Скрипках-это место, где находится медиана наших данных, а минимальные и максимальные значения обозначаются позициями линий на оси 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()
Это приводит к:
Здесь мы установили 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()
Здесь мы установили метки тиков по оси 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()
Однако обратите внимание, что, поскольку медианы и средние значения по существу выглядят одинаково, может стать неясным, какая вертикальная линия здесь относится к медиане, а какая к среднему.
Настройка оценки плотности ядра для скрипичных графиков
Мы также можем изменить количество точек данных, которые модель учитывает при создании оценок плотности гауссовского ядра, изменив параметр 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()
Обратите внимание, что форма скрипки менее гладкая, так как было отобрано меньше точек.
Как правило, вы хотите увеличить количество точек, используемых для лучшего понимания распределения. Это может быть не всегда так, если 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()
Это приводит к:
Нет никакой очевидной разницы между вторым и третьим сюжетом, хотя между первым и вторым есть существенная разница.
Вывод
В этом уроке мы рассмотрели несколько способов построения скрипичного сюжета с помощью 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.
Он служит уникальным практическим руководством по визуализации данных, в изобилии инструментов, которые вы могли бы использовать в своей карьере.