Main Content

绘制日期时间

此示例说明如何使用存储为 datetimeduration 数组的日期时间创建线图。datetime 数据类型表示时间点,如 2020 年 8 月 24 日上午 10:50:30,而 duration 数据类型表示时间长度,如 12 小时 30 分钟。大多数绘图函数接受 datetimeduration 数组作为 xyz 坐标,并以适当的日期时间单位显示刻度值。您可以使用 datetimeduration 值指定自己的坐标轴范围和刻度值。您还可以更改刻度值的格式,以显示您选择的日期时间单位。数据提示显示绘图中游标位置的 datetimeduration 值,您可以将这些值导出到工作区变量中。从电子表格或逗号分隔值 (CSV) 文件中读取数据时,您可以在绘图中包含日期时间数据。

绘制日期时间数据

您可以绘制 datetimeduration 数组,而无需将它们转换为数值数组。大多数绘图函数接受 datetimeduration 数组作为输入参量。

例如,绘制一个数据集,该数据集在 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)

Figure contains an axes object. The axes object contains an object of type line.

同样,绘制一个在 x 轴上有 duration 值的数据集。要创建一个以秒为单位的 duration 数组,请使用 seconds 函数。

XTimes = seconds(0:120);
YNumsForXTimes = cos(0:0.05:6);
plot(XTimes,YNumsForXTimes)

Figure contains an axes object. The axes object contains an object of type line.

指定坐标区范围

当您更改绘图上的范围时,为 datetimeduration 值显示的刻度值会自动更新。您可以通过交互方式或通过调用对应轴的 xlimylimzlim 函数来更新范围。将新范围指定为 datetimeduration 数组。如果您更改范围以放大或缩小到足够的程度,则刻度值可以显示其他日期时间分量,而不仅仅是新刻度值。

例如,绘制 XDatesYNumsForXDates 数组。然后使用 xlimx 轴范围更改为 2021 年 6 月 20 日和 7 月 7 日。该绘图显示新刻度值。

plot(XDates,YNumsForXDates)
xlim([datetime("2021-06-20") datetime("2021-07-07")])

Figure contains an axes object. The axes object contains an object of type line.

x 轴范围更改为 2021 年 6 月 20 日和 6 月 22 日。刻度值以 hh:mm 格式显示小时和分钟分量,因为该绘图已放大到足以在 x 轴上显示更小的时间单位。

xlim([datetime("2021-06-20") datetime("2021-06-22")])

Figure contains an axes object. The axes object contains an object of type line.

指定刻度值

您不必更改坐标区范围来更改刻度值。在这种情况下,您可以使用 xticksytickszticks 函数来指定自己的沿 xyz 轴的刻度值。将刻度值指定为 datetimeduration 数组。

例如,绘制 XTimesYNumsForXTimes 数组。然后使用 xticks 指定 0、60 和 120 秒处的刻度值。

plot(XTimes,YNumsForXTimes)
xticks(seconds([0 60 120]))

Figure contains an axes object. The axes object contains an object of type line.

指定刻度格式

绘图函数使用默认格式将 datetimeduration 值显示为刻度值。要覆盖一个轴上刻度值的格式,请使用 xtickformatytickformatztickformat 函数。

例如,绘制 XDatesYNumsForXDates。使用 xtickformat 指定显示年、月和日期的刻度值格式。

plot(XDates,YNumsForXDates)
xtickformat("yyyy-MM-dd")

Figure contains an axes object. The axes object contains an object of type line.

您也可以调用带 DatetimeTickFormatDurationTickFormat 名称-值参量的 plot。例如,以下对 plot 函数的调用创建相同的绘图。

plot(XDates,YNumsForXDates,"DatetimeTickFormat","yyyy-MM-dd")

但是,这些名称-值参量只能与 plot 函数结合使用。您可以在调用任何绘图函数(如 scatterstemstairs)后使用函数(如 xtickformat)。

存储日期时间的坐标区属性

线图中的坐标轴范围、刻度标签的位置以及 datetimeduration 数组的 xyz 值也存储为 Axes 对象的属性。以下属性代表线图的前述内容。

  • XLim, YLim, ZLim

  • XTick, YTick, ZTick

  • XData, YData, ZData

例如,与 XDatesYNumsForXDates 的绘图相关联的 XLimXTick 属性存储 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

