2017-04-20 6 views
1

Ich erstelle manuell ein Boxplot-Diagramm. Ich habe 4 double [] Arrays mit einigen Berechnungsergebnissen, die ich auf dem Diagramm anzeigen möchte. Ich weiß nicht, wie ich meine Arrays korrekt mit der Chart-Serie verbinde. Hier ist mein Diagramm:Wie füge ich Daten zu BoxPlot in WFA hinzu?

 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); 

Dies ist, was ich bekommen:

my failed boxplot

Als Ergebnis ich so etwas bekommen wollen: example boxplot

+0

Haben Sie Ihre Probleme gelöst? – TaW

+0

Ja, deine Antwort löste mein Problem. Regelmäßige Datenbindung war das, was ich brauche. Vielen Dank – user3785803

Antwort

2

Sie versucht haben, Ihre Daten zu binden eine BoxPlot Serie. Dies hat jedoch nur dazu geführt, dass der erste Y-Wert gebunden wurde, was bedeutet, dass Sie eine Reihe von "unteren Schnurrhaaren" erstellt haben. Alle anderen 5 Y-Werte sind leer, dh sind 0. Daraus ergibt sich die spärlichen Grafiken, die Sie sehen ..

MSDN: Die Werte für ein Feld werden in der Regel Werte von Daten berechnet, die in einer anderen Reihe vorhanden ist. Ein Feldsymbol (DataPoint Objekt) ist einer Datenreihe zugeordnet. können unter Verwendung von Datenbindung oder durch das Series.Points Element verwendet (a DataPointCollection Objekt)

Die Daten für eine Box-Plot-Reihe noch gefüllt.

Schauen wir uns alle diese Optionen:

  1. Verwenden regelmäßige Datenbindung. Dies ist, was Sie versucht haben, aber mit einer falschen Syntax.

  2. Sie können auch die DataPoints der Box-Plot Serie selbst einzeln mit AddY oder AddXY, Versorgung aller 6 Y-Werte, d.h. Zuführung in den Ergebnissen einer statistischen Analyse hinzuzufügen. Hier wird nur ein Array verwendet und es enthält die sechs y-Werte.

  3. Oder Sie können eine oder mehrere Datenreihen verwenden und das Diagramm diese Daten in einer Box pro Serie zusammenfassen lassen. Die Serien sind ganz normal, gelesen werden können Point, Line oder was auch immer .. Sie können sogar unsichtbar sein und natürlich können Sie Datenbindung für sie verwenden .. - Sobald einige Datenreihen vorhanden sind, können Sie die BoxPlot Serie definieren und binden ‚an die Datenreihe durch seine ["BoxPlotSeries"] besondere Eigenschaft auf eine Zeichenfolge seting, in die Sie die Serie verketten‘ Namen ...

Option 1. Verwenden Sie regelmäßige Datenbindung in den Statistiken zu füttern Sie haben.

Das haben Sie ausprobiert. Der richtige Weg ist jedoch ein wenig überraschend; Ihre Daten müssen wie folgt sortiert werden:

Das äußere Array (oder IEnumerable) muss die sechs y-Werte haben; Die sechs inneren Arrays sollten einen Wert für jeden der Datensätze enthalten, die in einem Feld angezeigt werden sollen.Lassen Sie uns mit drei Datensätze von gefälschten Statistiken ein Beispiel an:

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 
     }; 

Dies ist, wie es nach der Bindung an einen BoxPlot Serie

S1.Points.DataBindY(yValues); 

enter image description here

Sie können auch erstellen individuelle S1

sieht Serie; Siehe dazu das Update unten!

Option 2: Transporteur in den BoxPlot Daten selbst

auf ein Beispiel der ersten Art und Weise Werfen wir einen Blick: Hier wir die Statistiken bereit .. Zunächst erstelle ich eine zufällige Datenstruktur haben müssen; es ist ein List von double arrays jeweils mit 6 Elementen:

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 }); 
} 

Nun fügen wir diese gefälschte Statistiken der BoxPlot Serie:

S1.ChartType = SeriesChartType.BoxPlot; 
S1.Points.Clear(); 
for (int i = 0; i < yValues.Count; i++) S1.Points.Add(new DataPoint(i, yValues[i])); 

Beachten Sie, dass jede DataPoint aus einem Array von 6 verdoppelt erstellt! Hier

ist das Ergebnis:

enter image description here

Das Diagramm zeigt nun Statistiken über 8 Datensätze, die alle gefälscht ;-)

Option 3a: Eine Datenreihe Verknüpfen mit dem BoxPlot und lassen es tut die Mathematik

Die andere Verwendung ist lassen Sie das Diagramm zur Mathematik: Es kann berechnen Die Statistiken für eine beliebige Anzahl von Datenreihen, die Sie haben, erstellen und eine Box für jeden erstellen.

Wir werden die gleichen Daten wie vor gesetzt verwenden, aber jetzt werden sie verwendet, 6 Datenreihe zu erstellen, die jeweils mit 8 Punkten:

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()); 
} 

Sie wie oben auf die gleichen Zahlen gebunden, aber diese jetzt habe eine andere Bedeutung. Daher werden und sollten die Ergebnisse nicht gleich aussehen !!

In der Tat können Sie die Kästchen und Grafiken betrachten und sehen, wie sie gut passen.

Beachten Sie die Names Ich gab die Datenreihe; wir werden sie jetzt brauchen, wenn wir ‚binden‘ sie an die BoxPlot Serie:

S1.ChartType = SeriesChartType.BoxPlot; 
S1["BoxPlotSeries"] = "D1;D2;D3;D4;D5;D6"; // box plot binding! 
S1.LegendText = "BoxPlot"; 

enter image description here

Ich verwende Zitate für die ‚Bindung‘, weil es nicht echte Daten ist verbindlich; stattdessen sind die Datenreihen nur mit der BoxPlot Serie mit der Sondereigenschaft String "BoxPlotSeries" zugeordnet.

Ihr Beispiel hat mehr als eine BoxPlot Serie; hier gelten die gleichen Regeln.

Sie einen Blick auf this post haben, die eine weitere Verwendung von BoxPlot zeigt auch einzelne Farben einstellen ..

Option 3b: Eine Datenreihe Verknüpfen mit Datapoints Sie zur BoxPlot Serie eintragen; auch hier wird es die Mathematik für uns

Während Option 3a scheint eher einfach, fand ich keine Möglichkeit, die Boxen zu färben. Hier ist, wie wir das tun können:

Zuerst erzwingen wir das Diagramm, um die Standardfarben in die Serie zu kopieren. Während wir gerade dabei sind, wollen wir auch die Legend Artikel verstecken:

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

Dann erstellen wir eine DataPoint in Serie aus BoxPlot Serie S1 für jede Daten; nicht wie meine Serie bestellt wird: 0 = Der BoxPlot, 1-6 einige Datenserien! Möglicherweise müssen Sie dies anpassen! Hier

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; 
} 

ist das Ergebnis:

enter image description here

Update:

Ihr Beispiel zeigt eigentlich drei boxplot Serie; daher die Farben und vor allem: die gruppierte (d. h. lückenlose) Anzeige.

Dies wäre ein Weg, um die oben genannten Daten zu binden (von Option 1) bis drei Einzelboxen:

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); 
} 

enter image description here

Abschließender Hinweis: Ihr Beispielcode ein Array mit 12 Doppelzimmer enthält und auch 4 Boxplot-Serien. Das macht keinen Sinn. Sie können die 12 Werte zu einer normalen Serie hinzufügen und sie mit einer Boxplot-Serie verknüpfen, indem Sie Option 3 verwenden.

Verwandte Themen