使用多个Y轴(3个或更多)创建图表

10

我有一个客户需要使用有超过 2 个 Y 轴的图表。

我已经在使用 Component One(C1Chart)图表,它具有内置的 Y2 轴,并且运行良好。

是否有人知道可以显示 3 个或更多 Y 轴的图表控件?


1
我猜你可以使用多个系列来通过MSChart实现这一点。 - V4Vendetta
您可以在Visual Studio中下载Crystal Reports插件,使用它可以制作各种图表的报告。 - Max
我在大学时的毕业项目中使用了ZedGraph。它似乎表现得相当不错。虽然主要网站有一段时间没有更新了,但你可以在这里找到一些文档,在这里找到一个简短的教程,在这里找到一些示例。 - valverij
3个回答

11

Microsoft Chart控件样例环境 包含了多个Y轴的示例。
以下是一些代码示例:

    private void checkBoxUseMultipleYAxis_CheckedChanged(object sender, System.EventArgs e)
    {
        if(checkBoxUseMultipleYAxis.Checked)
        {
            // Set custom chart area position
            Chart1.ChartAreas["Default"].Position = new ElementPosition(25,10,68,85);
            Chart1.ChartAreas["Default"].InnerPlotPosition = new ElementPosition(10,0,90,90);

            // Create extra Y axis for second and third series
            CreateYAxis(Chart1, Chart1.ChartAreas["Default"], Chart1.Series["Series2"], 13, 8);
            CreateYAxis(Chart1, Chart1.ChartAreas["Default"], Chart1.Series["Series3"], 22, 8);
        }
        else
        {
            // Set default chart areas
            Chart1.Series["Series2"].ChartArea = "Default";
            Chart1.Series["Series3"].ChartArea = "Default";

            // Remove newly created series and chart areas
            while(Chart1.Series.Count > 3)
            {
                Chart1.Series.RemoveAt(3);
            }
            while(Chart1.ChartAreas.Count > 1)
            {
                Chart1.ChartAreas.RemoveAt(1);
            }

            // Set default chart are position to Auto
            Chart1.ChartAreas["Default"].Position.Auto = true;
            Chart1.ChartAreas["Default"].InnerPlotPosition.Auto = true;

        }
    }

public void CreateYAxis(Chart chart, ChartArea area, Series series, float axisOffset, float labelsSize)
    {
        // Create new chart area for original series
        ChartArea areaSeries = chart.ChartAreas.Add("ChartArea_" + series.Name);
        areaSeries.BackColor = Color.Transparent;
        areaSeries.BorderColor = Color.Transparent;
        areaSeries.Position.FromRectangleF(area.Position.ToRectangleF());
        areaSeries.InnerPlotPosition.FromRectangleF(area.InnerPlotPosition.ToRectangleF());
        areaSeries.AxisX.MajorGrid.Enabled = false;
        areaSeries.AxisX.MajorTickMark.Enabled = false;
        areaSeries.AxisX.LabelStyle.Enabled = false;
        areaSeries.AxisY.MajorGrid.Enabled = false;
        areaSeries.AxisY.MajorTickMark.Enabled = false;
        areaSeries.AxisY.LabelStyle.Enabled = false;
        areaSeries.AxisY.IsStartedFromZero = area.AxisY.IsStartedFromZero;


        series.ChartArea = areaSeries.Name;

        // Create new chart area for axis
        ChartArea areaAxis = chart.ChartAreas.Add("AxisY_" + series.ChartArea);
        areaAxis.BackColor = Color.Transparent;
        areaAxis.BorderColor = Color.Transparent;
        areaAxis.Position.FromRectangleF(chart.ChartAreas[series.ChartArea].Position.ToRectangleF());
        areaAxis.InnerPlotPosition.FromRectangleF(chart.ChartAreas[series.ChartArea].InnerPlotPosition.ToRectangleF());

        // Create a copy of specified series
        Series seriesCopy = chart.Series.Add(series.Name + "_Copy");
        seriesCopy.ChartType = series.ChartType;
        foreach(DataPoint point in series.Points)
        {
            seriesCopy.Points.AddXY(point.XValue, point.YValues[0]);
        }

        // Hide copied series
        seriesCopy.IsVisibleInLegend = false;
        seriesCopy.Color = Color.Transparent;
        seriesCopy.BorderColor = Color.Transparent;
        seriesCopy.ChartArea = areaAxis.Name;

        // Disable drid lines & tickmarks
        areaAxis.AxisX.LineWidth = 0;
        areaAxis.AxisX.MajorGrid.Enabled = false;
        areaAxis.AxisX.MajorTickMark.Enabled = false;
        areaAxis.AxisX.LabelStyle.Enabled = false;
        areaAxis.AxisY.MajorGrid.Enabled = false;
        areaAxis.AxisY.IsStartedFromZero = area.AxisY.IsStartedFromZero;
        areaAxis.AxisY.LabelStyle.Font = area.AxisY.LabelStyle.Font;

        // Adjust area position
        areaAxis.Position.X -= axisOffset;
        areaAxis.InnerPlotPosition.X += labelsSize;

    }

结果:
关闭多Y轴 关闭多Y轴


这些数据是相对于每个y轴绘制的,对吗? - techV
@vivek 是的,在这种情况下,我们有3个图表,3个轴,每个图表数据对应于相应的y轴。 - fat
1
链接无法使用(再也不行了)。您可以找到一个名为“浏览代码示例”的页面,目前有2627个条目,但没有一个是关于Windows Forms图形控件的。 - Jens Mander
@fat 你好,能否在多个y轴中显示日期时间。我尝试过修改你的代码,但无法在x轴上显示日期时间,先感谢了。 - Nazim

2

1

MS Chart控件几乎包含了您在制作图表方面所需的所有功能。下载示例,运行它并转到“图表特性”>“轴”>“多个Y轴”。我认为您会找到您想要的!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接