If I understand your question correctly, I may have a solution to your problem. First of all, the statement below, when converted to Python code, will generate an array of numbers the same length of your masses list.

> 'y runs fron 0 to n where n == len(masses) '

However, this statement will give you a single number:

> x = 'mass_avg = sum(masses)/len(masses)'

You will not be able to plot these two objects because of the different sizes. If you are asking about a 'running' or cumulative mean, then you may want to use the cumulative sum function from Numpy (cumsum). To convert this into a cumulative average, you can do a simple division.

Below is a modification to your script that incorporates this averaging technique. (I don't know why you want to print everything. Surely you can't see all of the data as the file gets processed. It is also a very slow operation... I'll just ignore those parts.)

import numpy as np

import matplotlib.pyplot as plt

f = open('myfile.txt')

f.next() # You want to skip the first line, I guess.

mass = []

for line in f:

# This will skip the lines that are spaces.

if line.isspace(): continue

# The strip function is unnecessary. The defalut for the split function takes care of that.

columns = line.split()

# Don't call the float function every time. It's a waste.

mass.append( columns[8] )

# Here we can convert the list of strings into an array of floats with the dtype keyword.

mass = np.array( mass, dtype='float')

# Here's the cumulative average steps.

mass_sum = np.cumsum(mass)

mass_average = mass_sum/ np.arange(1, len(mass_sum) + 1)

# If you only plot one array or list of values, they are assumed to be the y values.

# The x values in that case are the indices of the y value array.

plt.plot(mass_average)

plt.show()

Ryan

Message: 5

Date: Thu, 25 Aug 2011 11:15:57 -0700 (PDT)

From: surfcast23 <surfcast23@gmail.com>

Subject: Re: [Matplotlib-users] How do you Plot data generated by a

python script?

To: matplotlib-users@lists.sourceforge.net

Message-ID: <32336570.post@talk.nabble.com>

Content-Type: text/plain; charset=us-ascii

Hi Martin,

Thank for the relpy. What I have is a script that reads the data from

a large file then prints out the values listed in a particular column. What

I now need to do is have the information in that column plotted as the

number of rows vs. the mean value of all of the rows. What I have so far is

import matplotlib.pyplot as plt

masses = []

f = open( 'myfile.txt','r')

f.readline()

for line in f:

if line != ' ':

line = line.strip() # Strips end of line character

columns = line.split() # Splits into coloumn

mass = columns[8] # Column which contains mass values

mass = float(mass)

masses.append(mass)

print(mass)

plt.plot()

plt.show

I am thinking I can do something like

'y runs fron 0 to n where n == len(masses) '

x = 'mass_avg = sum(masses)/len(masses)'

Problem is I don' tknow how to have matplotlib do it with out giving me an

error about dimentions. I would also like to do this with out having to

write and read from another file. I alos need to to be able to work on files

with ddifering numbers of rows.

Thanks

mdekauwe wrote:

>

> I wasn't quite able to follow exactly what you wanted to do but maybe this

> will help. I am going to generate some "data" that I think sounds a bit

> like yours, write it to a file, clearly you already have this. Then I am

> going to read it back in and plot it, e.g.

>

> import matplotlib.pyplot as plt

> import numpy as np

>

> # Generate some data a little like yours, I think?

> # print it to a file, i.e. I am making your myfile.txt

> numrows = 100

> numcols = 8

> mass = np.random.normal(0, 1, (numrows * numcols)).reshape(numrows,

> numcols)

> f = open("myfile.txt", "w")

> for i in xrange(numrows):

> for j in xrange(numcols):

> print >>f, mass[i,j],

> print >> f

> f.close()

>

> # read the file back in

> mass = np.loadtxt("myfile.txt")

>

> # plot the 8th column

> fig = plt.figure()

> ax = fig.add_subplot(111)

> ax.plot(mass[:,7], 'r-o')

> ax.set_xlabel("Time")

> ax.set_ylabel("Mass")

> plt.show()

>

>

> I wasn't clear on the mean bit, but that is easy to do with numpy, e.g.

>

> mean_mass = np.mean(mass[:,8])

>

> etc.

>

> Numpy et al is great for stuff like this.

>

> Hope that helps,

>

> Martin

>

>

--

View this message in context: http://old.nabble.com/How-do-you-Plot-data-generated-by-a-python-script--tp32328822p32336570.html

Sent from the matplotlib - users mailing list archive at Nabble.com.