如何在WFA中向BoxPlot添加数据?

我正在手动创建一个箱线图。 我有4个double []数组,其中包含一些计算结果,我希望在图表上显示。 我不知道如何正确连接我的数组与图表系列。 这是我的图表:

Chart chart = new Chart(); chart.Series.Add("S1"); chart.Series.Add("S2"); chart.Series.Add("S3"); chart.Series.Add("S4"); chart.ChartAreas.Add("ChartArea1"); chart.ChartAreas[0].Visible = true; chart.ChartAreas[0].Position.Auto = true; chart.Series[0].ChartType = SeriesChartType.BoxPlot; chart.Series[1].ChartType = SeriesChartType.BoxPlot; chart.Series[2].ChartType = SeriesChartType.BoxPlot; chart.Series[3].ChartType = SeriesChartType.BoxPlot; chart.Parent = this; chart.Visible = true; double[] yValues = { 2, 3, 4, 5, 4, 5, 5, 2, 1, 9, 20, 4 };//example values chart.Series["S1"].Points.DataBindY(yValues); 

这就是我得到的:

我失败的箱子图

结果我想得到这样的东西: 示例箱图

您已尝试将数据绑定到BoxPlot系列。 但这只会导致绑定第一个Y值,这意味着你创造了一组“低胡须”。 所有其他5个Y值都是空的,即为0 。 因此,你看到的微薄的图形..

MSDN :框的值通常是根据另一个系列中的数据计算得出的值。 一个框符号(DataPoint对象)与一个数据系列相关联。

Box Plot系列的数据仍然可以使用数据绑定使用Series.Points成员(DataPointCollection对象)填充。

让我们看看所有这些选项:

  1. 使用常规数据绑定。 这是你尝试但语法错误的。

  2. 您还可以使用AddYAddXY添加箱形图系列的DataPoints提供所有6个Y值 ,即输入统计分析的结果。 这里只使用一个数组,它包含六个y值。

  3. 或者您可以使用一个或多个数据系列,并让图表在每个系列的一个框中汇总这些数据。 这个系列是很正常的,读取可能是PointLine或者其他..它们甚至可以是不可见的,当然你可以使用它们的数据绑定.. – 一旦某些数据系列到位,你可以定义BoxPlot系列和’绑定’通过将其["BoxPlotSeries"]特殊属性设置为一个字符串,将其连接到系列的名称…

选项1.使用常规数据绑定来输入您拥有的统计数据。

这是你尝试过的。 但是,正确的方法有点令人惊讶; 您的数据需要像这样订购:

外部数组(或IEnumerable )必须具有六个y值; 六个内部数组应包含要在框中显示的每个数据集的一个值。 让我们看一个包含三个伪造统计数据集的示例:

 double[][] yValues = { new[]{ 15.6, 24.4, 36.1 }, // Lower whiskers new[]{ 46.2, 52.2, 91.9 }, // Upper whiskers new[]{ 22.3, 27.2, 55.9 }, // Lower boxes new[]{ 33.2, 44.4, 77.9 }, // Upper boxes new[]{ 25.2, 38.4, 68.5 }, // Averages and means new[]{ 27.4, 32.4, 66.9 } // Medians }; 

这是将它绑定到BoxPlot系列S1后的BoxPlot

 S1.Points.DataBindY(yValues); 

在此处输入图像描述

您还可以创建单个系列; 看到底部的更新!

选项2:自己输入BoxPlot数据

让我们看一下第一种方式的例子:这里我们需要准备好统计数据。首先,我创建一个随机数据结构; 它是一个double arrays每个double arrays有6个元素:

 Random R = new Random(23); List yValues = new List(); for (int i = 0; i < 8; i++) { { R.Next(5), R.Next(5) + 20, R.Next(5) + 3, R.Next(5) + 10, R.Next(5) + 5, R.Next(5) + 7 }); } 

现在我们将这些假统计数据添加到BoxPlot系列中:

 S1.ChartType = SeriesChartType.BoxPlot; S1.Points.Clear(); for (int i = 0; i < yValues.Count; i++ ) S1.Points.Add(new DataPoint(i, yValues[i])); 

请注意,每个DataPoint都是由6个双精度数组创建的!

结果如下:

在此处输入图像描述

该图表现在显示8个数据集的统计数据,全部伪造;-)

选项3a:将一些数据系列与BoxPlot并让它进行数学运算

另一种用法是让图表进行数学计算:它可以计算您拥有的任意数量的数据系列的统计数据,并为每个数据系列创建一个框。

我们将使用与以前相同的数据集,但现在它们用于创建6个数据系列,每个数据系列有8个点:

 for (int i = 0; i < 6; i++) { Series ds = chart.Series.Add("D" + (i+1)); // set a name D1, D2.. dx.ChartType = SeriesChartType.Line; dx.Points.DataBindY(yValues.Select(x => x[i]).ToArray()); } 

它们与上面的数字相同,但现在它们具有不同的含义。 因此结果将会也应该看起来一样!!

实际上,您可以查看方框和图形,看看它们是如何合适的。

注意我给出的数据系列Names ; 当我们将它们“绑定”到BoxPlot系列时,我们现在将需要它们:

 S1.ChartType = SeriesChartType.BoxPlot; S1["BoxPlotSeries"] = "D1;D2;D3;D4;D5;D6"; // box plot binding! S1.LegendText = "BoxPlot"; 

在此处输入图像描述

我使用引号进行'绑定',因为它不是真正的数据绑定; 相反,数据系列仅具有sprecial属性字符串"BoxPlotSeries"BoxPlot系列相关联

您的示例有多个BoxPlot系列; 这里适用相同的规则。

看看这篇post ,看看BoxPlot另一个用途,包括设置个别颜色..

选项3b:将一些数据系列与您添加到BoxPlot系列的DataPoints相关BoxPlot ; 这里也会为我们做数学计算

虽然选项3a看起来很简单,但我发现没有办法给盒子上色。 以下是我们如何做到这一点:

首先,我们强制图表将默认颜色复制到系列中。 当我们在它的时候,让我们也隐藏Legend项目:

 S1.Color = Color.Transparent; S1.LegendText = " "; chart.ApplyPaletteColors() 

然后我们在BoxPlot系列S1为每个数据系列创建一个DataPoint ; 不是我的系列如何订购: 0 = BoxPlot,1-6一些数据系列 ! 你可能需要适应这个!

 for (int i = 1; i < chart.Series.Count; i++) { DataPoint dp = new DataPoint(); S1.Points.Add(dp); dp["BoxPlotSeries"] = "D" + i; // names D1-D6 dp.Color = chart.Series[i].Color; } 

结果如下:

在此处输入图像描述

更新:

你的例子实际上显示了三个boxplot系列; 因此颜色最显着:聚集(即无间隙)显示。

这将是将上述数据(从选项1)绑定到三个单独框的方法:

 for (int i = 0; i < 3; i++) { Series bps = chart.Series.Add("BoxPlotSeries" + i); bps.ChartType = SeriesChartType.BoxPlot; var yValOne = yValues.Select(x => new[] { x[i] }).ToArray(); bps.Points.DataBindY(yValOne); } 

在此处输入图像描述

最后注释 :您的示例代码包含一个包含12个双打和4个boxplot系列的数组。 这毫无意义。 您可以将12个值添加到普通系列中,并使用选项3将其与一个boxplot系列相关联,但是..