如何为没有x值的一系列数据创建Box Plot

我很难为列表中包含的一组行对象创建一个箱形图。 数据本身填充得足够精细,但图表会为列表中的每个对象创建不同的x值,这不是预期的。 也许我在列表中使用了错误的绑定方法? 以下是绑定发生的代码片段:

foreach (DataRow row in myDataSet.Tables[0].Rows) { colValues.Add(row["Freight Cost/ Pc - $"]); } chart1.Series["Series1"].Points.DataBindY(colValues); 

编辑:

这是一个清单。 它包含“Freight Cost / Pc – $”列的每一行值。 我相信我只有一个系列。 它当前正在为列表中的每个y值创建一个x值。 我希望每个y值只有一个独立的值。 换句话说,我正在处理一个单变量样本。 我甚至不明白为什么这是一个问题。 我认为箱形图严格用于显示与单变量数据相关的描述性统计数据。

ChartType的DataPoint BoxPlot是统计数据的图形描述。

您有两种使用BoxPlot图表的基本方法:

  • 您可以添加多个DataPoints例如使用AddXY调用。 为此,您必须提供(至少) 六个Y值,其中包含要显示的统计值。

  • 或者,您可以将DataPoint “绑定” 到图表中的另一个系列 。 如果您有多个Series ,则可以在每个BoxPlot DataPoint显示其统计数据。

主要区别在于,在第一种情况下,您需要已经拥有统计数据,而第二种方式将让图表在一系列DataPoints上进行计算。 实现这项工作的方法不是通过普通的数据绑定,而是使用BoxPlotSeries 自定义属性

 Series BS = chart1.Series.Add("BoxPlotSeries"); BS.ChartType = SeriesChartType.BoxPlot; BS.Points.Add(new DataPoint(55, 0)); BS.Points[0]["BoxPlotSeries"] = "S1"; 

创建一个包含50个DataPoints的随机序列S1之后,我创建了一个BoxPlot系列,在x=55处添加一个点并关联该点的Custom属性BoxPlotSeries

结果如下:

在此处输入图像描述

通过定期Points 绑定List您已经有效地选择了方法BoxPlot看到许多 BoxPlot点。 而是根据您的喜好设计Series ,如chartType Point, Line, Column或您想要的; 然后添加第二个 Series一个 DataPoint其与数据系列相关联,就像在我的代码示例中一样。

我选择了我的X-Value以便BoxPlot点位于数据的右侧。 如果您的数据没有有意义的数字X值,它们会按顺序显示,您可以将BoxPlot点放在S1.Points.CountCount + 1 or +2 ..

请注意 ,如果你有很多DataPoints ,BoxPlotPoint看起来很薄,你几乎看不到它。

在那种情况下,如果你可以简单地扩大它就会很好。

有一组自定义属性,即

PointWidth和PixelPointWidth , MinPixelPointWidth和MaxPixelPointWidth 。

 BS["MinPixelPointWidth"] = "15"; BS["MaxPixelPointWidth"] = "25"; 

但您可能更喜欢通过在BoxPlot系列中添加第二个ChartArea来保持BoxPlot点分离:

在此处输入图像描述

以下是用于上述屏幕截图的定位和样式调用:

 ChartArea A1 = chart1.ChartAreas[0]; Series S1 = chart1.Series[0]; A1.AxisX.Interval = 50; ChartArea A2 = chart1.ChartAreas.Add("A2"); A2.AlignWithChartArea = "A1"; A2.AlignmentOrientation = AreaAlignmentOrientations.Horizontal; A2.AlignmentStyle = AreaAlignmentStyles.PlotPosition; A1.Position.Width *= 0.85f; A2.Position.Y = A1.Position.Y; A2.Position.X = A1.Position.Right; A2.Position.Width = A1.Position.Width * 0.15f; A2.AxisX.LabelStyle.ForeColor = Color.Transparent; A2.AxisX.MajorGrid.Enabled = false; A2.AxisX.MajorTickMark.Enabled = false; A2.AxisX.Minimum = 0; A2.AxisX.Maximum = 2; A2.AxisY.Interval = 10; A2.AxisY.Maximum = A1.AxisY.Maximum; A2.AxisY.Minimum = A1.AxisY.Minimum; Series BS = chart1.Series.Add("BoxPlotSeries"); BS.ChartArea = "A2"; BS.ChartType = SeriesChartType.BoxPlot; BS.Points.Add(new DataPoint(1, 0)); DataPoint DPT = BS.Points[BS.Points.Count - 1]; DPT["BoxPlotSeries"] = "S1"; 

通过添加第二个稍微更随机的数据系列和第二个boxplot点,您可以显示不同的分布:

在此处输入图像描述

请注意,您需要明确设置数据Series.Colors以允许为BoxPlot点引用它们。:

  S1.Color = Color.SteelBlue; S2.Color = Color.DarkKhaki; ... DPT1.Color = chart1.Series["S1"].Color; DPT2.Color = chart1.Series["S2"].Color;