使用Plot图表插件和自定义设计图表

自定义PLOT图表的开发流程

  • 在window类里面引用
    1
    using Gaiaxis.Components.Oxyplots.PlotModels
  1. 初始化注册图表库的应用
    1
    this. RegeditorPlotsample();

upload successful

  1. 启动系统,在应用模式下面点击图表库,然后点击应用选项,点击图层显示

upload successful

  1. 可以看到自定义的测试样例效果,目前底层仅支持柱状图横向纵向,和曲线图、饼图。

upload successful

upload successful

副标题是方法名称。

upload successful

如何自己扩充新的图表样式,参照

upload successful

如何统一改变色系
在每个plotmodel创建之后,自己重新设置下defaultcolor,如果里面的对象没有人为指定颜色,会依次从这里取,这个色系可参照网上的配色方案。

upload successful

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
using ExampleLibrary;
using Gaiaxis.Defines;
using Gaiaxis.MathUtilities;
using OxyPlot;
using OxyPlot.Series;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
namespace Gaiaxis.Components.Oxyplots.PlotModels
{
/// <summary>
/// 本地自定义标准图形的写法
/// </summary>
public static class PlotPiePlugin
{
/// <summary>
/// 环形图,区别于之前的
/// </summary>
/// <param name="name">表名</param>
/// <param name="data">数据类型</param>
/// <param name="colorStyle">样式</param>
/// <param name="InnerDiameter">内圈半径</param>
/// <param name="Diameter">外圈半径</param>
/// <param name="ExplodedDistance">往外延申距离</param>
/// <param name="isshowmarklabel">是否显示标记百分比</param>
/// <param name="isshowNum">是否显示中心数值</param>
/// <param name="width">表宽</param>
/// <param name="height">表高</param>
/// <returns></returns>
public static void CreatePieCircle(this OxySeriesModel model, DataType2T<int> data, float InnerDiameter = 0, float Diameter = 0.7f, float ExplodedDistance = 0.01f)
{
double totalcount = 0;
wPieSlice[] items = OxyPlotHelper.DataTypeToPieSlice(data);
if (items == null)
{
return;
}
var pieSeries = new PieSeries()
{
OutsideLabelFormat = "{2:0.0}%",
TickLabelDistance = 2,
InnerDiameter = InnerDiameter,
ExplodedDistance = ExplodedDistance,
Stroke = OxyColors.Transparent,
StrokeThickness = 0,
Diameter = Diameter,
AngleSpan = 360.0,
StartAngle = 0
};
foreach (var item in items)
{
pieSeries.Slices = items;
totalcount += item.Value;
}
model.IsLegendVisible = false;
model.Series.Clear();
model.Annotations.Clear();
model.Series.Add(pieSeries);

//if (isshownum && isHasData)
//{
// //渲染饼状图中心数值渲染
// this.Annotations.Add(new DelegateAnnotation(rc =>
// {

// double X = (int)(w / 2 + 5);
// double y = (int)(h / 2);
// rc.DrawText(new ScreenPoint(X, y += D), CenterDescription, this.TextColor, Font, FontSize, FontWeight, 0, HorizontalAlignment.Center, VerticalAlignment.Middle);
// }));
//}
float D = 24;
//饼状图的 图例
model.Annotations.Add(new DelegateAnnotation(rc =>
{
var TLW = D;
var TLH = D * 2;
int index = 0;
foreach (var item in items)
{
if (index < 6)
{
rc.DrawRectangle(new OxyRect(TLW, TLH, 10, 10), item.Fill, item.Fill);
rc.DrawText(new ScreenPoint(TLW + 15, TLH), item.DesCription + " " + item.Value, OxyColors.White, model.Font, model.FontSize / 2, model.FontWeight / 2, 0, model.TitleHPosition, VerticalAlignment.Top);
}
else
{
if (index == 6)
{
TLW = 2000 - D;
TLH = D * 2;
}
rc.DrawRectangle(new OxyRect(TLW, TLH, 10, 10), item.Fill, item.Fill);
rc.DrawText(new ScreenPoint(TLW - 10, TLH), item.DesCription + " " + item.Value, OxyColors.White, model.Font, model.FontSize / 2, model.FontWeight / 2, 0, HorizontalAlignment.Right, VerticalAlignment.Top);
}
TLH += D;
index++;
}
}));
}


public static OxySeriesModel CreatePieCircle(string name, string subname, IDataUpdateEvent owner, Func<DataType2T<int>> Getdata, float InnerDiameter = 0.25f, float Diameter = 0.7f, float ExplodedDistance = 0.01f)
{
var model = new OxySeriesModel(name, subname);
model.InitAxis();
model.CreatePieCircle(Getdata(), InnerDiameter, Diameter, ExplodedDistance);
if (owner != null)
owner.DataUpdateEvent += () =>
{
model.CreatePieCircle(Getdata());
(model as IPlotModel).Update(true);
};
return model;
}
}

[Examples("AGaiaxisUserSeries"), Tags("Series")]
public static class GaiaxisUserSeriesExamples
{
[Example("横向单组[直方图]")]
[DocumentationExample("Series/AGaiaxisUserSeries")]
public static PlotModel CreateBarSeries()
{
return OxyPlotHelper.CreateHorizonBarSeries1("横向单组直方图", "CreateHorizonBarSeries1", null, DataTypeSample.Sample0);
}
[Example("横向单组[直方图]简介模式")]
public static PlotModel CreateSimpleBarSeries()
{
return OxyPlotHelper.CreateHorizonBarSeriesSample1("横向单组直方图", "CreateHorizonBarSeriesSample1", null, DataTypeSample.Sample0);
}

[Example("横向组合[直方图]")]
public static PlotModel CreateTwoBarSeries()
{
return OxyPlotHelper.CreateHorizonGroupBarSeries("直方图", "CreateHorizonGroupBarSeries", null, DataTypeSample.Sample6T);
}

[Example("横向组合[直方图]叠加")]
public static PlotModel CreateTwoBarDateTimeSeries()
{
return OxyPlotHelper.CreateHorizonGroupBarSeriesStake("直方图", "CreateHorizonGroupBarSeriesStake", null, DataTypeSample.Sample6T);
}
[Example("纵向单组直方图")]
public static PlotModel CreateVerticalBarSeries()
{
return OxyPlotHelper.CreateVerticalBarSeries1("纵向单组直方图", "CreateVerticalBarSeries1", null, DataTypeSample.Sample0);
}

[Example("纵向单组直方图简洁模式")]
public static PlotModel CreateSimpleVerticalBarSeries()
{
return OxyPlotHelper.CreateVerticalBarSeriesSample1("纵向单组直方图", "CreateVerticalBarSeriesSample1", null, DataTypeSample.Sample0);
}
[Example("纵向组合直方图")]
public static PlotModel CreateTwoBarVerticalSeries()
{
return OxyPlotHelper.CreateVerticalGroupBarSeries("直方图", "CreateVerticalGroupBarSeries", null, DataTypeSample.Sample6T);
}

[Example("时间-数值曲线1")]
public static PlotModel CreateDateTimeVerticalSeries1()
{
return OxyPlotHelper.CreateCurvePathSeries("时间-数值曲线", "CreateCurvePathSeries", null, PathSeriesMode.Area, DataTypeSample.Sample6TDate);
}
[Example("时间-数值曲线2")]
public static PlotModel CreateDateTimeVerticalSeries2()
{
return OxyPlotHelper.CreateCurvePathSeries("时间-数值曲线", "CreateCurvePathSeries", null, PathSeriesMode.PathLine, DataTypeSample.Sample6TDate);
}
[Example("时间-数值曲线3")]
public static PlotModel CreateDateTimeVerticalSeries3()
{
return OxyPlotHelper.CreateCurvePathSeries("时间-数值曲线", "CreateCurvePathSeries", null, PathSeriesMode.Stair, DataTypeSample.Sample6TDate);
}
[Example("时间-数值曲线4")]
public static PlotModel CreateDateTimeVerticalSeries4()
{
return OxyPlotHelper.CreateCurvePathSeries("时间-数值曲线", "CreateCurvePathSeries", null, PathSeriesMode.Stem, DataTypeSample.Sample6TDate);
}

[Example("饼图")]
public static PlotModel CreatePieCircle2()
{
return PlotPiePlugin.CreatePieCircle("饼图", "CreatePieCircle", null, DataTypeSample.Sample0);
}

[Example("散点图")]
public static PlotModel CreateBubble()
{
return OxyPlotHelper.CreateBubble("散点图", "CreateBubble", null, DataTypeSample.Sample0);
}
}
public class DataTypeSample
{

public static void Load(TypeInfo type, ref List<ExampleInfo> list)
{
var examplesAttribute = type.GetCustomAttributes<ExamplesAttribute>().FirstOrDefault();
if (examplesAttribute == null)
{
return;
}
var examplesTags = type.GetCustomAttributes<TagsAttribute>().FirstOrDefault() ?? new TagsAttribute();

var types = new List<Type>();
var baseType = type;
while (baseType != null)
{
types.Add(baseType.AsType());
baseType = baseType.BaseType != null ? baseType.BaseType.GetTypeInfo() : null;
}

foreach (var t in types)
{
var methods = t.GetRuntimeMethods();

foreach (var method in methods)
{
try
{
var exampleAttribute = method.GetCustomAttributes<ExampleAttribute>().FirstOrDefault();
if (exampleAttribute != null)
{
var exampleTags = method.GetCustomAttributes<TagsAttribute>().FirstOrDefault() ?? new TagsAttribute();
var tags = new List<string>(examplesTags.Tags);
tags.AddRange(exampleTags.Tags);
list.Add(
new ExampleInfo(
examplesAttribute.Category,
exampleAttribute.Title,
tags.ToArray(),
method));
}
}
catch (Exception)
{
}
}
}
}
public static DataType2T<int> Sample0()
{
DataType2T<int> data = new DataType2T<int>();
data.name = "Name";
data.subname = "Subname";
for (int i = 0; i < 20; i++)
{
data.Content.Add("item" + i.ToString(), SeMath.random.Next(60));
}
return data;
}
public static DataType2T<double> Sample2TD()
{
DataType2T<double> data = new DataType2T<double>();
data.name = "Name";
data.subname = "Subname";
for (int i = 0; i < 20; i++)
{
data.Content.Add("item" + i.ToString(), SeMath.random.NextDouble());
}
return data;
}

public static DataType7T<int> Sample7T()
{
DataType7T<int> data = new DataType7T<int>();
for (int i = 0; i < 20; i++)
{
data.Content.Add(DateTime.Now.AddHours(i), SeMath.random.Next(60));
}
return data;
}
public static DataType7T<float> Sample7TF()
{
DataType7T<float> data = new DataType7T<float>();
for (int i = 0; i < 20; i++)
{
data.Content.Add(DateTime.Now.AddHours(i), (float)(SeMath.random.NextDouble()));
}
return data;
}
public static DataType8T<float> Sample8TF()
{
DataType8T<float> data = new DataType8T<float>();

for (int i = 0; i < 4; i++)
{
Dictionary<DateTime, float> node = new Dictionary<DateTime, float>();
for (int m = 0; m < 8; m++)
{
node.Add(DateTime.Now.AddHours(m), (float)(SeMath.random.NextDouble()));
}
data.Content.Add("item" + i.ToString(), node);
}
return data;
}
public static DataType8T<int> Sample8T()
{
DataType8T<int> data = new DataType8T<int>();

for (int i = 0; i < 4; i++)
{
Dictionary<DateTime, int> node = new Dictionary<DateTime, int>();
for (int m = 0; m < 8; m++)
{
node.Add(DateTime.Now.AddHours(m), (SeMath.random.Next(60)));
}
data.Content.Add("item" + i.ToString(), node);
}
return data;
}

public static DataType6TDate Sample6TDate()
{
DataType6TDate data = new DataType6TDate();
for (int i = 0; i < 3; i++)
{
Dictionary<DateTime, double> node = new Dictionary<DateTime, double>();
for (int m = 0; m < 12; m++)
{
node.Add(DateTime.Now.AddHours(m), (SeMath.random.Next(24)));
}
data.Content_timeslot.Add("item_" + i.ToString(), node);
}
return data;
}
public static DataType6T Sample6T()
{
DataType6T data = new DataType6T();
for (int i = 0; i < 3; i++)
{
Dictionary<string, int> node = new Dictionary<string, int>();
for (int m = 0; m < 12; m++)
{
node.Add("Subitem" + m.ToString(), (SeMath.random.Next(60)));
}
data.Content_timeslot.Add("item" + i.ToString(), node);
}
return data;
}
public static DataType9T Sample9T()
{
DataType9T data = new DataType9T();
for (int i = 0; i < 3; i++)
{
Dictionary<string, double> node = new Dictionary<string, double>();
for (int m = 0; m < 12; m++)
{
node.Add("Subitem" + m.ToString(), SeMath.random.NextDouble());
}
data.Content.Add("item" + i.ToString(), node);
}
return data;
}
}
}