Почему пример построения Python в приведенном ниже тексте использует подплот, когда кажется, что он не добавляет значения? - PullRequest
0 голосов
/ 05 ноября 2018

Документация matplotlib

https://matplotlib.org/gallery/lines_bars_and_markers/simple_plot.html

предоставляет следующий пример кода

import matplotlib
import matplotlib.pyplot as plt
import numpy as np

# Data for plotting
t = np.arange(0.0, 2.0, 0.01)
s = 1 + np.sin(2 * np.pi * t)

fig, ax = plt.subplots()
ax.plot(t, s)

ax.set(xlabel='time (s)', ylabel='voltage (mV)',
       title='About as simple as it gets, folks')
ax.grid()

fig.savefig("test.png")
plt.show()

для получения следующего участка

enter image description here

Точно такой же график можно получить с помощью следующего кода

import matplotlib
import matplotlib.pyplot as plt
import numpy as np
t = np.arange(0.0, 2.0, 0.01)
s = 1 + np.sin(2 * np.pi * t)
plt.plot(t,s)
plt.grid(True)
plt.xlabel('time (s)')
plt.ylabel('voltage (mV)')
plt.title('About as simple as it gets, folks')
plt.savefig("test.png")
plt.show()

, который не использует подзаговор, топор или рис.

Я научился рисовать, используя второй подход. Я только недавно наткнулся на первый подход и хотя я могу себе представить, что он делает, он кажется гораздо менее интуитивным, чем второй подход.

Может ли кто-нибудь объяснить рациональность первого подхода, поскольку он, кажется, усложняет что-то очень простое?

1 Ответ

0 голосов
/ 05 ноября 2018

Подход Pyplot может показаться более интуитивным с первого взгляда. И, конечно, это в значительной степени субъективно. Поэтому не стесняйтесь использовать его, если он соответствует вашим потребностям.

pyplot - это так называемый конечный автомат. Он будет работать на «текущей фигуре» и «текущих осях». Однако затем он, как и в первом случае, вызовет соответствующие методы текущих объектов. Например. plt.plot(...) просто позвонит ax = plt.gca(); ax.plot(...) внутренне в любом случае. Таким образом, можно решить напрямую работать с рассматриваемыми объектами, а не полагаться на pyplot, чтобы найти их.

Кроме того, pyplot не предоставляет полной функциональности matplotlib. Например. если вы хотите создать форматировщик для своих ярлыков, вам все равно придется использовать объектно-ориентированный интерфейс,

plt.gca().xaxis.set_major_formatter(...)

, и в этом случае может возникнуть соблазн иметь в распоряжении непосредственно оси ax для работы на

ax.xaxis.set_major_formatter(...)

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

def myplot(ax, data, **kwargs):
    ax.plot(data, label = "My plot", **kwargs)
    ax.set_title("My plot")
    ax.legend()

Тогда повторное использование такой функции на любых осях очень удобно. Может быть, у вас есть одна фигура с осями для построения,

fig, ax = plt.subplots()
myplot(ax, data)

или у вас несколько осей на разных фигурах

fig1, (ax1, ax2) = plt.subplots(ncols=2)
fig2, (ax3, ax4) = plt.subplots(ncols=2)
myplot(ax2, data2)
myplot(ax4, data3)

Есть также случаи, когда вы вообще не хотите использовать pyplot, например при встраивании вашего графика в графический интерфейс, в этом случае вам нужно будет использовать такую ​​структуру, как

fig = matplotlib.figure.Figure()
canvas = FigureCanvasQT(fig)
axes = fig.subplots(2,3)
axes[0,1].plot(...)

Наконец, следует отметить, что многие вопросы, которые люди задают здесь, в Stackoverflow, напрямую связаны с использованием pyplot вместо объектно-ориентированного подхода. Это не значит, что вы не должны его использовать, но в целом можно сказать, что pyplot увеличивает шансы выстрелить себе в ногу, если вы не обращаете максимального внимания на то, что представляют собой «текущие оси» при работе с pyplot.

Ввиду всего вышесказанного, matplotlib пришел к выводу, что лучше всего использовать объектно-ориентированный подход, хотя для очень простых примеров, подобных приведенным в этом вопросе, он может быть менее простым для использования. Даже если не использовать объектно-ориентированный стиль, понимание его как-то является обязательным условием использования matplotlib даже для средних сложных сюжетов.

...