【问题标题】:Zedgraph - last minor ticks disappearZedgraph - 最后一个小刻度消失
【发布时间】:2015-02-24 16:57:49
【问题描述】:

我有一个从 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 在处理以毫秒为单位的微小刻度时是否有一些限制?

【问题讨论】:

标签: c# visual-studio plot charts zedgraph


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

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

【讨论】:

  • 感谢您的解释!我刚刚设置了 new XDate(1899, 12, 30, 0, 0, 5, 0) 并且它工作正常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-13
  • 1970-01-01
  • 2013-01-23
  • 1970-01-01
  • 2013-08-14
相关资源
最近更新 更多