C# MS图中的自动间隔精度

C# MS图中的自动间隔精度,c#,precision,data-visualization,mschart,intervals,C#,Precision,Data Visualization,Mschart,Intervals,我目前正在使用System.Windows.Forms.DataVisualization.charting.Chart在.NET中使用图表。到目前为止,它似乎非常强大,效果非常好。然而,如何自动计算时间间隔是一个巨大的问题。我使用了很多双值,在像ZedGraph这样的库中,它可以完美地处理这个问题。它选择的最小/最大/间隔刚刚好。但是,在MS图表中,它可以选择206.3334539832作为最小值,并且间隔的小数精度类似。显然这看起来很难看 所以,我试着简单地制作axis格式{0.00},当它

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

所以,我试着简单地制作axis格式{0.00},当它加载图表时效果非常好。除非放大,否则需要更高的精度,可能是小数点后4位而不是2位。看来我要么一直坚持小数点后9位,要么就是一个固定不变的数字,当有人需要更高的精度时,这个数字可能会被打破。我宁愿它根据当前应用的缩放级别来选择精度。像ZedGraph和Dundas这样的库,我相信微软正在使用!倾向于选择随着放大和缩小而变化的好值


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

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

您是否考虑过自己设置轴的最大值和最小值?如果将实际最大值和最小值四舍五入到最接近的合理四舍五入数字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,并获取统计数据,然后根据设置的最大值和最小值,我在放大时遇到了完全相同的问题。我添加了格式化轴标签的代码,并从绘制处理程序调用它。轴视图对象具有IsZoomed特性,并具有获取当前轴限制GetViewMinimum/Maximum的函数。对于所有情况,我都将Axis LabelStyle.Format设置为N,除非Max-Min=范围小于1。然后我将格式设置为F,其中基于轴范围计算

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

它有助于设置轴的间隔偏移,例如:

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

另外,图表控件基于Dundas控件。微软不久前收购了邓达斯的数据可视化组件。更多信息您的编辑中没有图片?@noelicus抱歉,从那以后有了新的工作,这些图片在某个时候被删除了,显然这是在允许上传图片之前。我现在已经删除了编辑。我将查看并查看是否可以找到这些图像的副本,如果可以,请更新此问题。我已尝试自己设置“最小值”和“最大值”,但这些图表用于分析,一旦您放大自定义区域,它将丢失漂亮的整数,并返回到这种不希望出现的行为。此外,将最小值设置为-10有时会导致-10.00000023或类似结果。所以,你已经走了一半;它确实修复了最初的显示,但由于将发生所有的缩放,它并不能完全解决这个问题。很高兴听到我不是唯一一个!如果这是一个只有有科学头脑的人才能使用的内部应用程序,那就太棒了!然而,我们有一个从大学教授到农民的用户群。教这些人阅读指数格式几乎是不可能的。此外,使用科学数字并不能防止小数位数过多的问题,如2.6666684583e-4中的“仅使用字符串”{0:e2},123.456789格式。还可以尝试使用自定义转换器格式化程序。问题是缩放级别没有什么意义。刻度有时并不总是相同的,X轴可能在100-120之间,其他时间在0-4000之间。此外,用户可以自行选择缩放窗口,这意味着没有明确的方法来确定要格式化的小数位数。理论上回答得很好,但它与这里的对象模型不匹配。代码?如何检测用户何时缩放?如何仅检索位于中的点
在缩放处于活动状态时显示窗口?非常感谢您指出GetViewMinimum/Maximum!这些可能就是我想要的功能。我很快就会试试这个,如果它对我的案子有效,我会恢复我以前的赏金并把它给你。同样感谢代码获得小数点-在WolframAlpha中进行了一些测试后,它似乎生成了完美的小数点。我忘了报告,但我终于有时间实现了这一点,而且它工作得非常完美。我仍然认为,如果像ZedGraph这样的开源项目可以做到这一点,那么控件本身就应该处理这种逻辑,当然MS/Dundas也可以。在这个问题上,我已经恢复了原来的悬赏,因为这让我从不开心的顾客那里省去了很多头疼的事!只要我同意,我会尽快奖励它。