Построение с помощью seaborn с использованием объектно-ориентированного интерфейса matplotlib

103

Я очень предпочитаю использовать matplotlibв стиле ООП:

f, axarr = plt.subplots(2, sharex=True)
axarr[0].plot(...)
axarr[1].plot(...)

Это упрощает отслеживание нескольких фигур и подзаголовков.

Вопрос: Как использовать морские корни таким образом? Или как изменить этот пример на стиль ООП? Как сказать seabornфункции рисования , как , lmplotкоторые Figureили Axesего участки , чтобы?

Ледяное пламя
источник
1
Связанный: эта проблема и этот ответ для возможного обходного пути, который позволил бы создать фигуру морского дна и позже переместить все оси в сетку подзаголовка.
ImportanceOfBeingErnest

Ответы:

229

Это немного зависит от того, какую функцию seaborn вы используете.

Функции построения графиков в seaborn можно разделить на два класса.

  • Функции «Топоры уровня», в том числе regplot, boxplot, kdeplotи многие другие
  • Функции «Рисунок на уровне», в том числе lmplot, factorplot, jointplotи один или два других

Первая группа идентифицируется путем принятия явного axаргумента и возврата Axesобъекта. Как следует из этого, вы можете использовать их в «объектно-ориентированном» стиле, передав им свой Axes:

f, (ax1, ax2) = plt.subplots(2)
sns.regplot(x, y, ax=ax1)
sns.kdeplot(x, ax=ax2)

Функции уровня осей будут рисовать только на Axesфигуре и в противном случае не будут вмешиваться в фигуру, поэтому они могут прекрасно сосуществовать в объектно-ориентированном скрипте matplotlib.

Вторая группа функций (уровень рисунка) отличается тем, что результирующий график потенциально может включать несколько осей, которые всегда организованы «осмысленным» образом. Это означает, что функции должны иметь полный контроль над фигурой, поэтому невозможно нанести, скажем, график lmplotна уже существующий. Вызов функции всегда инициализирует фигуру и настраивает ее для конкретного графика, который она рисует.

Однако, как только вы позвоните lmplot, он вернет объект типа FacetGrid. У этого объекта есть несколько методов для работы с результирующим графиком, которые немного знают о структуре графика. Он также раскрывает , лежащие в основе фигуры и множество осей по поводу FacetGrid.figи FacetGrid.axesаргументов. jointplotФункция очень похожа, но она использует JointGridобъект. Таким образом, вы по-прежнему можете использовать эти функции в объектно-ориентированном контексте, но все ваши настройки должны выполняться после того, как вы вызвали функцию.

Мваском
источник
Это было действительно полезно. Взгляните на мой ответ здесь: stackoverflow.com/questions/27019079/…
denson