简体   繁体   中英

How do I flush a graphics figure from matplotlib.pylab when inside a file input loop?

I am using Python 2.7 and importing libraries numpy and matplotlib. I want to read multiple file names of tab-delimited text files (time, voltage and pressure measurements) and after each one display the corresponding graph with %pylab.

My code can display the graph I want, but only after I enter the specific string ('exit') to get out of the while loop. I want to see each graph displayed immediately after the file name has been entered and have multiple figures on the screen at once. What's wrong with my code below?

import numpy as np
import matplotlib.pylab as plt

filename = ''
filepath = 'C:/Users/David/My Documents/Cardiorespiratory Experiment/' 
FileNotFoundError = 2
while filename != 'exit':
    is_valid = False
    while not is_valid :
        try :
                filename = raw_input('File name:')
                if filename == 'exit':
                    break
                fullfilename = filepath+filename+str('.txt')
                data = np.loadtxt(fullfilename, skiprows=7, usecols=(0,1,2))
                is_valid = True 
        except (FileNotFoundError, IOError):
                print ("File not found")    
t = [row[0] for row in data]    
v = [row[1] for row in data]
p = [row[2] for row in data]
#c = [row[3] for row in data]

plt.figure()
plt.subplot(2, 1, 1)
plt.title('Graph Title ('+filename+')')
plt.xlabel('time (s)')
plt.ylabel('voltage (mV)')
plt.plot(t, v, color='red')
plt.subplot(2, 1, 2)
plt.xlabel('time (s)')
plt.ylabel('pressure (kPa)')
plt.plot(t, p, color='blue')
plt.show()

I have tried Padraic Cunningham's suggestion to use only a single while loop to get the file name and that's an improvement. But when I put the graphing commands inside the loop, the figure comes up as an empty window with the message "Not Responding". The graph appears in the figure only after exiting the while loop. I want the figures to appear immediately upon getting the file name. Here's my current code:

import numpy as np
import matplotlib.pylab as plt

filename = ''
filepath = 'C:/Users/David/My Documents/Cardiorespiratory Experiment/' 
FileNotFoundError = 2
Count = 0
while Count <= 4:
    try :
        filename = raw_input('File name:')
        fullfilename = "{}{}.txt".format(filepath, filename)
        data = np.loadtxt(fullfilename, skiprows=7, usecols=(0,1,2))
        is_valid = True 
    except (FileNotFoundError, IOError):
        print ("File not found")
    Count += 1

    t = [row[0] for row in data]    
    v = [row[1] for row in data]
    p = [row[2] for row in data]

    plt.figure()
    plt.subplot(2, 1, 1)
    plt.title('Graph Title ('+filename+')')
    plt.xlabel('time (s)')
    plt.ylabel('voltage (mV)')
    plt.plot(t, v, color='red')
    plt.subplot(2, 1, 2)
    plt.xlabel('time (s)')
    plt.ylabel('pressure (kPa)')
    plt.plot(t, p, color='blue')
    plt.show()

Just use one loop to get the filename:

    while True:
        try :
            filename = raw_input('File name:')
            full_filename = "{}{}.txt".format(filepath, filename)
            data = np.loadtxt(full_filename, skiprows=7, usecols=(0,1,2))
            break # if no error break out of loop
        except (FileNotFoundError, IOError): # else  catch error and ask again
                print ("File not found")

".txt" is already a string so no need to cast

You should replace plt.show() with plt.pause(1) in your second script. Have a look at the answer to this similar question.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM