Reputation: 23
I'm new to python and I am trying to create a series of subplots with the only parameter changing being the fill_between parameter for each plot. Currently I repeat the whole code and change the fill_between for each subplot. Is there a more efficient way of creating a loop for the subplots where the only thing that changes is the fill_between? Below is an example of the type of plots I am trying to produce.
import numpy as np
import matplotlib.pyplot as plt
#data
data1 = [11,20,25,80]
data2 = [15,35,50,90]
data3 =[25,36,58,63]
data4=[30,40,68,78]
element = np.arange(4)
fig = plt.figure()
#first plot
ax1 = fig.add_subplot(2,2,1)
phase1 = ax1.plot(data1,color='blue', lw=2)
phase2 = ax1.plot(data2,color='blue', lw=2)
phase3 = ax1.plot(data3,color='green', lw=2)
phase4 = ax1.plot(data4,color='green', lw=2)
plt.xticks(element,('La','Ce','Pr','Nd'))
ax1.fill_between(element,data1,data2,color='grey')
ax1.set_yscale('log')
fig.set_size_inches(10,5)
#second plot
ax2 = fig.add_subplot(2,2,2,sharex=ax1,sharey=ax1)
phase1 = ax2.plot(data1,color='blue', lw=2)
phase2 = ax2.plot(data2,color='blue', lw=2)
phase3 = ax2.plot(data3,color='green', lw=2)
phase4 = ax2.plot(data4,color='green', lw=2)
plt.xticks(element,('La','Ce','Pr','Nd'))
#the fill is the ONLY thing to change
ax2.fill_between(element,data3,data4,color='red')
ax2.set_yscale('log')
plt.show()
Upvotes: 2
Views: 1165
Reputation: 3363
I hope this helps
import numpy as np
import matplotlib.pyplot as plt
#data
data1 = [11,20,25,80]
data2 = [15,35,50,90]
data3 = [25,36,58,63]
data4 = [30,40,68,78]
element = np.arange(4)
# data is used to automatize the fill_between argument
data = [[data1,data2],[data3,data4]]
# creating an list of the colors used
cols = ['grey','red']
# creating the figure including all axes
fig,ax = plt.subplots(1,2)
for i,a in enumerate(ax):
phase1 = a.plot(data1,color='blue', lw=2)
phase2 = a.plot(data2,color='blue', lw=2)
phase3 = a.plot(data3,color='green', lw=2)
phase4 = a.plot(data4,color='green', lw=2)
a.set_xticks(element)
a.set_xticklabels(['La','Ce','Pr','Nd'])
a.fill_between(element,data[i][0],data[i][1],color=cols[i])
a.set_yscale('log')
fig.set_size_inches(10,5)
Upvotes: 3