最近在學習OxyPlot圖表控制元件,一些基本的學習心得,在這裡記錄一下,方便以後進行查詢。
 
一、引用
OxyPlot控制元件可以直接在VS的 “ Nuget ” 裡面下載
 
選擇:
 
下載最新版本的就行。
 
二、使用
 
在前端介面中,我們需要新增引用:
 
xmlns:oxy="http://oxyplot.org/wpf"
 
引用過後,新增圖表的承載控制元件PlotView:
 
1 <Grid>
2 <oxy:PlotView Model="{Binding Model}" />
3 </Grid>
 
其中的 “ Model ” 與 後端的 ViewModel 進行繫結,這個屬性相當於 ContentControl 控制元件的Content 屬性。
 
在後端的 ViewModel 中,我們定義 前端介面中繫結的屬性 “ Model ”:
 
1 private PlotModel model;
2 public PlotModel Model
3 {
4 get { return model; }
5 set { SetProperty(ref model, value); }
6 }
 
現在我們就可以開始 " 創作 " 了!
 
三、新增內容
 
這裡就直接上程式碼了,相應的解釋會放在程式碼中:
 
1、直線
 
首先我們先來畫一條直線
 1 Private void GetLine()
2 {
3 var tmp = new PlotModel
4 {
5 Title = "Demo", //圖表的Titile
6 Subtitle = "直線" //圖表的說明
7 };
8 var series2 = new LineSeries
9 {
10 Title = "Series 2", //線的說明
11 MarkerType = MarkerType.Square //標記點 的型別、形狀
12 };
13 series2.Points.Add(new DataPoint(0, 0));//新增線的第一個點座標
14 series2.Points.Add(new DataPoint(4, 4));//新增線的第二個點的座標
15 tmp.Series.Add(series2);//將線新增到圖示的容器中
16 this.Model = tmp;//賦值
17 }
 
執行結果:
 
2、曲線
 
知道了直線怎麼畫,那麼看看平滑的曲線該怎麼畫
 
 1 Private void GetSpline()
2 {
3 var lineSeries1 = new LineSeries { Title = "Series 1", MarkerType = MarkerType.Circle };
4 //畫曲線主要是需要將線的 InterpolationAlgorithm 屬性 設定為 CanonicalSpline 就可變成曲線
5 lineSeries1.InterpolationAlgorithm = InterpolationAlgorithms.CanonicalSpline;
6 lineSeries1.Points.Add(new DataPoint(0, 20));
7 lineSeries1.Points.Add(new DataPoint(10, 21));
8 lineSeries1.Points.Add(new DataPoint(20, 24));
9 lineSeries1.Points.Add(new DataPoint(30, 22));
10 lineSeries1.Points.Add(new DataPoint(40, 17));
11 lineSeries1.Points.Add(new DataPoint(50, 21));
12 lineSeries1.Points.Add(new DataPoint(60, 23));
13 lineSeries1.Points.Add(new DataPoint(70, 27));
14 lineSeries1.Points.Add(new DataPoint(80, 27));
15 lineSeries1.Points.Add(new DataPoint(90, 22));
16 lineSeries1.Points.Add(new DataPoint(100, 25));
17 tmp.Series.Add(lineSeries1);
18 this.Model = tmp;
19 }
效果圖如下:
 
3、有填充的線
 
有時候有的需求是要將線進行填充,以達到更好的視覺效果:
 
以上面的例子為例:
 
 1 Private void GetSpline()
2 {
3 //將線進行填充 ,主要是將線的型別改為 AreaSeries 即可 但是此時是不會顯示Mark點
4 var lineSeries1 = new AreaSeries { Title = "Series 1", MarkerType = MarkerType.Circle };
5
6 //畫曲線主要是需要將線的 InterpolationAlgorithm 屬性 設定為 CanonicalSpline 就可變成曲線
7 lineSeries1.InterpolationAlgorithm = InterpolationAlgorithms.CanonicalSpline;
8 lineSeries1.Points.Add(new DataPoint(0, 20));
9 lineSeries1.Points.Add(new DataPoint(10, 21));
10 lineSeries1.Points.Add(new DataPoint(20, 24));
11 lineSeries1.Points.Add(new DataPoint(30, 22));
12 lineSeries1.Points.Add(new DataPoint(40, 17));
13 lineSeries1.Points.Add(new DataPoint(50, 21));
14 lineSeries1.Points.Add(new DataPoint(60, 23));
15 lineSeries1.Points.Add(new DataPoint(70, 27));
16 lineSeries1.Points.Add(new DataPoint(80, 27));
17 lineSeries1.Points.Add(new DataPoint(90, 22));
18 lineSeries1.Points.Add(new DataPoint(100, 25));
19 tmp.Series.Add(lineSeries1);
20 this.Model = tmp;
21 }
4、標識
從 3、有填充的線 可以看到線的標識 遮擋住了一部分的線,這在構圖時可能會損失許多資料
 
