2016-05-25 3 views
2

Я использую OxyPlot для одного из проектов, над которыми я сейчас работаю, и он работает очень хорошо. Однако я не смог решить проблему построения нескольких графиков в одном окне. Моя цель - сделать что-то вроде this.OxyPlot: построение нескольких графиков в одном окне с использованием OxyPlot и WindowsForms

Мой текущий отдельный участок выглядит как this.

Вот некоторые из моего кода

 var myModel = new PlotModel { Title = "REBA Score" }; 

     myModel.Axes.Add(new LinearAxis { Position = AxisPosition.Bottom, MajorGridlineStyle = LineStyle.Solid, MinorGridlineStyle = LineStyle.Dot, Minimum = 0, Maximum = a_count, Title = "Frame" }); 
     myModel.Axes.Add(new LinearAxis { Position = AxisPosition.Left, MajorGridlineStyle = LineStyle.Solid, MinorGridlineStyle = LineStyle.Dot, Minimum = 0, Maximum = 15, Title = "Score" }); 



     var series1 = new LineSeries 
     { 
      StrokeThickness = 1, 
      MarkerSize = 1, 
     }; 

     for (int i = 0; i < a_count; i++) 
     { 
      int x_val = i; 
      int y_val = scores[0, i]; //"scores" is an array with my data 

      series1.Points.Add(new DataPoint(x_val, y_val)); 

     } 

     myModel.Series.Add(series1); 


     this.plot1.Model = myModel //plot1 is an object of PlotView 

То, что я хочу сделать, это использовать тот же метод «Создать линейный ряд -> Fill -> участок» для нескольких различных массивов данных и его отображения в упомянутый ранее. Я использую WindowsForms и OxyPlot для этого проекта.

+0

Создайте несколько объектов «PlotModel» с разными именами и назначьте их другим «PlotViews». Вы можете уменьшить свою маржу или поместить их в разные контейнеры, чтобы они выстроились так, как в примере. – bgura

+0

Спасибо, я попробую это и отчитаю –

+1

Это работает! Я только что создал несколько PlotView и связал их с моей формой, изменив размер и положение каждого в соответствии с моими потребностями. –

ответ

2

Вот что я сделал с помощью рекомендации bgura.

Сначала я создал несколько PlotView и установил их свойства. Я изменил их размер, чтобы они не занимали все окно, и я не задумывался, чтобы прокомментировать строку, где свойство «Dock» было заполнено, поскольку это привело к тому, что изменение размера не повлияло. Затем вы можете отрегулировать размер формы и отдельного PlotView для достижения эффекта множественного участка.

private OxyPlot.WindowsForms.PlotView plot1; 
    private OxyPlot.WindowsForms.PlotView plot2; 
    private OxyPlot.WindowsForms.PlotView plot3; 


     private void InitializeComponent() 
    { 
     this.plot1 = new OxyPlot.WindowsForms.PlotView(); 
     this.plot2 = new OxyPlot.WindowsForms.PlotView(); 
     this.plot3 = new OxyPlot.WindowsForms.PlotView(); 
     this.SuspendLayout(); 
     // 
     // plot1 
     // 
     //this.plot1.Dock = System.Windows.Forms.DockStyle.Fill; 
     this.plot1.Location = new System.Drawing.Point(0, 0); 
     this.plot1.Name = "plot1"; 
     this.plot1.PanCursor = System.Windows.Forms.Cursors.Hand; 
     this.plot1.Size = new System.Drawing.Size(300, 300); 
     this.plot1.TabIndex = 0; 
     this.plot1.Text = "plot1"; 
     this.plot1.ZoomHorizontalCursor = System.Windows.Forms.Cursors.SizeWE; 
     this.plot1.ZoomRectangleCursor = System.Windows.Forms.Cursors.SizeNWSE; 
     this.plot1.ZoomVerticalCursor = System.Windows.Forms.Cursors.SizeNS; 
     // 
     // plot2 
     // 
     //this.plot2.Dock = System.Windows.Forms.DockStyle.Fill; 
     this.plot2.Location = new System.Drawing.Point(300, 0); 
     this.plot2.Name = "plot2"; 
     this.plot2.PanCursor = System.Windows.Forms.Cursors.Hand; 
     this.plot2.Size = new System.Drawing.Size(300, 300); 
     this.plot2.TabIndex = 0; 
     this.plot2.Text = "plot2"; 
     this.plot2.ZoomHorizontalCursor = System.Windows.Forms.Cursors.SizeWE; 
     this.plot2.ZoomRectangleCursor = System.Windows.Forms.Cursors.SizeNWSE; 
     this.plot2.ZoomVerticalCursor = System.Windows.Forms.Cursors.SizeNS; 
     // 
     // plot3 
     // 
     //this.plot3.Dock = System.Windows.Forms.DockStyle.Fill; 
     this.plot3.Location = new System.Drawing.Point(900, 600); 
     this.plot3.Name = "plot3"; 
     this.plot3.PanCursor = System.Windows.Forms.Cursors.Hand; 
     this.plot3.Size = new System.Drawing.Size(300,300); 
     this.plot3.TabIndex = 0; 
     this.plot3.Text = "plot3"; 
     this.plot3.ZoomHorizontalCursor = System.Windows.Forms.Cursors.SizeWE; 
     this.plot3.ZoomRectangleCursor = System.Windows.Forms.Cursors.SizeNWSE; 
     this.plot3.ZoomVerticalCursor = System.Windows.Forms.Cursors.SizeNS; 
     // 
     // Form1 
     // 
     this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); 
     this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 
     this.ClientSize = new System.Drawing.Size(1225, 900); 
     this.Controls.Add(this.plot3); 
     this.Controls.Add(this.plot1); 
     this.Controls.Add(this.plot2); 
     this.Name = "Form1"; 
     this.Text = "plot3 Score"; 
     this.ResumeLayout(false); 

    } 

