read a table and make a basic plot

Peter Otten __peter__ at web.de
Mon Dec 19 04:01:46 EST 2016


metal.suomi at gmail.com wrote:
> Hi, I'm learning python and full of extensive tutorials around. Getting a
> bit lost and overflowed in my head with tuples, dictionaries, lists, etc
> ... etc... Everything great, but I'd like to perform some basic task while
> learning the rest. For example, I'm having a hard time to find some
> practical info to get me up to speed. E.g. doing the following list of
> tasks:
>> - read a file named 'data.dat' (let's suppose it has 13 columns and n
> lines) and read column 3 and 4
>> -plot column 3 vs column 4
>> -write a file 'outcome.txt' which has column 3 and 4
>> How do I do read and write of files? Is there some extra library I need
> for doing plots? I have read about matplotlib.pyplot. How can I do the
> plot above using this library? (running python3.5 in OSX).
>> Thanks!
> J.

Here's a simple implementation that assumes both input and output file
$ cat plot_data.py
import csv
import sys
from matplotlib import pyplot
# get file names and column indices from commandline arguments
infile = sys.argv[1]
outfile = sys.argv[2]
xindex = int(sys.argv[3]) - 1
yindex = int(sys.argv[4]) - 1
# read the specified input file columns into separate lists
x = []
y = []
with open(infile) as instream:
 for row in csv.reader(instream, delimiter="\t"):
 x.append(float(row[xindex]))
 y.append(float(row[yindex]))
# write specified columns to output file
with open(outfile, "w") as outstream:
 csv.writer(outstream, delimiter="\t").writerows(zip(x, y))
# draw and show plot
pyplot.plot(x, y)
pyplot.show()
Use it like this:
$ python3 plot_data.py data.dat outfile.txt 3 4
PS: I used the following script to create some sample data:
import math
import random
ROWS = 100
def make_func(i):
 if i == 2:
 return lambda i: i
 else:
 N = random.randrange(1, 30)
 def f(i):
 return math.sin(i * N / ROWS)
 return f
column_funcs = [make_func(i) for i in range(13)]
with open("data.dat", "w") as outstream:
 for i in range(ROWS):
 print(
 "\t".join(map(str, [g(i) for g in column_funcs])),
 file=outstream
 )


More information about the Python-list mailing list

AltStyle によって変換されたページ (->オリジナル) /