2013-04-04 32 views
5

我有一個需要使用多於2個Y軸的圖表的客戶端。C#Winforms - 使用多個Y軸創建圖表(3個或更多)

我已經使用已經內置Y2軸及其工作

大部件中的一個(C1Chart)圖。

有誰知道可以在圖表上顯示3個或更多Y軸的圖表控件?

+1

我想你可以通過使用多個系列 – V4Vendetta 2013-04-04 07:37:22

+0

您也可以下載Visual Studio中的水晶報表插件做到這一點與MSChart的,你可以報告它,用各種圖表。 – Max 2013-04-04 16:46:04

+0

我在大學的高級項目中使用了[ZedGraph](http://sourceforge.net/projects/zedgraph/)。它似乎工作得很好。主站點一段時間沒有更新,但你可以在這裏找到一些文檔[http://zedgraph.dariowiz.com/),一個簡短的教程[here](http://www.codeproject.com)/Articles/5431/A-flexible-charting-library-for-NET)以及一些示例[here](http://zedgraph.sourceforge.net/samples.html)。 – valverij 2013-04-05 14:18:34

回答

1

MS Chart control幾乎所有你會需要就圖表而言。下載示例,運行它並轉到圖表要素>軸>多個Y軸。我想你會找到你要找的東西!

5

Samples Environments for Microsoft Chart Controls包含多個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; 

    } 

結果:
Multi Y axis off Multi Y axis off

+0

這個數據是對應每個y軸繪製的嗎? – vivek 2017-01-05 08:22:20

+0

@vivek是的,在這種特殊情況下,我們有3個圖表,3個軸,每個圖表數據分別對應於y軸 – fat 2017-01-05 08:29:33