mirror of
https://github.com/Telecominfraproject/wlan-lanforge-scripts.git
synced 2025-11-01 03:07:56 +00:00
230 lines
8.2 KiB
Python
Executable File
230 lines
8.2 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
'''
|
|
NAME: lf_graph.py
|
|
|
|
PURPOSE:
|
|
Common Library for generating graphs for LANforge output
|
|
|
|
SETUP:
|
|
/lanforge/html-reports directory needs to be present or output generated in local file
|
|
|
|
EXAMPLE:
|
|
see: /py-scritps/lf_report_test.py for example
|
|
|
|
COPYWRITE
|
|
Copyright 2021 Candela Technologies Inc
|
|
License: Free to distribute and modify. LANforge systems must be licensed.
|
|
|
|
INCLUDE_IN_README
|
|
'''
|
|
|
|
import matplotlib.pyplot as plt
|
|
import matplotlib as mpl
|
|
import numpy as np
|
|
import pandas as pd
|
|
import pdfkit
|
|
import math
|
|
|
|
# internal candela references included during intial phases, to be deleted at future date
|
|
|
|
# graph reporting classes
|
|
class lf_bar_graph():
|
|
def __init__(self,
|
|
_data_set= [[30,55,69,37],[45,67,34,22],[22,45,12,34]],
|
|
_xaxis_name="x-axis",
|
|
_yaxis_name="y-axis",
|
|
_xaxis_categories=[1,2,3,4],
|
|
_graph_image_name="image_name",
|
|
_label=["bi-downlink", "bi-uplink",'uplink'],
|
|
_color=None,
|
|
_bar_width=0.25,
|
|
_color_edge='grey',
|
|
_font_weight='bold',
|
|
_color_name=['lightcoral','darkgrey','r','g','b','y'],
|
|
_figsize=(10,5),
|
|
_dpi=96):
|
|
|
|
self.data_set=_data_set
|
|
self.xaxis_name=_xaxis_name
|
|
self.yaxis_name=_yaxis_name
|
|
self.xaxis_categories=_xaxis_categories
|
|
self.graph_image_name=_graph_image_name
|
|
self.label=_label
|
|
self.color=_color
|
|
self.bar_width=_bar_width
|
|
self.color_edge=_color_edge
|
|
self.font_weight=_font_weight
|
|
self.color_name=_color_name
|
|
self.figsize=_figsize
|
|
|
|
|
|
|
|
def build_bar_graph(self):
|
|
if self.color is None:
|
|
i = 0
|
|
self.color = []
|
|
for col in self.data_set:
|
|
self.color.append(self.color_name[i])
|
|
i = i+1
|
|
|
|
fig = plt.subplots(figsize=self.figsize)
|
|
i = 0
|
|
for set in self.data_set:
|
|
if i > 0:
|
|
br = br1
|
|
br2 = [x + self.bar_width for x in br]
|
|
plt.bar(br2, self.data_set[i], color=self.color[i], width=self.bar_width,
|
|
edgecolor=self.color_edge, label=self.label[i])
|
|
br1 = br2
|
|
i = i+1
|
|
else:
|
|
br1 = np.arange(len(self.data_set[i]))
|
|
plt.bar(br1, self.data_set[i], color=self.color[i], width=self.bar_width,
|
|
edgecolor=self.color_edge, label=self.label[i])
|
|
i=i+1
|
|
plt.xlabel(self.xaxis_name, fontweight='bold', fontsize=15)
|
|
plt.ylabel(self.yaxis_name, fontweight='bold', fontsize=15)
|
|
plt.xticks([r + self.bar_width for r in range(len(self.data_set[0]))],
|
|
self.xaxis_categories)
|
|
plt.legend()
|
|
|
|
fig = plt.gcf()
|
|
plt.savefig("%s.png"% (self.graph_image_name), dpi=96)
|
|
plt.close()
|
|
print("{}.png".format(self.graph_image_name))
|
|
|
|
return "%s.png" % (self.graph_image_name)
|
|
|
|
|
|
class lf_scatter_graph():
|
|
def __init__(self,
|
|
_x_data_set= ["sta0 ","sta1","sta2","sta3"],
|
|
_y_data_set= [[30,55,69,37]],
|
|
_xaxis_name="x-axis",
|
|
_yaxis_name="y-axis",
|
|
_label = ["num1", "num2"],
|
|
_graph_image_name="image_name",
|
|
_color=["r","y"],
|
|
_figsize=(9,4)):
|
|
self.x_data_set = _x_data_set
|
|
self.y_data_set = _y_data_set
|
|
self.xaxis_name = _xaxis_name
|
|
self.yaxis_name = _yaxis_name
|
|
self.figsize = _figsize
|
|
self.graph_image_name = _graph_image_name
|
|
self.color = _color
|
|
self.label = _label
|
|
|
|
def build_scatter_graph(self):
|
|
if self.color is None:
|
|
self.color = ["orchid", "lime", "aquamarine", "royalblue", "darkgray", "maroon"]
|
|
fig = plt.subplots(figsize=self.figsize)
|
|
plt.scatter(self.x_data_set, self.y_data_set[0], color=self.color[0], label=self.label[0])
|
|
if len(self.y_data_set) > 1:
|
|
for i in range(1,len(self.y_data_set)):
|
|
plt.scatter(self.x_data_set, self.y_data_set[i], color=self.color[i], label=self.label[i])
|
|
plt.xlabel(self.xaxis_name, fontweight='bold', fontsize=15)
|
|
plt.ylabel(self.yaxis_name, fontweight='bold', fontsize=15)
|
|
plt.gcf().autofmt_xdate()
|
|
plt.legend()
|
|
plt.savefig("%s.png" % (self.graph_image_name), dpi=96)
|
|
plt.close()
|
|
print("{}.png".format(self.graph_image_name))
|
|
|
|
return "%s.png" % (self.graph_image_name)
|
|
|
|
class lf_stacked_graph():
|
|
def __init__(self,
|
|
_data_set= [[1,2,3,4],[1,1,1,1],[1,1,1,1]],
|
|
_xaxis_name="Stations",
|
|
_yaxis_name="Numbers",
|
|
_label = ['Success','Fail'],
|
|
_graph_image_name="image_name",
|
|
_color = ["b","g"],
|
|
_figsize=(9,4)):
|
|
self.data_set = _data_set # [x_axis,y1_axis,y2_axis]
|
|
self.xaxis_name = _xaxis_name
|
|
self.yaxis_name = _yaxis_name
|
|
self.figsize = _figsize
|
|
self.graph_image_name = _graph_image_name
|
|
self.label = _label
|
|
self.color = _color
|
|
|
|
|
|
def build_stacked_graph(self):
|
|
fig = plt.subplots(figsize=self.figsize)
|
|
if self.color is None:
|
|
self.color = ["darkred", "tomato", "springgreen", "skyblue", "indigo", "plum"]
|
|
plt.bar(self.data_set[0], self.data_set[1], color=self.color[0])
|
|
plt.bar(self.data_set[0], self.data_set[2], bottom=self.data_set[1], color=self.color[1])
|
|
if len(self.data_set) > 3:
|
|
for i in range(3, len(self.data_set)):
|
|
plt.bar(self.data_set[0], self.data_set[i], bottom=np.array(self.data_set[i-2])+np.array(self.data_set[i-1]), color=self.color[i-1])
|
|
plt.xlabel(self.xaxis_name)
|
|
plt.ylabel(self.yaxis_name)
|
|
plt.legend(self.label)
|
|
plt.savefig("%s.png" % (self.graph_image_name), dpi=96)
|
|
plt.close()
|
|
print("{}.png".format(self.graph_image_name))
|
|
|
|
return "%s.png" % (self.graph_image_name)
|
|
# Unit Test
|
|
if __name__ == "__main__":
|
|
|
|
output_html_1 = "graph_1.html"
|
|
output_pdf_1 = "graph_1.pdf"
|
|
|
|
# test build_bar_graph with defaults
|
|
graph = lf_bar_graph()
|
|
graph_html_obj = """
|
|
<img align='center' style='padding:15;margin:5;width:1000px;' src=""" + "%s" % (graph.build_bar_graph()) + """ border='1' />
|
|
<br><br>
|
|
"""
|
|
#
|
|
test_file = open(output_html_1, "w")
|
|
test_file.write(graph_html_obj)
|
|
test_file.close()
|
|
|
|
# write to pdf
|
|
# write logic to generate pdf here
|
|
# wget https://github.com/wkhtmltopdf/packaging/releases/download/0.12.6-1/wkhtmltox_0.12.6-1.focal_amd64.deb
|
|
# sudo apt install ./wkhtmltox_0.12.6-1.focal_amd64.deb
|
|
options = {"enable-local-file-access" : None} # prevent eerror Blocked access to file
|
|
pdfkit.from_file(output_html_1, output_pdf_1, options=options)
|
|
|
|
|
|
# test build_bar_graph setting values
|
|
dataset = [[45,67,34,22],[22,45,12,34],[30,55,69,37]]
|
|
x_axis_values = [1,2,3,4]
|
|
|
|
output_html_2 = "graph_2.html"
|
|
output_pdf_2 = "graph_2.pdf"
|
|
|
|
# test build_bar_graph with defaults
|
|
graph = lf_bar_graph(_data_set=dataset,
|
|
_xaxis_name="stations",
|
|
_yaxis_name="Throughput 2 (Mbps)",
|
|
_xaxis_categories=x_axis_values,
|
|
_graph_image_name="Bi-single_radio_2.4GHz",
|
|
_label=["bi-downlink", "bi-uplink",'uplink'],
|
|
_color=None,
|
|
_color_edge='red')
|
|
graph_html_obj = """
|
|
<img align='center' style='padding:15;margin:5;width:1000px;' src=""" + "%s" % (graph.build_bar_graph()) + """ border='1' />
|
|
<br><br>
|
|
"""
|
|
#
|
|
test_file = open(output_html_2, "w")
|
|
test_file.write(graph_html_obj)
|
|
test_file.close()
|
|
|
|
# write to pdf
|
|
# write logic to generate pdf here
|
|
# wget https://github.com/wkhtmltopdf/packaging/releases/download/0.12.6-1/wkhtmltox_0.12.6-1.focal_amd64.deb
|
|
# sudo apt install ./wkhtmltox_0.12.6-1.focal_amd64.deb
|
|
options = {"enable-local-file-access" : None} # prevent eerror Blocked access to file
|
|
pdfkit.from_file(output_html_2, output_pdf_2, options=options)
|
|
|
|
|
|
|