Matplotlib - plt.show () на объекте диаграммы

Aug 28 2020

У меня есть действительно простой пример. Я делаю сюжет из объекта топора, возвращенного функцией:

import matplotlib.pyplot as plt

x = ['a', 'b', 'c']
y = [1, 2, 3]

def make_plot():

    fig, ax = plt.subplots()
    ax.set_title('test bar chart')

    return ax


chart = make_plot()
chart.bar(x, y)

plt.show()               #why does this show the chart?

Мой вопрос касается plt.show () в конце. Очевидно, это показывает результат диаграммы. Но почему? Мне не кажется, что plt.show () ни к чему не привязан. У меня есть chartобъект, содержащий мою диаграмму со всеми ее параметрами и прочим. Но как plt.show () узнает, что с этим нужно взаимодействовать? Казалось бы, более интуитивно понятно иметь что-то подобное chart.show(), как chartэкземпляр класса.

Ответы

2 Keon Aug 28 2020 at 01:42

Хороший вопрос! chartAxes создается, когда вы звоните plt.subplots(). Pyplot - это так называемый API с отслеживанием состояния. Когда вы вызываете функции plt. *, Это меняет внутреннее состояние pyplot, что может повлиять на будущие вызовы. Когда вы вызываете plt.subplots(), он знает, что есть недавно созданная фигура с недавно созданными осями подзаговора внутри нее.

Точно так же, если вы вызываете plt.plot(), он имеет сохраненную запись о последних осях и отображает данные на этом графике.

Взгляните на исходный код pyplot, и вы увидите, как у него есть глобальная managerпеременная, которую он использует для хранения текущего графика и обновляет его managerпри создании графика.

Кроме того, есть Figure.show(). Если вы хотите обойти pyplot, он будет выглядеть примерно так