MS图表中的自动间隔精度

时间:2010-09-17 22:01:55

标签: c# precision data-visualization mschart intervals

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

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

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

7 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

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

创建格式字符串

string formatString = "{0.00";

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

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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

设定分钟。最多值:

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

答案 5 :(得分:0)

您可以根据数据集动态更新最大值和最小值。每次用户放大时,你都会对每个点做一次FOREACH并获得统计数据,并根据该设置确定你的最大值和最小值

答案 6 :(得分:0)

设置轴的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