代码之家  ›  专栏  ›  技术社区  ›  DarenW

为什么matplotlib中的图例在“savefig()”之后没有清除?

  •  2
  • DarenW  · 技术社区  · 6 年前

    我正在交互地使用python 3.6。如果我将下面的代码从一个文本文件粘贴到python命令行中,它可以在一行中多次正常工作。但是,在评论时 show() 并启用 pp.savefig(...) 行,每次我粘贴整个代码块时,图例都会重复几次“abc”。 怎么回事?有没有一种方法来清除传说,让它每次都重新开始?

    import matplotlib.pyplot as pp
    
    pp.title("Szekeres Polynomials")
    pp.legend([]) # clears the legend? no!
    pp.plot([1,2,3], [8,5,4], '-', label='xxxabc' )
    pp.legend(loc='best', shadow=True )
    #pp.show()
    pp.savefig('TMPxxx.eps', format='eps', dpi=600)
    
    2 回复  |  直到 6 年前
        1
  •  2
  •   Lorran Sutter    6 年前

    在这种情况下,你应该 close 在保存新图形之前绘制对象,以避免附加信息:

    import matplotlib.pyplot as pp
    
    pp.title("Szekeres Polynomials")
    pp.legend([]) # clears the legend? no.
    pp.plot([1,2,3], [8,5,4], '-', label='xxxabc' )
    pp.legend(loc='best', shadow=True )
    #pp.show()
    pp.savefig('TMPxxx.eps', format='eps', dpi=600)
    
    # Close last plot object 
    plt.close()
    

    参考文献:

    https://matplotlib.org/api/_as_gen/matplotlib.pyplot.close.html

        2
  •  1
  •   Raven Cheuk    6 年前

    就像@importanceofBeingernest对您的问题所做的评论一样,每次运行 pp.plot() 时,如果您没有指定要绘制的图形,它将在同一个图形上再绘制一条线。 为了避免这种歧义,您可能希望遵循@lorran sutter的建议,或者开始在matplotlib中使用对象,那么您的代码将变为:

    fig1=pp.figure()创建新图形
    ax1=图1.添加子批次(111)创建轴
    ax1.设置标题(“Szekeres多项式”)
    ax1.plot([1,2,3],[8,5,4],'-',label='xxxabc')
    ax1.legend(loc='best',shadow=true)
    图1.savefig('tmpxxx.eps',format='eps',dpi=600)
    

    这样可以确保每个新图形都位于新图形上,而不是位于上一个图形上。


    使用对象的好处

    以这种方式绘制图形不仅解决了您的问题,而且还允许您进行高级绘图并保存多个图形而不产生混淆。

    例如,当绘制三个图形时,每个图形内部包含多个子图:

    fig=pp.figure()创建第一个图形
    ax=图添加子批次(111)
    ax.set_title(“Szekeres多项式”)
    ax.plot([1,2,3],[8,5,4],'-',label='xxxabc')
    ax.legend(loc='best',shadow=true)
    Fig.saveFig('tmpxxx.eps',format='eps',dpi=600)
    
    图1=pp.figure()创建第二个图
    ax1=图1.添加子批次(121)
    ax1.设置标题(“Szekeres多项式”)
    ax1.plot([1,2,3],[8,5,4],'-',label='xxxabc')
    ax1.legend(loc='best',shadow=true)
    
    ax2=图1.添加子批次(122)
    ax2.设置标题(“第二个Szekeres多项式”)
    ax2.plot([3,9,10],[10,15,20],'-',label='xxx')
    ax2.图例(loc='best',shadow=true)
    图1.savefig('tmpxxx2.eps',format='eps',dpi=600)
    
    图2=pp.figure()创建第三个图形
    ax21=图2.添加子批次(131)
    ax21.设置标题(“hahah”)
    ax21.绘图([1,2,3],[1,2,3],'-',label='1',c='r')
    ax21.图例(loc='best',shadow=true)
    
    ax22=图2.添加子批次(132)
    ax22.设置标题(“heheh”)
    ax22.绘图([1,2,3],[-1,-2,-3],'-',label='2',c='b')
    ax22.图例(loc='best',shadow=true)
    
    ax23=图2.添加子批次(133)
    ax23.设置标题(“hohoho”)
    ax23.绘图([1,2,3],[2**2,4**2,6**2],'-',label='3',c='g')
    ax23.图例(loc='best',shadow=true)
    
    Fig2.saveFig('graph2.eps',format='eps',dpi=600)
    

    您可以轻松地调整每个单独子批次的参数并保存三个数字,而不会出现任何混淆。

    E你跑pp.plot()如果没有指定要绘制的图形,它将在同一个图形上再绘制一行。 为了避免这种模糊性,您可能希望遵循@lorran sutter的建议,或者开始在matplotlib中使用对象,那么您的代码将变为:

    fig1 = pp.figure() #Creating new figure
    ax1 = fig1.add_subplot(111) #Creating axis
    ax1.set_title("Szekeres Polynomials")
    ax1.plot([1,2,3], [8,5,4], '-', label='xxxabc' )
    ax1.legend(loc='best', shadow=True)
    fig1.savefig('TMPxxx.eps', format='eps', dpi=600)
    

    这样可以确保每个新图形都位于新图形上,而不是位于前一个图形上。


    使用对象的好处

    以这种方式绘制图形不仅解决了您的问题,而且还允许您进行高级绘图并保存多个图形而不产生混淆。

    例如,当绘制三个图形时,每个图形内部包含几个子图:

    fig = pp.figure() #Creating the first figure    
    ax = fig.add_subplot(111)
    ax.set_title("Szekeres Polynomials")
    ax.plot([1,2,3], [8,5,4], '-', label='xxxabc' )
    ax.legend(loc='best', shadow=True)
    fig.savefig('TMPxxx.eps', format='eps', dpi=600)
    
    fig1 = pp.figure() #Creating the second figure    
    ax1 = fig1.add_subplot(121)
    ax1.set_title("Szekeres Polynomials")
    ax1.plot([1,2,3], [8,5,4], '-', label='xxxabc' )
    ax1.legend(loc='best', shadow=True) 
    
    ax2 = fig1.add_subplot(122)
    ax2.set_title("Second Szekeres Polynomials")
    ax2.plot([3,9,10], [10,15,20], '-', label='xxx' )
    ax2.legend(loc='best', shadow=True)
    fig1.savefig('TMPxxx2.eps', format='eps', dpi=600)
    
    fig2 = pp.figure() #Creating the third figure    
    ax21 = fig2.add_subplot(131)
    ax21.set_title("hahah")
    ax21.plot([1,2,3], [1,2,3], '-', label='1', c='r')
    ax21.legend(loc='best', shadow=True)
    
    ax22 = fig2.add_subplot(132)
    ax22.set_title("heheh")
    ax22.plot([1,2,3], [-1,-2,-3], '-', label='2', c='b')
    ax22.legend(loc='best', shadow=True)
    
    ax23 = fig2.add_subplot(133)
    ax23.set_title("hohoho")
    ax23.plot([1,2,3], [2**2,4**2,6**2], '-', label='3', c='g' )
    ax23.legend(loc='best', shadow=True)
    
    fig2.savefig('graph2.eps', format='eps', dpi=600)
    

    enter image description here enter image description here enter image description here

    您可以轻松地调整每个单独子批次的参数并保存三个数字,而不会出现任何混淆。