嵌套循环导致不需要的重复数字
nested loops resulting in unwanted repeated figures
我知道以前有人问过这个问题,但我不知道如何表达我的问题才能找到我要找的东西。我对编码还很陌生,正在尝试使用嵌套的 for 循环生成图。我打算创建 4 个图,但每个图都创建了 4 次,总共有 16 个数字。重复的原因是什么?
我已经检查过 plotting multiple plots generated inside a for loop on the same axes python 但这无关紧要。
这是我的代码:
###(this is sample data in case you are trying to recreate the code)
df24avg=pd.dataframe({'pm10_3135_2018':[30,34,32,44,45,46,59,54,59,30],
'nox_3135(ppb)':[20,29,27,31,33,14,34,23,32,31],
'CO_3135(ppm)':[0.8,0.9,0.1,0.2,0.5,0.5,0.7,0.9,0,9,0.3],
'O3_mda8_3135':[42,45,47,51,52,52,57,67,65,70],
'pm25_3135_2018':[6,7,6,7,4,5,2,11,9,18]})
x = [df24avg.pm10_3135_2018,df24avg['nox_3135(ppb)'],df24avg['CO_3135(ppm)'],df24avg.O3_mda8_3135]
y = df24avg.pm25_3135_2018
xlab = ["PM10 (ug/m^3)", "NOx (ppb)", "CO (ppm)", "O3 MDA8 (ppb)"]
for xcol in x:
for lab in xlab:
fig, ax = plt.subplots()
ax = plt.gca()
ax.plot(xcol, y, color='xkcd:red',linestyle='None',marker='o')
ax.set_xlabel(lab,fontsize=15)
ax.set_ylabel('PM2.5 (ug/m^3)',fontsize=15)
ax.set_ylim(0,)
ax.set_xlim(0,)
#ax.set_title("{} vs {}".format(x1, ylab))
#ax.legend(fontsize='medium', loc='lower right')
fig.tight_layout()
我还想用我选择的不同名称保存每个图形,但不确定如何在不创建第三个循环的情况下在循环中执行此操作。我也不反对创建另一个循环,只是想避免这个数字重复的问题。谢谢!
如果我没理解错的话,你需要一个循环 zip
:
for xcol, lab in zip(x, xlab):
fig, ax = plt.subplots()
ax.plot(xcol, y, color='xkcd:red',linestyle='None',marker='o')
ax = plt.gca()
应删除,因为 ax
已在 subplots
调用中确定。
如果您有每个绘图的唯一文件名列表,只需将其添加到 zip
:
fnames = ['foo.png', 'bar.png', 'baz.png', 'grr.png']
for xcol, lab, fname in zip(x, xlab, fnames):
...
plt.savefig(fname)
您可以使用 range(len())
函数而不是直接使用值。
for i in range(len(x)):
# for lab in xlab: # you don't need this line
fig, ax = plt.subplots()
ax = plt.gca()
ax.plot(x[i], y, color='xkcd:red',linestyle='None',marker='o') # Modified with index
ax.set_xlabel(xlab[i],fontsize=15) # Also used index
ax.set_ylabel('PM2.5 (ug/m^3)',fontsize=15)
ax.set_ylim(0,)
ax.set_xlim(0,)
#ax.set_title("{} vs {}".format(x1, ylab))
#ax.legend(fontsize='medium', loc='lower right')
fig.tight_layout()
我知道以前有人问过这个问题,但我不知道如何表达我的问题才能找到我要找的东西。我对编码还很陌生,正在尝试使用嵌套的 for 循环生成图。我打算创建 4 个图,但每个图都创建了 4 次,总共有 16 个数字。重复的原因是什么?
我已经检查过 plotting multiple plots generated inside a for loop on the same axes python 但这无关紧要。
这是我的代码:
###(this is sample data in case you are trying to recreate the code)
df24avg=pd.dataframe({'pm10_3135_2018':[30,34,32,44,45,46,59,54,59,30],
'nox_3135(ppb)':[20,29,27,31,33,14,34,23,32,31],
'CO_3135(ppm)':[0.8,0.9,0.1,0.2,0.5,0.5,0.7,0.9,0,9,0.3],
'O3_mda8_3135':[42,45,47,51,52,52,57,67,65,70],
'pm25_3135_2018':[6,7,6,7,4,5,2,11,9,18]})
x = [df24avg.pm10_3135_2018,df24avg['nox_3135(ppb)'],df24avg['CO_3135(ppm)'],df24avg.O3_mda8_3135]
y = df24avg.pm25_3135_2018
xlab = ["PM10 (ug/m^3)", "NOx (ppb)", "CO (ppm)", "O3 MDA8 (ppb)"]
for xcol in x:
for lab in xlab:
fig, ax = plt.subplots()
ax = plt.gca()
ax.plot(xcol, y, color='xkcd:red',linestyle='None',marker='o')
ax.set_xlabel(lab,fontsize=15)
ax.set_ylabel('PM2.5 (ug/m^3)',fontsize=15)
ax.set_ylim(0,)
ax.set_xlim(0,)
#ax.set_title("{} vs {}".format(x1, ylab))
#ax.legend(fontsize='medium', loc='lower right')
fig.tight_layout()
我还想用我选择的不同名称保存每个图形,但不确定如何在不创建第三个循环的情况下在循环中执行此操作。我也不反对创建另一个循环,只是想避免这个数字重复的问题。谢谢!
如果我没理解错的话,你需要一个循环 zip
:
for xcol, lab in zip(x, xlab):
fig, ax = plt.subplots()
ax.plot(xcol, y, color='xkcd:red',linestyle='None',marker='o')
ax = plt.gca()
应删除,因为 ax
已在 subplots
调用中确定。
如果您有每个绘图的唯一文件名列表,只需将其添加到 zip
:
fnames = ['foo.png', 'bar.png', 'baz.png', 'grr.png']
for xcol, lab, fname in zip(x, xlab, fnames):
...
plt.savefig(fname)
您可以使用 range(len())
函数而不是直接使用值。
for i in range(len(x)):
# for lab in xlab: # you don't need this line
fig, ax = plt.subplots()
ax = plt.gca()
ax.plot(x[i], y, color='xkcd:red',linestyle='None',marker='o') # Modified with index
ax.set_xlabel(xlab[i],fontsize=15) # Also used index
ax.set_ylabel('PM2.5 (ug/m^3)',fontsize=15)
ax.set_ylim(0,)
ax.set_xlim(0,)
#ax.set_title("{} vs {}".format(x1, ylab))
#ax.legend(fontsize='medium', loc='lower right')
fig.tight_layout()