|
1 | 1 | from datetime import datetime |
2 | 2 |
|
3 | 3 | import gtk |
| 4 | +import math |
4 | 5 |
|
5 | 6 | from . import BuilderAware |
6 | 7 | from ..util import join_to_file_dir |
7 | 8 |
|
| 9 | +def median(values): |
| 10 | + values = sorted(values) |
| 11 | + a = int((len(values) + 1) / 2) |
| 12 | + b = a - len(values) % 2 |
| 13 | + |
| 14 | + return ( values[a-1] + values[b] ) / 2.0 |
| 15 | + |
8 | 16 | class StatDrawer(gtk.DrawingArea): |
9 | 17 | __gsignals__ = { "expose-event": "override" } |
10 | 18 |
|
@@ -50,23 +58,36 @@ def draw(self, cr, width, height): |
50 | 58 |
|
51 | 59 | self.draw_grid(cr, mindt, maxdt, mincpm, maxcpm, hfactor) |
52 | 60 |
|
53 | | - cr.set_source_rgb(0.2, 0.2, 0.2) |
| 61 | + data = sorted(self.data.iteritems(), key=lambda r: r[0]) |
| 62 | + |
| 63 | + cr.set_source_rgb(0.2, 0.4, 0.2) |
54 | 64 | cr.set_line_width(0.1) |
55 | 65 |
|
56 | | - moved = False |
57 | | - for dt in sorted(self.data): |
58 | | - x, y = float(dt.toordinal()), float(self.data[dt][0]) * hfactor |
59 | | - if not moved: |
60 | | - cr.move_to(x, y) |
61 | | - moved = True |
62 | | - else: |
63 | | - cr.line_to(x, y) |
| 66 | + data.insert(0, (None, (data[0][1][0], None))) |
| 67 | + data.insert(0, (None, (data[0][1][0], None))) |
| 68 | + data.append((None, (data[-1][1][0], None))) |
| 69 | + data.append((None, (data[-1][1][0], None))) |
| 70 | + cr.new_sub_path() |
| 71 | + for i in range(len(data)-4): |
| 72 | + x = float(data[i+2][0].toordinal()) |
| 73 | + y = median([r[1][0] for r in data[i:i+5]]) |
| 74 | + cr.line_to(x, y*hfactor) |
64 | 75 |
|
65 | 76 | cr.stroke() |
66 | 77 |
|
| 78 | + cr.set_line_width(0.02) |
| 79 | + cr.new_sub_path() |
| 80 | + for dt, (cpm, cnt) in data[2:-2]: |
| 81 | + x, y = float(dt.toordinal()), cpm * hfactor |
| 82 | + cr.arc(x, y, 0.2, 0, math.pi*2) |
| 83 | + cr.set_source_rgb(0.88627, 0.68627, 0.88627) |
| 84 | + cr.fill_preserve() |
| 85 | + cr.set_source_rgb(0.2, 0.2, 0.2) |
| 86 | + cr.stroke() |
| 87 | + |
67 | 88 | def draw_grid(self, cr, mindt, maxdt, mincpm, maxcpm, hfactor): |
68 | 89 | cr.set_source_rgb(0.8, 0.8, 0.8) |
69 | | - cr.set_line_width(0.03) |
| 90 | + cr.set_line_width(0.02) |
70 | 91 | for x in range(mindt, maxdt+1): |
71 | 92 | cr.move_to(x, mincpm*hfactor) |
72 | 93 | cr.line_to(x, maxcpm*hfactor) |
|
0 commit comments