Практическое резюме Matplotlib в 13 фрагментах Python

Фундаментальные скрипты для базовой визуализации данных на Python

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

В этой статье я покажу вам 13 скриптов, которые обобщают основы Matplotlib.

Основы построения графиков с помощью фигур и осей

import matplotlib.pyplot as plt
import numpy as np
fig,axs = plt.subplots(figsize=(15,7)) 
data1 = np.random.normal(0,1,100)
data2 = np.random.normal(0,1,100)
data3 = np.random.normal(0,1,100)
x_ax = np.arange(0,100,10)
y_ax = np.arange(-3,3,1)
axs.plot(data1,marker="o")
axs.plot(data2,marker="*")
axs.plot(data3,marker="^")
axs.set_xticks(x_ax)
axs.set_xticklabels(labels=x_ax,rotation=45)
axs.set_yticks(y_ax)
axs.set_yticklabels(labels=y_ax,rotation=45)
axs.set_xlabel("X label")
axs.set_ylabel("Y label")
axs.set_title("Title")
axs.grid("on")

Объектно-ориентированный стиль (OO) против стиля Pyplot

Как отмечено в документации, по существу есть два способа использования Matplotlib:

  • ОО-стиль: явно создавайте фигуры и оси и вызывайте для них методы.
  • Стиль Pyplot: полагайтесь на модуль pyplot для автоматического создания фигур и осей и управления ими.

OO-стиль

import matplotlib.pyplot as plt
import numpy as np


x = np.cos(np.linspace(0, 2, 100)) # Create the data
# Note that even in the OO-style, we use `.pyplot.figure` to create the figure.
fig, ax = plt.subplots()  # Create a figure and an axes with pyplot.subplots()
ax.plot(x, x, label='linear')  # Plot some data on the axes.
ax.plot(x, x**2, label='quadratic')  # Plot more data on the axes...
ax.plot(x, x**3, label='cubic')  # ... and some more.
ax.set_xlabel('x label')  # Add an x-label to the axes.
ax.set_ylabel('y label')  # Add a y-label to the axes.
ax.set_title("Simple Plot")  # Add a title to the axes.
ax.legend();  # Add a legend.

Pyplot-стиль

import matplotlib.pyplot as plt
import numpy as np
x = np.cos(np.linspace(0, 2, 100)) # Create the data
plt.plot(x, x, label='linear')  # Plot some data on the (implicit) axes.
plt.plot(x, x**2, label='quadratic')  # same pipeline but using pyplot.plot directly
plt.plot(x, x**3, label='cubic')
plt.xlabel('x label')
plt.ylabel('y label')
plt.title("Simple Plot")
plt.legend();

Когда использовать стиль OO или стиль pyplot

Примеры из документации Matplotlib используют оба подхода, но подчеркивают, что предпочтительнее выбрать один из них и придерживаться его. Предлагается ограничить pyplot интерактивным построением (например, в блокноте Jupyter) и предпочесть объектно-ориентированный стиль для неинтерактивного построения.

Рекомендуемая сигнатура функции для графиков Matplotlib

# source: https://matplotlib.org/stable/tutorials/introductory/usage.html#sphx-glr-tutorials-introductory-usage-py
import matplotlib.pyplot as plt
import numpy as np
def my_plotter(ax, data1, data2, param_dict):
    """
    A helper function to make a graph

    Parameters
    ----------
    ax : Axes
        The axes to draw to

    data1 : array
       The x data

    data2 : array
       The y data

    param_dict : dict
       Dictionary of kwargs to pass to ax.plot

    Returns
    -------
    out : list
        list of artists added
    """
    out = ax.plot(data1, data2, **param_dict)
    return out


data1, data2, data3, data4 = np.random.randn(4, 100)
fig, ax = plt.subplots(1, 1)
my_plotter(ax, data1, data2, {'marker': 'x'})


# 2 sub-plots example
fig, (ax1, ax2) = plt.subplots(1, 2)
my_plotter(ax1, data1, data2, {'marker': 'x'})
my_plotter(ax2, data3, data4, {'marker': 'o'});

Форматирование стиля вашего сюжета

import matplotlib.pyplot as plt
import numpy as np

t = np.sin(np.linspace(-3,3,50))
# red dashes, blue squares and green triangles
plt.plot(t, t, 'r--', color="red")
plt.plot(t, t**2, 'bs', color="blue")
plt.plot(t, t**3, 'g^', color="green")
plt.plot(t, t**4, "o", color="orange")
plt.plot(t, t**5, "o-", color="black")
plt.show()

Смотрите больше на

Построение строк с ключевыми словами (из словарей)

# source: https://matplotlib.org/stable/gallery/misc/keyword_plotting.html
import matplotlib.pyplot as plt
import numpy as np
data = {'a': np.arange(50),
        'c': np.random.randint(0, 50, 50),
        'd': np.random.randn(50)}
data['b'] = data['a'] + 10 * np.random.randn(50)
data['d'] = np.abs(data['d']) * 100
plt.scatter('a', 'b', c='c', s='d', data=data)
plt.xlabel('entry a')
plt.ylabel('entry b')
plt.show()

Построение категориальных переменных

