15

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

因此,我尝试简单地制作轴格式{0.00},并且在加载图表时效果很好。除了放大时,您需要更高的精度,可能是小数点后 4 位而不是 2 位。看来我要么一直被 9 位小数所困扰,要么是一个恒定的固定数字,当有人需要更高的精度时可能会中断。我宁愿它根据当前应用的缩放级别来获得精度。ZedGraph 和 Dundas 之类的库(我相信 MS 甚至都在使用它们!)倾向于选择随着放大和缩小而改变的好的值。

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

4

7 回答 7

6

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

# = Convert.ToInt32(Math.Abs(Math.Log10(range) - .5)) + 1;
于 2011-04-12T21:51:14.183 回答
1

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

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

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

于 2010-12-09T10:04:58.273 回答
1

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

创建格式字符串

string formatString = "{0.00";

确定缩放级别,例如 zoomLevel = 2;

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

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

于 2010-12-21T07:17:43.130 回答
0

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

于 2010-12-09T21:54:06.330 回答
0

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

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

设置分钟。和最大。价值观:

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

等等

于 2011-01-25T10:22:07.270 回答
0

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

于 2011-03-23T18:28:18.103 回答
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
于 2012-02-16T01:13:16.357 回答