Matlab:绘制日期时间
- 绘制日期时间数据
- 指定坐标区范围
- 指定刻度值
- 指定刻度格式
- 存储日期时间的坐标区属性
- 导出和转换数据提示值
- 绘制来自文件的日期时间数据
此示例说明如何使用存储为 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")
该博文为原创文章,未经博主同意不得转。
本文章博客地址:https://cplusplus.blog.csdn.net/article/details/127901815