Стройте диаграмму класса с переменным количеством линий

В этом примере показано, как задать класс графиков, которые могут отобразить любое количество линий на основе размера данных пользователя. Отображения графика столько же линий сколько существуют столбцы в 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;

Смотрите также

Классы

Похожие темы