Затем я создал несколько PlotModel-х и наполнили их с данными, и приписал их соответствующие им PlotView-х:

 this.InitializeComponent(); 

     //Setup plot1 
     var plot1_model = new PlotModel { Title = "plot1 Score" }; 

     plot1_model.Axes.Add(new LinearAxis { Position = AxisPosition.Bottom, MajorGridlineStyle = LineStyle.Solid, MinorGridlineStyle = LineStyle.Dot, Minimum = 0, Maximum = a_count, Title = "Frame" }); 
     plot1_model.Axes.Add(new LinearAxis { Position = AxisPosition.Left, MajorGridlineStyle = LineStyle.Solid, MinorGridlineStyle = LineStyle.Dot, Minimum = 0, Maximum = 15, Title = "Score" }); 


     var plot1_Series = new LineSeries { StrokeThickness = 1, MarkerSize = 1 }; 

     for (int i = 0; i < a_count; i++) 
     { 
      int x_val = i; 
      int y_val = your_data[0, i]; 

      plot1_Series.Points.Add(new DataPoint(x_val, y_val)); 

     } 

     plot1_model.Series.Add(plot1_Series); 

     //Setup plot2 
     var plot2_Model = new PlotModel { Title = "plot2 Score" }; 

     plot2_Model.Axes.Add(new LinearAxis { Position = AxisPosition.Bottom, MajorGridlineStyle = LineStyle.Solid, MinorGridlineStyle = LineStyle.Dot, Minimum = 0, Maximum = a_count, Title = "Frame" }); 
     plot2_Model.Axes.Add(new LinearAxis { Position = AxisPosition.Left, MajorGridlineStyle = LineStyle.Solid, MinorGridlineStyle = LineStyle.Dot, Minimum = 0, Maximum = 15, Title = "Score" }); 


     var plot2_Series = new LineSeries { StrokeThickness = 1, MarkerSize = 1 }; 

     for (int i = 0; i < a_count; i++) 
     { 
      int x_val = i; 
      int y_val = your_data[1, i]; 

      plot2_Series.Points.Add(new DataPoint(x_val, y_val)); 

     } 

     plot2_Model.Series.Add(plot2_Series); 







     //Setup plot3 
     var plot3_Model = new PlotModel { Title = "plot3 Score" }; 

     plot3_Model.Axes.Add(new LinearAxis { Position = AxisPosition.Bottom, MajorGridlineStyle = LineStyle.Solid, MinorGridlineStyle = LineStyle.Dot, Minimum = 0, Maximum = a_count, Title = "Frame" }); 
     plot3_Model.Axes.Add(new LinearAxis { Position = AxisPosition.Left, MajorGridlineStyle = LineStyle.Solid, MinorGridlineStyle = LineStyle.Dot, Minimum = 0, Maximum = 15, Title = "Score" }); 


     var plot3_Series = new LineSeries{ StrokeThickness = 1, MarkerSize = 1}; 

     for (int i = 0; i < a_count; i++) 
     { 
      int x_val = i; 
      int y_val = your_data[3, i]; 

      plot3_Series.Points.Add(new DataPoint(x_val, y_val)); 

     } 
     this.plot1.Model = plot1_Model; 
     this.plot2.Model = plot2_model; 
     this.plot3.Model = plot3_Model; 

Надеемся, что это может помочь кому-то, кто должен реализовать ту же функцию. В случае, если кто-то задавался вопросом, я в значительной степени использовал программу HelloWorld из документации OxyPlot и добавил к ней. Это можно найти here

+0

В качестве примера обратите внимание, что в этом примере имеется только 3 разных графика, которые не заполнят весь экран в этом случае. Тем не менее, та же стратегия может быть использована для создания достаточно участков для заполнения экрана любого размера. –

0

Я использовал TableLayoutPanel для размещения отдельных участков в разных строках и столбцах. Я планирую программно добавлять графики, поэтому я могу добавлять строки и прикреплять их в макете.

Смежные вопросы