for 循环中的 Matplotlib 子图
Matplotlib subplots inside a for loop
我有一个函数,它接受 3 个数组和一个常数值作为输入。
在函数内部,我给出了 10 个不同的数组和条件,并尝试将它们绘制在 10 个不同的子图中。
def ra_vs_dec(alpha,delta,zphot,mlim):
zmin = [0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0,1.1,1.2]
zmax = [0.4,0.5,0.6,0.7,0.8,0.9,1.0,1.1,1.2,1.3]
plot_no = [1,2,3,4,5,6,7,8,9,10] # THESE ARE THE SUBPLOT NUMBERS
for a,b,c in zip(zmin,zmax,plot_no):
ra = alpha[(data_m200>mlim)*(data_z>a)*(data_z<b)] # RA FOR ZCOSMO
dec = delta[(data_m200>mlim)*(data_z>a)*(data_z<b)] # DEC FOR ZCOSMO
ra_zphot = alpha[(data_m200>mlim)*(zphot>a)*(zphot<b)] # RA FOR ZPHOT
dec_zphot = delta[(data_m200>mlim)*(zphot>a)*(zphot<b)] # DEC FOR ZPHOT
fig = plt.figure()
ax = fig.add_subplot(2,5,c)
ax.scatter(ra,dec,color='red',s=5.0,label=''+str(a)+'<zcosmo<'+str(b)+'')
ax.scatter(ra_zphot,dec_zphot,color='blue',s=5.0,label=''+str(a)+'<zphot<'+str(b)+'')
ax.legend(loc='best',scatterpoints=2)
fig.show()
但是,当我 运行 上面的代码时,我只得到最后的子图,即第 10 个子图。我在这里做错了什么?
我想看所有 10 个子图。
将图形的创建移到循环之外。通过将其置于循环中,您将创建 10 个独立的图形,然后仅向每个图形添加一个子图。当您随后使用 fig.show()
时,它只会向您显示在最后一次迭代中创建的图形。
fig = plt.figure()
for a,b,c in zip(zmin,zmax,plot_no):
ra = alpha[(data_m200>mlim)*(data_z>a)*(data_z<b)] # RA FOR ZCOSMO
dec = delta[(data_m200>mlim)*(data_z>a)*(data_z<b)] # DEC FOR ZCOSMO
ra_zphot = alpha[(data_m200>mlim)*(zphot>a)*(zphot<b)] # RA FOR ZPHOT
dec_zphot = delta[(data_m200>mlim)*(zphot>a)*(zphot<b)] # DEC FOR ZPHOT
ax = fig.add_subplot(2,5,c)
ax.scatter(ra,dec,color='red',s=5.0,label=''+str(a)+'<zcosmo<'+str(b)+'')
ax.scatter(ra_zphot,dec_zphot,color='blue',s=5.0,label=''+str(a)+'<zphot<'+str(b)+'')
ax.legend(loc='best',scatterpoints=2)
fig.show()
我有一个函数,它接受 3 个数组和一个常数值作为输入。
在函数内部,我给出了 10 个不同的数组和条件,并尝试将它们绘制在 10 个不同的子图中。
def ra_vs_dec(alpha,delta,zphot,mlim):
zmin = [0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0,1.1,1.2]
zmax = [0.4,0.5,0.6,0.7,0.8,0.9,1.0,1.1,1.2,1.3]
plot_no = [1,2,3,4,5,6,7,8,9,10] # THESE ARE THE SUBPLOT NUMBERS
for a,b,c in zip(zmin,zmax,plot_no):
ra = alpha[(data_m200>mlim)*(data_z>a)*(data_z<b)] # RA FOR ZCOSMO
dec = delta[(data_m200>mlim)*(data_z>a)*(data_z<b)] # DEC FOR ZCOSMO
ra_zphot = alpha[(data_m200>mlim)*(zphot>a)*(zphot<b)] # RA FOR ZPHOT
dec_zphot = delta[(data_m200>mlim)*(zphot>a)*(zphot<b)] # DEC FOR ZPHOT
fig = plt.figure()
ax = fig.add_subplot(2,5,c)
ax.scatter(ra,dec,color='red',s=5.0,label=''+str(a)+'<zcosmo<'+str(b)+'')
ax.scatter(ra_zphot,dec_zphot,color='blue',s=5.0,label=''+str(a)+'<zphot<'+str(b)+'')
ax.legend(loc='best',scatterpoints=2)
fig.show()
但是,当我 运行 上面的代码时,我只得到最后的子图,即第 10 个子图。我在这里做错了什么?
我想看所有 10 个子图。
将图形的创建移到循环之外。通过将其置于循环中,您将创建 10 个独立的图形,然后仅向每个图形添加一个子图。当您随后使用 fig.show()
时,它只会向您显示在最后一次迭代中创建的图形。
fig = plt.figure()
for a,b,c in zip(zmin,zmax,plot_no):
ra = alpha[(data_m200>mlim)*(data_z>a)*(data_z<b)] # RA FOR ZCOSMO
dec = delta[(data_m200>mlim)*(data_z>a)*(data_z<b)] # DEC FOR ZCOSMO
ra_zphot = alpha[(data_m200>mlim)*(zphot>a)*(zphot<b)] # RA FOR ZPHOT
dec_zphot = delta[(data_m200>mlim)*(zphot>a)*(zphot<b)] # DEC FOR ZPHOT
ax = fig.add_subplot(2,5,c)
ax.scatter(ra,dec,color='red',s=5.0,label=''+str(a)+'<zcosmo<'+str(b)+'')
ax.scatter(ra_zphot,dec_zphot,color='blue',s=5.0,label=''+str(a)+'<zphot<'+str(b)+'')
ax.legend(loc='best',scatterpoints=2)
fig.show()