forked from sboysel/bashplotlib
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathscatterplot.py
More file actions
154 lines (132 loc) · 4.89 KB
/
scatterplot.py
File metadata and controls
154 lines (132 loc) · 4.89 KB
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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
# -*- coding: utf-8 -*-
"""
Plotting terminal based scatterplots
"""
from __future__ import print_function
import csv
import sys
import optparse
from os.path import isfile
from .utils.helpers import *
from .utils.commandhelp import scatter
def get_scale(series, is_y=False, steps=20):
min_val = min(series)
max_val = max(series)
scaled_series = []
for x in drange(min_val, max_val, (max_val - min_val) / steps,
include_stop=True):
if x > 0 and scaled_series and max(scaled_series) < 0:
scaled_series.append(0.0)
scaled_series.append(x)
if is_y:
scaled_series.reverse()
return scaled_series
def plot_scatter(xs, ys, size=None, pch='o',
colour='red', title=None, return_str=False):
''' Scatter plot.
----------------------
| * |
| * |
| * |
| * |
| * |
| * |
| * |
| * |
-----------------------
Parameters
----------
xs : list, numpy.ndarray
list of x series
ys : list, numpy.ndarray
list of y series
size : int
width of plot
pch : str
any character to represent a points
colour : str, list(str)
white,aqua,pink,blue,yellow,green,red,grey,black,default,ENDC
title : str
title for the plot, None = not show
return_str : boolean
return string represent the plot or print it out, default: False
'''
splot = ''
plotted = set()
cs = colour
if size is None:
size = 13
if title:
splot += print_return_str(
box_text(title, 2 * len(get_scale(xs, False, size)) + 1),
return_str=return_str)
# ====== Top line ====== #
splot += print_return_str(' ' + "-" * (len(get_scale(xs, False, size)) + 2),
return_str=return_str)
# ====== Main plot ====== #
for y in get_scale(ys, True, size):
splot += print_return_str("|", end=' ', return_str=return_str)
for x in get_scale(xs, False, size):
point = " "
for (i, (xp, yp)) in enumerate(zip(xs, ys)):
if xp <= x and yp >= y and (xp, yp) not in plotted:
point = pch
plotted.add((xp, yp))
if isinstance(cs, list):
colour = cs[i]
splot += printcolour(point, True, colour, return_str)
splot += print_return_str(" |", return_str=return_str)
# ====== Bottom line ====== #
splot += print_return_str(' ' + "-" * (len(get_scale(xs, False, size)) + 2),
return_str=return_str)
if return_str:
return splot
def _plot_scatter(f, xs, ys, size, pch, colour, title):
"""
Form a complex number.
Arguments:
f -- comma delimited file w/ x,y coordinates
xs -- if f not specified this is a file w/ x coordinates
ys -- if f not specified this is a filew / y coordinates
size -- size of the plot
pch -- shape of the points (any character)
colour -- colour of the points
title -- title of the plot
"""
if f:
if isinstance(f, str):
f = open(f)
data = [tuple(line.strip().split(',')) for line in f]
xs = [float(i[0]) for i in data]
ys = [float(i[1]) for i in data]
if len(data[0]) > 2:
cs = [i[2].strip() for i in data]
else:
cs = None
else:
xs = [float(str(row).strip()) for row in open(xs)]
ys = [float(str(row).strip()) for row in open(ys)]
if isfile(colour):
cs = [str(row).strip() for row in open(colour)]
else:
cs = colour
plot_scatter(xs, ys, size=size, pch=pch, colour=cs, title=title)
def main():
parser = optparse.OptionParser(usage=scatter['usage'])
parser.add_option('-f', '--file', help='a csv w/ x and y coordinates', default=None, dest='f')
parser.add_option('-t', '--title', help='title for the chart', default="", dest='t')
parser.add_option('-x', help='x coordinates', default=None, dest='x')
parser.add_option('-y', help='y coordinates', default=None, dest='y')
parser.add_option('-s', '--size', help='y coordinates', default=20, dest='size', type='int')
parser.add_option('-p', '--pch', help='shape of point', default="x", dest='pch')
parser.add_option('-c', '--colour', help='colour of the plot (%s)' %
colour_help, default='default', dest='colour')
opts, args = parser.parse_args()
if opts.f is None and (opts.x is None or opts.y is None):
opts.f = sys.stdin.readlines()
if opts.f or (opts.x and opts.y):
_plot_scatter(opts.f, opts.x, opts.y, opts.size, opts.pch, opts.colour, opts.t)
else:
print("nothing to plot!")
if __name__ == "__main__":
main()