Вступление
В Python есть много библиотек визуализации данных, но Matplotlib - самая популярная из них. Популярность Matplotlib объясняется его надежностью и полезностью - он может создавать как простые, так и сложные графики с небольшим количеством кода. Вы также можете настроить графики различными способами.
В этом уроке мы расскажем, как построить совместный график в
Matplotlib, который состоит из точечной
диаграммы и нескольких
графиков распределения на одном и том же Figure
.
Совместные графики используются для одновременного изучения взаимосвязей между двумерными данными, а также их распределения.
Примечание. Задачи такого типа больше подходят для таких
библиотек, как Seaborn, в которых есть встроенная jointplot()
.
GridSpec
Joint Plot вручную, используя GridSpec и несколько Axes
,
вместо того, чтобы делать это за нас Seaborn.
Импорт данных
Мы будем использовать знаменитый набор данных
Iris , поскольку мы можем
исследовать взаимосвязь между такими функциями, как SepalWidthCm
и
SepalLengthCm
помощью точечной диаграммы, но также исследуем
распределения между Species
с учетом длины / ширины чашелистиков с
помощью графиков распределения в то же время.
Давайте импортируем набор данных и посмотрим:
import pandas as pd
df = pd.read_csv('iris.csv')
print(df.head())
Это приводит к:
Id SepalLengthCm SepalWidthCm PetalLengthCm PetalWidthCm Species
0 1 5.1 3.5 1.4 0.2 Iris-setosa
1 2 4.9 3.0 1.4 0.2 Iris-setosa
2 3 4.7 3.2 1.3 0.2 Iris-setosa
3 4 4.6 3.1 1.5 0.2 Iris-setosa
4 5 5.0 3.6 1.4 0.2 Iris-setosa
Здесь мы будем исследовать двумерные отношения между SepalLengthCm
и
SepalWidthCm
, а также их распределения. Мы можем подойти к этому
двумя способами - относительно их Species
или нет.
Мы можем полностью игнорировать Species
и просто строить гистограммы
распределения каждого экземпляра цветка. С другой стороны, мы можем
кодировать цветом и строить графики распределения каждого экземпляра
цветка, также подчеркивая разницу в их Species
.
Мы рассмотрим здесь оба варианта, начиная с более простого - вообще
Species
Постройте совместный график в Matplotlib с гистограммами одного класса
В первом подходе мы просто загрузим экземпляры цветов и построим их как
есть, без учета их Species
.
Мы будем использовать
GridSpec
для настройки макета нашей фигуры, чтобы освободить место для трех
разных графиков и экземпляров Axes
Чтобы вызвать GridSpec
, мы хотим импортировать его вместе с
экземпляром PyPlot:
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.gridspec import GridSpec
Теперь давайте создадим нашу Figure
и создадим объекты Axes
df = pd.read_csv('iris.csv')
fig = plt.figure()
gs = GridSpec(4, 4)
ax_scatter = fig.add_subplot(gs[1:4, 0:3])
ax_hist_y = fig.add_subplot(gs[0,0:3])
ax_hist_x = fig.add_subplot(gs[1:4, 3])
plt.show()
Мы создали 3 Axes
, добавив подзаголовки к фигуре, используя наш
GridSpec
для их размещения. Это приводит к Figure
с 3 пустыми
экземплярами Axes
{.ezlazyload}
Теперь, когда у нас есть макет и расположение, все, что нам нужно
сделать, это нанести данные на наши Axes
. Давайте обновим скрипт,
чтобы построить характеристики SepalLengthCm
и SepalWidthCm
через
диаграмму рассеяния на наших ax_scatter
, а каждую из этих функций на
ax_hist_y
и ax_hist_x
:
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.gridspec import GridSpec
df = pd.read_csv('iris.csv')
fig = plt.figure()
gs = GridSpec(4, 4)
ax_scatter = fig.add_subplot(gs[1:4, 0:3])
ax_hist_x = fig.add_subplot(gs[0,0:3])
ax_hist_y = fig.add_subplot(gs[1:4, 3])
ax_scatter.scatter(df['SepalLengthCm'], df['SepalWidthCm'])
ax_hist_x.hist(df['SepalLengthCm'])
ax_hist_y.hist(df['SepalWidthCm'], orientation = 'horizontal')
plt.show()
Мы установили orientation
ax_hist_y
на horizontal
чтобы она
отображалась горизонтально, с правой стороны точечной диаграммы, в той
же ориентации, которую мы установили для наших осей, используя
GridSpec
:
{.ezlazyload}
В результате получается совместный SepalLengthCm
и SepalWidthCm
, а
также распределения для соответствующих функций.
Постройте совместный график в Matplotlib с гистограммами нескольких классов
Теперь еще один случай, который мы могли бы захотеть изучить, - это
распределение этих особенностей по отношению к Species
цветка, так как
это может повлиять на диапазон длины и ширины чашелистиков.
Для этого мы не будем использовать только одну гистограмму для каждой
оси, каждая из которых содержит все экземпляры цветов , а, скорее, мы
будем накладывать гистограмму для каждого Species
на обе оси.
Для этого нам сначала нужно проанализировать DataFrame
мы использовали
раньше, по Species
цветов:
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.gridspec import GridSpec
df = pd.read_csv('iris.csv')
setosa = df[df['Species']=='Iris-setosa']
virginica = df[df['Species']=='Iris-virginica']
versicolor = df[df['Species']=='Iris-versicolor']
species = df['Species']
colors = {
'Iris-setosa' : 'tab:blue',
'Iris-versicolor' : 'tab:red',
'Iris-virginica' : 'tab:green'
}
Здесь мы только что отфильтровали DataFrame
Species
на три отдельных
набора данных. setosa
данных setosa, virginica
и versicolor
теперь
содержат только соответствующие экземпляры.
Мы также захотим окрасить каждый из этих экземпляров другим цветом в
зависимости от их Species
как на диаграмме рассеяния, так и на
гистограммах. Для этого мы просто вырезали Series
Species
и
составили colors
, который мы будем использовать для map()
Species
каждого цветка с цветом позже.
Теперь давайте GridSpec
экземпляры Figure
, GridSpec и Axes
fig = plt.figure()
gs = GridSpec(4, 4)
ax_scatter = fig.add_subplot(gs[1:4, 0:3])
ax_hist_y = fig.add_subplot(gs[0,0:3])
ax_hist_x = fig.add_subplot(gs[1:4, 3])
Наконец, мы можем построить диаграмму рассеяния и гистограммы, установив их цвета и ориентацию соответственно:
ax_scatter.scatter(df['SepalLengthCm'], df['SepalWidthCm'], c=species.map(colors))
ax_hist_y.hist(versicolor['SepalLengthCm'], color='tab:red', alpha=0.4)
ax_hist_y.hist(virginica['SepalLengthCm'], color='tab:green', alpha=0.4)
ax_hist_y.hist(setosa['SepalLengthCm'], color='tab:blue', alpha=0.4)
ax_hist_x.hist(versicolor['SepalWidthCm'], orientation = 'horizontal', color='tab:red', alpha=0.4)
ax_hist_x.hist(virginica['SepalWidthCm'], orientation = 'horizontal', color='tab:green', alpha=0.4)
ax_hist_x.hist(setosa['SepalWidthCm'], orientation = 'horizontal', color='tab:blue', alpha=0.4)
plt.show()
Результатом вызова map()
Series
цветов:
0 tab:blue
1 tab:blue
2 tab:blue
3 tab:blue
4 tab:blue
...
145 tab:green
146 tab:green
147 tab:green
148 tab:green
149 tab:green
Когда c
аргументу scatter()
, он применяет цвета к экземплярам в
указанном порядке, эффективно окрашивая каждый экземпляр цветом,
соответствующим его виду.
Для гистограмм мы просто построили три графика, по одному для каждого
Species
, с соответствующими цветами. Здесь вы можете выбрать step
гистограмму и настроить alpha
значение для создания разных
распределений.
Выполнение этого кода приводит к:
{.ezlazyload}
Теперь у каждого Species
есть свой цвет и распределение, нанесенное
отдельно от других цветов. Кроме того, они имеют цветовую кодировку с
помощью точечной диаграммы, поэтому это действительно интуитивно
понятный график, который можно легко читать и интерпретировать.
Примечание. Если вы обнаружите, что перекрывающиеся цвета, такие как
оранжевый, состоящий из красной и синей гистограмм, отвлекают, установка
для параметра histtype
step
приведет к удалению заполненных цветов:
{.ezlazyload}
Заключение
В этом руководстве мы рассмотрели, как построить совместный график в Matplotlib - график разброса с соответствующими графиками распределения (гистограммы) по обеим осям графика, чтобы изучить распределение переменных, которые составляют сам график разброса. .
Хотя эта задача больше подходит для таких библиотек, как Seaborn, которые имеют встроенную поддержку совместных графиков, Matplotlib является базовым механизмом, который позволяет Seaborn легко создавать эти графики.
Если вас интересует визуализация данных и вы не знаете, с чего начать, обязательно ознакомьтесь с нашим комплектом книг по визуализации данных в Python{.ebook-link} :
::: {style=“border: 1px solid #ebebeb;padding: 15px;”} {.ebook-link}
Визуализация данных в Python
::: {.row} ::: {.col-md-4 .col-xs-12} {.ezlazyload .img-responsive .center-block} :::
::: {.col-md-8 .col-xs-12 .my-auto} Станьте опасными с визуализацией данных
✅ 30-дневная гарантия возврата денег без вопросов
✅ от начального до продвинутого
✅ Регулярно обновляется бесплатно (последнее обновление в апреле 2021 г.)
✅ Обновлено с бонусными ресурсами и руководствами ::: ::: :::
Визуализация данных в Python с помощью Matplotlib и Pandas - это книга, предназначенная для абсолютных новичков в работе с Pandas и Matplotlib с базовыми знаниями Python и позволяющая им создать прочную основу для расширенной работы с этими библиотеками - от простых графиков до анимированных трехмерных графиков с интерактивными кнопки.
Он служит подробным руководством, которое научит вас всему, что вам нужно знать о Pandas и Matplotlib, в том числе о том, как создавать типы графиков, которые не встроены в саму библиотеку.
Книга «Визуализация данных в Python» , книга для начинающих и средних разработчиков Python, проведет вас через простые манипуляции с данными с помощью Pandas, охватит основные библиотеки построения графиков, такие как Matplotlib и Seaborn, и покажет, как использовать преимущества декларативных и экспериментальных библиотек, таких как Altair. В частности, на протяжении 11 глав эта книга охватывает 9 библиотек Python: Pandas, Matplotlib, Seaborn, Bokeh, Altair, Plotly, GGPlot, GeoPandas и VisPy.
Он служит уникальным практическим руководством по визуализации данных в виде множества инструментов, которые вы можете использовать в своей карьере.