Comment tracer MULTIPLE LineSeries sur un graphique OxyPlot?

Je m’excuse d’avoir posé autant de questions à OxyPlot, mais il semble que j’aie vraiment du mal à utiliser le contrôle de graphique OxyPlot.

Mon projet est au format WPF et, à l’origine, j’utilisais un graphique WINFORMS hébergé. Cela fonctionnait comme un charme et je faisais absolument tout ce dont j’avais besoin jusqu’à ce que je doive superposer un élément WPF au-dessus du graphique Winform hébergé. En raison du problème “AirSpace”, je n’ai pas pu voir l’élément WPF que j’ai placé en haut du graphique hébergé, peu importe ce que j’ai fait. C’est alors que j’ai décidé d’aller avec OxyPlot, ce qui me donne pas mal de maux de tête jusqu’à présent.

Voici ma question d’origine ! que j’ai demandé à CodePlex. Je ne semble pas recevoir beaucoup d’aide là-bas et j’essaie encore ici.

Ma question est:

Est-ce que quelqu’un sait comment tracer MULTIPLE LineSeries sur un tracé?

Mon approche jusqu’ici:

Je prends un tableau de liste ac # et j’ajoute une nouvelle copie du LineSeries contenant les nouvelles données à tracer. Mon code:

// Function to plot data private void plotData(double numWeeks, double startingSS) { // Initialize new Salt Split class for acess to data variables Salt_Split_Builder calcSS = new Salt_Split_Builder(); calcSS.compute(numWeeks, startingSS, maxDegSS); // Create the OxyPlot graph for Salt Split OxyPlot.Wpf.PlotView plot = new OxyPlot.Wpf.PlotView(); var model = new PlotModel(); // Add Chart Title model.Title = "Salt Split Degradation"; // Create new Line Series LineSeries linePoints = new LineSeries() { StrokeThickness = 1, MarkerSize = 1, Title = numWeeks.ToSsortingng() + " weeks" }; // Add each point to the new series foreach (var point in calcSS.saltSplitCurve) { DataPoint XYpoint = new DataPoint(); XYpoint = new DataPoint(point.Key, point.Value * 100); linePoints.Format("%", XYpoint.Y); linePoints.Points.Add(XYpoint); } listPointAray.Add(linePoints); // Define X-Axis var Xaxis = new OxyPlot.Axes.LinearAxis(); Xaxis.Maximum = numWeeks; Xaxis.Minimum = 0; Xaxis.Position = OxyPlot.Axes.AxisPosition.Bottom; Xaxis.Title = "Number of Weeks"; model.Axes.Add(Xaxis); //Define Y-Axis var Yaxis = new OxyPlot.Axes.LinearAxis(); Yaxis.MajorStep = 15; Yaxis.Maximum = calcSS.saltSplitCurve.Last().Value * 100; Yaxis.MaximumPadding = 0; Yaxis.Minimum = 0; Yaxis.MinimumPadding = 0; Yaxis.MinorStep = 5; Yaxis.Title = "Percent Degradation"; model.Axes.Add(Yaxis); // Add Each series to the foreach (var series in listPointAray) { LineSeries newpoints = new LineSeries(); newpoints = linePoints; model.Series.Add(newpoints); } // Add the plot to the window plot.Model = model; SaltSplitChartGrid.Children.Add(plot); } 

