LineChart绘制线到系列

时间:2017-07-11 10:36:53

标签: c# charts average linechart

我想做什么: 我有多个具有不同CreationDates的文件。 X轴=日期和Y轴= 0-100的值。我想创建一个折线图,显示标有X - >的每一天的所有值。例如(10.07.2017 = 50和60 - >在10.07.2017显示X为50和60为60)

这已经完成了代码就是这个:

for (int i=0; i< orderedList.Count(); i++)//iterating through Files
                                {
                                    int max_col = 0, max_rows = 0;
                                    double[][] temp = FileManager.ReadCSV(orderedList[i].FullName.ToString(),ref max_rows, ref max_col); //reading the file to a double[][]
                                     chartGraphic.Series[0].Points.AddXY(orderedList[i].CreationTime.Date, 100-Statistics.Prozent_NIO(temp, 1)); //adding the point to the Chart -> Prozent_NIO returns the y-value 
                                }

我使用的是Chart [0] ChartType = points

的图表

现在我想为系列1标记每个现有X值(日期)的点数。 Y值应该是该特定日期的系列[0]的所有现有Y值的平均值。 系列1 ChartType = Line

示例:

系列[0]积分是:

X值= 10.07.2017 Y值= 10; 20; 30

X值= 11.07.2017 Y值= 50; 60;

所以系列1点应该是:

X值= 10.07.2017 Y值= 20(平均值10,20,30)

X值= 11.07.2017 Y值= 55(平均值为50,60)

虽然系列[0]仅显示标记点(ech之间没有连接)和系列1,但会在每个点之间画一条线。

我已经研究过但无法找到具体答案...

我尝试了什么:

double temp_average=0;
double temp_number=0;
for (int i=0; i< orderedList.Count(); i++)// (FileInfo file in orderedList)
  {
    int max_col = 0, max_rows = 0;
    double[][] temp = FileManager.ReadCSV(orderedList[i].FullName.ToString(),ref max_rows, ref max_col);                       chartGraphic.Series[0].Points.AddXY(orderedList[i].CreationTime.Date, 100-Statistics.Prozent_NIO(temp, 1));
    if (i != 0)
     {
        if (orderedList[i].CreationTime.Date == orderedList[i - 1].CreationTime.Date) //times are similar -> add value to temp_averge and count number up
           {

              temp_average += Convert.ToDouble(chartGraphic.Series[0].Points[i - 1].YValues);
              temp_number++;
           }
           else //Times different -> add last y value then calculate average and reset the variables
             {

                temp_average += Convert.ToDouble(chartGraphic.Series[0].Points[i - 1].YValues); //add last point
                temp_number++;
                chartGraphic.Series[1].Points.AddXY(orderedList[i - 1].CreationTime.Date, temp_average / temp_number); // add point in series 1 
                  temp_average = 0;
                  temp_number = 0;*/
               }
        }
   }

但这不起作用它说我不能将double []转换为double = /

编辑: 我也尝试使用FinancialFormula,但是这个并没有真正达到平均值,只是预测了我使用的进一步趋势:

     chartGraphic.Series.Add("TrendLine");
     chartGraphic.Series["TrendLine"].ChartType = Graph.SeriesChartType.Line;
    chartGraphic.Series["TrendLine"].Color = Color.Red;
    chartGraphic.DataManipulator.IsStartFromFirst = true;
    chartGraphic.DataManipulator.FinancialFormula(FinancialFormula.Forecasting, "Linear, 1, false, false", chartGraphic.Series[0], chartGraphic.Series["TrendLine"]);

enter image description here

以下是当前图表的示例。现在我要做的是显示每个X值的平均线(日期)红线(趋势)是我的尝试,但这只是预测下一个值很好但也不是我想要的。我需要通过点的平均值绘制一条线 - &gt;红线的起点应该更高,因为100分上有2分,90分上2分,应该是95分,而不是92分,

1 个答案:

答案 0 :(得分:2)

以下是使用LINQ的示例;它首先从数据系列中收集每个x值的平均值,然后将它们添加到平均序列中:

Series dataSeries = chartGraphic.Series[0];
Series avgSeries = chartGraphic.Series["TrendLine"];

var grouped = dataSeries.Points.GroupBy(x => x.XValue)
                               .Select(x => new { xval = x.Key, 
                                           yavg = x.Average(y => y.YValues[0]) })
                               .ToList();

foreach (var kv in grouped) avgSeries.Points.AddXY(kv.xval, kv.yavg);

注意LINQ:

  • 我首先按x值分组,即你的日期。 (确保它们实际上只是日期,并且没有不同的时间窗格,这会阻止分组)。
  • 然后我从gouping键和分组数据的平均值创建一个匿名对象。
  • 最后我将它们复制到一个列表,我可以从中创建DataPoints

enter image description here

请注意,图表统计/财务功能在这里并不适用,因为它们是从一个或多个系列开始工作,而是逐点进行。