在主Y轴和辅助Y轴上设置公共零点

时间:2015-01-13 23:28:48

标签: c# winforms charts axes

如何让辅助Y轴与主Y轴共享零点?我不在乎排队的其余间隔或任何类似的东西,我只想让主要和次要Y轴共享相同的零。

我默认按周汇总数据,但我的图表也可以按日或月更改为汇总。例如,当我按周汇总时,两个轴上的所有值均为正值,因此图表的底部位于0(请参阅http://imgur.com/aIe2kaW),但是当我每天汇总时,我会在主要值上得到一些负值轴。此时,我仍然在辅助轴上具有所有正值,因此图形的底部在主轴上跳至-2000并在辅助轴上保持为0(参见http://imgur.com/Q1E8bLw)。

我已尝试在轴上设置Axis.Crossing属性,我尝试将最小值设置为相等,我尝试过其他一些事情,但似乎没有任何效果。是否有任何方法可以使用公共零点,以便辅助轴上的低正值看起来不像第二张图像中那样是否为负值?

修改:我在Visual Studio 2010中使用WinForms

2 个答案:

答案 0 :(得分:0)

您可以通过设置AxesMinimum值来强制Maximum分享他们的Axis.MinimumMaximum值。像这样:

 ChartArea CA = chart1.ChartAreas[0];
 CA.AxisY2.Maximum = CA.AxisY.Maximum;
 CA.AxisY2.Minimum = CA.AxisY.Minimum;

如果您不知道值的传播方式,您可能需要计算常用的最小值和最大值:

 ChartArea CA = chart1.ChartAreas[0];

 double min = Math.Min(CA.AxisY.Minimum, CA.AxisY2.Minimum);
 double max = Math.Max(CA.AxisY.Maximum, CA.AxisY2.Maximum);

 CA.AxisY.Maximum = max;
 CA.AxisY2.Maximum = max;
 CA.AxisY.Minimum = min;
 CA.AxisY2.Minimum = min; 

请注意,这会更改一个或两个PointsSeries的显示。:

enter image description here enter image description here

另请注意,无论您更改这些值,Axes都必须显示有关值的真相;因此,如果两个系列显示不同比例的值,您将不得不找到一种计算最小和最大值的方法,以便它们共享一个共同的零。

如果是您知道第二个Series值大x倍,您可以将其最小值/最大值设置为x的{​​{1}}倍...:

Series1

这是一种相当简单的方法,但它有效(使用不同的数据点值):

enter image description here enter image description here

答案 1 :(得分:0)

强制两个轴具有相同的比例,只需要决定使用哪个轴比例。 在这个例子中,我使用的是主轴比例:

 private static void ForceCommonZero(Chart chart)
    {
        chart.ChartAreas[0].RecalculateAxesScale();
        Axis y1 = chart.ChartAreas[0].AxisY;
        Axis y2 = chart.ChartAreas[0].AxisY2;
        double proportion = y1.Maximum / (-y1.Minimum);
        y2.Maximum = proportion * (-y2.Minimum);
    }

请注意,我假设两个轴都是零交叉(最大值> 0&amp;&amp;&lt; 0),这需要检查(然后这可以作为扩展方法实现)< / p>