Zedgraph - 最后一个小刻度消失

时间:2015-02-24 16:57:49

标签: c# visual-studio plot charts zedgraph

我有一个简单的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是否有一些限制,以毫秒为单位处理次要刻度?

1 个答案:

答案 0 :(得分:1)

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使用days作为基本单位并缩放到毫秒级别,这最终会再次发生。

更好的解决方案是将基本单位缩短几秒甚至几毫秒,然后根本不使用AxisType.Date设置,并连接到ScaleFormatEvent的{​​{1}}事件以格式化手动值。