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

时间:2019-04-03 12:28:42

标签: python matplotlib 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

fig

并绘制fig1

中的所有内容

fig1

所需的输出

这是它的行为方式:

fig

fig2

fig1

fig3

2 个答案:

答案 0 :(得分:3)

我会使用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 :(得分:1)

指针对:

  1. 您已经在ax和ax1中分别定义了2x2的轴数组。您无需在循环内再次进行子图绘制。

  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])