Main Content

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 y ExtremaArray que almacenan los objetos de las líneas y de los marcadores, respectivamente.

  • Implementar un método update que sustituya los contenidos de las propiedades PlotLineArray y ExtremaArray con los nuevos objetos. Ya que este método ejecuta todos los comandos de configuración y representación, el método setup 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;

Consulte también

Clases

Temas relacionados