具有可变数量的线条的图类
此示例说明如何定义一个图类,该图类可以根据用户数据的大小显示任意数量的线条。图显示的线条数与 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;