Source code for datalogd.plugins.matplotlib_datasink

import logging
from datetime import datetime

from datalogd import DataSink, listify

try:
    import matplotlib as mpl
    import matplotlib.pyplot as plt
except (ModuleNotFoundError, ImportError):
    log = logging.getLogger(__name__.rpartition(".")[2])
    log.warning("matplotlib module not found. Install it with \"pip install matplotlib\" or similar.")
else:
    # Required modules present, continue loading rest of this module

[docs] class MatplotlibDataSink(DataSink): """ .. note:: This plugin is still a work in progress, and is really only at the proof-of-concept stage. """ def __init__(self, filename="plot.pdf", keys=["timestamp", "value"], labels=["timestamp", "{type}_{id}"]): self.filename = filename self.keys = keys self.labels = labels # Make the figure canvas self.fig, self.ax = plt.subplots(1, 1, figsize=(4.5, 3.5))
[docs] def receive(self, data): # TODO: Restrict to pairs of columns of data? data = listify(data) col_labels = [] cols = [] for d in data: if self.keys and isinstance(d, dict): # May be inefficient, but orders keys as requested for k_i, k in enumerate(self.keys): for dk in d.keys(): if k == dk: col_labels.append(self.labels[k_i].format_map(d)) cols.append(listify(d[k])) else: col_labels.append("data") cols.append(d) # Remove old traces self.ax.clear() # Not guaranteed pairs columns will have equal lengths... for col_i, col in enumerate(cols[::2]): row_count = min(len(cols[2*col_i]), len(cols[2*col_i+1])) self.ax.plot(cols[2*col_i][:row_count], cols[2*col_i+1][:row_count], label=col_labels[2*col_i+1]) if type(cols[0][0]) == datetime: self.fig.autofmt_xdate() self.ax.legend(frameon=False) self.fig.tight_layout() self.fig.savefig(self.filename)