如何为没有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.Count
或Count + 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;
- entity framework核心忽略.Include(..)而没有.ToList(..)间接
- C#reflection:在成员字段上查找属性
- 将Trace方法添加到System.Diagnostics.TraceListener
- nhibernate 2.0高效数据分页DataList控件和ObjectDataSource
- 改进了IValueConverter – MarkupExtension还是DependencyObject?
- 使用LINQ查询获取索引值的集合
- 如何通过SOCKS代理将文件上传到FTP服务器?
- 无法将REST API用于Windows Server 1.1的Service Bus(OnPremises)
- 为什么要使用Windows.Forms.Timer?