So I'm trying to create a 3x3 box of 9 graphs, and while I've managed to do it by manually writing the code for each individual box, I want to learn how to do it using a loop. I can't seem to figure it out. Currently, I'm using the following:
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)
And so on and so forth, until ax9.
What I've tried to do is the following:
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)
Because I want to take ax(k) in a loop and run all nine iterations at once. But obviously this isn't the way to do it, or just doesn't work. Is it possible to take ax_ and iterate it from 1 to 9 in a loop while calling it?
An easy way to iterate over many subplots is to create them via
fig, axes = plt.subplots(nrows=n, ncols=m)
axes
is then an array of n
rows and m
columns. One could then iterate over the rows and columns independently, or over the flattened version of the axes array.
The latter is shown in this example:
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()
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()
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With