【问题标题】:How to dispose figure in matplotlib如何在 matplotlib 中处理图形
【发布时间】:2014-08-08 15:29:36
【问题描述】:

我是 Python/Django 的新手,我尝试创建一个生成绘图的网站。为了生成绘图,我使用 matplotlib。

当我第一次运行页面时一切正常,但在结果刷新后我得到错误的情节(由新旧情节组成)。

代码如下:

    from pylab import *

    ...


    #prepare values and labels
    values = []
    labels = []
    values.append(float(user.playcount)/sum*100)
    labels.append(user.name)

    for friend in friends:
        friend = friend.getInfo()
        values.append(float(friend.playcount)/sum*100)
        labels.append(friend.name)

    # create figure
    figure(1)

    # set some parameters
    params = { 'axes.labelsize': 6, 'text.fontsize': 6, 'font.size': 6, 'legend.fontsize': 6, 'xtick.labelsize': 6, 'ytick.labelsize': 6,}        
    rcParams.update(params)

    # draw, add legend and save
    pie(values, labels=labels, shadow=False)
    l = legend(loc='lower center', ncol= 5, bbox_to_anchor=(0.5, -0.25))
    l.get_frame().set_alpha(0.0)
    savefig('media/images/3.png', dpi=100, transparent=True)

    #close(1)

如果我取消注释 close(1) 指令,刷新页面将会出现问题,因为应用程序会卡在 figure() 指令上。

谁能告诉我问题出在哪里?我认为图形处理有问题,但我不知道究竟是什么。

【问题讨论】:

    标签: python django matplotlib


    【解决方案1】:

    我认为你会从使用cla() 轴方法中受益,clears the axes。您可以在完成任何操作之前在脚本顶部执行此操作;甚至在第一个情节之前。我会用这个来代替close(),因为那样第二次就不会出现这个数字了。所以我会将figure(1) 行替换为

    figure(1)
    figure(1).gca().cla()
    

    这会将图形设置为图形 1,然后获取当前轴 (gca()),然后使用 cla() 将其清除。这是我独立于 django 运行的脚本,它对我有用并模仿了我认为您正在尝试做的事情:

    from pylab import *
    
    #prepare values and labels
    values = [34,17,29,6,14]
    labels = ["john","jane","jim","jason","judy"]
    
    # create figure
    figure(1)
    figure(1).gca().cla()
    
    # set some parameters
    params = { 'axes.labelsize': 6, 'text.fontsize': 6, 'font.size': 6, 
               'legend.fontsize': 6, 'xtick.labelsize': 6, 
               'ytick.labelsize': 6,}        
    rcParams.update(params)
    
    # draw, add legend and save
    pie(values, labels=labels, shadow=False)
    l = legend(loc='lower center', ncol= 5, bbox_to_anchor=(0.5, -0.25))
    l.get_frame().set_alpha(0.0)
    savefig('3.png', dpi=100, transparent=True)
    
    
    #close(1)
    
    values2 = [24,27,29,16,4]
    labels2 = ["dave","donna","derrick","dotty","drew"]
    
    figure(1)
    figure(1).gca().cla()
    
    # draw, add legend and save
    pie(values2, labels=labels2, shadow=False)
    l = legend(loc='lower center', ncol= 5, bbox_to_anchor=(0.5, -0.25))
    l.get_frame().set_alpha(0.0)
    savefig('4.png', dpi=100, transparent=True)
    
    #show()
    

    你可能只用一行就可以逃脱;这对我有用:

    figure(1).gca().cla()
    

    但也许换一种方式会更清楚一些。

    【讨论】:

    • 谢谢,我使用了你的解决方案,它可以工作,但我还添加了一些代码来清除图形 clf() 和图例。
    【解决方案2】:

    根据 Cristian Ciupitu 对this similar question 的回答,使用figure() 而不是figure(1) 应该可以解决问题。

    【讨论】:

    • 目前,这个答案被列为低质量。试着解释一下为什么这种方法有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多