我有一个简单的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是否有一些限制,以毫秒为单位处理次要刻度?
答案 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}}事件以格式化手动值。