【问题标题】:Creating multiple charts and the relation between Chart, Series, ChartArea创建多个图表以及 Chart、Series、ChartArea 之间的关系
【发布时间】:2013-06-22 14:33:56
【问题描述】:

我使用 MSChart 生成图表已有一段时间了,但我从未在一个图表对象中创建多个图表。考虑这项任务,我发现我的知识存在差距。

我对创建图表的看法

  1. 创建图表对象
  2. 将 ChartArea 对象添加到 Chart 对象
  3. 创建系列并添加数据
  4. 向图表添加系列

对象结构最终看起来像这样

                 Chart
               /       \
          ChartArea   Series

就我过去所关心的而言,ChartArea 只是我设置标签之类的区域。要添加另一个,我会想要添加另一个 ChartArea 和一个或多个系列。

           ___________________ Chart ___________________
          /                  /       \                  \
       ChartArea0      ChartArea1   Series0            Series1

如何将 Series0 关联到 ChartArea0?将 Series 添加到 ChartArea 是有意义的,但这是不可能的。为什么将 Series 与 Chart 关联而不是 ChartArea 有好处?

【问题讨论】:

    标签: c# mschart


    【解决方案1】:

    系列与这样的图表区域相关联

    Chart Chart0 = new Chart();
    ChartArea ChartArea0 = new ChartArea("name");
    Chart0.ChartAreas.Add(ChartArea0);
    Series Series0 = new Series();
    Chart0.Series.Add(Series0);
    // link series to area here
    Series0.ChartArea = "name";
    

    【讨论】:

    【解决方案2】:

    一个图表可以分为多个区域,其中一个区域可以是条形图,另一个可以是饼图。

    System.Windows.Forms.DataVisualization.Charting.Chart chart1 = new System.Windows.Forms.DataVisualization.Charting.Chart(); System.Windows.Forms.DataVisualization.Charting.ChartArea chartarea1 = new System.Windows.Forms.DataVisualization.Charting.ChartArea(); System.Windows.Forms.DataVisualization.Charting.ChartArea chartarea2 = new System.Windows.Forms.DataVisualization.Charting.ChartArea(); chart1.ChartAreas.Clear(); chart1.ChartAreas.Add(chartarea1); chart1.ChartAreas.Add(chartarea2);

    然后你创建一些系列;每个系列将与一个图表区域相关联。如果您创建 5 个系列并将 series1、series2 和 series3 关联到 chartarea1,那么这些系列必须是相同或兼容的图表类型。否则会发生运行时错误。在某些情况下,同一图表区域中的多个系列可能具有不同的 x 轴分量。例如在以下代码中:series1 有 3 个数据点,series2 有 5 个数据点,在这种情况下,chartarea 将显示 series1 的前三个 x 值和 series2 的后两个 x 值。

    chart1.Series.Clear(); chart1.Series.Add("Series1"); chart1.Series[0].ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Column; chart1.Series[0].ChartArea = chart1.ChartAreas[0].Name;

            chart1.Series[0].Points.AddXY("Point1", 20);
            chart1.Series[0].Points.AddXY("Point2", 50);
            chart1.Series[0].Points.AddXY("Point3",30);
    
    
            chart1.Series.Add("Series2");
            chart1.Series[1].ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Column;
            chart1.Series[1].ChartArea = chart1.ChartAreas[0].Name;
            chart1.Series[1].Points.AddXY("newname1", 10);
            chart1.Series[1].Points.AddXY("newname2", 20);
            chart1.Series[1].Points.AddXY("newname3", 30);
            chart1.Series[1].Points.AddXY("newname4", 40);
            chart1.Series[1].Points.AddXY("newname5", 50);
    
            this.tabPage3.Controls.Add(chart1);
            chart1.Dock = System.Windows.Forms.DockStyle.Fill;
    

    【讨论】:

      【解决方案3】:

      上一个答案打破了图表的宽度,这个例子使用 elementposition 对象,具体设置为 100%(所有 nr 都是 %() 此示例:“两个图表区域,垂直划分为 80/20”:

      ElementPosition ePos = new ElementPosition();
      ePos.Width = 100; ePos.Y = 0; ePos.X = 2; ePos.Height = 80;
      ElementPosition ePos2 = new ElementPosition();
      ePos2.Width = 100; ePos2.Y = 80; ePos2.X = 2;  ePos2.Height = 20;
      chartCandleStick.ChartAreas[0].Position = ePos;
      chartCandleStick.ChartAreas[1].Position = ePos2;
      

      【讨论】:

        猜你喜欢
        • 2013-07-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-03
        • 1970-01-01
        • 2019-08-24
        • 2019-03-25
        • 2014-11-02
        • 2013-01-14
        相关资源
        最近更新 更多