MS图表中的自动间隔精度

我目前正在使用System.Windows.Forms.DataVisualization.Charting.Chart在.NET中使用图表。 到目前为止,它似乎非常强大,而且效果很好。 然而,就如何自动计算间隔而言存在巨大的问题。 我使用了很多double值,在像ZedGraph这样的库中,它完美地处理了这个问题。 它选择最小/最大/间隔就好了。 但是,在MS Chart中,它可以选择206.3334539832作为最小值,并选择相似小数精度的间隔。 显然这看起来很难看。

因此,我尝试简单地制作轴格式{0.00}并且在加载图表时效果很好。 除非你放大,你需要更高的精度,可能是4位小数而不是2位。看起来我要么一直处于9个小数位,要么是一个固定的常数,当有人需要更高的精度时它可能会破坏。 我宁愿根据当前应用的缩放级别来获取精度。 像ZedGraph和Dundas这样的图书馆(我相信MS甚至正在使用!)倾向于选择在放大和缩小时改变的好值。

当缩放框架改变时,有没有办法让间隔改变精度? 这可能是我设置错误的一些简单属性,但很难说这个东西有数百万个属性(特别是当大约有14个地方代表Interval的概念时)。

缩放时我遇到了完全相同的问题。 我添加了代码来格式化轴标签并从Paint处理程序中调用它。 Axis View对象具有IsZoomed属性,并具有获取当前轴限制(GetViewMinimum / Maximum)的函数。 除非Max-Min =范围小于1,否则我将Axis LabelStyle.Format设置为“N”。然后我将格式设置为“F#”,其中#是根据轴范围计算的。

 # = Convert.ToInt32(Math.Abs(Math.Log10(range) - .5)) + 1; 

玩过图表控件之后,我一直无法找到解决问题的简单方法。 但是以下内容可能有所帮助

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

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

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

创建格式字符串

 string formatString = "{0.00"; 

识别缩放级别,比如zoomLevel = 2;

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

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

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

您可以附加到自定义事件。 从那里,您可以修改x轴上的标签:

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

设定分钟。 最多 值:

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

等等

您可以根据数据集动态更新最大值和最小值。 每次用户放大时,您都会在每个点上执行FOREACH并获取统计数据,并根据该设置获取最大值和最小值

它有助于设置轴的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