“ `

Mon code fonctionne la première fois que j’appuie sur mon bouton “Graph Data”, mais échoue lors de tentatives consécutives avec l’erreur suivante:

L’élément ne peut pas être ajouté, il appartient déjà à un modèle de tracé

Le graphique suivant est le type de graphique que je voudrais produire (cela fonctionnait correctement avec le contrôle WinForms Chart):

Image http://soffr.miximages.com/charts/jqs3n9.jpg

Je voudrais qu’une nouvelle ligne avec une nouvelle couleur soit tracée à chaque fois que j’exécute la méthode.

Voici comment j’ai déjà créé plusieurs lignes sur un graphique OxyPlot. La clé crée un ensemble de DataPoints pour chaque série – appelés circlePoints & linePoints dans l’exemple de code suivant. Ceux-ci sont ensuite liés aux CircleSeries et LineSeries:

 var xAxis = new DateTimeAxis { Position = AxisPosition.Bottom, SsortingngFormat = Constants.MarketData.DisplayDateFormat, Title = "End of Day", IntervalLength = 75, MinorIntervalType = DateTimeIntervalType.Days, IntervalType = DateTimeIntervalType.Days, MajorGridlineStyle = LineStyle.Solid, MinorGridlineStyle = LineStyle.None, }; var yAxis = new LinearAxis { Position = AxisPosition.Left, Title = "Value", MajorGridlineStyle = LineStyle.Solid, MinorGridlineStyle = LineStyle.None }; var plot = new PlotModel(); plot.Axes.Add(xAxis); plot.Axes.Add(yAxis); var circlePoints = new[] { new ScatterPoint(DateTimeAxis.ToDouble(date1), value1), new ScatterPoint(DateTimeAxis.ToDouble(date2), value2), }; var circleSeries = new ScatterSeries { MarkerSize = 7, MarkerType = MarkerType.Circle, ItemsSource = circlePoints }; var linePoints = new[] { new DataPoint(DateTimeAxis.ToDouble(date1), value1), new DataPoint(DateTimeAxis.ToDouble(date2), value2), }; var lineSeries = new LineSeries { StrokeThickness = 2, Color = LineDataPointColor, ItemsSource = linePoints }; plot.Series.Add(circleSeries); plot.Series.Add(lineSeries); 

Sucess !!!!

AwkwardCoder, merci pour l’aide, mais j’ai réalisé que mon erreur était juste que j’avais négligé certaines choses!

Voici la version du code qui fonctionne:

  // Make a new plotmodel private PlotModel model = new PlotModel(); // Create the OxyPlot graph for Salt Split private OxyPlot.Wpf.PlotView plot = new OxyPlot.Wpf.PlotView(); // Function to plot data private void plotData(double numWeeks, double startingSS) { List listPointAray = new List(); // Initialize new Salt Split class for acess to data variables Salt_Split_Builder calcSS = new Salt_Split_Builder(); calcSS.compute(numWeeks, startingSS, maxDegSS); // Create new Line Series LineSeries linePoints = new LineSeries() { StrokeThickness = 1, MarkerSize = 1, Title = numWeeks.ToSsortingng() + " weeks" }; // Add each point to the new series foreach (var point in calcSS.saltSplitCurve) { DataPoint XYpoint = new DataPoint(); XYpoint = new DataPoint(point.Key, point.Value * 100); linePoints.Format("%", XYpoint.Y); linePoints.Points.Add(XYpoint); } listPointAray.Add(linePoints); // Add Chart Title model.Title = "Salt Split Degradation"; // Add Each series to the foreach (var series in listPointAray) { // Define X-Axis OxyPlot.Axes.LinearAxis Xaxis = new OxyPlot.Axes.LinearAxis(); Xaxis.Maximum = numWeeks; Xaxis.Minimum = 0; Xaxis.Position = OxyPlot.Axes.AxisPosition.Bottom; Xaxis.Title = "Number of Weeks"; model.Axes.Add(Xaxis); //Define Y-Axis OxyPlot.Axes.LinearAxis Yaxis = new OxyPlot.Axes.LinearAxis(); Yaxis.MajorStep = 15; Yaxis.Maximum = calcSS.saltSplitCurve.Last().Value * 100; Yaxis.MaximumPadding = 0; Yaxis.Minimum = 0; Yaxis.MinimumPadding = 0; Yaxis.MinorStep = 5; Yaxis.Title = "Percent Degradation"; //Yaxis.SsortingngFormat = "{0.00} %"; model.Axes.Add(Yaxis); model.Series.Add(series); } // Add the plot to the window plot.Model = model; plot.InvalidatePlot(true); SaltSplitChartGrid.Children.Clear(); SaltSplitChartGrid.Children.Add(plot); } 

Voici les multiples choses que j’ai mal faites:

  1. Dans ma boucle foreach var series, j’ajoutais la série originale qui avait déjà été ajoutée et PAS la prochaine série var de la liste! (stupide!)
  2. Je créais un nouveau modèle chaque fois que j’exécutais la méthode. Cela signifie qu’à chaque exécution du code, j’ajoutais une série qui existait déjà dans le modèle précédent. (aussi bête!)
  3. Je créais chaque fois un nouveau complot et essayais d’append un modèle dans le nouveau complot ayant déjà appartenu à un précédent. (obtenir un dummer ..)
  4. L’insortinggue était ajoutée à la grid chaque fois que j’exécutais la méthode. Je devais donc effacer les enfants de la grid avant de rappend la même plot.
  5. Je ne rafraîchissais pas l’insortinggue.

C’était beaucoup d’erreurs, mais j’y ai travaillé. J’espère que cela aidera quelqu’un à l’avenir. De plus, je sais que je n’utilise pas les techniques de liaison de données ordinaires, mais au moins, cela fonctionne.

Résultat final: plot de travail http://soffr.miximages.com/charts/359b7d2.png