在 matplotlib 中的图形对象之间切换 - 更改活动图形

switch between figure objects in matplotlib - change the active figure

假设我们正在创建两个需要在循环中填写的图形。 这是一个玩具示例(不起作用):

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) 将简单地创建另一个引用相同位置的对象,这将导致在同一位置生成两个地块。
那么,如何更改活动人物?
我看过这个 question,但没能让它适用于我的情况。

当前输出

代码生成一个空 fig

它绘制了 fig1

中的所有内容

期望的输出

它应该是这样的:

fig

fig1

一些建议:

  1. 您已经分别在 ax 和 ax1 中定义了一个 2x2 轴数组。你不需要在循环内再次制作子图。

  2. 您可以简单地展平 2X2 数组并将其作为数组进行迭代。

  3. 您可以在将它们展平到 sns.distplot 之后添加相应的轴(ax 或 ax1)作为轴(ax = flat_ax[i] OR 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])

我会用 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])