Matplotlib:循环中保存的文件与show()中的相同

时间:2016-01-07 17:09:45

标签: python matplotlib

我的程序在plt.show()弹出窗口中显示正确的图形,但在 fig.savefig 中却没有。我对python很新,所以如果它很简单就道歉。 我使用 python 2.7.10,windows(10)

import numpy as np
import matplotlib.pyplot as plt

data = np.genfromtxt('strike_details.txt')  #, skip_header= 0
header= 3
information=10000
width = 5
files = 16
types = 4

length = information + header
frames = data[header:length,0]

fig= plt.figure()
plt.grid(True)

for i in range(0,int(files)):
    density=data[(header+i*length):(length+i*length),4]
    plt.plot(frames,density, label=data[i*length+1][2])

    for j in range (0,files/types):
        if i==(types*(j+1)-1):  
            plt.legend(loc='best')
            plt.xlabel('$Frames$', fontsize=22)
            plt.ylabel('$Density$', fontsize=22)
            fig.savefig(str(data[j*length+1][0])+'_'+str(data[j*length+1][1])+'_'+str(data[j*length+1][2])+'.png',format='png', dpi=fig.dpi)        
            plt.show()
            plt.clf()

该程序生成四个文件名不同的文件,但它们是你在plt.show弹出窗口中看到的第一组文件。

如果我错过了任何重要信息,请告诉我。

谢谢,

力欧

1 个答案:

答案 0 :(得分:3)

我认为这是因为混合了matplotlib的API风格和交互式风格。当您致电plt.show()时,活动人物与fig之间的链接已断开,因此您将继续输出您创建的第一个数字。我可以用这个最小的例子重现这个问题:

import matplotlib.pyplot as plt

fig = plt.figure()

for n in range(0,10):
    plt.plot(list(range(0,n)))
    fig.savefig('test%d.png' % n)
    plt.show() 
    plt.clf()

如果删除show(),问题就会消失。

执行此操作的正确方法是通过plt.gcf()

访问当前的交互式数字
plt.gcf().savefig(...)

或者,您可以通过在每个循环上重新创建图形对象来解决它:

for i in range(0,int(files)):
    fig= plt.figure()
    plt.grid(True)
    ...