Класс графика с переменным количеством линий

В этом примере показано, как определить класс графиков, которые могут отображать любое количество линий на основе размера данных пользователя. На графике отображаются столько линии, сколько столбцов в YData матрица. Для каждой линии график вычисляет локальную экстрему и указывает их местоположение с помощью круговых маркеров. Следующий код демонстрирует, как:

  • Задайте два свойства, называемые PlotLineArray и ExtremaArray которые хранят объекты для линий и маркеров, соответственно.

  • Реализуйте update метод, который заменяет содержимое PlotLineArray и ExtremaArray свойства с новыми объектами. Поскольку этот метод выполняет все команды графического изображения и строения, setup метод пуст. Это простой способ создать любое количество линий. Чтобы узнать, как создать этот график более эффективно, путем переиспользования существующих объектов линий, смотрите Оптимизированный класс графика для отображения переменного количества строк.

Чтобы определить класс, скопируйте этот код в редактор и сохраните его с именем LocalExtremaChart.m в папке с возможностью записи.

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

После сохранения файла класса можно создать образец графика. Для примера:

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);

Измените размер маркера на 8.

c.MarkerSize = 8;

См. также

Классы

Похожие темы