Clase de gráficas con número variable de líneas
Este ejemplo muestra la manera de definir una clase de gráficas que pueda mostrar cualquier número de líneas según el tamaño de los datos del usuario. La gráfica muestra tantas líneas como columnas haya en la matriz YData
. Para cada línea, la gráfica calcula los extremos locales e indica sus ubicaciones con marcadores circulares. El siguiente código muestra la manera de:
Definir dos propiedades llamadas
PlotLineArray
yExtremaArray
que almacenan los objetos de las líneas y de los marcadores, respectivamente.Implementar un método
update
que sustituya los contenidos de las propiedadesPlotLineArray
yExtremaArray
con los nuevos objetos. Ya que este método ejecuta todos los comandos de configuración y representación, el métodosetup
está vacío. Esta es una forma sencilla de crear cualquier número de líneas. Para obtener información acerca de cómo crear esta gráfica de forma más eficiente, reutilizando los objetos de línea existentes, consulte Optimized Chart Class for Displaying Variable Number of Lines.
Para definir la clase, copie este código en el editor y guárdelo con el mismo nombre de LocalExtremaChart.m
en una carpeta grabable.
classdef LocalExtremaChart < matlab.graphics.chartcontainer.ChartContainer % c = LocalExtremaChart('XData',X,'YData',Y,Name,Value,...) % plots one line with markers at local extrema for every column of matrix Y. % You can also specify the additonal name-value arguments, 'MarkerColor' % and 'MarkerSize'. properties XData (1,:) double = NaN YData (:,:) double = NaN MarkerColor {validatecolor} = [1 0 0] MarkerSize (1,1) double = 5 end properties(Access = private,Transient,NonCopyable) PlotLineArray (:,1) matlab.graphics.chart.primitive.Line ExtremaArray (:,1) matlab.graphics.chart.primitive.Line end methods(Access = protected) function setup(~) end function update(obj) % get the axes ax = getAxes(obj); % Plot Lines and the local extrema obj.PlotLineArray = plot(ax,obj.XData,obj.YData); hold(ax,'on') % Replicate x-coordinate vectors to match size of YData newx = repmat(obj.XData(:),1,size(obj.YData,2)); % Find local minima and maxima and plot markers tfmin = islocalmin(obj.YData,1); tfmax = islocalmax(obj.YData,1); obj.ExtremaArray = plot(ax,newx(tfmin),obj.YData(tfmin),'o',... newx(tfmax),obj.YData(tfmax),'o',... 'MarkerEdgeColor','none',... 'MarkerFaceColor',obj.MarkerColor,... 'MarkerSize',obj.MarkerSize); hold(ax,'off') end end end
Después de guardar el archivo de clases, puede crear una instancia de la gráfica. Por ejemplo:
x = linspace(0,3); y1 = cos(5*x)./(1+x.^2); y2 = -cos(5*x)./(1+x.^3); y3 = sin(x)./2; y = [y1' y2' y3']; c = LocalExtremaChart('XData',x,'YData',y);
Cambie el tamaño del marcador a 8
.
c.MarkerSize = 8;