【问题标题】:How to add data to BoxPlot in WFA?如何在 WFA 中向 BoxPlot 添加数据?
【发布时间】:2017-04-20 16:22:40
【问题描述】:

我正在手动创建箱线图。我有 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);

这是我得到的:

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

【问题讨论】:

  • 您的问题解决了吗?
  • 是的,您的回答解决了我的问题。常规数据绑定就是我所需要的。谢谢

标签: c# winforms charts boxplot


【解决方案1】:

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

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

箱线图系列的数据仍可使用 数据绑定,通过使用 Series.Points 成员(a DataPointCollection 对象)。

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

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

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

  3. 或者您可以使用一个或多个数据系列,让图表在每个系列的一个框中汇总这些数据。该系列很正常,读取可能是PointLine 或其他任何内容。它们甚至可以是不可见的,当然您可以为它们使用数据绑定.. - 一旦一些数据系列到位,您可以定义@ 987654340@ 系列并将其“绑定”到数据系列,方法是将其 ["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后的样子

S1.Points.DataBindY(yValues);

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

选项 2:自己输入 BoxPlot 数据

我们来看第一种方式的例子:这里我们需要准备好统计数据。首先我创建一个随机数据结构;它是double arrays 中的List,每个都有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 个双精度数组创建的!

结果如下:

图表现在显示了 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";

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

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

看看this post,它显示了BoxPlot 的另一种用法,包括设置单独的颜色..

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

虽然选项 3a 看起来相当简单,但我发现无法为框着色。我们可以这样做:

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

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

然后我们为每个数据系列创建一个DataPoint in out BoxPlot series S1;不是我的系列的排序方式: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;
}

结果如下:

更新:

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

这是一种将上述数据(来自选项 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 个箱线图系列的数组。这是没有意义的。不过,您可以将 12 个值添加到普通系列,并使用选项 3 将其与一个箱线图系列相关联..

【讨论】:

    猜你喜欢
    • 2018-08-01
    • 1970-01-01
    • 2014-12-19
    • 2017-07-13
    • 2020-08-28
    • 2014-04-18
    • 1970-01-01
    • 2018-11-17
    • 2021-02-22
    相关资源
    最近更新 更多