Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python for循环中,如何为绘图创建图例?_Python_Python 3.x_Matplotlib - Fatal编程技术网

在Python for循环中,如何为绘图创建图例?

在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.

我已经成功地创建了一个由四个子图和两个子图组成的图形,其中两个子图具有双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.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()