自定义 LINQPad 图表中时间序列数据的 x 轴刻度和标签

Customise the x-axis ticks and labels for time series data in LINQPad charts

我有一个简单的 CSV 日志文件,将其读入列表并在 LINQPad 中绘制图表非常容易,但我想更新格式和 x 轴上的刻度。

这是我的代码:

File.ReadAllLines(@"\...\ModelTimes.csv")
    .Skip(1)
    .Select(line => line.Split(','))
    .Select(data => new
        {
            CurrentTime = DateTime.Parse(data[0]),
            ModelTime = DateTime.Parse(data[1]),
            ModelAgeHours = Decimal.Parse(data[2]),
            CutOff = 2
        })
    .Where(data => data.CurrentTime.Date == new DateTime(2021, 9, 24))
    .Chart(data => data.CurrentTime)
    .AddYSeries(data => data.ModelAgeHours, LINQPad.Util.SeriesType.Line, "Model Age")
    .AddYSeries(data => data.CutOff, LINQPad.Util.SeriesType.Line, "2 Hours")

输出: 如您所见,我得到的只是日期而不是 x 轴上的时间。有什么方法可以将标签和滴答声的频率配置为: 2021-09-24 10:00 并且每 2 小时 1 个刻度。

多亏了 Joe Albahari's 我已经开始工作了,我还自定义了数据点上的工具提示。

使用 .ToWindowsChart() 给你一个 System.Windows.Forms.DataVisualization.Charting.Chart 从那里你可以访问 xAxis 进行定制。我还向 chart.GetToolTipText 事件添加了一个处理程序来设置自定义文本以显示 x 和 y 值。

var times = File.ReadAllLines(@"\...\ModelTimes.csv")
    .Skip(1)
    .Select(line => line.Split(','))
    .Select(data => new
        {
            CurrentTime = DateTime.Parse(data[0]),
            ModelTime = DateTime.Parse(data[1]),
            ModelAgeHours = Decimal.Parse(data[2]),
            CutOff = 2
        })
    .Where(data => data.CurrentTime >= DateTime.Now.AddDays(-4)).OrderByDescending(data => data.CurrentTime);

var chart = times
    .Chart(data => data.CurrentTime)
    .AddYSeries(data => data.ModelAgeHours, LINQPad.Util.SeriesType.Line, "Model Age")
    .AddYSeries(data => data.CutOff, LINQPad.Util.SeriesType.Line, "2 Hours")
    .ToWindowsChart();
var xAxis = chart.ChartAreas[0].AxisX;
xAxis.IntervalType = DateTimeIntervalType.Hours;
xAxis.Interval = 4;
xAxis.LabelStyle.Format = "MMM dd HH:mm";
xAxis.LabelStyle.Angle = 90;
xAxis.MinorTickMark = new TickMark {
        Enabled = true,
        IntervalType = DateTimeIntervalType.Hours,
        TickMarkStyle = TickMarkStyle.OutsideArea,
        Interval = 2,
};
chart.GetToolTipText += (_, e) =>
    {
        if (e.HitTestResult.ChartElementType == ChartElementType.DataPoint) 
        {
            var data = e.HitTestResult.Series.Points[e.HitTestResult.PointIndex];
            e.Text = $"({DateTime.FromOADate(data.XValue):MMM dd HH:mm}, {data.YValues[0]:0.00})";
        }
    };
chart.Dump();   

结果: