MATLAB: ¿la mejor manera de actualizar dinámicamente una línea maneja 'XData y YData?
Estoy recopilando datos y trazando esos datos en tiempo real. Los datos son producidos por un sistema de captura de movimiento. Tengo una claseDynamicDataset
que es solo un contenedor alrededor de una matriz de 2 columnas (aunque tiene más matices que eso) con un notificador de eventos para nuevos datos agregados; otra claseDynamicPlotter
que escucha el evento de datos agregados y actualiza el diagrama dinámicamente. Fragmentos de código apropiados:
classdef DynamicDataset < 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 < 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
Basado en el Perfil de Código MATLAB, elset
comando enupdatePlot()
es bastante caro. Me pregunto si hay una mejor manera de trazar puntos individuales a medida que surgen. Idealmente, empujaría el punto único aXData
yYData
y dibujar ese punto solamente, pero no sé si esto es posible.
Tenga en cuenta que puede haber varios objetos de serie lineal (es decir, múltiples gráficos en el mismo diagrama); @plot()
toma un identificador de ejes como argumento, por lo que no consideraría las propiedades de los identificadores de línea dibujados anteriormente (¿o hay alguna forma de hacerlo?); Pensé en solo hacerplot(x,y);hold all;
pero eso me daría identificadores de línea separados cada vez, cada uno correspondiente a un solo punto.
uede ser que no haya forma de hacer un trazado más rápido de los puntos entrantes, pero pensé en pregunta
EDITA: OP actualizado con el código real con el que estoy trabajando, en lugar de usar un ejemplo genérico que está mal interpretado.