"""
Devloped By : Nishant Baheti
"""
import matplotlib.pyplot
from graphpkg.live.graph import LiveTrend,LiveScatter,LiveDistribution
import logging
from graphpkg import __version__
__author__ = "Nishant Baheti"
__copyright__ = "Nishant Baheti"
__license__ = "MIT"
_logger = logging.getLogger(__name__)
__plot_class_map__ = {
"trend": LiveTrend,
"scatter": LiveScatter,
"distribution": LiveDistribution
}
[docs]class LiveDashboard:
"""Live Dashboard plot
Args:
config (dict): Configuration Dictionary
Notes:
Dashboard Configration Example
| conf = {
| "dashboard": "DASHBOARD1",
| "plots": {
| "trend": [
| {
| "func_for_data": func1,
| "fig_spec": (1,3,(1,2)),
| "interval": 500,
| "title" : "trend plot1"
| }
| ],
| "scatter": [
| {
| "fig_spec" : (1, 3, 3),
| "func_for_data" : func3,
| "func_args": (1000,),
| "interval" : 1000,
| "title" : "other scatter plot",
| "window": 500
| }
| ]
| }
| }
Example:
>>> conf = {
>>> "dashboard": "DASHBOARD1",
>>> "plots": {
>>> "trend": [
>>> {
>>> "func_for_data": func1,
>>> "fig_spec": (4, 3, (1, 2)),
>>> "interval": 500,
>>> "title": "trend plot1"
>>> },
>>> {
>>> "func_for_data": func1,
>>> "fig_spec": (4, 3, (4, 5)),
>>> "interval": 500,
>>> "title": "trend plot2"
>>> },
>>> {
>>> "func_for_data": func1,
>>> "fig_spec": (4, 3, (7, 8)),
>>> "interval": 500,
>>> "title": "trend plot3"
>>> },
>>> {
>>> "func_for_data": func1,
>>> "fig_spec": (4, 3, (10,11)),
>>> "interval": 500,
>>> "title": "trend plot4"
>>> }
>>> ],
>>> "distribution": [{
>>> "fig_spec": (4, 3, (3,6)),
>>> "func_for_data": func4,
>>> "interval": 1000,
>>> "title": "distribution plot",
>>> "window": 500
>>> }],
>>> "scatter": [
>>> {
>>> "fig_spec": (4, 3, (9,12)),
>>> "func_for_data": func3,
>>> "func_args": (1000,),
>>> "interval": 1000,
>>> "title": "other other scatter plot",
>>> "window": 500
>>> }
>>> ]
>>> }
>>> }
>>> dash = LiveDashboard(config=conf)
>>> dash.start()
>>> matplotlib.pyplot.show()
"""
def __init__(self, config: dict):
"""Constructor
"""
self.config = config
self._dash_config = []
self.fig = matplotlib.pyplot.figure()
self.title = None
def _plot_config(self):
"""plot config template
Returns:
dict : Configuration template dictionary
"""
conf = {
"interval": 1000,
"func_for_data": None,
"func_args": None,
"fig": self.fig,
"fig_spec": None,
"xlabel": "x-axis",
"ylabel": "y-axis",
"label": "Current Data",
"title": "Live Trend",
"window": 100
}
return conf.copy()
def _load_config_in_format(self):
"""Load configuratiobn of the dashboard
Raises:
ValueError: any of these : func_for_data, interval, fig_spec, fig are None
"""
self.title = self.config["dashboard"] or "DASHBOARD"
plots_in_conf = self.config["plots"].keys()
for plot in plots_in_conf:
if plot in __plot_class_map__.keys():
plot_class = __plot_class_map__[plot]
list_of_plots = self.config["plots"][plot]
for cplot in list_of_plots:
templ_conf = self._plot_config()
for key in templ_conf:
if key in cplot:
templ_conf[key] = cplot[key]
if None in [
templ_conf["func_for_data"],
templ_conf["interval"],
templ_conf["fig_spec"],
templ_conf["fig"]
]:
raise ValueError(
""" func_for_data, interval, fig_spec, fig can't be None""")
else:
self._dash_config.append(plot_class(**templ_conf))
[docs] def start(self):
"""Start the dashboard
"""
self._load_config_in_format()
for plot in self._dash_config:
plot.start()
self.fig.canvas.set_window_title(self.title)
self.fig.tight_layout()
[docs] def display(self):
"""display information
"""
print(f"""
=====================================================
Configuration Information
=====================================================
title : {self.title}
""")