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

时间:2015-12-14 13:37:33

标签: c#

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

domQuery(".top_button").on("click", function() {
    // do something
});

编辑:

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

1 个答案:

答案 0 :(得分:4)

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

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

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

  • 或者你可以'绑定' a 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"; 自定义属性

S1

创建一个包含50 DataPoints的随机系列BoxPlot后,我创建了一个x=55系列,在Points添加了一个点,并将该点与List相关联3}}

结果如下:

BoxPlot

通过常规绑定 BoxPlot到您的Series,您已经有效地选择了方法一,并看到多个 chartType Point, Line, Column点。而是将Series按照您的喜好设置为DataPoint或您想要的样式;然后添加一个第二个 X-Value 一个 BoxPlot与数据系列相关联,就像在我的代码示例中一样..

我选择了BoxPlot,以便S1.Points.Count点位于数据的右侧。如果您的数据没有有意义的数字X值,则会按顺序显示,您可以将Count + 1 or +2点放在DataPointsBS["MinPixelPointWidth"] = "15"; BS["MaxPixelPointWidth"] = "25"; ..

注意如果你有很多ChartArea,那么BoxPlotPoint看起来会很薄,你几乎看不到它。

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

有一组自定义属性,即

Custom property BoxPlotSeriesenter image description herePointWidthPixelPointWidth

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系列的位置添加第二个 S1.Color = Color.SteelBlue; S2.Color = Color.DarkKhaki; ... DPT1.Color = chart1.Series["S1"].Color; DPT2.Color = chart1.Series["S2"].Color; 来将BoxPlot点分开:

MinPixelPointWidth

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

#include <iostream>
#include <string>


using namespace std; 

int main()
{
    string playerName;
    int age;
    int playerGender;

    cout << "Are you a Lady or a Sir?" << endl;
    cin >> playerGender;

    if (playerGender = Lady)
    {
    cout << "So you're a girl. " << endl;
    }
    else if (playerGender = Sir)
    {
    cout << "So you're a boy." << endl;
    }
    cout << "What is your name " << playerGender << "?" << endl;
    cin >> playerName;

    cout << "What is your age?" << playerName << endl;
    cin >> age;

    if (age <= 10)
    {
    cout << "You're too young " << playerName << "! " << endl;
    }
    else if (age >= 11)
    {
    cout << "You are old enough to play" << playerName << ". " << endl;

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

MaxPixelPointWidth

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

{{1}}