import matplotlib.pyplot as plt
import numpy as np
names = ['cats', 'dogs', 'dragons']
values = [5, 25, 125]
plt.figure(figsize=(15, 7))
plt.subplot(131)
plt.bar(names, values, color="red", label="bar chart")
plt.legend()
plt.subplot(132)
plt.scatter(names, values, color="orange", label="scatter plot")
plt.legend()
plt.subplot(133)
plt.plot(names, values, color="green", label="line plot")
plt.legend()
plt.suptitle('Categorical Plots')
plt.show()

Работа с несколькими фигурами

import matplotlib.pyplot as plt
import numpy as np
def f(t):
    return np.exp(-t) * np.cos(2*np.pi*t)

t1 = np.arange(0.0, 5.0, 0.1)
t2 = np.arange(0.0, 5.0, 0.2)

plt.figure()

plt.subplot(2,2,1)
plt.plot(t1, f(t1), 'black')

plt.subplot(2,2,2)
plt.plot(t2, np.tan(2*np.pi*t2), 'r--')

plt.subplot(2,2,3)
plt.plot(t2, np.exp(t2), 'g^')

plt.subplot(2,2,4)
plt.plot(t2, np.cos(2*np.pi*t2), 'orange');

Вы можете использовать номера фигур для создания нескольких фигур:

import matplotlib.pyplot as plt
import numpy as np
plt.figure(1)
plt.subplot(121)
plt.plot([1, 2, 3])
plt.subplot(122)
plt.plot([4, 5, 6])
plt.figure(2)
plt.subplot(121)
plt.plot([1, 2, 3],color="red")
plt.subplot(122)
plt.plot([4, 5, 6],color="red")
plt.title('It is that simple');

Смотрите больше на:

Работа с текстом

Matplotlib позволяет легко писать произвольно размещенный текст внутри графиков, используя текстовые объекты.

#source: https://matplotlib.org/stable/tutorials/introductory/pyplot.html#sphx-glr-tutorials-introductory-pyplot-py
mu, sigma = 100, 15
x = mu + sigma * np.random.randn(10000)

# the histogram of the data
n, bins, patches = plt.hist(x, 50, density=1, facecolor='g', alpha=0.75)
plt.xlabel('Smarts')
plt.ylabel('Probability')
plt.title('Histogram of IQ')
plt.text(60, .025, r'$\mu=100,\ \sigma=15$')
plt.axis([40, 160, 0, 0.03])
plt.grid(True)
plt.show()

Все текстовые функции возвращают экземпляр текстового объекта. Обратите внимание, что вы можете использовать математические выражения в тексте, как это сделано в приведенном выше примере, взятом из документации Matplotlib. Идея состоит в том, чтобы вставить латексный синтаксис в текстовую строку:

plt.title(r'$\sigma_i=15$')
Text(0.5, 1.0, '$\\sigma_i=15$')

Больше на:

Текстовые аннотации

# source: https://matplotlib.org/stable/tutorials/text/annotations.html
ax = plt.subplot()

t = np.arange(0.0, 5.0, 0.01)
s = np.cos(2*np.pi*t)
line, = plt.plot(t, s, lw=2)

plt.annotate('local max', xy=(2, 1), xytext=(3, 1.5),
             arrowprops=dict(facecolor='black', shrink=0.05),
             )

plt.ylim(-2, 2)
plt.show()

Смотрите больше на:

Работа с другими шкалами осей

# adapted from: https://matplotlib.org/stable/tutorials/introductory/pyplot.html#sphx-glr-tutorials-introductory-pyplot-py

# make up some data in the open interval (0, 1)
y = np.random.normal(loc=0.5, scale=0.4, size=1000)
y = y[(y > 0) & (y < 1)]
y.sort()
x = np.arange(len(y))

# plot with various axes scales
plt.figure()

# linear
plt.subplot(221)
plt.plot(x, y, color="red")
plt.yscale('linear')
plt.title('linear',color="red")
plt.grid(True)

# log
plt.subplot(222)
plt.plot(x, y, color="green")
plt.yscale('log')
plt.title('log',color="green")
plt.grid(True)

# symmetric log
plt.subplot(223)
plt.plot(x, y - y.mean(),color="blue")
plt.yscale('symlog', linthresh=0.01)
plt.title('symlog',color="blue")
plt.grid(True)

# logit
plt.subplot(224)
plt.plot(x, y, color="orange")
plt.yscale('logit')
plt.title('logit',color="orange")
plt.grid(True)
# Adjust the subplot layout, because the logit one may take more space
# than usual, due to y-tick labels like "1 - 10^{-3}"
plt.subplots_adjust(top=0.92, bottom=0.08, left=0.10, right=0.95, hspace=0.25,
                    wspace=0.35)
plt.tight_layout()
plt.show()

Смотрите больше на:

Визуализация данных - это ремесло

Это всего лишь несколько примеров вселенной графических возможностей Matplotlib. Я рекомендую вам прочитать документацию и изучить надлежащие практики для освоения Matplotlib. Для тех, кто работает с ним ежедневно, я гарантирую, что это достойное занятие!

Исходный код с записной книжкой к этой статье можно найти здесь.

Если вы хотите узнать больше о Python и визуализации данных, ознакомьтесь с этими курсами от Udemy:

Это партнерские ссылки, если вы воспользуетесь ими, я получу небольшую комиссию, ура! :)

Если вам понравился этот пост, свяжитесь со мной в Twitter, LinkedIn, Instagram и подпишитесь на меня в Medium. Спасибо и увидимся в следующий раз!

использованная литература