Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Newer
Older
100644 490 lines (432 sloc) 12.257 kB
f3522c9 Remove Base to Module.
Martijn Koedam authored
1 using GLib;
2 using Gtk;
3
bd7354a Use Plotting module.
Martijn Koedam authored
4 class Plotting : Module
f3522c9 Remove Base to Module.
Martijn Koedam authored
5 {
bd7354a Use Plotting module.
Martijn Koedam authored
6 private enum PlotType {
7 POINTS,
8 AVG_WEEKDAY,
4671174 @DaveDavenport Add day plot. fix small things.
authored
9 AVG_HOURS,
bd7354a Use Plotting module.
Martijn Koedam authored
10 DAYS,
11 WEEKS,
12 MONTHS,
13 NUM_PLOT_TYPES
f3522c9 Remove Base to Module.
Martijn Koedam authored
14 }
15
bd7354a Use Plotting module.
Martijn Koedam authored
16 private EnergyStorage es = null;
f3522c9 Remove Base to Module.
Martijn Koedam authored
17
4671174 @DaveDavenport Add day plot. fix small things.
authored
18 // config options.
19 private bool do_svg = false;
20 private string output_filename = "output.svg";
21 private uint output_width = 800;
22 private uint output_height = 600;
23 private bool do_average = false;
24 private PlotType plot_type = PlotType.POINTS;
25
bd7354a Use Plotting module.
Martijn Koedam authored
26 private DateTime tstart;
27 private DateTime tstop;
f3522c9 Remove Base to Module.
Martijn Koedam authored
28
29
bd7354a Use Plotting module.
Martijn Koedam authored
30 public Plotting(EnergyStorage es)
f3522c9 Remove Base to Module.
Martijn Koedam authored
31 {
bd7354a Use Plotting module.
Martijn Koedam authored
32 this.es = es;
33
f3522c9 Remove Base to Module.
Martijn Koedam authored
34 }
35
bd7354a Use Plotting module.
Martijn Koedam authored
36 public override void print_help()
37 {
38 stdout.printf("""
51df54e @DaveDavenport Fix average drawing. more updates.
authored
39 Usage plot:
40 ep plot <options> <commands>
f3522c9 Remove Base to Module.
Martijn Koedam authored
41
bd7354a Use Plotting module.
Martijn Koedam authored
42 commands:
43 points: Plot all the data points. (use in combination with range)
4671174 @DaveDavenport Add day plot. fix small things.
authored
44 dayhours: Shows the average power consumption for each hour of the day.
bd7354a Use Plotting module.
Martijn Koedam authored
45 weekday: Shows the average power consumption for each day of the week.
fa51d54 @DaveDavenport Allow graphs to be written to svg.
authored
46 weeks: Shows the energy consumption for each week of the year.
4671174 @DaveDavenport Add day plot. fix small things.
authored
47 days: Shows the energy consumption for each day of the year.
51df54e @DaveDavenport Fix average drawing. more updates.
authored
48 months: Shows the energy consumption for each month of the year.
bd7354a Use Plotting module.
Martijn Koedam authored
49
50 Options:
51 --help, help print this help message.
4671174 @DaveDavenport Add day plot. fix small things.
authored
52 range <start date> <end date> Limit the evaluated data to a certain range.
53 svg <filename> Outputs the graph to an SVG file.
54 average Plot an average line.
55 width <width in px> The width of the output.
56 height <height in px> The height of the output.
bd7354a Use Plotting module.
Martijn Koedam authored
57
58 Example:
59 """);
60 }
f3522c9 Remove Base to Module.
Martijn Koedam authored
61
bd7354a Use Plotting module.
Martijn Koedam authored
62 public override bool parse_arguments(string[] argv)
f3522c9 Remove Base to Module.
Martijn Koedam authored
63 {
bd7354a Use Plotting module.
Martijn Koedam authored
64 tstart = es.get_starting_datetime();
65 tstop = es.get_stopping_datetime();
66 for(uint i = 0; i < argv.length; i++)
f3522c9 Remove Base to Module.
Martijn Koedam authored
67 {
bd7354a Use Plotting module.
Martijn Koedam authored
68 if(argv[i] == "help" || argv[i] == "--help") {
69 print_help();
70 return false;
71 } else if (argv[i] == "range") {
72 i += parse_range(argv, i+1, ref tstart, ref tstop);
73 } else if (argv[i] == "weekday") {
74 plot_type = PlotType.AVG_WEEKDAY;
75 }else if (argv[i] == "points") {
76 plot_type = PlotType.POINTS;
35c423f @DaveDavenport Add plots, statistics
authored
77 }else if (argv[i] == "weeks") {
78 plot_type = PlotType.WEEKS;
51df54e @DaveDavenport Fix average drawing. more updates.
authored
79 }else if (argv[i] == "months") {
80 plot_type = PlotType.MONTHS;
bd7354a Use Plotting module.
Martijn Koedam authored
81 }else if (argv[i] == "days") {
82 plot_type = PlotType.DAYS;
4671174 @DaveDavenport Add day plot. fix small things.
authored
83 }else if (argv[i] == "dayhours") {
84 plot_type = PlotType.AVG_HOURS;
fa51d54 @DaveDavenport Allow graphs to be written to svg.
authored
85 }else if (argv[i] == "svg") {
86 do_svg = true;
4671174 @DaveDavenport Add day plot. fix small things.
authored
87 i++;
88 if(i >= argv.length)
89 {
90 stdout.printf("Expected filename after svg.\n");
91 return false;
92 }
93 output_filename = argv[i];
94 }else if (argv[i] == "width") {
95 i++;
96 if(i >= argv.length)
97 {
98 stdout.printf("Expected size after width.\n");
99 return false;
100 }
101 output_width = (uint)uint64.parse(argv[i]);
102 if(output_width < 100) {
103 stdout.printf("The output should be atleast 100px width.\n");
104 return false;
105 }
106 }else if (argv[i] == "height") {
107 i++;
108 if(i >= argv.length)
109 {
110 stdout.printf("Expected size after height.\n");
111 return false;
112 }
113 output_height = (uint)uint64.parse(argv[i]);
114 if(output_height < 100) {
115 stdout.printf("The output should be atleast 100px heigh.\n");
116 return false;
117 }
51df54e @DaveDavenport Fix average drawing. more updates.
authored
118 }else if (argv[i] == "average") {
119 do_average = true;
bd7354a Use Plotting module.
Martijn Koedam authored
120 } else {
121 print_help();
122 return false;
123 }
f3522c9 Remove Base to Module.
Martijn Koedam authored
124 }
fa51d54 @DaveDavenport Allow graphs to be written to svg.
authored
125 if(!do_svg)
126 {
127 Gtk.init(ref argv);
128 }
bd7354a Use Plotting module.
Martijn Koedam authored
129 return true;
130 }
131 public override int execute()
132 {
fff4b27 Add debug
Martijn Koedam authored
133 stdout.printf("Range: %s --> %s\n", tstart.format("%d/%m/%Y - %H:%M"),tstop.format("%d/%m/%Y - %H:%M"));
fa51d54 @DaveDavenport Allow graphs to be written to svg.
authored
134
135 Graph.Widget widget = null;
136 Graph.Svg svg_plot = null;
137 Graph.Graph graph = null;
138 if(do_svg)
139 {
140 svg_plot = new Graph.Svg();
141 graph = svg_plot.graph;
142 }else{
143 widget = new Graph.Widget();
144 graph = widget.graph;
145 }
bd7354a Use Plotting module.
Martijn Koedam authored
146 if(plot_type == PlotType.POINTS)
f3522c9 Remove Base to Module.
Martijn Koedam authored
147 {
fa51d54 @DaveDavenport Allow graphs to be written to svg.
authored
148 plot_graph(graph);
f3522c9 Remove Base to Module.
Martijn Koedam authored
149 }
bd7354a Use Plotting module.
Martijn Koedam authored
150 else if (plot_type == PlotType.AVG_WEEKDAY)
f3522c9 Remove Base to Module.
Martijn Koedam authored
151 {
fa51d54 @DaveDavenport Allow graphs to be written to svg.
authored
152 plot_weekday(graph);
f3522c9 Remove Base to Module.
Martijn Koedam authored
153 }
35c423f @DaveDavenport Add plots, statistics
authored
154 else if (plot_type == PlotType.WEEKS)
155 {
fa51d54 @DaveDavenport Allow graphs to be written to svg.
authored
156 plot_weeks(graph);
35c423f @DaveDavenport Add plots, statistics
authored
157 }
51df54e @DaveDavenport Fix average drawing. more updates.
authored
158 else if (plot_type == PlotType.MONTHS)
159 {
160 plot_months(graph);
161 }
4671174 @DaveDavenport Add day plot. fix small things.
authored
162 else if (plot_type == PlotType.DAYS)
163 {
164 plot_days(graph);
165 }
166 else if (plot_type == PlotType.AVG_HOURS)
167 {
168 plot_dayhours(graph);
169 }
bd7354a Use Plotting module.
Martijn Koedam authored
170
fa51d54 @DaveDavenport Allow graphs to be written to svg.
authored
171 if(!do_svg)
172 {
173 Gtk.Window win = new Gtk.Window();
174
175 win.delete_event.connect((source) =>{
176 Gtk.main_quit();
177 return false;
178 });
179 // Set default size
4671174 @DaveDavenport Add day plot. fix small things.
authored
180 win.set_default_size((int)output_width, (int)output_height);
fa51d54 @DaveDavenport Allow graphs to be written to svg.
authored
181 win.add(widget);
182 win.show_all();
183 Gtk.main();
184 }else{
4671174 @DaveDavenport Add day plot. fix small things.
authored
185 svg_plot.output(output_filename, output_width, output_height);
fa51d54 @DaveDavenport Allow graphs to be written to svg.
authored
186 }
bd7354a Use Plotting module.
Martijn Koedam authored
187 return 0;
188 }
fa51d54 @DaveDavenport Allow graphs to be written to svg.
authored
189 private void plot_weeks(Graph.Graph graph)
35c423f @DaveDavenport Add plots, statistics
authored
190 {
191 var start = tstart;
192 var stop = start.add_minutes(-start.get_minute());
193 stop = stop.add_hours(-stop.get_hour());
194 stop = stop.add_days(-stop.get_day_of_week()+1);
195
fa51d54 @DaveDavenport Allow graphs to be written to svg.
authored
196 graph.title_label = "Power consumption";
197 graph.y_axis_label = "Energy (kWh)";
198 graph.x_axis_label = "Week";
35c423f @DaveDavenport Add plots, statistics
authored
199
fa51d54 @DaveDavenport Allow graphs to be written to svg.
authored
200 var ds3 = graph.create_data_set_bar();
51df54e @DaveDavenport Fix average drawing. more updates.
authored
201 ds3.min_y_point = 0;
35c423f @DaveDavenport Add plots, statistics
authored
202 ds3.set_color(0.5,0.2,0.2);
203 while(stop.compare(tstop)< 0)
204 {
205 start = stop;
206 stop = start.add_days(7);
207
208 stdout.printf("Range: %s --> %s\n", start.format("%V %d/%m/%Y - %H:%M"),stop.format("%d/%m/%Y - %H:%M"));
209 var avg = es.get_average_energy(start,stop)*24*7/1000.0;
51df54e @DaveDavenport Fix average drawing. more updates.
authored
210
35c423f @DaveDavenport Add plots, statistics
authored
211 stdout.printf("power: %.2f kWh\n", avg);
51df54e @DaveDavenport Fix average drawing. more updates.
authored
212 ds3.add_point((double)stop.to_unix()-3.5*24*60*60, avg);
fa51d54 @DaveDavenport Allow graphs to be written to svg.
authored
213 graph.add_xticks((double)start.to_unix()+(3.5*24*60*60), start.format("%V"));
35c423f @DaveDavenport Add plots, statistics
authored
214 }
51df54e @DaveDavenport Fix average drawing. more updates.
authored
215
216 // if we need average.
217 if(do_average)
218 {
219 var ds2 = new Graph.DataSetAverage(ds3);
220 graph.add_data_set(ds2);
221 ds2.set_color(0.2,0.2,0.4);
222 }
223 }
4671174 @DaveDavenport Add day plot. fix small things.
authored
224 private void plot_days(Graph.Graph graph)
225 {
226 var start = tstart;
227 var stop = start.add_minutes(-start.get_minute());
228 stop = stop.add_hours(-stop.get_hour());
229
230 graph.title_label = "Power consumption";
231 graph.y_axis_label = "Energy (kWh)";
232 graph.x_axis_label = "Day";
233
234 var ds3 = graph.create_data_set_bar();
235 ds3.set_color(0.2,0.5,0.2);
236 // Graph 0 point to 0
237 ds3.min_y_point = 0;
238
239 graph.add_xticks((double)stop.to_unix(),"");
240 while(stop.compare(tstop)< 0)
241 {
242 start = stop;
243 stop = start.add_days(1);
244
245 var day = stop.get_day_of_year();
246
247 stdout.printf("Range:%u %s --> %s\n",day, start.format("%B %d/%m/%Y - %H:%M"),stop.format("%d/%m/%Y - %H:%M"));
248 var avg = es.get_average_energy(start,stop)*24/1000.0;
249
250 stdout.printf("power: %.2f kWh\n", avg);
251 ds3.add_point((double)start.to_unix()+(0.5*24*60*60), avg);
252 graph.add_xticks((double)start.to_unix()+(0.5*24*60*60), "%03d".printf(day));
253 }
254 graph.add_xticks((double)stop.to_unix(),"");
255 // if we need average.
256 if(do_average)
257 {
258 var ds2 = new Graph.DataSetAverage(ds3);
259 graph.add_data_set(ds2);
260 ds2.set_color(0.2,0.2,0.4);
261 }
262 }
51df54e @DaveDavenport Fix average drawing. more updates.
authored
263 private void plot_months(Graph.Graph graph)
264 {
265 var start = tstart;
266 var stop = start.add_minutes(-start.get_minute());
267 stop = stop.add_hours(-stop.get_hour());
268 stop = stop.add_days(-stop.get_day_of_month()+1);
269
270 graph.title_label = "Power consumption";
271 graph.y_axis_label = "Energy (kWh)";
272 graph.x_axis_label = "Month";
273
274 var ds3 = graph.create_data_set_bar();
275 ds3.set_color(0.5,0.2,0.2);
276 // Graph 0 point to 0
277 ds3.min_y_point = 0;
278
279 graph.add_xticks((double)stop.to_unix(),"");
280 while(stop.compare(tstop)< 0)
281 {
282 start = stop;
283 stop = start.add_months(1);
284
285 var num_days = stop.add_seconds(-1).get_day_of_month();
286
287 stdout.printf("Range:%u %s --> %s\n",num_days, start.format("%B %d/%m/%Y - %H:%M"),stop.format("%d/%m/%Y - %H:%M"));
288 var avg = es.get_average_energy(start,stop)*num_days*24/1000.0;
289
290 stdout.printf("power: %.2f kWh\n", avg);
291 ds3.add_point((double)start.to_unix()+(num_days*0.5*24*60*60), avg);
292 graph.add_xticks((double)start.to_unix()+(num_days*0.5*24*60*60), start.format("%B"));
293 }
294 graph.add_xticks((double)stop.to_unix(),"");
295 // if we need average.
296 if(do_average)
297 {
298 var ds2 = new Graph.DataSetAverage(ds3);
299 graph.add_data_set(ds2);
300 ds2.set_color(0.2,0.2,0.4);
301 }
35c423f @DaveDavenport Add plots, statistics
authored
302 }
fa51d54 @DaveDavenport Allow graphs to be written to svg.
authored
303 private void plot_weekday(Graph.Graph graph)
bd7354a Use Plotting module.
Martijn Koedam authored
304 {
305 double week[7] = {0};
306 int num_week[7] = {0};
307
308 var start = tstart;
309 var stop = start.add_minutes(-start.get_minute());
310 stop = stop.add_hours(-stop.get_hour());
311 while(stop.compare(tstop)< 0)
f3522c9 Remove Base to Module.
Martijn Koedam authored
312 {
bd7354a Use Plotting module.
Martijn Koedam authored
313 start = stop;
314 int d = start.get_day_of_week();
315 stop = start.add_days(1);
316
317 week[d-1] += es.get_average_energy(start, stop);
318 num_week[d-1]++;
319
f3522c9 Remove Base to Module.
Martijn Koedam authored
320 }
bd7354a Use Plotting module.
Martijn Koedam authored
321
322
fa51d54 @DaveDavenport Allow graphs to be written to svg.
authored
323 graph.title_label = "Power consumption";
324 graph.y_axis_label = "Energy (kWh)";
325 graph.x_axis_label = "Week day";
bd7354a Use Plotting module.
Martijn Koedam authored
326
fa51d54 @DaveDavenport Allow graphs to be written to svg.
authored
327 graph.min_y_point = 0;
328 var ds = graph.create_data_set_bar();
bd7354a Use Plotting module.
Martijn Koedam authored
329 ds.set_color(0.4,0.5,0.3);
51df54e @DaveDavenport Fix average drawing. more updates.
authored
330 ds.min_y_point = 0;
331 graph.add_xticks(0.0, "");
fa51d54 @DaveDavenport Allow graphs to be written to svg.
authored
332 graph.add_xticks(0.5, "Monday");
333 graph.add_xticks(1.5, "Tuesday");
334 graph.add_xticks(2.5, "Wednesday");
335 graph.add_xticks(3.5, "Thursday");
336 graph.add_xticks(4.5, "Friday");
337 graph.add_xticks(5.5, "Saturday");
338 graph.add_xticks(6.5, "Sunday");
51df54e @DaveDavenport Fix average drawing. more updates.
authored
339 graph.add_xticks(7.0, "");
340 // ds.add_point(0, 0);
bd7354a Use Plotting module.
Martijn Koedam authored
341 for(uint i = 0; i < 7; i++)
f3522c9 Remove Base to Module.
Martijn Koedam authored
342 {
bd7354a Use Plotting module.
Martijn Koedam authored
343 if(num_week[i] > 0)
344 {
51df54e @DaveDavenport Fix average drawing. more updates.
authored
345 stdout.printf("%u %f %i\n",i, 24/1000.0*week[i]/(double)num_week[i], num_week[i]);
346 ds.add_point(i+0.5,
bd7354a Use Plotting module.
Martijn Koedam authored
347 24/1000.0*week[i]/(double)num_week[i]);
348 }else{
51df54e @DaveDavenport Fix average drawing. more updates.
authored
349 ds.add_point(i+0.5, 0);
bd7354a Use Plotting module.
Martijn Koedam authored
350 }
f3522c9 Remove Base to Module.
Martijn Koedam authored
351 }
51df54e @DaveDavenport Fix average drawing. more updates.
authored
352 // if we need average.
353 if(do_average)
354 {
355 var ds2 = new Graph.DataSetAverage(ds);
356 graph.add_data_set(ds2);
357 ds2.set_color(0.2,0.2,0.4);
358 }
f3522c9 Remove Base to Module.
Martijn Koedam authored
359 }
4671174 @DaveDavenport Add day plot. fix small things.
authored
360 private void plot_dayhours(Graph.Graph graph)
361 {
362 double hour[24] = {0};
363 int num_hour[24] = {0};
364
365 var start = tstart;
366 var stop = start.add_minutes(-start.get_minute());
367 while(stop.compare(tstop)< 0)
368 {
369 start = stop;
370 int d = start.get_hour();
371 stop = start.add_hours(1);
372
373 hour[d] += es.get_average_energy(start, stop);
374 num_hour[d]++;
375
376 }
377
378
379 graph.title_label = "Power consumption";
380 graph.y_axis_label = "Energy (kWh)";
381 graph.x_axis_label = "Hour";
382
383 graph.min_y_point = 0;
384 var ds = graph.create_data_set_bar();
385 ds.set_color(0.4,0.5,0.3);
386 ds.min_y_point = 0;
387 // Add X-grid points.
388 graph.add_xticks(0.0, "");
389 for(uint i = 0 ; i < 24; i++)
390 {
391 graph.add_xticks(0.5+i, "%2u".printf(i));
392 }
393 graph.add_xticks(24.0, "");
394
395 for(uint i = 0; i < 24; i++)
396 {
397 if(num_hour[i] > 0)
398 {
399 stdout.printf("%u %f %i\n",i, 24/1000.0*hour[i]/(double)num_hour[i], num_hour[i]);
400 ds.add_point(i+0.5,
401 1/1000.0*hour[i]/(double)num_hour[i]);
402 }else{
403 ds.add_point(i+0.5, 0);
404 }
405 }
406 // if we need average.
407 if(do_average)
408 {
409 var ds2 = new Graph.DataSetAverage(ds);
410 graph.add_data_set(ds2);
411 ds2.set_color(0.2,0.2,0.4);
412 }
413 }
f3522c9 Remove Base to Module.
Martijn Koedam authored
414
bd7354a Use Plotting module.
Martijn Koedam authored
415 /**
416 * Plotting graph
417 */
fa51d54 @DaveDavenport Allow graphs to be written to svg.
authored
418 void plot_graph(Graph.Graph graph)
bd7354a Use Plotting module.
Martijn Koedam authored
419 {
51df54e @DaveDavenport Fix average drawing. more updates.
authored
420 // bool do_bars = false;
421 bool do_points = true;
f3522c9 Remove Base to Module.
Martijn Koedam authored
422
51df54e @DaveDavenport Fix average drawing. more updates.
authored
423 // if(!do_bars) do_points = true;
bd7354a Use Plotting module.
Martijn Koedam authored
424 tstart = es.get_starting_datetime(tstart);
425 tstop = es.get_stopping_datetime(tstop);
f3522c9 Remove Base to Module.
Martijn Koedam authored
426
bd7354a Use Plotting module.
Martijn Koedam authored
427 double avg = es.get_average_energy(tstart, tstop);
428 //double eng = es.get_energy(tstart, tstop);
f3522c9 Remove Base to Module.
Martijn Koedam authored
429
430
fa51d54 @DaveDavenport Allow graphs to be written to svg.
authored
431 graph.title_label = "Power consumption";
432 graph.y_axis_label = "Power (W)";
433 graph.x_axis_label = "Time (HH:MM)";
f3522c9 Remove Base to Module.
Martijn Koedam authored
434
fa51d54 @DaveDavenport Allow graphs to be written to svg.
authored
435 graph.min_y_point = 0;
436 var ds = graph.create_data_set_area();
bd7354a Use Plotting module.
Martijn Koedam authored
437 ds.set_color(0.4,0.5,0.3);
51df54e @DaveDavenport Fix average drawing. more updates.
authored
438 /*
bd7354a Use Plotting module.
Martijn Koedam authored
439 if (do_bars)
440 {
fa51d54 @DaveDavenport Allow graphs to be written to svg.
authored
441 var ds3 = graph.create_data_set_bar();
bd7354a Use Plotting module.
Martijn Koedam authored
442 ds3.set_color(0.5,0.2,0.2);
443
444
445 var start = tstart;
446 var stop = start.add_minutes(-start.get_minute());
447 ds3.add_point((double)stop.to_unix(), 0);
448
449 while(stop.compare(tstop)< 0)
450 {
451 start = stop;
452 stop = start.add_hours(1);
f3522c9 Remove Base to Module.
Martijn Koedam authored
453
bd7354a Use Plotting module.
Martijn Koedam authored
454 avg = es.get_energy(start,stop);
455 ds3.add_point((double)stop.to_unix(), avg);
456 }
f3522c9 Remove Base to Module.
Martijn Koedam authored
457 }
51df54e @DaveDavenport Fix average drawing. more updates.
authored
458 */
bd7354a Use Plotting module.
Martijn Koedam authored
459 // add zero point.
460 if(do_points)
f3522c9 Remove Base to Module.
Martijn Koedam authored
461 {
bd7354a Use Plotting module.
Martijn Koedam authored
462 ds.add_point((double)tstart.to_unix(), 0);
463 foreach ( EnergyPoint ep in es.get_data(tstart, tstop))
464 {
465 ds.add_point((double)ep.time.to_unix(), ep.power);
466 }
f3522c9 Remove Base to Module.
Martijn Koedam authored
467 }
51df54e @DaveDavenport Fix average drawing. more updates.
authored
468 // if we need average.
469 if(do_average)
470 {
471 var ds2 = new Graph.DataSetAverage(ds);
472 graph.add_data_set(ds2);
473 ds2.set_color(0.2,0.2,0.4);
474 ds2.average = avg;
475 }
f3522c9 Remove Base to Module.
Martijn Koedam authored
476
bd7354a Use Plotting module.
Martijn Koedam authored
477 var start = tstart;
478 var stop = start.add_minutes(-start.get_minute());
479 // ticks.
480 while(stop.compare(tstop)< 0)
481 {
482 start = stop;
483 stop = start.add_hours(1);
484 string sa = "%02d:%02d".printf(start.get_hour(), start.get_minute());
fa51d54 @DaveDavenport Allow graphs to be written to svg.
authored
485 graph.add_xticks((double)start.to_unix(),sa);
f3522c9 Remove Base to Module.
Martijn Koedam authored
486
bd7354a Use Plotting module.
Martijn Koedam authored
487 }
488 }
f3522c9 Remove Base to Module.
Martijn Koedam authored
489 }
Something went wrong with that request. Please try again.