blob: 59270a0b9516d53abe98e092d63dfb240ae34461 [file] [log] [blame]
terelius54ce6802016-07-13 06:44:41 -07001/*
2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11#include "webrtc/tools/event_log_visualizer/plot_python.h"
12
13#include <stdio.h>
tereliusdc35dcd2016-08-01 12:03:27 -070014
Stefan Holmer13181032016-07-29 14:48:54 +020015#include <memory>
terelius54ce6802016-07-13 06:44:41 -070016
17namespace webrtc {
18namespace plotting {
19
20PythonPlot::PythonPlot() {}
21
22PythonPlot::~PythonPlot() {}
23
tereliusdc35dcd2016-08-01 12:03:27 -070024void PythonPlot::Draw() {
terelius54ce6802016-07-13 06:44:41 -070025 // Write python commands to stdout. Intended program usage is
26 // ./event_log_visualizer event_log160330.dump | python
27
tereliusdc35dcd2016-08-01 12:03:27 -070028 if (!series_list_.empty()) {
29 printf("color_count = %zu\n", series_list_.size());
terelius54ce6802016-07-13 06:44:41 -070030 printf(
31 "hls_colors = [(i*1.0/color_count, 0.25+i*0.5/color_count, 0.8) for i "
32 "in range(color_count)]\n");
33 printf("rgb_colors = [colorsys.hls_to_rgb(*hls) for hls in hls_colors]\n");
34
tereliusdc35dcd2016-08-01 12:03:27 -070035 for (size_t i = 0; i < series_list_.size(); i++) {
philipel35ba9bd2017-04-19 05:58:51 -070036 printf("\n# === Series: %s ===\n", series_list_[i].label.c_str());
terelius54ce6802016-07-13 06:44:41 -070037 // List x coordinates
38 printf("x%zu = [", i);
tereliusdc35dcd2016-08-01 12:03:27 -070039 if (series_list_[i].points.size() > 0)
40 printf("%G", series_list_[i].points[0].x);
41 for (size_t j = 1; j < series_list_[i].points.size(); j++)
42 printf(", %G", series_list_[i].points[j].x);
terelius54ce6802016-07-13 06:44:41 -070043 printf("]\n");
44
45 // List y coordinates
46 printf("y%zu = [", i);
tereliusdc35dcd2016-08-01 12:03:27 -070047 if (series_list_[i].points.size() > 0)
48 printf("%G", series_list_[i].points[0].y);
49 for (size_t j = 1; j < series_list_[i].points.size(); j++)
50 printf(", %G", series_list_[i].points[j].y);
terelius54ce6802016-07-13 06:44:41 -070051 printf("]\n");
52
tereliusdc35dcd2016-08-01 12:03:27 -070053 if (series_list_[i].style == BAR_GRAPH) {
terelius54ce6802016-07-13 06:44:41 -070054 // There is a plt.bar function that draws bar plots,
55 // but it is *way* too slow to be useful.
56 printf(
57 "plt.vlines(x%zu, map(lambda t: min(t,0), y%zu), map(lambda t: "
58 "max(t,0), y%zu), color=rgb_colors[%zu], "
59 "label=\'%s\')\n",
tereliusdc35dcd2016-08-01 12:03:27 -070060 i, i, i, i, series_list_[i].label.c_str());
61 } else if (series_list_[i].style == LINE_GRAPH) {
terelius54ce6802016-07-13 06:44:41 -070062 printf("plt.plot(x%zu, y%zu, color=rgb_colors[%zu], label=\'%s\')\n", i,
tereliusdc35dcd2016-08-01 12:03:27 -070063 i, i, series_list_[i].label.c_str());
64 } else if (series_list_[i].style == LINE_DOT_GRAPH) {
Stefan Holmer13181032016-07-29 14:48:54 +020065 printf(
66 "plt.plot(x%zu, y%zu, color=rgb_colors[%zu], label=\'%s\', "
67 "marker='.')\n",
tereliusdc35dcd2016-08-01 12:03:27 -070068 i, i, i, series_list_[i].label.c_str());
terelius77f05802017-02-01 06:34:53 -080069 } else if (series_list_[i].style == LINE_STEP_GRAPH) {
70 // Draw lines from (x[0],y[0]) to (x[1],y[0]) to (x[1],y[1]) and so on
71 // to illustrate the "steps". This can be expressed by duplicating all
72 // elements except the first in x and the last in y.
73 printf("x%zu = [v for dup in x%zu for v in [dup, dup]]\n", i, i);
74 printf("y%zu = [v for dup in y%zu for v in [dup, dup]]\n", i, i);
75 printf(
76 "plt.plot(x%zu[1:], y%zu[:-1], color=rgb_colors[%zu], "
77 "label=\'%s\')\n",
78 i, i, i, series_list_[i].label.c_str());
philipele127e7a2017-03-29 16:28:53 +020079 } else if (series_list_[i].style == DOT_GRAPH) {
80 printf(
81 "plt.plot(x%zu, y%zu, color=rgb_colors[%zu], label=\'%s\', "
philipel10fc0e62017-04-11 01:50:23 -070082 "marker='o', ls=' ')\n",
philipele127e7a2017-03-29 16:28:53 +020083 i, i, i, series_list_[i].label.c_str());
terelius54ce6802016-07-13 06:44:41 -070084 } else {
85 printf("raise Exception(\"Unknown graph type\")\n");
86 }
87 }
88 }
89
tereliusdc35dcd2016-08-01 12:03:27 -070090 printf("plt.xlim(%f, %f)\n", xaxis_min_, xaxis_max_);
91 printf("plt.ylim(%f, %f)\n", yaxis_min_, yaxis_max_);
92 printf("plt.xlabel(\'%s\')\n", xaxis_label_.c_str());
93 printf("plt.ylabel(\'%s\')\n", yaxis_label_.c_str());
94 printf("plt.title(\'%s\')\n", title_.c_str());
95 if (!series_list_.empty()) {
terelius54ce6802016-07-13 06:44:41 -070096 printf("plt.legend(loc=\'best\', fontsize=\'small\')\n");
97 }
98}
99
100PythonPlotCollection::PythonPlotCollection() {}
101
102PythonPlotCollection::~PythonPlotCollection() {}
103
tereliusdc35dcd2016-08-01 12:03:27 -0700104void PythonPlotCollection::Draw() {
terelius54ce6802016-07-13 06:44:41 -0700105 printf("import matplotlib.pyplot as plt\n");
106 printf("import colorsys\n");
tereliusdc35dcd2016-08-01 12:03:27 -0700107 for (size_t i = 0; i < plots_.size(); i++) {
terelius54ce6802016-07-13 06:44:41 -0700108 printf("plt.figure(%zu)\n", i);
tereliusdc35dcd2016-08-01 12:03:27 -0700109 plots_[i]->Draw();
terelius54ce6802016-07-13 06:44:41 -0700110 }
111 printf("plt.show()\n");
112}
113
tereliusdc35dcd2016-08-01 12:03:27 -0700114Plot* PythonPlotCollection::AppendNewPlot() {
terelius54ce6802016-07-13 06:44:41 -0700115 Plot* plot = new PythonPlot();
tereliusdc35dcd2016-08-01 12:03:27 -0700116 plots_.push_back(std::unique_ptr<Plot>(plot));
terelius54ce6802016-07-13 06:44:41 -0700117 return plot;
118}
119
120} // namespace plotting
121} // namespace webrtc