Mercurial > hg > numerics
annotate numerics/bar.py @ 179:f63194f81f7d
stubbing table splitting
author | Jeff Hammel <k0scist@gmail.com> |
---|---|
date | Tue, 09 Aug 2016 14:03:33 -0700 |
parents | f46cfad55d7a |
children |
rev | line source |
---|---|
103
067aa27050a3
limping along towards bar charts
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
1 #!/usr/bin/env python |
067aa27050a3
limping along towards bar charts
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
2 # -*- coding: utf-8 -*- |
067aa27050a3
limping along towards bar charts
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
3 |
067aa27050a3
limping along towards bar charts
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
4 """ |
157 | 5 bar charts using d3 (maybe bokeh again some day) |
103
067aa27050a3
limping along towards bar charts
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
6 |
067aa27050a3
limping along towards bar charts
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
7 See: |
067aa27050a3
limping along towards bar charts
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
8 - http://bokeh.pydata.org/tutorial/solutions/gallery/olympics.html |
137 | 9 - http://bokeh.pydata.org/en/latest/tutorial/topical.html |
140 | 10 - https://gist.github.com/mbostock/7322386 |
103
067aa27050a3
limping along towards bar charts
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
11 """ |
067aa27050a3
limping along towards bar charts
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
12 |
157 | 13 # TODO: http://bost.ocks.org/mike/bar/3/ |
158 | 14 # - http://alignedleft.com/tutorials/d3/making-a-bar-chart |
157 | 15 |
103
067aa27050a3
limping along towards bar charts
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
16 # imports |
067aa27050a3
limping along towards bar charts
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
17 import argparse |
148
279f5ae33564
this now generates something
Jeff Hammel <k0scist@gmail.com>
parents:
147
diff
changeset
|
18 import json |
140 | 19 import os |
103
067aa27050a3
limping along towards bar charts
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
20 import sys |
141
310290f95787
cleanup; now it really doesnt do anything
Jeff Hammel <k0scist@gmail.com>
parents:
140
diff
changeset
|
21 import tempita |
112 | 22 from .manipulate import ManipulationParser |
115
7fac47bb648e
mysteries and more mysteries: bokeh should really be a plugin for this, not the way to do it, but we are porting so lets ignore that and boldly walk forward
Jeff Hammel <k0scist@gmail.com>
parents:
113
diff
changeset
|
23 from collections import OrderedDict |
103
067aa27050a3
limping along towards bar charts
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
24 |
107
19a5c2fb52bb
add transpose functionality
Jeff Hammel <k0scist@gmail.com>
parents:
104
diff
changeset
|
25 __all__ = ['bar_chart', 'BarChartParser', 'main'] |
103
067aa27050a3
limping along towards bar charts
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
26 |
140 | 27 # template info |
28 # TODO: own module | |
29 here = os.path.dirname(os.path.abspath(__file__)) | |
30 templates = os.path.join(here, 'templates') | |
147 | 31 bar_template = os.path.join(templates, 'bar.d3.html') |
146 | 32 with open(os.path.join(here, 'js', 'd3.v3.min.js')) as f: |
141
310290f95787
cleanup; now it really doesnt do anything
Jeff Hammel <k0scist@gmail.com>
parents:
140
diff
changeset
|
33 d3 = f.read() |
140 | 34 |
115
7fac47bb648e
mysteries and more mysteries: bokeh should really be a plugin for this, not the way to do it, but we are porting so lets ignore that and boldly walk forward
Jeff Hammel <k0scist@gmail.com>
parents:
113
diff
changeset
|
35 |
156
69940819bc8a
allow for labels in an assenine way
Jeff Hammel <k0scist@gmail.com>
parents:
154
diff
changeset
|
36 def bar_chart(data, labels=None, title=None): |
116
fe820a3afa48
wip but we do need that new dependency
Jeff Hammel <k0scist@gmail.com>
parents:
115
diff
changeset
|
37 """ |
fe820a3afa48
wip but we do need that new dependency
Jeff Hammel <k0scist@gmail.com>
parents:
115
diff
changeset
|
38 create a bar chart |
fe820a3afa48
wip but we do need that new dependency
Jeff Hammel <k0scist@gmail.com>
parents:
115
diff
changeset
|
39 |
fe820a3afa48
wip but we do need that new dependency
Jeff Hammel <k0scist@gmail.com>
parents:
115
diff
changeset
|
40 See: |
fe820a3afa48
wip but we do need that new dependency
Jeff Hammel <k0scist@gmail.com>
parents:
115
diff
changeset
|
41 - http://bokeh.pydata.org/en/latest/tutorial/solutions/gallery/olympics.html |
fe820a3afa48
wip but we do need that new dependency
Jeff Hammel <k0scist@gmail.com>
parents:
115
diff
changeset
|
42 """ |
fe820a3afa48
wip but we do need that new dependency
Jeff Hammel <k0scist@gmail.com>
parents:
115
diff
changeset
|
43 # TODO: abstract this to a plot class |
156
69940819bc8a
allow for labels in an assenine way
Jeff Hammel <k0scist@gmail.com>
parents:
154
diff
changeset
|
44 if labels is None: |
69940819bc8a
allow for labels in an assenine way
Jeff Hammel <k0scist@gmail.com>
parents:
154
diff
changeset
|
45 labels = data |
116
fe820a3afa48
wip but we do need that new dependency
Jeff Hammel <k0scist@gmail.com>
parents:
115
diff
changeset
|
46 |
142
6747ce2bb090
more stubbing; almost there
Jeff Hammel <k0scist@gmail.com>
parents:
141
diff
changeset
|
47 template = tempita.Template.from_filename(bar_template) |
6747ce2bb090
more stubbing; almost there
Jeff Hammel <k0scist@gmail.com>
parents:
141
diff
changeset
|
48 bar_chart = template.substitute(title=title or '', |
6747ce2bb090
more stubbing; almost there
Jeff Hammel <k0scist@gmail.com>
parents:
141
diff
changeset
|
49 d3=d3, |
156
69940819bc8a
allow for labels in an assenine way
Jeff Hammel <k0scist@gmail.com>
parents:
154
diff
changeset
|
50 labels=json.dumps(labels), |
148
279f5ae33564
this now generates something
Jeff Hammel <k0scist@gmail.com>
parents:
147
diff
changeset
|
51 data=json.dumps(data)) |
279f5ae33564
this now generates something
Jeff Hammel <k0scist@gmail.com>
parents:
147
diff
changeset
|
52 return bar_chart |
116
fe820a3afa48
wip but we do need that new dependency
Jeff Hammel <k0scist@gmail.com>
parents:
115
diff
changeset
|
53 |
112 | 54 class BarChartParser(ManipulationParser): |
104 | 55 """command line options parser for bar charts""" |
103
067aa27050a3
limping along towards bar charts
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
56 # TODO: upstream to PlotParser |
067aa27050a3
limping along towards bar charts
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
57 |
067aa27050a3
limping along towards bar charts
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
58 def __init__(self, **kwargs): |
067aa27050a3
limping along towards bar charts
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
59 kwargs.setdefault('description', __doc__) |
112 | 60 ManipulationParser.__init__(self, **kwargs) |
104 | 61 self.add_argument('-t', '--title', dest='title', |
62 help="plot title") | |
159
f46cfad55d7a
hack to include numbers in our bar charts
Jeff Hammel <k0scist@gmail.com>
parents:
158
diff
changeset
|
63 self.add_argument('-u', '--use-numbers', dest='use_numbers', |
f46cfad55d7a
hack to include numbers in our bar charts
Jeff Hammel <k0scist@gmail.com>
parents:
158
diff
changeset
|
64 action='store_true', default=False, |
f46cfad55d7a
hack to include numbers in our bar charts
Jeff Hammel <k0scist@gmail.com>
parents:
158
diff
changeset
|
65 help="include numbers with the labels") |
103
067aa27050a3
limping along towards bar charts
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
66 |
067aa27050a3
limping along towards bar charts
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
67 |
067aa27050a3
limping along towards bar charts
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
68 def main(args=sys.argv[1:]): |
067aa27050a3
limping along towards bar charts
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
69 """CLI""" |
067aa27050a3
limping along towards bar charts
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
70 |
067aa27050a3
limping along towards bar charts
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
71 # parse command line |
067aa27050a3
limping along towards bar charts
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
72 parser = BarChartParser() |
067aa27050a3
limping along towards bar charts
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
73 options = parser.parse_args(args) |
067aa27050a3
limping along towards bar charts
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
74 |
112 | 75 # process data |
76 data = parser.typed_data() | |
77 | |
115
7fac47bb648e
mysteries and more mysteries: bokeh should really be a plugin for this, not the way to do it, but we are porting so lets ignore that and boldly walk forward
Jeff Hammel <k0scist@gmail.com>
parents:
113
diff
changeset
|
78 # ensure a mapping is given |
156
69940819bc8a
allow for labels in an assenine way
Jeff Hammel <k0scist@gmail.com>
parents:
154
diff
changeset
|
79 if len(data) == 1: |
69940819bc8a
allow for labels in an assenine way
Jeff Hammel <k0scist@gmail.com>
parents:
154
diff
changeset
|
80 data = data[0] |
69940819bc8a
allow for labels in an assenine way
Jeff Hammel <k0scist@gmail.com>
parents:
154
diff
changeset
|
81 labels = None |
159
f46cfad55d7a
hack to include numbers in our bar charts
Jeff Hammel <k0scist@gmail.com>
parents:
158
diff
changeset
|
82 elif len(data) == 2: |
f46cfad55d7a
hack to include numbers in our bar charts
Jeff Hammel <k0scist@gmail.com>
parents:
158
diff
changeset
|
83 if options.use_numbers: |
f46cfad55d7a
hack to include numbers in our bar charts
Jeff Hammel <k0scist@gmail.com>
parents:
158
diff
changeset
|
84 labels = ['{} : {}'.format(label, value) for label, value in zip(*data)] |
f46cfad55d7a
hack to include numbers in our bar charts
Jeff Hammel <k0scist@gmail.com>
parents:
158
diff
changeset
|
85 else: |
f46cfad55d7a
hack to include numbers in our bar charts
Jeff Hammel <k0scist@gmail.com>
parents:
158
diff
changeset
|
86 labels = data[0] |
156
69940819bc8a
allow for labels in an assenine way
Jeff Hammel <k0scist@gmail.com>
parents:
154
diff
changeset
|
87 data = data[1] |
141
310290f95787
cleanup; now it really doesnt do anything
Jeff Hammel <k0scist@gmail.com>
parents:
140
diff
changeset
|
88 else: |
156
69940819bc8a
allow for labels in an assenine way
Jeff Hammel <k0scist@gmail.com>
parents:
154
diff
changeset
|
89 raise NotImplementedError('TODO') |
115
7fac47bb648e
mysteries and more mysteries: bokeh should really be a plugin for this, not the way to do it, but we are porting so lets ignore that and boldly walk forward
Jeff Hammel <k0scist@gmail.com>
parents:
113
diff
changeset
|
90 |
113
f9900883db2e
hook it up and break it down
Jeff Hammel <k0scist@gmail.com>
parents:
112
diff
changeset
|
91 # generate bar chart |
156
69940819bc8a
allow for labels in an assenine way
Jeff Hammel <k0scist@gmail.com>
parents:
154
diff
changeset
|
92 options.output.write(bar_chart(data, labels=labels, title=options.title)) |
103
067aa27050a3
limping along towards bar charts
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
93 |
149 | 94 if options.output != sys.stdout: |
95 # print URL of file | |
96 print ('file://{}'.format(os.path.abspath(options.output.name))) | |
97 | |
103
067aa27050a3
limping along towards bar charts
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
98 |
067aa27050a3
limping along towards bar charts
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
99 if __name__ == '__main__': |
067aa27050a3
limping along towards bar charts
Jeff Hammel <k0scist@gmail.com>
parents:
diff
changeset
|
100 main() |