Matplotlib.pyplot против matplotlib.pylab

Обычно я использую следующий пакет для создания моих графиков: matplotlib.pylab. Однако есть также пакет под названием matplotlib.pyplot.

Я не смог определить разницу между ними при их использовании. Поэтому мой вопрос следующий:

В чем разница между пакетами matplotlib.pylab и matplotlib.pyplot. В каких случаях вы могли бы советовать друг другу?

Ответы

Ответ 1

Per FAQ:

Pyplot предоставляет интерфейс state-machine для основного построения библиотека в matplotlib. Это означает, что цифры и оси неявно и автоматически создается для достижения желаемого участка....

Pylab объединяет функциональность pyplot (для построения) с numpy функциональность (для математики и для работы с массивами) в единое пространство имен, что делает пространство имен (или среду) еще более MATLAB типа. Например, можно назвать функции sin и cos только как вы могли бы в MATLAB, а также иметь все возможности pyplot.

Интерфейс pyplot обычно предпочтительнее для неинтерактивных (т.е. сценариев). Интерфейс pylab удобен для интерактивные вычисления и построение графика, поскольку это сводит к минимуму типизацию. (мой акцент.)

Обратите внимание, что

from pylab import *

также выполняет

from numpy import *

Это перезаписывает многие встроенные функции Python, такие как:

In [5]: import __builtin__
In [6]: import numpy as np

In [5]: {name for name in set(dir(np)).intersection(dir(__builtin__)) if not name.startswith('__') and getattr(__builtin__, name) != getattr(np, name)}
Out[5]: {'abs', 'all', 'any', 'max', 'min', 'round', 'sum'}

Поэтому мне не нравится from pylab import * (или действительно from module import * для любого модуля), потому что он приводит к тому, что известные любимые имена Python ведут себя неожиданным образом (если вы не всегда помните, что from numpy import * имеет загрязнено глобальное пространство имен.)

Например,

In [32]: np.all([np.arange(3), np.arange(3)])
Out[32]: False

а

In [33]: all([np.arange(3), np.arange(3)])
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()