【问题标题】:How Do I Group Chart Data Points and Add a Series for the SUM of the grouping at each datapoint?如何对图表数据点进行分组并为每个数据点的分组的总和添加一个系列?
【发布时间】:2015-05-07 07:45:56
【问题描述】:

我正在尝试按间隔为 15 分钟的多个系列的数据点对下图中的数据进行分组。

如图所示有两个系列,我的程序有可能添加无限系列的不同名称。如何将不同系列的 y 值分组在同一点以添加到总成本系列中?我已经试过了:

chartDailyCost.DataManipulator.Group(
"SUM", 15, System.Windows.Forms.DataVisualization.Charting.IntervalType.Minutes, "*");

其中“*”显然将多个输入系列分组 这也是我用来将折线图添加到图表中的循环:

chartDailyCost.Series.Add(textBoxApplianceName.Text);
chartDailyCost.Legends.Add(textBoxApplianceName.Text); 
chartDailyCost.Series[textBoxApplianceName.Text].ChartType = System.Windows.Forms.
    DataVisualization.Charting.SeriesChartType.Line;

while (starttime <= endtime)
{
   if ((starttime <= (Convert.ToDateTime("06:00"))) 
   && (starttime > (Convert.ToDateTime("00:00"))))
   {
     TotalCostLowPeak = TotalCost * (8.0 / 12.2);
     chartDailyCost.Series[textBoxApplianceName.Text].
                    Points.AddXY( starttime, TotalCostLowPeak);
   }
   if ((starttime <= (Convert.ToDateTime("10:00"))) 
   && (starttime > (Convert.ToDateTime("06:00"))))
   {
     TotalCostHighPeak = TotalCost * (16.1 / 12.2);
     chartDailyCost.Series[textBoxApplianceName.Text]
                   .Points.AddXY(starttime, TotalCostHighPeak);
   }
   if ((starttime <= (Convert.ToDateTime("16:00"))) 
   && (starttime > (Convert.ToDateTime("10:00"))))
   {
     chartDailyCost.Series[textBoxApplianceName.Text]
                   .Points.AddXY(starttime, TotalCost);
   }
  if ((starttime <= (Convert.ToDateTime("20:00"))) 
  && (starttime > (Convert.ToDateTime("16:00"))))
 {
   TotalCostHighPeak = TotalCost * (16.1 / 12.2);
   chartDailyCost.Series[textBoxApplianceName.Text]
                 .Points.AddXY(starttime, TotalCostHighPeak);
 }
 if ((starttime <= (Convert.ToDateTime("23:45"))) 
 && (starttime > (Convert.ToDateTime("20:00"))))
 {
     TotalCostLowPeak = TotalCost * (8.0 / 12.2);
     chartDailyCost.Series[textBoxApplianceName.Text]
                   .Points.AddXY(starttime, TotalCostLowPeak);
 }

 starttime = starttime.AddMinutes(15);
}
sumSeries(chartDailyCost);

在这里我尝试了 TaW 推荐的方法,但我得到了错误:

http://postimg.org/image/7pco8vrst/

using System.Windows.Forms.DataVisualization.Charting;
private void sumSeries(Chart chartDailyCost)
    {
        chartDailyCost.Series.Remove(chartDailyCost.Series["Total Cost"]);

        List<Series> dataSeries = chartDailyCost.Series.ToList();
//this line shows an error when multiple series are added
        Series sumSeries = chartDailyCost.Series.Add("Total Cost");
        chartDailyCost.Series["Total Cost"].ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Column;
        //I have initialised many of the chart formats in the form_load method

        for (int i = 1; i < dataSeries[0].Points.Count; i++)
        {
            double sum = 0d;

            //for every series in the chart collection sum the yvalues at the specified 
            foreach (Series s in dataSeries)
            {
                sum += s.Points[i].YValues[0];
            }
            DataPoint dp = new DataPoint();
            //Add a new yvalue to the datapoint for the summed series's
            dp.XValue = dataSeries[0].Points[i].XValue;
            dp.YValues[0] = sum;
            sumSeries.Points.Add(dp);
        }
        //Add all of the data points to the "Total Cost" Series
        //chartDailyCost.Series.Add(sumSeries);//Found in above coding
    }

【问题讨论】:

  • 我已经试过了: 结果如何?您可以发布一个链接到所需输出的示例吗?
  • 抱歉,我没有 10 名声望来做到这一点,基本上我希望每个系列在每个数据点上求和,例如在 01:15 group(sum (series 1, series 2 etc...),然后能够在 01:15 将 y 值的总和绘制到一个新系列
  • 在我有那行代码的那一刻,“总”系列没有显示任何数据点,当你添加一个系列输出时,它说没有足够的输出
  • 这就是我要求你发布链接的原因;有很多免费的图像托管服务。所以我说得对吗:你想要一个系列来表示每个点上所有其他系列的值的总和吗?听起来很直接:在所有点上编写一个循环,并在其中对所有其他系列进行一个循环,对值求和并将新点添加到总和系列中。数据的动态性如何?会改变很多吗?

标签: c# visual-studio-2010 visual-studio visual-studio-2012 charts


【解决方案1】:

代码示例假设您要将所有系列的所有值相加到一个新系列的点中。此外,所有系列都有相同的点数和相同的XValues

using System.Windows.Forms.DataVisualization.Charting;
...
...
void sumSeries(Chart chart)
{
    List<Series> dataSeries = chart.Series.ToList();
    Series sumSeries = chart.Series.Add("Total");
    // insert charttype and styles here!
    for (int i = 0; i < dataSeries[0].Points.Count; i++)
    {
        double sum = 0d;

        foreach (Series s in dataSeries)
        {
            sum += s.Points[i].YValues[0];
        }
        DataPoint dp = new DataPoint();
        dp.XValue = dataSeries[0].Points[i].XValue;
        dp.YValues[0] = sum;
        sumSeries.Add(dp);
    }
}

这会添加一个新的Series sumSeries。在您再次调用该函数以反映更新的数据之前,请务必删除它。

【讨论】:

  • 对于私人无效中的争论声明,我尝试使用这些,但我没有运气:私人无效 sumSeries(Chart chartDailyCost, List)
  • 您只需调用sumSeries(chartDailyCost);,列表是在里面创建的..如果您希望总和在第一个系列中,您可以随时修改它..
  • 您好,很抱歉提出另一个问题,非常感谢您的帮助,但是您能否参考我原始帖子中的编辑代码以获取我使用该方法得到的错误代码?
  • 是的,你缺少一个 using 指令:using System.Windows.Forms.DataVisualization.Charting; 没有它,只有少数图表方法和成员可用,但它是一个很好的空间,可以避免限制长 mnamespace..
  • 嘿,这个方法现在很好用,我正在显示总成本字段,干杯!!!但是,如postimg.org/image/7pco8vrst 所示,该图表现在按预期绘制,但我也收到错误尝试添加多个系列,如我所做的 cmets 所示,需要一种清除系列的方法,以我尝试了一个不太奏效的 Dispose() 。我感激不尽!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-01
  • 2022-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-29
相关资源
最近更新 更多