C# Winforms - Creating a chart with multiple Y axis (3 or more)

前端 未结 3 384
眼角桃花
眼角桃花 2021-01-04 20:41

I have a client that needs to use charts with more than 2 Y axes.

I am already using Component One (C1Chart) chart that has a built in Y2 axis and its working

相关标签:
3条回答
  • 2021-01-04 21:25

    The MS Chart control has almost everything you will ever need as far as charting is concerned. Download the sample, run it and go to Chart Features > Axes > Multiple Y axis. I think you will find what you are looking for!

    0 讨论(0)
  • 2021-01-04 21:34

    I think you could try multiple ChartArea's, which allows you to arrange multiple plots in the same chart object.

    You can assign each Series to its own ChartArea.

    0 讨论(0)
  • 2021-01-04 21:38

    Samples Environments for Microsoft Chart Controls contains example of multiple Y axis.
    Some pieces of code:

        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;
    
        }
    

    Result:
    Multi Y axis off Multi Y axis off

    0 讨论(0)
提交回复
热议问题