图表控制Y轴在滚动时自动缩放

L.E*_*E.O 10 c# scale mschart

我一直在网上搜索一段时间但仍然没有找到任何解决我问题的好方法.我想让MS Chart在滚动时自动重新缩放Y轴,以确保所有数据点都可见.这里的转折是我需要能够排除某些系列用于自动缩放.到目前为止,我只找到了解决方案,它们可以在AxisViewChanged事件中迭代整个点集合,当你有大量的点集合和几个迭代的系列时,这种解决方案效果不佳.我想知道是否有办法通过获取当前可见的最小和最大X值之间的数据点来缩小搜索范围.任何帮助,将不胜感激.

编辑 Heres图像.正如您所看到的,中间的烛台并不完全可见. 在此输入图像描述

Ste*_*cya 6

你可以尝试这个代码

        DateTime date = DateTime.Now;
        chart1.ChartAreas[0].AxisX.Minimum = 0;
        chart1.ChartAreas[0].AxisX.Maximum = 20;
        Random r = new Random((int)date.Ticks);

        chart1.Series[0].ChartType = SeriesChartType.Candlestick;
        chart1.Series[0].Color = Color.Green;
        chart1.Series[0].XValueType = ChartValueType.Time;
        chart1.Series[0].IsXValueIndexed = true;
        chart1.Series[0].YValuesPerPoint = 4;
        chart1.Series[0].CustomProperties = "MaxPixelPointWidth=10";
        for (int i = 0; i < 100; i++ )
        {
            DataPoint point = new DataPoint(date.AddHours(i).ToOADate(), new double[] { r.Next(10, 20), r.Next(30, 40), r.Next(20, 30), r.Next(20, 30) });
            chart1.Series[0].Points.Add(point);
        }

        int min = (int)chart1.ChartAreas[0].AxisX.Minimum;
        int max = (int)chart1.ChartAreas[0].AxisX.Maximum;

        if (max > chart1.Series[0].Points.Count)
            max = chart1.Series[0].Points.Count;

        var points = chart1.Series[0].Points.Skip(min).Take(max - min);

        var minValue = points.Min(x => x.YValues[0]);
        var maxValue = points.Max(x => x.YValues[1]);

        chart1.ChartAreas[0].AxisY.Minimum = minValue;
        chart1.ChartAreas[0].AxisY.Maximum = maxValue;
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


小智 5

使用查询找出要用于在代码中查找ymin和ymax的系列.

private void chart1_AxisViewChanged(object sender, ViewEventArgs e)
    {
        if (e.Axis.AxisName == AxisName.X)
        {
            int start = (int)e.Axis.ScaleView.ViewMinimum;
            int end = (int)e.Axis.ScaleView.ViewMaximum;

            // Series ss = chart1.Series.FindByName("SeriesName");
            // use ss instead of chart1.Series[0]

            double[] temp = chart1.Series[0].Points.Where((x, i) => i >= start && i <= end).Select(x => x.YValues[0]).ToArray();
            double ymin = temp.Min();
            double ymax = temp.Max();

            chart1.ChartAreas[0].AxisY.ScaleView.Position = ymin;
            chart1.ChartAreas[0].AxisY.ScaleView.Size = ymax - ymin;
        }
    }
Run Code Online (Sandbox Code Playgroud)