主要内容

包含两个交互图的图表类

这个例子展示了如何定义一个类来使用两个具有交互特性的轴来可视化时间表数据。顶部的轴具有沿x维度,以便用户可以检查感兴趣的区域。底部的坐标轴显示了整个时间范围内的图形。底部轴还显示一个浅蓝色的时间窗口,表示顶部轴中的时间范围。该类定义了以下属性、方法和局部函数。

属性:

  • 数据-存储时间表的公共和附属财产。

  • 期限-一个公共属性,用于设置顶部轴的限制和底部轴的时间窗口的宽度。

  • SavedData—一个受保护的属性,使用户能够保存和加载图表实例并保存数据。

  • TopAxesBottomAxes—存储轴对象的私有属性。

  • 背线底线—存储行对象的私有属性。

  • TimeWindow—下面坐标轴显示的是补丁对象,表示上面坐标轴的时间范围。

方法:

  • 集。数据得到的。数据—允许用户保存和加载图表实例,并保存数据。

  • 设置—创建图表时执行一次。它配置布局和轴、线对象和补丁对象。

  • 更新-在设置方法,并在用户更改图表上的一个或多个属性之后。

  • panZoom-当用户在顶部轴内平移或缩放时,更新图表的时间限制。这将导致时间窗口更新以反映新的限制。

  • 点击—重新计算用户单击底部轴时的时间限制。

本地函数:

  • updateDataTipTemplate-从里面叫的更新方法。它在数据提示中创建与时间表中的变量相对应的行。

  • mustHaveOneNumericVariable——验证数据财产。此函数确保用户指定的时间表至少有一个数字变量。

要定义类,请将以下代码复制到编辑器中,并使用名称保存它TimeTableChart.m在一个可写文件夹中。

classdefTimeTableChart < matlab.graphics.chartcontainer.ChartContainer属性(依赖)数据时间表{mustHaveOneNumericVariable}...时间表(datetime.empty (0, 1), 0 (0,1))结束属性期限(1、2)datetime= (NaT NaT)结束属性(Access = protected) SavedData时间表=时间表(datetime.empty (0, 1), 0 (0,1))结束属性(Access = private, Transient, NonCopyable) TopAxesmatlab.graphics.axis.Axes背线matlab.graphics.chart.primitive.LineBottomAxesmatlab.graphics.axis.Axes底线matlab.graphics.chart.primitive.LineTimeWindowmatlab.graphics.primitive.Patch结束方法函数集。数据(obj, tbl)如果行时间改变,则重置时间限制。下来= obj.SavedData.Properties.RowTimes;新时期= tbl.Properties.RowTimes;如果~ isequal下来,新时期obj。TimeLimits = [NaT NaT];结束%存储新表。obj。SavedData =(资源;结束函数tbl = get.Data(obj) tbl = obj. saveddata;结束结束方法(访问=保护)函数设置(obj)创建两个轴。上面的轴比下面的轴高3倍。tcl = getLayout (obj);tcl。GridSize = [4 1];obj。TopAxes = nexttile(tcl, 1, [3 1]);obj。下面的例子是:在布局中添加共享工具栏,删除%工具栏。axtoolbar (tcl,“默认”);%创建一行以显示放大的数据。obj。背线=情节(obj。TopAxes NaT, NaN);%创建一行以显示数据的概述,并禁用% HitTest,所以ButtonDownFcn在底部轴工作。obj。底线=情节(obj。BottomAxes NaT,南...“HitTest”“关闭”);%创建补丁以显示当前的时间限制。obj。TimeWindow =补丁(obj。BottomAxes,...“脸”1:4,...“顶点”南(4,2)...“FaceColor”obj.TopLine.Color,...“FaceAlpha”, 0.3,...“EdgeColor”“没有”...“HitTest”“关闭”);%限制轴移动/缩放到仅x维。obj.TopAxes.Interactions = [...dataTipInteraction;panInteraction (“维度”“x”);rulerPanInteraction (“维度”“x”);zoomInteraction (“维度”“x”));%禁用底部轴的平移/缩放。obj.BottomAxes.Interactions = [];%向XLim添加侦听器以响应缩放事件。addlistener (obj。TopAxes,“XLim”“PostSet”, @(~, ~) panZoom(obj));%为底部轴上的点击添加回调。obj. bottomax . buttondownfcn = @(~, ~)点击(obj);结束函数更新(obj)%从表中提取时间数据。台= obj.Data;t = tbl.Properties.RowTimes;%从表中提取数值变量。S = vartype (“数字”);numericTbl =(资源(:,S);%更新这两行数据。集(obj。底线obj。背线),“XData”t“YData”numericTbl {: 1});%为时间表中的每个变量创建一个dataTipTextRow。updateDataTipTemplate (obj。背线,(资源)%更新顶部轴的限制。obj.TopAxes.YLimMode =“汽车”如果obj.TimeLimits(1) < obj.TimeLimits(2) obj. topax . xlim = obj.TimeLimits;其他的%当前时间限制无效,因此将XLimMode设置为auto和%让坐标轴根据可用数据计算极限。obj.TopAxes.XLimMode =“汽车”;obj。期限= obj.TopAxes.XLim;结束%更新时间窗口以反映新的时间限制。xLimits = ruler2num (obj。期限,obj。BottomAxes.XAxis); yLimits = obj.BottomAxes.YLim; obj.TimeWindow.Vertices = [xLimits([1 1 2 2]); yLimits([1 2 2 1])]';结束函数panZoom (obj)%当顶部轴上的XLim改变时,更新时间限制。obj。期限= obj.TopAxes.XLim;结束函数点击(obj)当点击底部坐标轴时,将时间限制重新对齐。%使用CurrentPoint找到单击的中心。中心= obj.BottomAxes.CurrentPoint (1,1);%使用num2标尺从数字单位转换为日期时间。center = num2ruler(center, obj.BottomAxes.XAxis);找到当前时间限制的宽度。宽度= diff (obj.TimeLimits);%重新设置当前时间限制。obj。TimeLimits = center +[-1 1]*宽度/2;结束结束结束函数updateDataTipTemplate (obj(资源)%为时间表中的每个变量创建一个dataTipTextRow。timeVariable = tbl.Properties.DimensionNames {1};= dataTipTextRow(timeVariable, tbl.(timeVariable));n = 1:numel(tbl.Properties.VariableNames) rows(n+1,1) = dataTipTextRow(...tbl.Properties。VariableNames {n},台{:n});结束obj.DataTipTemplate.DataTipRows =行;结束函数mustHaveOneNumericVariable(台)数据属性的验证函数。S = vartype (“数字”);如果宽度(tbl(:,S)) < 1错误(“TimeTableChart: InvalidTable”...'表必须至少有一个数值变量'结束结束

保存类文件后,创建图表的实例。在这种情况下,使用图表来检查一年中几周的自行车交通数据。

bikeTbl = readtimetable (“BicycleCounts.csv”);bikeTbl = bikeTbl (169:8954:);Tlimits = [datetime(2015,8,6) datetime(2015,8,27)];TimeTableChart (“数据”bikeTbl,“期限”, tlimits);

另请参阅

功能

属性

相关的话题