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