我正在绘制两个图形,每个图形都有多个子图。我需要在一个循环中执行此操作。当我只有一个数字时,这是我的工作:

fig, ax = plt.subplots(nrows=6,ncols=6,figsize=(20, 20))
fig.subplots_adjust(hspace=.5,wspace=0.4)
plt.subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=None, hspace=None)

for x in range(1,32):
    plt.subplot(6,6,x)
    plt.title('day='+str(x))
    plt.scatter(x1,y1)
    plt.scatter(x2,y2)
    plt.colorbar().set_label('Distance from ocean',rotation=270)
plt.savefig('Plots/everyday_D color.png')
plt.close()


现在我知道,当您有多个数字时,您需要执行以下操作:

fig1, ax1 = plt.subplots()
fig2, ax2 = plt.subplots()


但是我不知道如何在循环中绘制,每个子图都在它的位置(因为如果有两个数字,您将无法继续执行plt.scatter)。请具体说明我需要做什么(关于它是否是fig1.scatter,ax1.scatter,fig.subplots_adjust,...以及最后的保存和关闭方式)

最佳答案

每个pyplot函数在面向对象的API中都有其对应的方法。如果您确实想同时在两个图形的轴上循环,则如下所示:

import numpy as np
import matplotlib.pyplot as plt

x1 = x2 = np.arange(10)
y1 = y2 = c = np.random.rand(10,6)

fig1, axes1 = plt.subplots(nrows=2,ncols=3)
fig1.subplots_adjust(hspace=.5,wspace=0.4)

fig2, axes2 = plt.subplots(nrows=2,ncols=3)
fig2.subplots_adjust(hspace=.5,wspace=0.4)

for i, (ax1,ax2) in enumerate(zip(axes1.flatten(), axes2.flatten())):
    ax1.set_title('day='+str(i))
    ax2.set_title('day='+str(i))
    sc1 = ax1.scatter(x1,y1[:,i], c=c[:,i])
    sc2 = ax2.scatter(x2,y2[:,i], c=c[:,i])
    fig1.colorbar(sc1, ax=ax1)
    fig2.colorbar(sc2, ax=ax2)

plt.savefig("plot.png")
plt.show()
plt.close()


在这里,您遍历两个展平的轴数组,例如ax1ax2是要绘制到的matplotlib axesfig1fig2是matplotlib数字(matplotlib.figure.Figure)。

为了同样获得索引,使用了enumerate。所以线

for i, (ax1,ax2) in enumerate(zip(axes1.flatten(), axes2.flatten())):
    # loop code


在这里相当于

for i in range(6):
    ax1 = axes1.flatten()[i]
    ax2 = axes2.flatten()[i]
    # loop code


要么

i = 0
for ax1,ax2 in zip(axes1.flatten(), axes2.flatten()):
    # loop code
    i += 1


两者都更长。

在这一点上,您可能会对以下事实感兴趣:尽管上述使用面向对象的API的解决方案肯定更通用且更可取,但仍然可以使用纯pyplot解决方案。这看起来像

import numpy as np
import matplotlib.pyplot as plt

x1 = x2 = np.arange(10)
y1 = y2 = c = np.random.rand(10,6)

plt.figure(1)
plt.subplots_adjust(hspace=.5,wspace=0.4)

plt.figure(2)
plt.subplots_adjust(hspace=.5,wspace=0.4)

for i in range(6):
    plt.figure(1)
    plt.subplot(2,3,i+1)
    sc1 = plt.scatter(x1,y1[:,i], c=c[:,i])
    plt.colorbar(sc1)

    plt.figure(2)
    plt.subplot(2,3,i+1)
    sc2 = plt.scatter(x1,y1[:,i], c=c[:,i])
    plt.colorbar(sc2)

plt.savefig("plot.png")
plt.show()
plt.close()

07-24 16:47