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