绘制日期时间
此示例说明如何使用存储为 datetime
和 duration
数组的日期时间创建线图。datetime
数据类型表示时间点,如 2020 年 8 月 24 日上午 10:50:30,而 duration
数据类型表示时间长度,如 12 小时 30 分钟。大多数绘图函数接受 datetime
和 duration
数组作为 x、y 和 z 坐标,并以适当的日期时间单位显示刻度值。您可以使用 datetime
和 duration
值指定自己的坐标轴范围和刻度值。您还可以更改刻度值的格式,以显示您选择的日期时间单位。数据提示显示绘图中游标位置的 datetime
和 duration
值,您可以将这些值导出到工作区变量中。从电子表格或逗号分隔值 (CSV) 文件中读取数据时,您可以在绘图中包含日期时间数据。
绘制日期时间数据
您可以绘制 datetime
和 duration
数组,而无需将它们转换为数值数组。大多数绘图函数接受 datetime
和 duration
数组作为输入参量。
例如,绘制一个数据集,该数据集在 x 轴上有 datetime
值,在 y 轴上有数值。x 坐标是 2021 年 6 月和 7 月每天的 datetime
值。该绘图自动在 x 轴上以适当的格式显示刻度值。在这种情况下,适当的格式显示月份名称和日期以及年份。
XDates = [datetime(2021,6,1:30) datetime(2021,7,1:31)]; YNumsForXDates = sin(0:0.1:6); plot(XDates,YNumsForXDates)
同样,绘制一个在 x 轴上有 duration
值的数据集。要创建一个以秒为单位的 duration
数组,请使用 seconds
函数。
XTimes = seconds(0:120); YNumsForXTimes = cos(0:0.05:6); plot(XTimes,YNumsForXTimes)
指定坐标区范围
当您更改绘图上的范围时,为 datetime
和 duration
值显示的刻度值会自动更新。您可以通过交互方式或通过调用对应轴的 xlim
、ylim
或 zlim
函数来更新范围。将新范围指定为 datetime
或 duration
数组。如果您更改范围以放大或缩小到足够的程度,则刻度值可以显示其他日期时间分量,而不仅仅是新刻度值。
例如,绘制 XDates
和 YNumsForXDates
数组。然后使用 xlim
将 x 轴范围更改为 2021 年 6 月 20 日和 7 月 7 日。该绘图显示新刻度值。
plot(XDates,YNumsForXDates) xlim([datetime("2021-06-20") datetime("2021-07-07")])
将 x 轴范围更改为 2021 年 6 月 20 日和 6 月 22 日。刻度值以 hh:mm 格式显示小时和分钟分量,因为该绘图已放大到足以在 x 轴上显示更小的时间单位。
xlim([datetime("2021-06-20") datetime("2021-06-22")])
指定刻度值
您不必更改坐标区范围来更改刻度值。在这种情况下,您可以使用 xticks
、yticks
或 zticks
函数来指定自己的沿 x、y 或 z 轴的刻度值。将刻度值指定为 datetime
或 duration
数组。
例如,绘制 XTimes
和 YNumsForXTimes
数组。然后使用 xticks
指定 0、60 和 120 秒处的刻度值。
plot(XTimes,YNumsForXTimes) xticks(seconds([0 60 120]))
指定刻度格式
绘图函数使用默认格式将 datetime
和 duration
值显示为刻度值。要覆盖一个轴上刻度值的格式,请使用 xtickformat
、ytickformat
或 ztickformat
函数。
例如,绘制 XDates
和 YNumsForXDates
。使用 xtickformat
指定显示年、月和日期的刻度值格式。
plot(XDates,YNumsForXDates)
xtickformat("yyyy-MM-dd")
您也可以调用带 DatetimeTickFormat
或 DurationTickFormat
名称-值参量的 plot
。例如,以下对 plot
函数的调用创建相同的绘图。
plot(XDates,YNumsForXDates,"DatetimeTickFormat","yyyy-MM-dd")
但是,这些名称-值参量只能与 plot
函数结合使用。您可以在调用任何绘图函数(如 scatter
、stem
和 stairs
)后使用函数(如 xtickformat
)。
存储日期时间的坐标区属性
线图中的坐标轴范围、刻度标签的位置以及 datetime
和 duration
数组的 x、y 和 z 值也存储为 Axes
对象的属性。以下属性代表线图的前述内容。
XLim
,YLim
,ZLim
XTick
,YTick
,ZTick
XData
,YData
,ZData
例如,与 XDates
和 YNumsForXDates
的绘图相关联的 XLim
和 XTick
属性存储 datetime
值。获取该绘图的 Axes
对象并显示这些属性。
ax = gca; ax.XLim
ans = 1x2 datetime
2021-06-01 2021-08-03
ax.XTick
ans = 1x5 datetime
2021-06-01 2021-06-15 2021-06-29 2021-07-13 2021-07-27
导出和转换数据提示值
点击一个绘图时,您会在游标位置创建一个数据提示,显示其 x 和 y 坐标。数据提示显示数值以及 datetime
和 duration
值。但是,当您将游标数据导出到工作区时,系统以数值对形式报告坐标。要将导出的游标数据转换为 datetime
或 duration
值,请使用 num2ruler
函数。
例如,绘制 XDates
和 YNumsForXDates
。然后通过点击该绘图创建一个数据提示。
要将游标数据导出到工作区,请右键点击数据提示并选择将游标数据导出到工作区。此操作将游标数据导出为工作区的一个结构体。
cursor_info = struct with fields: Target: [1×1 Line] Position: [25 0.5985] DataIndex: 26
cursor_info.Position
字段将游标数据表示为数值对。与绘图相关联的 Axes
对象具有将 x 坐标的数值转换为 datetime
值所需的信息。获取绘图的 Axes
对象。然后将数值 x 坐标和 x 轴从 Axes
对象传递给 num2ruler
。
ax = gca; datetimePosition = num2ruler(cursor_info.Position(1),ax.XAxis) datetimePosition = datetime 26-Jun-2021
您不需要转换数值 y 坐标,cursor_info.Position(2)
,因为此绘图中的 y 值是数值。
绘制来自文件的日期时间数据
电子表格和 CSV 文件等数据文件通常将日期时间存储为格式化文本。从这类文件中读入数据时,可以将表示日期时间的文本转换为 datetime
或 duration
数组。然后您可以创建这些数据的绘图。
例如,从示例数据文件 outages.csv
创建一个数据绘图。此 CSV 文件包含六列数据。其中两列包含表示日期时间的文本。
Region,OutageTime,Loss,Customers,RestorationTime,Cause SouthWest,2002-02-01 12:18,458.9772218,1820159.482,2002-02-07 16:50,winter storm SouthEast,2003-01-23 00:49,530.1399497,212035.3001,,winter storm SouthEast,2003-02-07 21:15,289.4035493,142938.6282,2003-02-17 08:14,winter storm ...
从 CSV 文件中读取数据的推荐方法是使用 readtable
函数。此函数从文件中读取数据,并以表的形式将它返回。
在 outages.csv
中进行读取。readtable
函数自动将 OutageTime
和 RestorationTime
列中的文本转换为 datetime
数组。表示数值的列(Loss
和 Customers
)作为数值数组读入。其余的列作为字符串读入。该表将 outages.csv
中的数据列存储在同名的表变量中。最后,使用 sortrows
函数,按照 OutageTime
中的日期时间对 T
中的行进行排序。如果表没有按时间排序,则最好在绘制或分析数据之前按时间对其排序。
T = readtable("outages.csv","TextType","string"); T = sortrows(T,"OutageTime")
T=1468×6 table
Region OutageTime Loss Customers RestorationTime Cause
___________ ________________ ______ __________ ________________ __________________
"SouthWest" 2002-02-01 12:18 458.98 1.8202e+06 2002-02-07 16:50 "winter storm"
"MidWest" 2002-03-05 17:53 96.563 2.8666e+05 2002-03-10 14:41 "wind"
"MidWest" 2002-03-16 06:18 186.44 2.1275e+05 2002-03-18 23:23 "severe storm"
"MidWest" 2002-03-26 01:59 388.04 5.6422e+05 2002-03-28 19:55 "winter storm"
"MidWest" 2002-04-20 16:46 23141 NaN NaT "unknown"
"SouthWest" 2002-05-08 20:34 50.732 34481 2002-05-08 22:21 "thunder storm"
"MidWest" 2002-05-18 11:04 1389.1 1.3447e+05 2002-05-21 01:22 "unknown"
"NorthEast" 2002-05-20 10:57 9116.6 2.4983e+06 2002-05-21 15:22 "unknown"
"SouthEast" 2002-05-27 09:44 237.28 1.7101e+05 2002-05-27 16:19 "wind"
"SouthEast" 2002-06-02 16:11 0 0 2002-06-05 05:55 "energy emergency"
"West" 2002-06-06 19:28 311.86 NaN 2002-06-07 00:51 "equipment fault"
"SouthEast" 2002-06-17 23:01 42.542 39877 2002-06-17 23:49 "thunder storm"
"MidWest" 2002-07-01 04:33 203.94 60650 2002-07-02 14:54 "severe storm"
"MidWest" 2002-07-01 08:18 100.71 1.8116e+05 2002-07-01 11:33 "severe storm"
"MidWest" 2002-07-10 01:49 168.02 NaN 2002-07-10 17:20 "equipment fault"
"SouthEast" 2002-07-14 21:32 90.83 60133 2002-07-14 23:53 "thunder storm"
⋮
您可以使用圆点表示法来访问表变量,通过名称引用表变量。使用圆点表示法,您可以像对待数组一样对待表变量。
绘制电力损失对停电时间的图。要从表中访问这些变量,请使用圆点表示法。
plot(T.OutageTime,T.Loss)
计算停电的持续时间,并绘制持续时间对 OutageTime
的图。要计算持续时间,请从 RestorationTime
中减去 OutageTime
。结果 OutageDuration
是一个 duration
数组,因为用 datetime
值进行算术运算会产生时间长度作为输出。其中一些停电持续时间很长,因此使用 ytickformat
将 y 轴刻度值的格式从小时更改为年。一些停电持续数年,这表明文件中可能存在一些有问题的数据值。根据您计划如何分析数据,您可以通过某种方式重新处理数据,或删除包含错误值的行。
OutageDuration = T.RestorationTime - T.OutageTime;
plot(T.OutageTime,OutageDuration)
ytickformat("y")
另请参阅
plot
| datetime
| duration
| seconds
| readtable
| sortrows
| xlim
| xtickformat
| xticks