Comment append des données à BoxPlot dans WFA?

Je crée manuellement un graphique en boîte à moustaches. J’ai 4 tableaux doubles [] avec des résultats de calculs que je veux montrer sur un graphique. Je ne sais pas comment connecter correctement mes tableaux avec Chart Series. Voici mon tableau:

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

Voici ce que je reçois:

mon boxplot échoué

En conséquence, je veux obtenir quelque chose comme ça: exemple de boîte à moustaches

Vous avez tenté de lier vos données à une série BoxPlot . Mais cela n’a abouti qu’à lier la première valeur Y, ce qui signifie que vous avez créé un ensemble de «moustaches basses». Toutes les 5 autres valeurs Y sont vides, c’est-à-dire 0 . D’où les maigres graphiques que vous voyez.

MSDN : les valeurs d’une boîte sont généralement des valeurs calculées à partir de données présentes dans une autre série. Un symbole de case (object DataPoint) est associé à une série de données.

Les données d’une série de boîtes à moustaches peuvent toujours être renseignées à l’aide de la liaison de données ou à l’aide du membre Series.Points (object DataPointCollection).

Regardons toutes ces options:

  1. Utilisez une liaison de données régulière. C’est ce que vous avez essayé, mais avec une syntaxe incorrecte.

  2. Vous pouvez également append les DataPoints de DataPoints de la série de AddY AddXY , un par un, avec AddY ou AddXY , en fournissant les 6 valeurs Y , c’est -à- dire en AddXY les résultats d’une parsing statistique. Ici, un seul tableau est utilisé et il contient les six valeurs y.

  3. Ou vous pouvez utiliser une ou plusieurs séries de données et laisser le graphique résumer ces données dans une boîte par série. Les séries sont assez normales, lues peuvent être Point , Line ou autre. Elles peuvent même être invisibles et vous pouvez bien sûr utiliser la liaison de données pour elles .. – Une fois que certaines séries de données sont en place, vous pouvez définir la série BoxPlot et lier ‘it à la série de données en définissant sa propriété spéciale ["BoxPlotSeries"] sur une chaîne dans laquelle vous concaténez les noms de la série …

Option 1. Utilisez la liaison de données régulière pour alimenter les statistiques que vous avez.

C’est ce que tu as essayé. La manière correcte est un peu surprenante, cependant; vos données doivent être commandées comme ceci:

Le tableau externe (ou IEnumerable ) doit avoir les six valeurs y; les six tableaux internes doivent contenir une valeur pour chacun des ensembles de données que vous souhaitez afficher dans une zone. Regardons un exemple avec trois ensembles de données de statistiques truquées:

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

Voici à quoi il ressemble après l’avoir lié à un BoxPlot série S1

 S1.Points.DataBindY(yValues); 

entrez la description de l'image ici

Vous pouvez également créer des séries individuelles. voir la mise à jour en bas pour cela!

Option 2: BoxPlot vous-même les données BoxPlot

Regardons un exemple de la première façon: Ici, nous devons avoir les statistiques prêtes .. Tout d’abord, je crée une structure de données aléatoire; c’est une List de double arrays chacun avec 6 éléments:

 Random R = new Random(23); List yValues = new List(); 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 }); } 

Maintenant, nous ajoutons ces fausses statistiques à la série BoxPlot :

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

Notez que chaque DataPoint est créé à partir d'un tableau de 6 doubles!

Voici le résultat:

entrez la description de l'image ici

Le graphique montre maintenant les statistiques sur 8 jeux de données, tous truqués 😉

Option 3a: BoxPlot séries de données au BoxPlot et laissez-le faire le calcul

L'autre utilisation est de laisser le graphique au calcul : il peut calculer les statistiques pour n'importe quel nombre de séries de données que vous avez et créer un cadre pour chacune.

Nous allons utiliser le même dataset que précédemment, mais ils sont maintenant utilisés pour créer 6 séries de données, chacune avec 8 points:

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

Ils sont liés aux mêmes numéros que ci-dessus, mais ils ont maintenant une signification différente. Par conséquent, les résultats seront et ne devraient pas se ressembler !!

En fait, vous pouvez regarder les encadrés et les graphiques et voir comment ils s’ajustent bien.

Notez les Names j'ai donnés la série de données; nous en aurons besoin maintenant, lorsque nous les BoxPlot série BoxPlot :

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

entrez la description de l'image ici

J'utilise des guillemets pour la "liaison" car il ne s'agit pas d' une liaison de données réelle ; au lieu de cela, les séries de données sont uniquement associées à la série BoxPlot avec la chaîne de propriété "BoxPlotSeries" .

Votre exemple comporte plusieurs séries BoxPlot ; Ici, les mêmes règles s'appliquent.

Jetez un coup d'œil à cet article qui montre une autre utilisation de BoxPlot notamment la définition de couleurs individuelles.

Option 3b: associez certaines séries de données aux points de données que vous ajoutez à la série BoxPlot ; ici aussi, il fera le calcul pour nous

Bien que l'option 3a semble plutôt simple, je n'ai trouvé aucun moyen de colorer les cases. Voici comment nous pouvons faire cela:

Premièrement, nous forçons le graphique à copier les couleurs par défaut dans la série. Pendant que nous y sums, cachons également l'élément Legend :

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

Ensuite, nous créons un DataPoint dans la série BoxPlot S1 pour chaque série de données; pas comment mes séries sont commandées: 0 = The BoxPlot, 1-6 des séries de données ! Vous devrez peut-être adapter cela!

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

Voici le résultat:

entrez la description de l'image ici

Mettre à jour:

Votre exemple montre en réalité trois séries de boîtes à moustaches; d’où les couleurs et plus particulièrement: l’affichage en cluster (sans gapless).

Ce serait un moyen de lier les données ci-dessus (de l'option 1) à trois boîtes individuelles:

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

entrez la description de l'image ici

Note finale : Votre exemple de code contient un tableau avec 12 doubles et 4 séries de boîtes à moustaches. Cela n'a aucun sens. Vous pouvez append les 12 valeurs à une série normale et l'associer à une série de boîtes à moustaches à l'aide de l'option 3, bien que ..