y轴上具有不均匀间隔的图形

时间:2017-01-15 17:19:21

标签: c# .net winforms charts

我试过没有运气在WinForms中使用Chart控件制作这样的图形。Graph with uneven intervals on y axis我的第一个想法是使用尖头图表,图像为空而非空标记。显示行,但不幸的是,值4到19和20 - 33之间有一个很大的空间。使用标准的WinForms图表控件时有没有办法避免空间? 我的第二个想法是使用DatagridView。我可以添加不超过700列的东西。我需要近2000列。因此,DataGridView不是我的最佳选择。

感谢任何提示如何实现它。

enter image description here

编辑1:

由于TnTinMn的消化,我尝试过ScaleBreakStyle。这似乎从图中删除了一些空格。目前我的图表看起来像这样:

enter image description here

这是通过守则实现的:

 var chartArea = chart1.ChartAreas[series.ChartArea];

 chartArea.AxisX.LabelStyle.IsStaggered = false;
 chartArea.AxisX.Minimum = 0;
 chartArea.AxisX.Maximum = (int)numericUpDown1.Value;
 chartArea.AxisX.IsReversed = true;
 chartArea.AxisX.Interval = 1;
 chartArea.AxisX.ScaleView.SizeType = DateTimeIntervalType.Number;
 chartArea.AxisY.ScaleBreakStyle.Enabled = true;
 chartArea.AxisY.ScaleBreakStyle.BreakLineStyle = BreakLineStyle.None;
 chartArea.AxisY.ScaleBreakStyle.Spacing = 0;
 chartArea.AxisY.ScaleBreakStyle.CollapsibleSpaceThreshold = 50;
 chartArea.AxisY.Interval = 1;

如果我尝试将y标签放在左侧,则无效

chartArea.AxisY.Enabled = AxisEnabled.False;
chartArea.AxisY2.Enabled = AxisEnabled.True;

添加以下代码无法解决问题:

 chartArea.AxisY2.ScaleBreakStyle.Enabled = true;
 chartArea.AxisY2.ScaleBreakStyle.BreakLineStyle = BreakLineStyle.None;
 chartArea.AxisY2.ScaleBreakStyle.Spacing = 0;
 chartArea.AxisY2.ScaleBreakStyle.CollapsibleSpaceThreshold = 50;
 chartArea.AxisY2.Interval = 1;

如何删除26和28,并在图表上只留下1和27?如何将1和27放在底部并在它们上方留下“大”空间?

编辑2:

经过一些尝试,我已经实现了我想要的东西(我仍然需要调整标记图像,但它看起来非常有前途)。 这就是我现在所拥有的:

enter image description here

正如TnTiMn所说,这有点棘手。我必须将1,2,3 ...映射到我的真实值,然后分配自定义标签。我没有使用ScaleBreakStyle。无论如何,谢谢你的帮助。

我的代码:

        chart1.ChartAreas[0].AxisX.IsReversed = true;
        chart1.ChartAreas[0].AxisX.MajorGrid.Enabled = false;
        chart1.ChartAreas[0].AxisY.MajorGrid.Enabled = false;
        chart1.ChartAreas[0].AxisY2.MajorGrid.Enabled = false;
        chart1.ChartAreas[0].AxisY.Enabled = AxisEnabled.False;
        chart1.ChartAreas[0].AxisY2.Enabled = AxisEnabled.True;
        chart1.ChartAreas[0].AxisY2.ScaleView.SizeType = DateTimeIntervalType.Number;
        chart1.ChartAreas[0].AxisY2.MajorTickMark.Enabled = false;
        chart1.Series[0].MarkerImage ="NotEmptyPoint.png";
        chart1.Series[0].EmptyPointStyle.MarkerImage = "EmptyPoint.png";
        chart1.Series[1].MarkerImage = "NotEmptyPoint.png";
        chart1.Series[1].EmptyPointStyle.MarkerImage = "EmptyPoint.png";
        chart1.Series[2].MarkerImage = "NotEmptyPoint.png";
        chart1.Series[2].EmptyPointStyle.MarkerImage = "EmptyPoint.png";
        chart1.ChartAreas[0].AxisY.Interval = 1;
        chart1.ChartAreas[0].AxisY2.Interval = 1;
        chart1.ChartAreas[0].AxisY2.Minimum = 0;
        chart1.ChartAreas[0].AxisY2.Maximum = 10;
        chart1.ChartAreas[0].AxisY.Minimum = 0;
        chart1.ChartAreas[0].AxisY.Maximum = 10;

        int number = 0;
        string mappedNumber;

        for (int i = 1; i < 15; i++)
        {
            number = 1;
            mappedNumber = "1";
            chart1.Series["Series1"].Points.AddXY(i, number);
            chart1.ChartAreas[0].AxisY2.CustomLabels.Add(number - 0.5, number + 0.5, mappedNumber);
            if(i % 3 == 0)
            {
                chart1.Series["Series1"].Points[chart1.Series["Series1"].Points.Count - 1].IsEmpty = true;
            }
        }

        for (int i = 1; i < 15; i++)
        {
            number = 2;
            mappedNumber = "7";
            chart1.Series["Series2"].Points.AddXY(i, number);
            chart1.ChartAreas[0].AxisY2.CustomLabels.Add(number - 0.5, number + 0.5, mappedNumber);

            if (i % 4 == 0)
            {
                chart1.Series["Series2"].Points[chart1.Series["Series2"].Points.Count - 1].IsEmpty = true;
            }
        }

        for (int i = 1; i < 15; i++)
        {
            number = 3;
            mappedNumber = "20";
            chart1.Series["Series3"].Points.AddXY(i, number);
            chart1.ChartAreas[0].AxisY2.CustomLabels.Add(number - 0.5, number + 0.5, mappedNumber);

            if (i % 5 == 0)
            {
                chart1.Series["Series3"].Points[chart1.Series["Series3"].Points.Count - 1].IsEmpty = true;
            }
        }

0 个答案:

没有答案