代码之家  ›  专栏  ›  技术社区  ›  drharris

MS图表中的自动间隔精度

  •  14
  • drharris  · 技术社区  · 16 年前

    我目前正在使用.NET中的图表 System.Windows.Forms.DataVisualization.Charting.Chart 。到目前为止,它似乎非常强大,而且工作得很好。然而,在如何自动计算间隔方面存在着一个巨大的问题。我用了很多 double 值,在Zedgraph之类的库中,它可以完美地处理这个问题。它选择了最小/最大/间隔。然而,在MS图表中,它可以选择206.3334539832作为最小值,以及具有类似小数精度的间隔。显然这看起来很难看。

    所以,我试着简单地制作轴格式 {0.00} 当它加载图表时,它工作得很好。除非放大,否则需要更高的精度,可能是4位小数,而不是2位小数。似乎我要么一直坚持9位小数,要么就是一个固定不变的数字,当有人需要更高的精度时,它可能会中断。我希望它能根据当前应用的缩放级别提高精度。Zedgraph和Dundas等图书馆(我相信微软甚至在使用!)倾向于选择在放大和缩小时变化的好值。

    有没有办法让间隔随着缩放帧的变化而改变精度?这可能是我设置错误的一些简单属性,但很难用它拥有的数百万个属性来判断(特别是当有大约14个位置代表间隔的概念时)。

    7 回复  |  直到 9 年前
        1
  •  5
  •   Kirk Woll    15 年前

    我在缩放时也遇到了同样的问题。我添加了代码来格式化轴标签,并从画图处理程序调用它。轴视图对象具有IsZoomed属性,并且具有获取当前轴限制(GetViewMinimum/Maximum)的函数。我将所有情况下的轴labelstyle.format设置为“n”,除非max-min=范围小于1。然后,我将格式设置为“f”,其中是根据轴范围计算的。

    # = Convert.ToInt32(Math.Abs(Math.Log10(range) - .5)) + 1;
    
        2
  •  1
  •   Richard Smith    15 年前

    玩过图表控件之后,我找不到解决您问题的简单方法。但是,以下可能有帮助:

    您是否考虑自己设置轴的最大值和最小值?如果将实际的最大值和最小值四舍五入到最接近的合理“四舍五入”数字(5、10、0.5、0.01),这将使计算的间隔更加友好。

    我理解这不是一个理想的解决方案,但通过仔细选择最大值和/或最小值,可以确保间隔是“更好”的数字。如果轴的范围可以被2、5和10整除,则会产生相当好的间隔。

        3
  •  1
  •   hungryMind    15 年前

    为什么不修改数字格式字符串?

    创建格式字符串

    string formatString = "{0.00";
    

    标识缩放级别,表示缩放级别=2;

    formatString = formatString.PadRight(5+zoomLevel, '0');
    formatString += "}";
    

    现在在轴图例上使用此格式。使用字符串生成器或更好的方法修改格式字符串。

        4
  •  0
  •   gabba    15 年前

    为了以最低的成本提供结果,您可以使用指数科学格式

        5
  •  0
  •   Å¡ljaker    15 年前

    你可以附加到 定制 事件。 从这里,可以修改X轴上的标签:

    var xAxisLabels = chart1.ChartAreas[0].AxisX.CustomLabels;
    ...
    xAxisLabels[0].Text = ...
    

    设置最小值和最大值:

     chart1.ChartAreas[0].AxisX.Maximum = ...;
    

    等。

        6
  •  0
  •   JOE SKEET    15 年前

    可以根据数据集动态更新最大值和最小值。每次用户放大时,您都会在每个点上做一个前臂,并获取统计数据,然后根据这些数据设置最大值和最小值。

        7
  •  0
  •   Austin Henley    14 年前

    它有助于设置轴的IntervalOffset,例如:

    Private Sub chMap_AxisViewChanged(sender As System.Object, e As System.Windows.Forms.DataVisualization.Charting.ViewEventArgs) Handles chMap.AxisViewChanged
      'the grid ticks are rounded values
      e.Axis.IntervalOffset = -e.Axis.ScaleView.ViewMinimum
    End Sub