為了避免這種情況,就必須要移動標識的位置
 
你在問什麼是標識???
 
 
這就是標識!!
 
以上面的例子為例:
 
 1 var tmp = new PlotModel { Title = "Demo", Subtitle = "曲線" };
2 tmp.LegendBackground = OxyColor.FromArgb(200, 255, 255, 255);//設定背景顏色
3 tmp.LegendBorder = OxyColors.Transparent;//設定邊框顏色
4 tmp.LegendOrientation = LegendOrientation.Horizontal;//設定標識對其方式
5 tmp.LegendPlacement = LegendPlacement.Outside;//設定標識在圖示中的相對位置 是在裡面還是在外面
6 tmp.LegendPosition = LegendPosition.BottomLeft;//設定標識在整個容器中的位置 此時是左下角
7
8 //將線進行填充 ,主要是將線的型別改為 AreaSeries 即可 但是此時是不會顯示Mark點
9 var lineSeries1 = new AreaSeries { Title = "Series 1", MarkerType = MarkerType.Circle };
10 //畫曲線主要是需要將線的 InterpolationAlgorithm 屬性 設定為 CanonicalSpline 就可變成曲線
11 lineSeries1.InterpolationAlgorithm = InterpolationAlgorithms.CanonicalSpline;
12 lineSeries1.Points.Add(new DataPoint(0, 20));
13 lineSeries1.Points.Add(new DataPoint(10, 21));
14 lineSeries1.Points.Add(new DataPoint(20, 24));
15 lineSeries1.Points.Add(new DataPoint(30, 22));
16 lineSeries1.Points.Add(new DataPoint(40, 17));
17 lineSeries1.Points.Add(new DataPoint(50, 21));
18 lineSeries1.Points.Add(new DataPoint(60, 23));
19 lineSeries1.Points.Add(new DataPoint(70, 27));
20 lineSeries1.Points.Add(new DataPoint(80, 27));
21 lineSeries1.Points.Add(new DataPoint(90, 22));
22 lineSeries1.Points.Add(new DataPoint(100, 25));
23 tmp.Series.Add(lineSeries1);
24 this.Model = tmp;
效果圖如下:
 
 
 
下面是多條線的情況:
 1 var tmp = new PlotModel { Title = "Demo", Subtitle = "曲線" };
2 tmp.LegendBackground = OxyColor.FromArgb(200, 255, 255, 255);//設定背景顏色
3 tmp.LegendBorder = OxyColors.Transparent;//設定邊框顏色
4 tmp.LegendOrientation = LegendOrientation.Horizontal;//設定標識對其方式
5 tmp.LegendPlacement = LegendPlacement.Outside;//設定標識在圖示中的相對位置 是在裡面還是在外面
6 tmp.LegendPosition = LegendPosition.BottomLeft;//設定標識在整個容器中的位置 此時是左下角
7
8 //line1
9 //將線進行填充 ,主要是將線的型別改為 AreaSeries 即可 但是此時是不會顯示Mark點
10 var lineSeries1 = new AreaSeries { Title = "Series 1", MarkerType = MarkerType.Circle };
11 //畫曲線主要是需要將線的 InterpolationAlgorithm 屬性 設定為 CanonicalSpline 就可變成曲線
12 lineSeries1.InterpolationAlgorithm = InterpolationAlgorithms.CanonicalSpline;
13 lineSeries1.Points.Add(new DataPoint(0, 20));
14 lineSeries1.Points.Add(new DataPoint(10, 21));
15 lineSeries1.Points.Add(new DataPoint(20, 24));
16 lineSeries1.Points.Add(new DataPoint(30, 22));
17 lineSeries1.Points.Add(new DataPoint(40, 17));
18 lineSeries1.Points.Add(new DataPoint(50, 21));
19 lineSeries1.Points.Add(new DataPoint(60, 23));
20 lineSeries1.Points.Add(new DataPoint(70, 27));
21 lineSeries1.Points.Add(new DataPoint(80, 27));
22 lineSeries1.Points.Add(new DataPoint(90, 22));
23 lineSeries1.Points.Add(new DataPoint(100, 25));
24 tmp.Series.Add(lineSeries1);
25
26 //Line2
27 var series2 = new LineSeries { Title = "Series 2", MarkerType = MarkerType.Square };
28 series2.Points.Add(new DataPoint(0, 0));
29 series2.Points.Add(new DataPoint(4, 4));
30 series2.Points.Add(new DataPoint(10, 12));
31 series2.Points.Add(new DataPoint(20, 16));
32 series2.Points.Add(new DataPoint(30, 25));
33 series2.Points.Add(new DataPoint(40, 5));
34 tmp.Series.Add(series2);
35
36 this.Model = tmp;
執行效果如下:
 
 
 
5、設定座標軸,以及設定帶數值顯示的折線
 
 1 var tmp = new PlotModel { Title = "Demo", Subtitle = "曲線" };
2 tmp.LegendBackground = OxyColor.FromArgb(200, 255, 255, 255);
3 tmp.LegendBorder = OxyColors.Transparent;
4 tmp.LegendOrientation = LegendOrientation.Horizontal;
5 tmp.LegendPlacement = LegendPlacement.Outside;
6 tmp.LegendPosition = LegendPosition.BottomLeft;
7 tmp.LegendSymbolLength = 24;
8
9 var linearAxis1 = new LinearAxis();
10 linearAxis1.MajorGridlineStyle = LineStyle.Solid;
11 linearAxis1.MinorGridlineStyle = LineStyle.Dot;
12 linearAxis1.Title = "Y";
13 linearAxis1.Minimum = 0;
14 linearAxis1.Maximum = 35;
15 tmp.Axes.Add(linearAxis1);
16
17 var linearAxis2 = new LinearAxis();
18 linearAxis2.MajorGridlineStyle = LineStyle.Solid;
19 linearAxis2.MinorGridlineStyle = LineStyle.Dot;
20 linearAxis2.Position = AxisPosition.Bottom;
21 linearAxis2.Title = "X";
22 tmp.Axes.Add(linearAxis2);
23
24 var lineSeries1 = new LineSeries { Title = "Series 1", MarkerType = MarkerType.Circle };
25 lineSeries1.LabelFormatString = "{1}";
26 lineSeries1.Points.Add(new DataPoint(0, 20));
27 lineSeries1.Points.Add(new DataPoint(10, 21));
28 lineSeries1.Points.Add(new DataPoint(20, 24));
29 lineSeries1.Points.Add(new DataPoint(30, 22));
30 lineSeries1.Points.Add(new DataPoint(40, 17));
31 lineSeries1.Points.Add(new DataPoint(50, 21));
32 lineSeries1.Points.Add(new DataPoint(60, 23));
33 lineSeries1.Points.Add(new DataPoint(70, 27));
34 lineSeries1.Points.Add(new DataPoint(80, 27));
35 lineSeries1.Points.Add(new DataPoint(90, 22));
36 tmp.Series.Add(lineSeries1);
37
38 var series2 = new LineSeries { Title = "Series 2", MarkerType = MarkerType.Square };
39 series2.Points.Add(new DataPoint(0, 0));
40 series2.Points.Add(new DataPoint(4, 4));
41 series2.Points.Add(new DataPoint(10, 12));
42 series2.Points.Add(new DataPoint(20, 16));
43 series2.Points.Add(new DataPoint(30, 25));
44 series2.Points.Add(new DataPoint(40, 5));
45
46 tmp.Series.Add(series2);
47 this.Model = tmp;
執行圖如下:
 
暫時的學習就到這裡,剩餘的可能要以後才能更新。
 
如果有錯誤希望能夠及時得到大家的指導。