Matplotlib: введение в его объектно-ориентированный интерфейс
5 марта
Я пишу приложения для встраиваемых платформ. Одно из моих приложений развернуто в сети, где оно получает данные от нескольких сетевых узлов и обрабатывает их. Здесь важно время. Мое приложение должно иметь возможность обрабатывать данные со всех узлов за указанное время. Это жесткое ограничение. я полагаюсь на matplotlib вместе с пандами визуализировать/анализировать информацию о временном профилировании для каждого принятого сетевого пакета.
Вышеприведенный график представляет собой гистограмму времени обработки каждого принятого пакета. Это генерируется с использованием matplotlib. Для этого эксперимента было почти 2 00 000 точек данных. Этот график говорит мне о нескольких важных вещах. Это говорит мне, что большую часть времени сетевой пакет обрабатывается в течение 30 мс после его прибытия. Это также говорит мне, что есть два пика, один в 10 мс, а другой около 20 мс. Как видите, здесь важна визуализация, и matplotlib отлично справляется с этой задачей.
matplotlib огромен. Это очень полезный инструмент для построения графиков, но иногда он может сбивать с толку. Я запутался, когда впервые начал использовать его. matplotlib предоставляет два разных интерфейса для построения графиков, и мы можем использовать любой из них для достижения результатов. Это было основной причиной моего замешательства. Всякий раз, когда я искал в Интернете какую-либо помощь, я находил как минимум два разных способа сделать это. Именно тогда я решил немного углубиться в его интерфейсы, и этот урок является результатом этого.
Фокус этого урока узок —Понять «объектно-ориентированный интерфейс».. Мы не начнем с большого набора данных. Это сместит фокус на сам набор данных, а не на объекты matplotlib. Большую часть времени мы будем работать с очень простыми данными, такими простыми, как список чисел. В конце мы будем работать с большим набором данных, чтобы увидеть, как matplotlib можно использовать для анализа большего набора данных.
Интерфейсы Matplotlib
matplotlib предоставляет два интерфейса для построения графиков
- Графика в стиле MATLAB с использованием pyplot
- Объектно-ориентированный интерфейс
После изучения matplotlib я решил использовать его «объектно-ориентированный интерфейс». Я считаю, что это проще в использовании. Каждая фигура разделена на несколько объектов, и иерархия объектов понятна. Мы работаем над объектами для достижения результата. Поэтому в этом уроке я сосредоточусь на объектно-ориентированном интерфейсе. Некоторые функции pyplot также будут использоваться везде, где их удобно использовать.
Объектно-ориентированный интерфейс Matplotlib
Рисунок в matplotlib разделен на два разных объекта.
- Фигура объект
- Оси объект
А Фигура объект может содержать один или несколько оси объекты. Один оси представляет собой один сюжет внутри фигуры. В этом уроке мы будем работать с оси объект непосредственно для всех видов построения графиков.
Объект фигуры
import matplotlib.pyplot as plt
fig = plt.figure()
print(type(fig))
Вывод приведенного выше фрагмента кода matplotlib.figure.Рисунок. plt.figure() возвращает Фигура объект. тип() метод в python используется для определения типа объекта. Итак, у нас есть пустой Фигура объект в данный момент. Давайте попробуем его составить.
# Give the figure a title
fig.suptitle("Empty figure")
plt.show()
Выполнение приведенного выше кода возвращает пустую фигуру. Я не включаю сюда цифру, потому что она просто пуста.
Объект осей
Один или больше оси объекты необходимы, чтобы мы начали рисовать. Существует более одного способа оси предмет можно получить. Мы начнем с add_subplot() метод, а позже изучат другие способы.
ax = fig.add_subplot(1,1,1)
# Set the title of plot
ax.set_title("Empty plot")
plt.show()
add_subplot (num_rows, num_cols, subplot_location) метод создает сетку из подграфиков размером (num_rows Икс число_столбцов) и возвращает оси объект для подзаговора в subplot_location. Подзаговоры нумеруются следующим образом:
- Первый участок находится в (первая строка, первый столбец). Начните с этой позиции и продолжайте нумерацию до последнего столбца первой строки.
- Начните с крайнего левого положения во втором ряду и продолжайте нумерацию.
- Пример: 3-й подзаговор в сетке из подзаговоров 2×2 находится в месте = (2-я строка, 1-й столбец)
Так add_subplot (1, 1, 1) возвращает объект осей в 1-м месте в сетке 1×1 подграфиков. Другими словами, внутри фигуры генерируется только один график. Выполнение приведенного выше кода дает нам пустой график с осью xy, как показано ниже.
Возьмем еще один пример. Мы делим фигуру на сетку подграфиков 2×2 и получаем объект осей для всех подграфиков.
import matplotlib.pyplot as plt
fig = plt.figure()
# Generate a grid of 2x2 subplots and get
# axes object for 1st location
ax1 = fig.add_subplot(2,2,1)
ax1.set_title('First Location')
# Get the axes object for subplot at 2nd
# location
ax2 = fig.add_subplot(2,2,2)
ax2.set_title('Second Location')
# Get the axes object for subplot at 3rd
# location
ax3 = fig.add_subplot(2,2,3)
ax3.set_xlabel('Third Location')
# Get the axes object for subplot at 4th
# location
ax4 = fig.add_subplot(2,2,4)
ax4.set_xlabel('Fourth Location')
# Display
plt.show()
Вывод приведенного выше кода:
2×2 Сетка подсюжетов
Как только мы получим оси объект, мы можем вызвать методы оси объект для создания графиков. Мы будем использовать следующие методы оси объекты в наших примерах:
- plot(x, y): генерировать график y vs x
- set_xlabel() : Метка для оси X
- set_ylabel() : Метка для оси Y
- set_title() : Название графика
- legend() : создать легенду для графика.
- hist() : Генерировать график гистограммы
- scatter(): создать точечную диаграмму
Пожалуйста, обратитесь к matplotlib оси страницу класса для более подробной информации о классе осей.
Ex1: простой график XY
Мы можем построить данные, используя участок() метод объекта осей. Это продемонстрировано в примере ниже.
import matplotlib.pyplot as plt
# Generate data for plots
x = [1, 2, 3, 4, 5]
y = x
# Get an empty figure
fig1 = plt.figure()
# Get the axes instance at 1st location in 1x1 grid
ax = fig1.add_subplot(1,1,1)
# Generate the plot
ax.plot(x, y)
# Set labels for x and y axis
ax.set_xlabel('X--->')
ax.set_ylabel('Y--->')
# Set title for the plot
ax.set_title('Simple XY plot')
# Display the figure
plt.show()
Выполнение приведенного выше кода создаст график y = x, как показано ниже.
Ex2: несколько графиков на одном графике
Давайте попробуем создать 2 графика в одном окне графика. Один для y = x, а другой для z = x²
import matplotlib.pyplot as plt
# Function to get the square of each element in the list
def list_square(a_list):
return [element**2 for element in a_list]
# Multiple plot in same subplot window
# plot y = x and z = x^2 in the same subplot window
fig2 = plt.figure()
x = [1, 2, 3, 4, 5]
y = x
z = list_square(x)
# Get the axes instance
ax = fig2.add_subplot(1,1,1)
# Plot y vs x as well as z vs x. label will be used by ax.legend() method to generate a legend automatically
ax.plot(x, y, label="y")
ax.plot(x, z, label="z")
ax.set_xlabel("X------>")
# Generate legend
ax.legend()
# Set title
ax.set_title('Two plots one axes')
# Display
plt.show()
В это время топор.сюжет () вызывается с одним дополнительным аргументом — меткой. Это нужно, чтобы установить метку для графика. Этот ярлык используется топор.легенда() способ создания легенды для графика. Вывод приведенного выше кода показан ниже:
Как видите, два графика генерируются в одном окне графика. Также легенда размещена в верхнем левом углу.
Ex3: два графика на рисунке
Теперь мы создадим несколько графиков на рисунке.
import matplotlib.pyplot as plt
# Function to get the square of each element in the list
def list_square(a_list):
return [element**2 for element in a_list]
# Multiple subplots in same figure
fig3 = plt.figure()
x = [1, 2, 3, 4, 5]
y = x
z = list_square(x)
# Divide the figure into 1 row 2 column grid and get the
# axes object for the first column
ax1 = fig3.add_subplot(1,2,1)
# plot y = x on axes instance 1
ax1.plot(x, y)
# set x and y axis labels
ax1.set_xlabel('X------>')
ax1.set_ylabel('Y------>')
ax1.set_title('y=x plot')
# Get second axes instance in the second column of the 1x2 grid
ax2 = fig3.add_subplot(1,2,2)
# plot z = x^2
ax2.plot(x, z)
ax2.set_xlabel('X---------->')
ax2.set_ylabel('z=X^2--------->')
ax2.set_title('z=x^2 plot')
# Generate the title for the Figure. Note that this is different then the title for individual plots
plt.suptitle("Two plots in a figure")
plt.show()
Выполнение приведенного выше кода генерирует следующий рисунок:
Ex3: Графики гистограммы
Графики гистограмм полезны для визуализации основного распределения данных. Ниже приведен пример графика гистограммы. Данные для этого примера генерируются с помощью numpy. 1000 выборок генерируются из распределения Гаусса со средним значением 10 и стандартным отклонением 0,5.
import matplotlib.pyplot as plt
import numpy as np
# Generate 1000 numbers from gaussian sample
mean = 10
std = 0.5
num_samples = 1000
samples = np.random.normal(mean, std, num_samples)
# Get an instance of Figure object
fig = plt.figure()
ax = fig.add_subplot(1,1,1)
# Generate histogram plot
ax.hist(samples)
ax.set_xlabel('Sample values')
ax.set_ylabel('Frequency')
ax.set_title('Histogram plot')
plt.show()
По оси X на приведенном выше графике указаны значения для выборок, а по оси Y — частота для каждой выборки. Мы можем наблюдать пик при значении 10.
Согласно правилу трех сигм, 99,7% выборок гауссовского распределения лежат в пределах трех стандартных отклонений от среднего значения. Для этого примера этот диапазон [8.5, 11.5]. Это также можно проверить из приведенного выше графика.
Построение на большем наборе данных
В этом примере мы будем работать с «Набором данных о ценах на жилье в Калифорнии». Этот набор данных используется в книге «Практическое машинное обучение с помощью Scikit-Learn и Tensor Flow» Орельена Герона. Этот набор данных можно скачать с kaggle по ссылке:
Каждая строка в наборе данных содержит данные для блока. Блок можно рассматривать как небольшую географическую область. Набор данных имеет следующие столбцы:
- longitude — Долгота в градусах
- latitude — Широта в градусах
- Housing_median_age — Средний возраст дома в квартале
- total_rooms — Общее количество комнат в блоке
- total_bedrooms — Общее количество спален в блоке
- населения — Население блока
- домохозяйства — Общее количество домохозяйств, группа людей, проживающих в доме, для блока
- median_income — средний доход домохозяйств в квартале (измеряется в десятках тысяч долларов США)
- median_house_value — Средняя стоимость дома для домохозяйств в пределах блока (в долларах США)
- ocean_proximity — Расположение дома относительно океана/моря
Давайте создадим несколько графиков, чтобы узнать некоторые вещи о наборе данных. Мне интересно знать следующие вещи о наборе данных.
- Распределение «median_house_value»
- Распределение «медиан_дохода»
- Здравый смысл подсказывает мне, что дома должны стоить дорого там, где доход выше, и наоборот. Также количество комнат в блоке должно быть больше в тех местах, где много людей. Давайте попробуем выяснить это, создав несколько графиков.
Метод подзаголовков () — В этом примере мы будем использовать метод подзаголовков pyplot, чтобы получить оси объекты. Мы видели что add_subplot() метод возвращает только один оси объект за раз. Так add_subplot() метод необходимо вызывать для каждого подграфика внутри рисунка. сюжет подсюжеты() API решает эту проблему. Он возвращает массив numpy nd из оси объекты. Создание графиков с использованием оси объект такой же, как описано в предыдущих примерах.
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
# Read the csv file into a pandas dataframe
# A dataframe is basically a table of data.
df_housing = pd.read_csv("housing.csv")
# Get figure object and an array of axes objects
fig, arr_ax = plt.subplots(2, 2)
# Histogram - median_house_value
arr_ax[0,0].hist(df_housing['median_house_value'])
arr_ax[0,0].set_title('median_house_value')
# Histogram - median_income
arr_ax[0,1].hist(df_housing['median_income'])
arr_ax[0,1].set_title('median_income')
# Scatter - population vs total_rooms
arr_ax[1,0].scatter(df_housing['population'], df_housing['total_rooms'])
arr_ax[1,0].set_xlabel('population')
arr_ax[1,0].set_ylabel('total_rooms')
# scatter - median_income vs median_house_value
arr_ax[1,1].scatter(df_housing['median_income'], df_housing['median_house_value'])
arr_ax[1,1].set_xlabel('median_income')
arr_ax[1,1].set_ylabel('median_house_value')
plt.show()
print('DONE : Matplotlib california housing dataset plotting')
я использовал питон панды библиотека для чтения данных из набора данных. Набор данных представляет собой CSV-файл с именем ‘жилье.csv’.
plt.subplots(2, 2) возвращает фигура объект и двумерный массив оси объекты размером 2×2. Оси Доступ к объекту для отдельного подграфика можно получить путем индексации массива по двумерному массиву оси объекты.
Первый участок имеет хорошее гауссово распределение, за исключением конца. Этот график говорит нам, что среднее значение «median_house_value» находится где-то между 1 00 000 и 2 00 000 долларов США. Верхняя крышка составляет 5 00 000 долларов США. Также есть удивительно большое количество домов по цене около 5 00 000 долларов США.
Второй участок также имеет хороший дистрибутив. Это говорит нам о том, что среднее значение среднего дохода составляет от 20 000 до 40 000 долларов США. Также очень мало людей с доходом выше 80 000 долларов США.
Третий график (население против total_rooms) подтверждает, что количество комнат больше в тех местах, где больше населения.
Четвертый график (median_income против median_house_value)подтверждает наш здравый смысл, что «медианная_ценность_дома» должна быть больше там, где больше «медианный_доход», и наоборот.
Это всего лишь пример. Для этого набора данных можно выполнить дополнительный анализ, но это выходит за рамки данного руководства.
Вывод
Я представил введение в объектно-ориентированный интерфейс matplotlib. В этом уроке основное внимание уделялось объяснению Фигура а также оси объекты и их отношения. Я постараюсь написать пост, в котором я проведу полный анализ набора данных, используя pandas, matplotlib и numpy.
Все примеры этого руководства можно загрузить из моей основной учетной записи github —