this is still a work in progress. but the idea was to use object oriented observer design pattern in an example. this one has an AnalysisFactory object communicating with Data objects when they should plot themselves. there may be bugs so please modify/use at your own risk.
this was the result:
import numpy as np from matplotlib import pyplot class BaseData(object): def __init__(self, dataPath='', data=None): self._dataPath = dataPath #where to find data. supports a path to example database, csv, json self._data = data #optional provide actual data to object like for NUMPYData, PYLISTData subclasses def doPlot(self, msg, ax=None): """ Args: msg (str) message ax (matplotlib.axes.AxesSubplot) pyplot subplot object to use for adding plot """ print("doing plot with message '{}'".format(msg)) print("using raw data", self._data) def toNUMPYMatrix(self, msg): print("converting data to numpy matrix. assumes all numbers data {}".format(msg)) return [] class CSVData(BaseData): pass class SQLITEData(BaseData): pass class NUMPYData(BaseData): def __init__(self, data): super(NUMPYData, self).__init__(data=data) def doPlot(self, msg, ax): print("class {0} doing plot with message '{1}'".format(self.__class__.__name__, msg)) print("using raw data", self._data) #putting plot code here ax.plot(self._data) #pyplot.show() class JSONData(BaseData): pass class PYLISTData(BaseData): def __init__(self, data): super(PYLISTData, self).__init__(data=data) def doPlot(self, msg, ax): print("class {0} doing plot with message '{1}'".format(self.__class__.__name__, msg)) print("using raw data", self._data) ax.plot(self._data) #pyplot.show() class AnalysisFactory(object): def __init__(self): self._data = [] def addData(self, dataNode): self._data.append(dataNode) def removeData(self, dataNode): self._data.remove(dataNode) def doPlots(self, msg): numFigures = len(self._data) if not numFigures: return #make figure to hold all plots fig, ax = pyplot.subplots(nrows=1, ncols=numFigures) if len(self._data) > 1: for i, data in enumerate(self._data): #print(type(ax[i])) data.doPlot(msg, ax[i]) else: #support single plot data = self._data[0] data.doPlot(msg, ax) #show completed figure pyplot.show() def toNUMPYMatrix(self, msg): matrices = [] for data in self._data: matrices.append(data.toNUMPYMatrix()) listData = PYLISTData(data=[1,2,3]) npData = NUMPYData(data=np.array([[1,2,3],[4,5,6]])) analysis = AnalysisFactory() analysis.addData(listData) analysis.addData(npData) analysis.doPlots("sending make plot update") #class PYLISTData doing plot with message 'sending make plot update' #('using raw data', [1, 2, 3]) #class NUMPYData doing plot with message 'sending make plot update' #('using raw data', array([[1, 2, 3], # [4, 5, 6]]))
Thanks for looking