가변 개수의 선을 갖는 chart 클래스
이 예제에서는 사용자 데이터의 크기에 따라 임의 개수의 선을 표시할 수 있는 차트의 클래스를 정의하는 방법을 보여줍니다. 이 차트는 YData
행렬에 포함된 열의 개수만큼 선을 표시합니다. 각 선마다 차트는 국소 극값을 계산하고 해당 위치를 원형 마커로 나타냅니다. 아래의 코드는 다음 작업을 수행하는 방법을 보여줍니다.
각각 선과 마커에 대한 객체를 저장하는
PlotLineArray
및ExtremaArray
라는 2개의 속성을 정의합니다.PlotLineArray
속성 및ExtremaArray
속성의 내용을 새 객체로 대체하는update
메서드를 구현합니다. 이 메서드는 모든 플로팅 및 구성 명령을 실행하기 때문에setup
메서드는 비어 있습니다. 이는 임의 개수의 선을 만드는 간단한 방법입니다. 기존의 line 객체를 재사용하여 이 차트를 더 효율적으로 만드는 방법을 알아보려면 가변 개수의 선을 표시하도록 최적화된 chart 클래스 항목을 참조하십시오.
클래스를 정의하려면 다음 코드를 편집기에 복사하고 쓰기 가능한 폴더에 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;