使用日期时间轴打印数据

C#可以用DateTime类型,但ScottPlot的所有方法都更喜欢double数组。本页介绍如何使用ScottPlot绘制具有时间轴的数据。

💡 TLDR:转换DateTimedouble使用DateTime.ToOATime()在策划之前,请致电XAxis.DateTimeFormat(true)以正确的格式显示轴标记标签。

散点图

  • 如果时间点间隔不均匀,应使用散点图(否则应考虑信号图)。
  • 使用LINQ和DateTime.ToOATime()皈依DateTime[]double[]在策划之前
  • 呼叫XAxis.DateTimeFormat(true)要指示轴,刻度标签的格式应为DateTime值(而不是默认的数字格式)
// generate sample data (arrays of individual DateTimes and values)
int pointCount = 100;
Random rand = new Random(0);
double[] values = ScottPlot.DataGen.RandomWalk(rand, pointCount);
DateTime[] dates = Enumerable.Range(0, pointCount)
                              .Select(x => new DateTime(2016, 06, 27).AddDays(x))
                              .ToArray();

// use LINQ and DateTime.ToOADate() to convert DateTime[] to double[]
double[] xs = dates.Select(x => x.ToOADate()).ToArray();

// plot the double arrays using a traditional scatter plot
var plt = new ScottPlot.Plot(600, 400);
plt.AddScatter(xs, values);

// indicate the horizontal axis tick labels should display DateTime units
plt.XAxis.DateTimeFormat(true);

// add padding to the right to prevent long dates from flowing off the figure
plt.YAxis2.SetSizeLimit(min: 40);

// save the output
plt.Title("Scatter Plot with DateTime Axis");
plt.SaveFig("../../../datetime-scatter.png");

此应用程序的源代码是在GitHub上提供

信号图

  • 与散点图相比,信号图提供了巨大的性能提升
  • 信号图计算X位置sample rateoffset
  • 价值sample rate是每天的样本数:
    • 每日:sampleRate = 1
    • 每小时:sampleRate = 24
    • 分钟:sampleRate = 24 * 60
    • 第二:sampleRate = 24 * 60 * 60
    • 毫秒:sampleRate = 24 * 60 * 60 * 1000
// generate sample data (array of values with a single starting DateTime)
int pointCount = 100;
Random rand = new Random(1);
double[] values = ScottPlot.DataGen.RandomWalk(rand, pointCount);
DateTime firstDay = new DateTime(2016, 06, 27);
double samplesPerDay = (24 * 60); // one sample per minute

// plot the double arrays using a traditional scatter plot
var plt = new ScottPlot.Plot(600, 400);
var sig = plt.AddSignal(values, sampleRate: samplesPerDay);
sig.OffsetX = firstDay.ToOADate();

// indicate the horizontal axis tick labels should display DateTime units
plt.XAxis.DateTimeFormat(true);

// add padding to the right to prevent long dates from flowing off the figure
plt.YAxis2.SetSizeLimit(min: 40);

// save the output
plt.Title("Signal Plot with DateTime Axis");
plt.SaveFig("../../../datetime-signal.png");

笔记

  • 👉 ScottPlot Cookbook提供了额外的信息和代码示例,展示了先进的日期时间刻度标签功能

  • 轴还有其他选项用于标记格式,包括为日期到字符串的转换定义格式字符串的功能,以及指示要使用的区域性的功能(例如,不同的区域性周期、连字符或破折号来分隔月份和年份)。