Note that there are some explanatory texts on larger screens.

plurals
  1. POMATLAB - best way to dynamically update a line handles' XData and YData?
    primarykey
    data
    text
    <p>I am collecting data and plotting that data in real time. The data are produced by a motion capture system. I have one class <code>DynamicDataset</code> that is just a wrapper around a 2-column matrix (although it's more nuanced than that) with an event notifier for new data added; another class <code>DynamicPlotter</code> that listens for the data-added event and updates the plot dynamically. Appropriate code snippets:</p> <pre><code>classdef DynamicDataset &lt; handle properties newestData = []; data = [] end events DataAdded end methods function append(obj, val) obj.data(end+1,:) = val; obj.newestData = val; notify(obj, 'DataAdded'); end end end classdef DynamicPlotter &lt; dynamicprops properties FH %# figure handle AH %# axes handle LH %# array of line handles - may have multiple lines on the plot dynProps = {} %# cell array of dynamic property names - %# use to access individual datasets end methods function obj = DynamicPlotter(props) %# props is a cell array of dynamic %# properties to store information for i = 1:length(props) addprop(obj, props{i}); obj.(props{i}) = DynamicDataset; obj.dynProps = [obj.dynProps props{i}]; addlistener(obj.(props{i}), 'DataAdded', @obj.updatePlot(i)); end obj.createBlankPlot(); end function createBlankPlot(obj) obj.FH = figure; obj.AH = axes; hold all; for i = 1:length(obj.dynProps) obj.LH(i) = plot(nan); %# only used to produce a line handle set(obj.LH(i), 'XData', [], 'YData', []); end end function updatePlot(obj, propNum) X = get(obj.LH(propNum), 'XData'); Y = get(obj.LH(propNum), 'YData'); X(end+1) = obj.(dynProps{propNum}).newestData(1); Y(end+1) = obj.(dynProps{propNum}).newestData(2); set(obj.LH(propNum), 'XData', X, 'YData', Y); end end end </code></pre> <p>Based on the MATLAB Code Profile, the <code>set</code> command in <code>updatePlot()</code> is rather expensive. I am wondering if there is a better way to plot individual points as they come? Ideally I would push the single point into <code>XData</code> and <code>YData</code> and draw that point only, but I don't know if this is possible.</p> <p>Please note that there may be multiple lineseries objects (i.e., multiple graphs on the same plot); <code>plot()</code> takes an axes handle as an argument, so it wouldn't consider the properties of the previously drawn line handles (or is there a way to make it do so?); I thought of just doing <code>plot(x,y);hold all;</code> but that would give me separate line handles every time, each corresponding to a single point.</p> <p>It might be that there's no way to make plotting incoming points any faster, but I figured I'd ask.</p> <p><strong>EDIT</strong>: Updated OP with actual code I'm working with, rather than using a generic example that's up for misinterpretation.</p>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload