【问题标题】:OxyPlot: Plotting several graphs on one window using OxyPlot and WindowsFormsOxyPlot:使用 OxyPlot 和 WindowsForms 在一个窗口上绘制多个图形
【发布时间】:2016-05-25 16:35:51
【问题描述】:

我一直在将 OxyPlot 用于我目前正在进行的一个项目,并且效果非常好。但是,我一直无法解决在一个窗口中绘制多个图形的问题。我的目标是能够做类似this 的事情。

我当前的单情节看起来像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

我想要做的是对几个不同的数据数组使用“创建线性系列 -> 填充 -> 绘图”的相同方法,并如前所述显示它。我正在为这个项目使用 WindowsForms 和 OxyPlot。

【问题讨论】:

  • 创建多个不同名称的“PlotModel”对象,并将它们分配给不同的“PlotViews”。您可以减少它们的边距或将它们放入不同的容器中,以使它们像示例中一样排列。
  • 谢谢,我会试试这个并报告
  • 这行得通!我刚刚创建了多个 PlotView 并将它们链接到我的表单,更改每个 PlotView 的大小和位置以满足我的需要。
  • 为了“完整性”,您可以发布您用来回答您自己问题的解决方案,以防其他人将来有同样的问题

标签: c# winforms visual-studio graph oxyplot


【解决方案1】:

这是我使用 bgura 的建议所做的。

我首先创建了多个 PlotView 并设置了它们的属性。我更改了它们的大小,因此它们不会占据整个窗口,并且我确保注释掉“Dock”属性设置为填充的行,因为这导致大小的更改无效。然后,您可以调整 Form 和各个 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;

希望这可以帮助需要实现相同功能的人。如果有人想知道,我几乎使用了 OxyPlot 文档中的 HelloWorld 程序并将其添加到其中。可以找到here

【讨论】:

  • 附带说明,这个例子只有 3 个不同的图,在这种情况下不会填满整个屏幕。但是,可以使用相同的策略来创建足够的绘图来填充任何大小的屏幕。
【解决方案2】:

我使用TableLayoutPanel 在不同的行和列中排列单独的图。我打算以编程方式添加图表,这样我就可以添加行并将它们停靠在布局中。

【讨论】:

    【解决方案3】:

    当我遇到同样的问题时,我想就这个话题提出我的解决方案。 如果您想在一个 Plotview 中绘制多个图形(具有不同的比例),您不需要每次都创建一个新的 Plotview。只需为要添加新图形的轴分配一个“AxisKey”。

    例如: 这些是轴:

    Dim xAxes As New OxyPlot.Axes.DateTimeAxis()
    With xAxes
        .Key = "x_first_Time"
        .Position = Axes.AxisPosition.Bottom
        .StringFormat = "HH:mm:ss"
        .Unit = "ms"
        .Title = "Zeitintervall"
        .TitleFont = "Arial"
        .TitleFontSize = 18.0!
        .TitleFontWeight = FontWeights.Bold
        .MajorGridlineStyle = LineStyle.Dot
        .MajorGridlineThickness = 0.5
    
    End With
    model.Axes.Add(xAxes)
    
    Dim yAxestemp As New OxyPlot.Axes.LinearAxis()
    With yAxestemp
        .Position = Axes.AxisPosition.Left
        .Unit = "deg Celsius"
        .Key = "y_first_Temp"
        .TitlePosition = 0.5
        .AxisTitleDistance = 10
        .Title = "Temperatur "
        .TitleFont = "Arial"
        .TitleFontSize = 18.0!
        .TitleFontWeight = FontWeights.Bold
        .MajorGridlineStyle = LineStyle.Dot
        .MajorGridlineThickness = 0.5
    
    End With
    model.Axes.Add(yAxestemp)
    
    Dim yAxesRPM As New OxyPlot.Axes.LinearAxis()
    With yAxesRPM
        .Position = Axes.AxisPosition.Right
        .Unit = "1/min"
        .Key = "y_second_RPM"
        .TitlePosition = 0.5
        .AxisTitleDistance = 10
        .Title = "Drehzahl "
        .TitleFont = "Arial"
        .TitleFontSize = 18.0!
        .TitleFontWeight = FontWeights.Bold
    
    End With
    model.Axes.Add(yAxesRPM)
    Plot.Model = model
    

    系列看起来像这样:

    With Sensor1series
        .Title = "Sensor_1"
        .YAxisKey = "y_first_Temp"
    End With
    model.Series.Add(Sensor1series)
    
    With Sensor2series
        .Title = "Sensor_2"
        .YAxisKey = "y_first_Temp"
    End With
    model.Series.Add(Sensor2series)
    
    With Sensor3series
        .Title = "Sensor_3"
        .YAxisKey = "y_first_Temp"
    End With
    model.Series.Add(Sensor3series)
    
    With Sensor4series
        .Title = "Sensor_4"
        .YAxisKey = "y_first_Temp"
    End With
    model.Series.Add(Sensor4series)
    
    With drehzahlseries
        .Title = "Drehzahl [rpm]"
        .LineStyle = LineStyle.Dot
        .YAxisKey = "y_second_RPM"
    End With
    model.Series.Add(drehzahlseries)
    

    为了用一些数据填充这些系列,我创建了一个包含另一个类中的数据的列表。 这是填充系列的示例:

    Sensor1series.Points.Add(New OxyPlot.DataPoint(Time, Datalist.Last.tempvalue1))
    Sensor2series.Points.Add(New OxyPlot.DataPoint(Time, Datalist.Last.tempvalue2))
    Sensor3series.Points.Add(New OxyPlot.DataPoint(Time, Datalist.Last.tempvalue3))
    Sensor4series.Points.Add(New OxyPlot.DataPoint(Time, Datalist.Last.tempvalue4))
    drehzahlseries.Points.Add(New OxyPlot.DataPoint(Time, Datalist.Last.RPM))
    TextBox_Time.Text = Datalist.Last.time.ToString()
    

    这应该是这样的,Rpm 在辅助轴上。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-16
      相关资源
      最近更新 更多