Практическое резюме 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 npdata = {'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:
Это партнерские ссылки, если вы воспользуетесь ими, я получу небольшую комиссию, ура! :)
- Python для науки о данных от А до Я
- Изучите Python для визуализации данных
- Визуализация данных в Python Мастер-класс
Если вам понравился этот пост, свяжитесь со мной в Twitter, LinkedIn, Instagram и подпишитесь на меня в Medium. Спасибо и увидимся в следующий раз!