C# 如何在WFA中向箱线图添加数据?

C# 如何在WFA中向箱线图添加数据?,c#,winforms,charts,boxplot,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"); char

我正在手动创建一个箱线图。我有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);
这就是我得到的:


因此,我希望得到这样的结果:

您试图将数据绑定到一个
箱线图
系列。但这只会导致绑定第一个Y值,这意味着您创建了一组“较低的胡须”。所有其他5个Y值均为空,即
0
。因此,你看到的是贫乏的图形

:框的值通常是从 存在于另一系列中的数据。一个方框符号(数据点 对象)与一个数据系列关联

方框图系列的数据仍然可以使用 数据绑定,,通过使用Series.Points成员(a DataPointCollection对象)

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

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

  • 您还可以使用
    AddY
    AddXY
    逐个添加方框图系列本身的
    数据点,提供所有6个Y值,即输入统计分析结果。这里只使用一个数组,它包含六个y值

  • 或者,您可以使用一个或多个数据系列,让图表在每个系列的一个框中汇总这些数据。该系列非常正常,读起来可能是
    线
    或任何东西。。它们甚至可以是不可见的,当然,您可以为它们使用数据绑定一旦某些数据系列就位,您就可以定义
    箱线图
    系列,并通过将其
    [“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
            };
    
    这是将其绑定到
    箱线图
    系列
    S1

    S1.Points.DataBindY(yValues);
    

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

    选项2:亲自输入
    箱线图
    数据

    让我们来看第一种方法的一个例子:在这里,我们需要准备好统计数据。。首先,我创建一个随机数据结构;它是一个由两个数组组成的
    列表
    ,每个数组有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 });
    }
    
    请注意,每个
    数据点都是由6个双精度数组创建的

    结果如下:

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

    选项3a:将一些数据系列与
    箱线图关联,并让它进行计算

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

    我们将使用与以前相同的数据集,但现在它们用于创建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());
    }
    

    我对“绑定”使用引号,因为它不是真正的数据绑定;相反,数据系列仅与带有特殊属性字符串的
    “BoxPlotSeries”
    BoxPlot
    系列关联

    您的示例有多个
    箱线图
    系列;在这里,同样的规则也适用

    请查看显示了另一种使用
    箱线图
    的方法,包括设置单个颜色

    选项3b:将一些数据系列与添加到
    箱线图中的数据点相关联;在这里,它也将为我们做数学计算

    虽然选项3a看起来很简单,但我没有办法给盒子上色。我们可以这样做:

    首先,我们强制图表将默认颜色复制到序列中。在进行此操作时,让我们也隐藏
    图例
    项:

    S1.Color = Color.Transparent;
    S1.LegendText = " ";
    chart.ApplyPaletteColors()
    
    然后我们为每个数据系列创建一个
    DataPoint
    in-out
    BoxPlot
    series
    S1
    ;不是我的系列是如何排序的:0=箱线图,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;
    }
    
    for(int i=1;i
    结果如下:

    更新:

    您的示例实际上显示了三个箱线图系列;因此,颜色和最明显的:集群(即无间隙)显示

    这将是一种将上述数据(来自选项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);
    }
    
    for(int i=0;i<3;i++)
    {
    系列bps=chart.Series.Add(“BoxPlotSeries”+i);
    bps.ChartType=SerieChartType.BoxPlot;
    var yvone=yValues.Select(x=>new[]{x[i]}).ToArray();
    bps.Points.DataBindY(仅YVS);
    }
    


    最后一点注意事项:示例代码包含一个包含12个双精度和4个箱线图系列的数组。这毫无意义。您可以使用选项3将12个值添加到一个普通系列中,并将其与一个箱线图系列相关联。

    您是否解决了问题?是的,您的anserw解决了我的问题。我需要的是常规数据绑定。谢谢
    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;
    }
    
    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);
    }