Когда использовать класс matplotlib.pyplot и когда использовать объект plot (matplotlib.collections.PathCollection)

Я задавался вопросом, что логика стоит за вопросом, когда использовать экземпляр сюжета (который есть PathCollection) и когда использовать сам сюжетный класс.

import matplotlib.pyplot as plt
p = plt.scatter([1,2,3],[1,2,3])

выводит график рассеяния. Чтобы заставить его работать, я должен сказать:

plt.annotate(...)

и для настройки меток осей или лимитов вы пишете:

plt.xlim(...)
plt.xlabel(...)

и т.д.

Но, с другой стороны, вы пишете:

p.axes.set_aspect(...)
p.axes.yaxis.set_major_locator(...)

Какова логика этого? Могу ли я найти его где-нибудь? К сожалению, я не нашел ответа на этот конкретный вопрос в документации.

Когда вы используете фактический экземпляр p для настройки вашего графика и когда вы используете класс pyplot plt?

Ответ 1

Согласно PEP20:

  • "Явный лучше, чем неявный".
  • "Простой лучше, чем сложный".

Зачастую код "make-it-just-work" принимает маршрут pyplot, поскольку он скрывает все управление фигурами и осями, о которых многие не заботятся. Это часто используется для кодирования интерактивного режима, простых одноразовых скриптов или построения графиков, выполняемых на сценариях высокого уровня.

Однако, если вы создаете библиотечный модуль, который должен выполнять построение графика, и у вас нет гарантии, что пользователь библиотеки не делает никаких дополнительных собственных графиков, тогда лучше всего быть явным и избегать интерфейса pyplot, Обычно я разрабатываю свои функции для принятия в качестве необязательных аргументов осей и/или фигурных объектов, на которые пользователь хотел бы работать (если не указан, то я использую plt.gcf() и/или plt.gca()).

Правило большого пальца, которое у меня есть, заключается в том, что если операция, которую я выполняю, может выполняться через pyplot, но если это так, скорее всего, изменит "конечный автомат", тогда я избежу pyplot. Обратите внимание, что любое действие с помощью pyplot (например, plt.xlim()) устанавливает/устанавливает текущие оси/фигуру/изображение ( "конечный автомат" ), а действия типа ax.set_xlim() не работают.

Ответ 2

'plt' - это просто ярлык, он полезен, когда у вас есть только 1 сюжет. Когда вы автоматически используете plt, matplotlib создает "фигуру" и подзаголовок, но если вы хотите работать с более чем 1 подзадачей, вам нужно будет использовать методы "оси", например:

fig = plt.figure()
a = fig.add_subplot(211)
b = fig.add_subplot(212)
print a.__class__ #<class 'matplotlib.axes.AxesSubplot'>
print fig.__class__ #<class 'matplotlib.figure.Figure'>
a.plot([0,1],[0,1],'r')
b.plot([1,0],[0,1],'b')
fig.show()

это невозможно сделать, используя 'plt' напрямую.