annotate numerics/bar.py @ 159:f46cfad55d7a

hack to include numbers in our bar charts
author Jeff Hammel <k0scist@gmail.com>
date Wed, 13 May 2015 15:00:44 -0700
parents 176aad184ad0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
c5e919aff552 note TODO
Jeff Hammel <k0scist@gmail.com>
parents: 156
diff changeset
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
a4e6b6ad6907 cleanup + notes
Jeff Hammel <k0scist@gmail.com>
parents: 118
diff changeset
9 - http://bokeh.pydata.org/en/latest/tutorial/topical.html
140
9acea302899a preparing for d3
Jeff Hammel <k0scist@gmail.com>
parents: 137
diff changeset
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
c5e919aff552 note TODO
Jeff Hammel <k0scist@gmail.com>
parents: 156
diff changeset
13 # TODO: http://bost.ocks.org/mike/bar/3/
158
176aad184ad0 one more note to self
Jeff Hammel <k0scist@gmail.com>
parents: 157
diff changeset
14 # - http://alignedleft.com/tutorials/d3/making-a-bar-chart
157
c5e919aff552 note TODO
Jeff Hammel <k0scist@gmail.com>
parents: 156
diff changeset
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
9acea302899a preparing for d3
Jeff Hammel <k0scist@gmail.com>
parents: 137
diff changeset
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
7578313b9fbf hook up basic plumbing
Jeff Hammel <k0scist@gmail.com>
parents: 107
diff changeset
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
9acea302899a preparing for d3
Jeff Hammel <k0scist@gmail.com>
parents: 137
diff changeset
27 # template info
9acea302899a preparing for d3
Jeff Hammel <k0scist@gmail.com>
parents: 137
diff changeset
28 # TODO: own module
9acea302899a preparing for d3
Jeff Hammel <k0scist@gmail.com>
parents: 137
diff changeset
29 here = os.path.dirname(os.path.abspath(__file__))
9acea302899a preparing for d3
Jeff Hammel <k0scist@gmail.com>
parents: 137
diff changeset
30 templates = os.path.join(here, 'templates')
147
b8a7604adf6f what i meant
Jeff Hammel <k0scist@gmail.com>
parents: 146
diff changeset
31 bar_template = os.path.join(templates, 'bar.d3.html')
146
3ca7289b09d9 unify on path convention
Jeff Hammel <k0scist@gmail.com>
parents: 142
diff changeset
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
9acea302899a preparing for d3
Jeff Hammel <k0scist@gmail.com>
parents: 137
diff changeset
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
7578313b9fbf hook up basic plumbing
Jeff Hammel <k0scist@gmail.com>
parents: 107
diff changeset
54 class BarChartParser(ManipulationParser):
104
889728b8d359 minor cleanup
Jeff Hammel <k0scist@gmail.com>
parents: 103
diff changeset
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
7578313b9fbf hook up basic plumbing
Jeff Hammel <k0scist@gmail.com>
parents: 107
diff changeset
60 ManipulationParser.__init__(self, **kwargs)
104
889728b8d359 minor cleanup
Jeff Hammel <k0scist@gmail.com>
parents: 103
diff changeset
61 self.add_argument('-t', '--title', dest='title',
889728b8d359 minor cleanup
Jeff Hammel <k0scist@gmail.com>
parents: 103
diff changeset
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
7578313b9fbf hook up basic plumbing
Jeff Hammel <k0scist@gmail.com>
parents: 107
diff changeset
75 # process data
7578313b9fbf hook up basic plumbing
Jeff Hammel <k0scist@gmail.com>
parents: 107
diff changeset
76 data = parser.typed_data()
7578313b9fbf hook up basic plumbing
Jeff Hammel <k0scist@gmail.com>
parents: 107
diff changeset
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
dcedbe63d2c6 bar charts now work
Jeff Hammel <k0scist@gmail.com>
parents: 148
diff changeset
94 if options.output != sys.stdout:
dcedbe63d2c6 bar charts now work
Jeff Hammel <k0scist@gmail.com>
parents: 148
diff changeset
95 # print URL of file
dcedbe63d2c6 bar charts now work
Jeff Hammel <k0scist@gmail.com>
parents: 148
diff changeset
96 print ('file://{}'.format(os.path.abspath(options.output.name)))
dcedbe63d2c6 bar charts now work
Jeff Hammel <k0scist@gmail.com>
parents: 148
diff changeset
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()