2017-03-16 15 views
1

因此,我試圖創建一個9x3的盒子,並且通過手動編寫每個盒子的代碼來實現它,但是我想學習如何使用循環做到這一點。我似乎無法弄清楚。目前,我使用以下內容:如何在Python中運行子圖的智能循環

from matplotlib import gridspec 

f, ((ax1, ax2, ax3), (ax4, ax5, ax6), (ax7, ax8, ax9)) = plt.subplots(3, 3, sharex='col', sharey='row') 

gs = gridspec.GridSpec(3, 3) 
fig = plt.figure(figsize=(20,20)) 

fig.text(0.5, .95, 'Constant Slope for [O/Fe]/[Fe/H] for Various R and Z', ha='center', va='center', size = 50) 
fig.text(0.5, 0.08, '[Fe/H]', ha='center', va='center', size = 60) 
fig.text(0.09, 0.5, '[O/Fe]', ha='center', va='center', rotation='vertical', size = 60) 

ax1 = plt.subplot(gs[0]) 
histogram1 = ax1.hist2d(fehsc, ofesc, bins=nbins, range=[[-1,.5],[0.2,0.4]]) 
counts = histogram1[0] 
xpos = histogram1[1] 
ypos = histogram1[2] 
image = histogram1[3] 
newcounts = counts #we're going to iterate over this 

for i in range (nbins): 
    xin = xpos[i] 
    yin = ypos 
    yline = m*xin + b 
    reset = np.where(yin < yline) #anything less than yline we want to be 0 
    #index = index[0:len(index)-1] 
    countout = counts[i] 
    countout[reset] = 0 
    newcounts[i] = countout 
ax1.plot(xarr2, yarr2, color='w', linewidth='5', alpha = 0.3) 
ax1.plot(xarr, yarr, color='r') 
ax1.set_title('R in [5,7] kpc | Z in [1,2] kpc', size = 20) 

ax2 = plt.subplot(gs[1]) 
histogram2 = ax2.hist2d(fehsc2, ofesc2, bins=nbins, range=[[-1,.5],[0.2,0.4]]) 
counts = histogram2[0] 
xpos = histogram2[1] 
ypos = histogram2[2] 
image = histogram2[3] 
newcounts = counts #we're going to iterate over this 

for i in range (nbins): 
    xin = xpos[i] 
    yin = ypos 
    yline = m*xin + b 
    reset = np.where(yin < yline) #anything less than yline we want to be 0 
    #index = index[0:len(index)-1] 
    countout = counts[i] 
    countout[reset] = 0 
    newcounts[i] = countout 
ax2.plot(xarr2, yarr2, color='w', linewidth='5', alpha = 0.3) 
ax2.plot(xarr, yarr, color='r') 
ax2.set_title('R in [7,9] kpc | Z in [1,2] kpc', size = 20) 

依此類推,直到ax9。

什麼我試圖做的是以下幾點:

for k in range(1,10): 
    ax[k] = plt.subplot(gs[0]) 
    histogram1 = ax[k].hist2d(fehsc, ofesc, bins=nbins, range=[[-1,.5],[0.2,0.4]]) 
    counts = histogram1[0] 
    xpos = histogram1[1] 
    ypos = histogram1[2] 
    image = histogram1[3] 
    newcounts = counts #we're going to iterate over this 

    for i in range (nbins): 
     xin = xpos[i] 
     yin = ypos 
     yline = m*xin + b 
     reset = np.where(yin < yline) #anything less than yline we want to be 0 
     countout = counts[i] 
     countout[reset] = 0 
     newcounts[i] = countout 
    ax[k].plot(xarr2, yarr2, color='w', linewidth='5', alpha = 0.3) 
    ax[k].plot(xarr, yarr, color='r') 
    ax[k].set_title('R in [5,7] kpc | Z in [1,2] kpc', size = 20) 

因爲我想在一個循環AX(k)和同時運行所有九個迭代。但顯然這不是做到這一點的方法,或者只是不起作用。調用它時,是否有可能在循環中將ax_和iteration從1到9?

回答

6

一種簡單的方法來遍歷的次要情節是經由

fig, axes = plt.subplots(nrows=n, ncols=m) 

axes創建它們是隨後的n行和m列的陣列。然後可以單獨遍歷行和列,或者遍歷平面軸數組的版本。

後者被示出在這個例子中:

import matplotlib.pyplot as plt 
import numpy as np 

x = np.arange(11) 
y = np.random.rand(len(x), 9)*10 

fig, axes = plt.subplots(3,3, sharex=True, sharey=True) 

for i, ax in enumerate(axes.flatten()): 
    ax.bar(x, y[:,i], color=plt.cm.Paired(i/10.)) 

plt.show() 

enter image description here

1
import numpy as np 
import matplotlib.pyplot as plt 

# made some data for you. 
# xx and yy is list of numpy arrays. in your case it will [fehsc1, fehsc3, ...fehsc9] and [ofesc1, ofesc2...ofesc9] 
xx = [np.random.randn(100000) for i in range(9)] 
yy = [np.random.randn(100000) + 5 for i in range(9)] 
nbins = 40 
m = 1 
b = 0.5 

f, ax = plt.subplots(3, 3, sharex='col', sharey='row') 
# because ax = [[ax0,ax1,ax2],[ax3,ax4,ax5],[ax7,ax8,ax9]], ie list of lists we have unravel it 

axr = ax.ravel() 
# now axr = [ax0,ax1,ax2,ax3,ax4,ax5,ax7,ax8,ax9] 

fig = plt.figure(figsize=(20,20)) 

for i in range(len(xx)): 
    histogram1 = axr[i].hist2d(xx[i], yy[i], bins=nbins) 
    counts = histogram1[0] 
    xpos = histogram1[1] 
    ypos = histogram1[2] 
    image = histogram1[3] 
    newcounts = counts #we're going to iterate over this 

    for k in range (nbins): 
     xin = xpos[k] 
     yin = ypos 
     yline = m*xin + b 
     reset = np.where(yin < yline) #anything less than yline we want to be 0 
     #index = index[0:len(index)-1] 
     countout = counts[k] 
     countout[reset] = 0 
     newcounts[k] = countout 
    #axr[i].plot(xarr2, yarr2, color='w', linewidth='5', alpha = 0.3) 
plt.show()