Я немного смущен тем, что происходит на бэкэнде, когда я рисую графики в matplotlib, tbh, я не понимаю иерархию сюжета, осей и фигуры. Я прочитал документацию, и это было полезно, но я все еще не понимаю ...
Приведенный ниже код рисует один и тот же сюжет тремя разными способами:
#creating the arrays for testing
x = np.arange(1, 100)
y = np.sqrt(x)
#1st way
plt.plot(x, y)
#2nd way
ax = plt.subplot()
ax.plot(x, y)
#3rd way
figure = plt.figure()
new_plot = figure.add_subplot(111)
new_plot.plot(x, y)
Теперь мой вопрос -
В чем разница между всеми тремя, я имею в виду, что происходит под капотом при вызове любого из трех методов?
Какой метод следует использовать, когда и каковы плюсы и минусы использования любого из них?
python
matplotlib
хэш-код55
источник
источник
Ответы:
Способ 1
Это позволяет построить только одну фигуру с координатами (x, y). Если вы хотите получить только одно изображение, вы можете использовать этот способ.
Способ 2
Это позволяет отображать одну или несколько фигур в одном окне. Когда вы его напишете, вы построите только одну фигуру, но вы можете сделать что-то вроде этого:
fig1, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2)
Вы построите 4 фигуры с именами ax1, ax2, ax3 и ax4 каждая, но в одном окне. В моем примере это окно будет разделено на 4 части.
Способ 3
fig = plt.figure() new_plot = fig.add_subplot(111) new_plot.plot(x, y)
Не использовал, но документацию можно найти.
Пример:
import numpy as np import matplotlib.pyplot as plt # Method 1 # x = np.random.rand(10) y = np.random.rand(10) figure1 = plt.plot(x,y) # Method 2 # x1 = np.random.rand(10) x2 = np.random.rand(10) x3 = np.random.rand(10) x4 = np.random.rand(10) y1 = np.random.rand(10) y2 = np.random.rand(10) y3 = np.random.rand(10) y4 = np.random.rand(10) figure2, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2) ax1.plot(x1,y1) ax2.plot(x2,y2) ax3.plot(x3,y3) ax4.plot(x4,y4) plt.show()
Другой пример:
источник
matplotlib
язык сбивал меня с толку, и этот вопрос появляется при поиске «оси против фигуры в matplotlib». Для других новичков этот вопрос помог ответить на этот вопрос . Я думаю, что формулировка здесь может быть более ясной, чтоsubplots()
вернетAxes
объекты на синглеfigure
.Имена предметов
Matplotlib строго объектно-ориентирован, и его основными объектами являются фигура и оси (я считаю, что название
axes
немного вводит в заблуждение, но, вероятно, это только я).Вы можете думать о фигуре как о холсте , для которого вы обычно указываете размеры и, возможно, цвет фона и т.д. и т. Д. Вы используете холст, фигуру , по существу, двумя способами, размещая на ней другие объекты (в основном оси , но также текстовые метки и т. д.) и сохраняя его содержимое с помощью
savefig
.Вы можете думать о топоре как о швейцарском армейском ноже, удобном предмете, который предлагает инструмент (например
.plot
,.scatter
и.hist
т. Д.) Для всего, в основном. Вы можете разместить одну, две, ... много осей внутри фигуры, используя один из множества различных методов.plt
интерфейсРх процедурный интерфейс был первоначально разработан , чтобы имитировать интерфейс MATLAB ™ , но на самом деле не отличается от интерфейса объектно - ориентированным, даже если вы не сделаете прямую ссылку на основные объекты (то есть, фигура и Ан оси ) эти объекты создается автоматически, и каждый метод plt , по сути, транслируется в вызов одного из методов базовых фундаментальных объектов: например, a
plt.plot()
- это,hidden_axes.plot
а aplt.savefig
- этоhidden_figure.savefig
.В любой момент вы можете управлять этими скрытыми объектами с помощью
plt.gcf
иplt.gca
, и это иногда необходимо, когда один из методов объекта не был перенесен в метод в пространстве имен plt .Я хотел бы добавить, что пространство имен plt также содержит ряд удобных методов для создания экземпляров фигур и осей разными способами .
Ваши примеры
Здесь вы используете только интерфейс plt , вы можете использовать только одну ось на каждом рисунке , но это то, что вам нужно, когда вы проводите исследование своих данных, быстрый рецепт, который выполняет работу ...
Здесь вы используете удобный метод в пространстве имен plt, чтобы дать имя (и дескриптор) вашему объекту осей , но, кстати, есть также скрытая фигура . Позже вы можете использовать объект оси для построения графика, построения гистограммы и т.д., всего, что вы можете делать с интерфейсом plt , но вы также можете получить доступ ко всем его атрибутам и изменить их с большей свободой.
Здесь вы начинаете создавать экземпляр фигуры, используя удобный метод в пространстве имен plt, а позже вы используете только объектно-ориентированный интерфейс.
Можно обойти удобный метод plt (
matplotlib.figure.Figure
), но затем вам придется настроить фигуру для лучшего интерактивного взаимодействия (в конце концов, это удобный метод).Персональные рекомендации
Я предлагаю голый
plt.plot
,plt.scatter
в контексте интерактивного сеанса, возможно, использовать IPython с его%matplotlib
волшебной командой, а также в контексте исследовательской записной книжки Jupyter.С другой стороны, объектно-ориентированный подход плюс несколько
plt
удобных методов - это лучший вариант.Между этими крайностями есть большая серая зона, и если вы спросите меня, что делать, я просто скажу: «Это зависит от обстоятельств» ...
источник
fig, ax = plt.subplot()
идиому, когда им не нужны подсюжеты. В таких случаях мне было проще "процедурный" стиль. «Но, наверное, это только я ...» :-)