在Python for循环中,如何为绘图创建图例?
我已经成功地创建了一个由四个子图和两个子图组成的图形,其中两个子图具有双y轴特征,如下所示。每个子地块都有许多不同的地块。我想添加一个传奇。但是,我不能用代码来完成它。下图所示: 我的代码如下:在Python for循环中,如何为绘图创建图例?,python,python-3.x,matplotlib,Python,Python 3.x,Matplotlib,我已经成功地创建了一个由四个子图和两个子图组成的图形,其中两个子图具有双y轴特征,如下所示。每个子地块都有许多不同的地块。我想添加一个传奇。但是,我不能用代码来完成它。下图所示: 我的代码如下: fig, axs = plt.subplots(2,2,figsize=(17,10)) fig.legend(loc="center right", fontsize=13,fancybox=True, framealpha=1, shadow=True, borderpad=1) plt.
fig, axs = plt.subplots(2,2,figsize=(17,10))
fig.legend(loc="center right", fontsize=13,fancybox=True, framealpha=1, shadow=True, borderpad=1)
plt.rc('font',family='Times New Roman')
.
.
for i,j in zip(IV_start_index,IV_start_index[1:]): # This is simple code to access present and next element in a list
axs[0][0].plot(module_allData_df['Time'].iloc[mpp_index],pmpp_theo,'bs',label="Theoretical")
axs[0][0].plot(module_allData_df['Time'].iloc[mpp_index],pmpp_act,'rd',label="Actual")
.
.
plt.suptitle('A NIST Module %s power loss analysis'%(module_allData_df['Time'].loc[i].strftime('%Y-%m-%d')),fontsize=18) #
plt.savefig('All_day_power_loss')
输出为:
No handles with labels found to put in legend.
你能帮我更正代码吗
更正:
我确实更改了下面给出的代码
for i,j in zip(IV_start_index,IV_start_index[1:]): # This is simple code to access present and next element in a list
axs[0][0].plot(module_allData_df['Time'].iloc[mpp_index],pmpp_theo,'bs',label="Theoretical")
axs[0][0].plot(module_allData_df['Time'].iloc[mpp_index],pmpp_act,'rd',label="Actual")
axs[0][0].legend()
它创建了许多图例。输出图如下所示:
fig, axs = plt.subplots(2,2,figsize=(17,10))
fig.legend(loc="center right", fontsize=13,fancybox=True, framealpha=1, shadow=True, borderpad=1)
plt.rc('font',family='Times New Roman')
.
.
for i,j in zip(IV_start_index,IV_start_index[1:]): # This is simple code to access present and next element in a list
axs[0][0].plot(module_allData_df['Time'].iloc[mpp_index],pmpp_theo,'bs',label="Theoretical")
axs[0][0].plot(module_allData_df['Time'].iloc[mpp_index],pmpp_act,'rd',label="Actual")
.
.
plt.suptitle('A NIST Module %s power loss analysis'%(module_allData_df['Time'].loc[i].strftime('%Y-%m-%d')),fontsize=18) #
plt.savefig('All_day_power_loss')
legend()
函数中提供图例条目,则应将其放置在绘图命令中的标签
-条目之后。否则,图例
无法知道要列出什么axs[i][j].legend()
(或者调用axs[0][0].legend()
,axs[0][1].legend()
,…当然,对于每个子批次都要手动调用)。要点是:fig.legend()
是一个图形级别的图例,即所有子地块都有一个图例。这应该在循环外部调用一次经过一系列跟踪,我对代码执行了以下操作:
for i,j in zip(IV_start_index,IV_start_index[1:]): # This is simple code to access present and next element in a list
axs[0][0].plot(module_allData_df['Time'].iloc[mpp_index],pmpp_theo,'bs')
axs[0][0].plot(module_allData_df['Time'].iloc[mpp_index],pmpp_act,'rd')
axs[0][0].legend(['Theoretical','Actual'])
.
.
我的输出是:
No handles with labels found to put in legend.
我已经修改了代码,上面的问题给出了答案。但是,它创造了许多传奇。
axs[0][0]
是左上方的子地块。如果希望在另一个子批次中添加图例,则应更改索引,即axs[0][1]。图例()
将图例放置在下一个子批次中,依此类推。如果您反复调用同一子批次上的legend
,它会一次又一次地生成一个图例,导致条目过多。在我的上述问题中,我上传了添加axs[0][0]后获得的最新图形。legend()
。你注意到了吗,我的第一个子地块?见传说。当for
循环迭代时,它只重复了100次。有什么办法吗?我不知道你的循环迭代了什么,但是你应该为几个子地块使用绘图命令,否则所有子地块中都不会有任何绘图。对于图例,这是一样的,在每个子地块上调用图例,可以手动一个接一个地调用,也可以在循环中调用。如果这个循环重复100次,显然这对于legend是错误的…:-)此外,您的绘图方式似乎调用plot及其label关键字100次。这也将为每个绘图调用生成一个单独的图例条目。。。我们应该更仔细地了解数据的结构,以及绘图是否更有效,即调用plot
。否则,您必须以编程方式控制label关键字每100次迭代仅激活一次,即每个子批次…此链接具有解决方案。你必须给你的图例添加句柄。你把一个图例命令放在一个循环中,循环重复100次——这是不正确的。在上面的代码中,您还可以使用title generation和savefig将图形保存到同一循环中的文件中。您应该过度考虑代码的哪些部分属于哪个上下文-是否要将相同的标题和文件写入100次?可能不会。我想,这里的问题甚至更深一点:你分别绘制数据的每个点——这就是为什么你有这个循环。这是低效的。这种东西只需要一行或几行就可以做成。请以文本形式发布模块\u allData\u df.head()