1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
|
#!/usr/bin/env python
import csv
import getopt
import os, sys
import scipy.interpolate
import numpy as np
import matplotlib.pyplot as plt
X_MAX = 100
Y_MAX = 50
def usage():
print("""usage: {} [OPTION...] CSV-FILE...
-c do cubic interpolation
-l do linear interpolation
-h show this help and exit""".format(os.path.basename(sys.argv[0])))
def plot(x, y, x_max, y_max, x_name, y_name, title, cubic, linear, xnew=None, f=None, f2=None):
plt.plot(x, y, 'o')
if linear:
plt.plot(xnew, f(xnew), '-')
if cubic:
plt.plot(xnew, f2(xnew), '--')
leg = [ 'data' ]
if linear:
leg.append('linear')
if cubic:
leg.append('cubic')
plt.legend(leg, loc='best')
plt.axis([0, x_max, 0, y_max], 'equal')
plt.xlabel(x_name)
plt.ylabel(y_name)
plt.title(title)
plt.grid(True)
plt.show()
def read_and_plot_csv(csv_file, cubic, linear, x_max=X_MAX, y_max=Y_MAX):
print("Reading data...")
cf = open(csv_file, 'r')
dialect = csv.Sniffer().sniff(cf.read(1024))
cf.seek(0)
reader = csv.reader(cf, dialect)
x_name,y_name = reader.next() # header line
X = np.array([[float(_x), float(_y)] for _x,_y in reader ])
x = X[:,0]
y = X[:,1]
xnew = f = f2 = None
# interpolate data points
if cubic or linear:
xnew = np.linspace(min(x), max(x), len(x)*5)
if linear:
print("Calculating linear interpolation...")
f = scipy.interpolate.interp1d(x, y)
if cubic:
print("Calculating cubic interpolation...")
f2 = scipy.interpolate.interp1d(x, y, kind='cubic')
plot(x, y, x_max, y_max, x_name, y_name, csv_file, cubic, linear, xnew, f, f2)
def main():
try:
opts, args = getopt.getopt(sys.argv[1:], "clh")
except getopt.GetoptError, err:
print(str(err))
usage()
sys.exit(-1)
if len(args) < 1:
usage()
sys.exit(-1)
cubic = False
linear = False
for o, a in opts:
if o == '-c':
cubic = True
elif o == '-l':
linear = True
elif o == '-h':
usage()
sys.exit(0)
else:
assert False, "unhandled option"
for csv in args:
if not os.path.exists(csv):
print "Error: File %s not found, skipping" % csv
continue
read_and_plot_csv(csv, cubic, linear)
if __name__ == '__main__':
main()
|