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

时间:2017-04-20 16:22:41

标签: c# winforms charts 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);

这就是我得到的:

my failed boxplot

结果我想得到类似的东西:example boxplot

1 个答案:

答案 0 :(得分:2)

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

  

MSDN:框的值通常是来自的计算值   另一系列中存在的数据。一个盒子符号(DataPoint   object)与一个数据系列相关联。

     

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

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

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

  2. 您还可以使用DataPointsAddY逐一添加方框图系列的AddXY提供所有6个Y值,即喂养统计分析的结果。这里只使用了一个数组,它包含六个y值。

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

  4. 选项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

    后的情况
    S1.Points.DataBindY(yValues);
    

    enter image description here

    您还可以创建单个系列;请参阅底部的更新!

    选项2:自己输入BoxPlot数据

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

    Random R = new Random(23);
    List<double[]> yValues = new List<double[]>();
    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个双打的数组创建的!

    结果如下:

    enter image description here

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

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

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

    我们将使用与以前相同的数据集,但现在它们用于创建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我提供的数据系列;我们现在需要他们,当我们绑定&#39;他们到BoxPlot系列:

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

    enter image description here

    我使用引号来绑定&#39;因为它不是真正的数据绑定;相反,数据系列只与<{1>}系列关联,并带有sprecial属性字符串BoxPlot

    您的示例包含多个"BoxPlotSeries"系列;这里适用相同的规则。

    请查看this post,其中显示BoxPlot的另一种用途,包括设置单个颜色..

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

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

    首先,我们强制图表将默认颜色复制到系列中。在我们处理此问题时,我们也会隐藏BoxPlot项:

    Legend

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

    S1

    结果如下:

    enter image description here

    <强>更新

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

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

    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;
    }
    

    enter image description here

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