我有变量x
和y
def function(a,b):
x = x[(x>a)*(x<b)]
y = y[(y<a)*(y>b)]
# perform some fitting routine using curve_fit on x and y
fig = plt.figure()
ax = fig.add_subplot(111)
phist,xedge,yedge,img = ax.hist2d(x,y,bins=20,norm=LogNorm())
im = ax.imshow(phist,cmap=plt.cm.jet,norm=LogNorm(),aspect='auto')
fig.colorbar(im,ax=ax)
fig.show()
一切正常。但我有6对不同的输入参数a
和b
。我想以某种方式使用循环调用function(a,b)
并将六个不同的x
和y
(对应于6个输入对)绘制为6个子图。< / strong>
ax1 = fig.add_subplot(231) # x vs y for a1,b1
ax2 = fig.add_subplot(232) # x vs y for a2,b2
....
ax6 = fig.add_subplot(236) # x vs y for a6,b6
我想知道如何进行最终的子情节!
我知道可以通过为第一个输入对x1
和y1
指定不同的变量来手动完成,例如a
和b
,以此类推6对(x2,y2...,x6,y6)
。但这将是一个非常冗长和令人困惑的代码。
答案 0 :(得分:2)
使用plt.subplots
代替plt.subplot
(请注意末尾的“s”)。 fig, axs = plt.subplots(2, 3)
将创建一个包含2x3子图组的图形,其中fig
是图形,axs
是2x3 numpy数组,其中每个元素是与轴对应的轴对象图中的位置(所以axs[1, 2]
是右下轴)。
然后,您可以使用一对循环遍历每一行,然后遍历该行中的每个轴:
fig, axs = plt.subplots(2, 3)
for i, row in enumerate(axs):
for j, ax in enumerate(row):
ax.imshow(foo[i, j])
fig.show()
或者您可以使用ravel
展平行以及您想要获取数据的任何内容:
fig, axs = plt.subplots(2, 3)
foor = foo.ravel()
for i, ax in enumerate(axs.ravel()):
ax.imshow(foor[i])
fig.show()
请注意ravel
是一个视图,而不是副本,因此不会占用任何额外的内存。
答案 1 :(得分:1)
关键是使用子图的三参数形式:
import matplotlib.pyplot as plt
# Build a list of pairs for a, b
ab = zip(range(6), range(6))
#iterate through them
for i, (a, b) in enumerate(ab):
plt.subplot(2, 3, i+1)
#function(a, b)
plt.plot(a, b)
plt.show()
你只需要从函数中调用figure
。