导出和转换数据提示值

点击一个绘图时,您会在游标位置创建一个数据提示,显示其 xy 坐标。数据提示显示数值以及 datetimeduration 值。但是,当您将游标数据导出到工作区时,系统以数值对形式报告坐标。要将导出的游标数据转换为 datetimeduration 值,请使用 num2ruler 函数。

例如,绘制 XDatesYNumsForXDates。然后通过点击该绘图创建一个数据提示。

DatetimeDataTip.png

要将游标数据导出到工作区,请右键点击数据提示并选择将游标数据导出到工作区。此操作将游标数据导出为工作区的一个结构体。

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 文件等数据文件通常将日期时间存储为格式化文本。从这类文件中读入数据时,可以将表示日期时间的文本转换为 datetimeduration 数组。然后您可以创建这些数据的绘图。

例如,从示例数据文件 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 函数自动将 OutageTimeRestorationTime 列中的文本转换为 datetime 数组。表示数值的列(LossCustomers)作为数值数组读入。其余的列作为字符串读入。该表将 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"    01-Feb-2002 12:18:00    458.98    1.8202e+06    07-Feb-2002 16:50:00    "winter storm"    
    "MidWest"      05-Mar-2002 17:53:00    96.563    2.8666e+05    10-Mar-2002 14:41:00    "wind"            
    "MidWest"      16-Mar-2002 06:18:00    186.44    2.1275e+05    18-Mar-2002 23:23:00    "severe storm"    
    "MidWest"      26-Mar-2002 01:59:00    388.04    5.6422e+05    28-Mar-2002 19:55:00    "winter storm"    
    "MidWest"      20-Apr-2002 16:46:00     23141           NaN                     NaT    "unknown"         
    "SouthWest"    08-May-2002 20:34:00    50.732         34481    08-May-2002 22:21:00    "thunder storm"   
    "MidWest"      18-May-2002 11:04:00    1389.1    1.3447e+05    21-May-2002 01:22:00    "unknown"         
    "NorthEast"    20-May-2002 10:57:00    9116.6    2.4983e+06    21-May-2002 15:22:00    "unknown"         
    "SouthEast"    27-May-2002 09:44:00    237.28    1.7101e+05    27-May-2002 16:19:00    "wind"            
    "SouthEast"    02-Jun-2002 16:11:00         0             0    05-Jun-2002 05:55:00    "energy emergency"
    "West"         06-Jun-2002 19:28:00    311.86           NaN    07-Jun-2002 00:51:00    "equipment fault" 
    "SouthEast"    17-Jun-2002 23:01:00    42.542         39877    17-Jun-2002 23:49:00    "thunder storm"   
    "MidWest"      01-Jul-2002 04:33:00    203.94         60650    02-Jul-2002 14:54:00    "severe storm"    
    "MidWest"      01-Jul-2002 08:18:00    100.71    1.8116e+05    01-Jul-2002 11:33:00    "severe storm"    
    "MidWest"      10-Jul-2002 01:49:00    168.02           NaN    10-Jul-2002 17:20:00    "equipment fault" 
    "SouthEast"    14-Jul-2002 21:32:00     90.83         60133    14-Jul-2002 23:53:00    "thunder storm"   
      ⋮

您可以使用圆点表示法来访问表变量,通过名称引用表变量。使用圆点表示法,您可以像对待数组一样对待表变量。

绘制电力损失对停电时间的图。要从表中访问这些变量,请使用圆点表示法。

plot(T.OutageTime,T.Loss)

Figure contains an axes object. The axes object contains an object of type line.

计算停电的持续时间,并绘制持续时间对 OutageTime 的图。要计算持续时间,请从 RestorationTime 中减去 OutageTime。结果 OutageDuration 是一个 duration 数组,因为用 datetime 值进行算术运算会产生时间长度作为输出。其中一些停电持续时间很长,因此使用 ytickformaty 轴刻度值的格式从小时更改为年。一些停电持续数年,这表明文件中可能存在一些有问题的数据值。根据您计划如何分析数据,您可以通过某种方式重新处理数据,或删除包含错误值的行。

OutageDuration = T.RestorationTime - T.OutageTime;
plot(T.OutageTime,OutageDuration)
ytickformat("y")

Figure contains an axes object. The axes object contains an object of type line.

另请参阅

| | | | | | | |

相关主题