Zedgraph - 最后的小刻度消失

Zedgraph - last minor ticks disappear

我有一个简单的时间序列图,从 0 到 5 秒。

        GraphPane pane = zedGraph.GraphPane;
        pane.XAxis.Type = AxisType.Date;
        pane.XAxis.Scale.Format = "mm:ss.fff";
        pane.XAxis.Scale.Min = new XDate(2011, 2, 5, 0, 0, 0, 0);
        pane.XAxis.Scale.Max = new XDate(2011, 2, 5, 0, 0, 5, 0);

        pane.YAxis.Scale.MajorStep = 1;
        pane.YAxis.Scale.Min = -1.0;
        pane.YAxis.Scale.Max = 3.0;

        zedGraph.IsEnableWheelZoom = true;
        zedGraph.AxisChange();
        zedGraph.Invalidate();

次刻度应小于 1 秒。但是 zedgraph 不会在每个主要刻度之前显示每个最后一个次要刻度。

如果我缩小到小比例 > 1 秒,它会正常显示。 当我更改大调和小调时,在大刻度之前可能会缺少几个刻度:

        pane.XAxis.Scale.MajorUnit = DateUnit.Second;
        pane.XAxis.Scale.MajorStep = 1;
        pane.XAxis.Scale.MinorUnit = DateUnit.Second;
        pane.XAxis.Scale.MinorStep = 0.10;

Zedgraph 在处理以毫秒为单位的微小刻度时是否有一些限制?

这似乎是 Axis.DrawMinorTics 方法中的一个问题。

轴值是双精度,XDate 使用天作为基本单位,2011,2,5 和 2011,2,5,0,0,5 转换为双精度,如 40579.0 和 40579.000057870522

在计算是否绘制次要刻度时,会使用一个epsilon值来比较刻度值与下一个主要值。在这种情况下,epsilon 是 1e-10。鉴于 XDate 的基数与毫秒相比如此之大,此比较计算开始变得非常小。

如何解决这个问题:

如果您直接使用源代码,您可以更新 Axis.DrawMiorTicks 以使用较小的 epsilon。 1e-20应该足够小了。

如果使用二进制版本(例如 nuget 包),您可以将所有日期值偏移起始值,这样日期就小得多,计算也不太可能变得那么小。

var start = new XDate(2011, 2, 5);
pane.XAxis.Scale.Min = new XDate(2011, 2, 5, 0, 0, 0, 0) - start;
pane.XAxis.Scale.Max = new XDate(2011, 2, 5, 0, 0, 5, 0) - start;

然而,这并不能保证某些值不会再次发生,因为 XDate 使用天作为基本单位并缩放到毫秒级,这最终会再次发生。

更好的解决方案是将秒甚至毫秒作为基本单位,根本不使用 AxisType.Date 设置,并连接到 XAxisScaleFormatEvent 事件以手动格式化您的值。