绘图时避免嵌套 for 循环

问题描述 投票:0回答:1

我目前正在保存 2 个数字,每个数字有 10 个基于变量的线图。结果是一个嵌套的 for 循环。该代码效率极其低下,尽管我相信有更好的方法可以做到这一点,但我一直找不到有效的方法。

代码应该是不言自明的,见下文。


    fig1, ax1 = plt.subplots()
    
    nml_Stress = [8, 15]
    
    nml_Plots = [[(2, "016"), (7, "032"), (8, "034"), (9, "036"), (10, "039"), (11, "040"), (12, "041"),
                (36, "086"), (37, "087"), (51, "118")],
                [(13, "042"), (14, "043"), (21, "056"), (22, "057"), (23, "058"), (42, "096"),
                (45, "103"), (46, "105"), (47, "107"), (52, "119")]]
    
    for i in range(len(nml_Stress)):
        for j in range(len(nml_Plots[i])):
            ax1.plot(BP_Dis_All[nml_Plots[i][j][0]], BP_Shear_All[nml_Plots[i][j][0]], label=nml_Plots[i][j][1])
    
        ax1.set_title("{} MPa".format(nml_Stress[i]))
        fig1.savefig('FracturePlots/{} MPa.png'.format(nml_Stress[i]))
        plt.cla()

为了重现绘图函数,我使用以下内容作为 for 循环:


    for i in range(len(nml_Stress)):
        for j in range(len(nml_Plots[i])):
            print(nml_Plots[i][j][0])
            print(nml_Plots[i][j][1])

我已经按照谷歌尝试使用map函数、列表理解和itertools函数,但没有成功。

python matplotlib nested-loops
1个回答
0
投票

真正引人注目的是你的循环根本不是Pythonic的。您不需要跟踪索引,

zip
相应的集合,并直接迭代集合

for stress, plot in zip(nml_Stress, nml_Plots):

    # unpack values from plot here
    for pltx, plty in plot:
        bpx, bpy = BP_Dis_All[pltx], BP_Shear_All[pltx]

        ax1.plot(bpx, bpy, label=plty)

    # use f-strings rather than str.format
    ax1.set_title(f"{stress} MPa")

    fig1.savefig(f'FracturePlots/{stress} MPa.png', format='png', dpi=300)
    plt.cla()

与实际将绘图保存到文件相比,这些优化只是小事一桩。程序花费的大部分时间主要花在渲染数据和写入文件上,除非减少正在使用的数据量,否则无法真正优化。

© www.soinside.com 2019 - 2024. All rights reserved.