переключаться между объектами фигуры в matplotlib - менять активную фигуру - PullRequest
2 голосов
/ 03 апреля 2019

Предположим, мы создаем две фигуры, которые нам нужно заполнить в цикле.Вот игрушечный пример (который не работает):

import matplotlib.pyplot as plt
import numpy as np

fig,ax = plt.subplots(2,2)
fig1,ax1 = plt.subplots(2,2)

for i in np.arange(4):
    ax = plt.subplot(2, 2, i+1)
    sns.distplot(np.random.normal(0,1,[1,100]), ax=ax)
    ax1 = plt.subplot(2, 2, i+1)
    sns.distplot(np.random.normal(-1,1,[1,100]),color='r', ax=ax1)

Это не работает, так как ax = plt.subplot(25, 4, i+1) будет просто ссылаться на последнюю созданную фигуру (fig1), которая в настоящее время активна, и ax1 = plt.subplot(25, 4, i+1) будетпросто создайте другой объект, относящийся к той же позиции, что приведет к созданию двух графиков в одной и той же позиции.
Итак, как мне изменить активную фигуру?
Я посмотрел на этот вопрос но мне не удалось заставить его работать для моего случая.

Токовый выход

Код приводит к пустому fig

fig

и отображает все в fig1

fig1

Желаемый вывод

Вот как это должновести себя:

fig

fig2

fig1

fig3

Ответы [ 2 ]

3 голосов
/ 03 апреля 2019

Я бы использовал flatten:

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

fig,ax = plt.subplots(2,2)
ax = ax.flatten()
fig1,ax1 = plt.subplots(2,2)
ax1 = ax1.flatten()

for i in np.arange(4):
    sns.distplot(np.random.normal(0,1,[1,100]), ax=ax[i])
    sns.distplot(np.random.normal(-1,1,[1,100]),color='r', ax=ax1[i])
1 голос
/ 03 апреля 2019

Пара указателей:

  1. Вы уже определяете массив осей 2x2 в ax и ax1 соответственно. Вам не нужно снова создавать подзаговоры внутри цикла.

  2. Вы можете просто сгладить массив 2X2 и перебрать его как массив.

  3. Вы можете добавить соответствующие оси (ax или ax1) после выравнивания их в sns.distplot как ось (ax = flat_ax [i] ИЛИ ax = flat_ax1 [i])

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

fig,ax = plt.subplots(2,2)
fig1,ax1 = plt.subplots(2,2)

#Flatten the n-dim array of ax and ax1
flat_ax = np.ravel(ax)
flat_ax1 = np.ravel(ax1)

#Iterate over them
for i in np.arange(4):
    sns.distplot(np.random.normal(0,1,[1,100]), ax=flat_ax[i])
    sns.distplot(np.random.normal(-1,1,[1,100]),color='r', ax=flat_ax1[i])
...