aardio调用c# ScottPlot 控件显示波形图

By admin at 2022-03-07 • 0人收藏 • 5913人看过

image.png

ScottPlot是用c# .net编写的波形图控件, 在winforms上性能优异, 上手简单, 只需要几行代码即可生成漂亮丝滑的波形图. 支持 折线图 / 直方图 / 饼图 / 散点图, 等等,

关键是开源免费MIT.

官方: https://scottplot.net/

github地址: https://github.com/scottplot/scottplot


特别注意:

运行以下示例 , 请将aardio升级到 v34.39.0 以上 , 因为此版本jacenHe老大对dotnet库进行了大幅度的更新, 下面代码里用到了最新的功能.


↓ScottPlot4.1.35版本控件

ScottPlot_V4.1.35.zip



第一版 简易封装调用库:

我将以下示例中常用的一些函数封装了库, 因为函数太多了, 

没文档, 要读代码慢慢看函数, 先这样, 以后慢慢增加吧.


↓↓↓↓demo↓↓↓↓↓

ScottPlot_Demo.zip



第一个示例:

import win.ui;
/*DSG{{*/
var winform = win.form(text="aardio form";right=759;bottom=469)
winform.add(
custom={cls="custom";text="自定义控件";left=0;top=0;right=760;bottom=470;bgcolor=12639424;db=1;dl=1;dr=1;dt=1;z=1}
)
/*}}*/


import dotNet;
var dll = dotNet.load("\ScottPlot.WinForms.dll");
var Chart = dll.new("ScottPlot.FormsPlot");
//绑定界面
dotNet.setParent(Chart,winform.custom);

var Plotdll = dotNet.load("\ScottPlot.dll");
var DataGen = Plotdll.import("ScottPlot.DataGen");

var xs = DataGen.Consecutive(51);
var sin = DataGen.Sin(51);
var cos = DataGen.Cos(51);

var plt = Chart.Plot;
// 2条曲线
plt.AddScatter(xs, sin);
plt.AddScatter(xs, cos);

// plot参数设置
plt.Title("aardio调用c# ScottPlot 控件");
plt.XLabel("X轴");
plt.YLabel("Y轴");
plt.AddCrosshair(0.0, 0.0);
Chart.Refresh(true);


winform.show();
win.loopMessage();


31 个回复 | 最后更新于 2022-08-03
2022-03-08   #1

image.png

import dotNet;

var dll = dotNet.load("\ScottPlot.WinForms.dll");
var Chart = dll.new("ScottPlot.FormsPlot");
//绑定界面
dotNet.setParent(Chart,winform.custom);

var Plotdll = dotNet.load("\ScottPlot.dll");
var DataGen = Plotdll.import("ScottPlot.DataGen");
var plt = Chart.Plot;
// plot one set of data using the primary Y axis
var sin = DataGen.Sin(51,com.double(1));
var cos = DataGen.Cos(51,com.double(1),com.double(0),com.double(100));

var sigSmall = plt.AddSignal(sin, com.double(1));
sigSmall.YAxisIndex = 0;
sigSmall.XAxisIndex = 0;
plt.XAxis.Label("Primary X Axis");
plt.YAxis.Label("Primary Y Axis");
plt.XAxis.Color(sigSmall.Color);
plt.YAxis.Color(sigSmall.Color);

// plot another set of data using the secondary axes
var sigBig = plt.AddSignal(cos, com.double(100));
sigBig.YAxisIndex = 1;
sigBig.XAxisIndex = 1;
plt.YAxis2.Ticks(true); // ticks weren't visible by default
plt.XAxis2.Ticks(true); // ticks weren't visible by default
plt.YAxis2.Color(sigBig.Color);
plt.XAxis2.Color(sigBig.Color);
plt.YAxis2.Label("Secondary Y Axis");
plt.XAxis2.Label("Secondary X Axis");

Chart.Refresh(true);


2022-03-08   #2

双Y轴:

image.png

import dotNet;

var dll = dotNet.load("\ScottPlot.WinForms.dll");
var Chart = dll.new("ScottPlot.FormsPlot");
//绑定界面
dotNet.setParent(Chart,winform.custom);

var Plotdll = dotNet.load("\ScottPlot.dll");
var DataGen = Plotdll.import("ScottPlot.DataGen");
var plt = Chart.Plot;

// plot one set of data using the primary Y axis
var sigSmall = plt.AddSignal(DataGen.Sin(51, com.double(1)));
sigSmall.YAxisIndex = 0;
plt.YAxis.Label("Primary Axis");
plt.YAxis.Color(sigSmall.Color);

// plot another set of data using an additional axis
var sigBig = plt.AddSignal(DataGen.Cos(51,com.double(1),com.double(0),com.double(100)));
var yAxis3 = plt.AddAxis(0/*Left*/, 2);
sigBig.YAxisIndex = 2;
yAxis3.Label("Additional Axis");
yAxis3.Color(sigBig.Color);;

Chart.Refresh(true);


2022-03-09   #3

事件交互:

鼠标动态移动十字标尺进行交互

screenshots.gif


运行下面代码, 需要 aardio v34.36.0 版本以上. 因为dotnet库需要最新功能支持.


import win.ui;
/*DSG{{*/
var winform = win.form(text="aardio form";right=759;bottom=469)
winform.add(
custom={cls="custom";text="自定义控件";left=0;top=0;right=760;bottom=470;bgcolor=12639424;db=1;dl=1;dr=1;dt=1;z=1}
)
/*}}*/
 
 
import dotNet;
 
var dll = dotNet.load("\ScottPlot.WinForms.dll");
var Chart = dll.new("ScottPlot.FormsPlot");
//绑定界面
dotNet.setParent(Chart,winform.custom);
 
var Plotdll = dotNet.load("\ScottPlot.dll");
var DataGen = Plotdll.import("ScottPlot.DataGen");
var plt = Chart.Plot;
 
var xs = DataGen.Consecutive(51);
var sin = DataGen.Sin(51);
var cos = DataGen.Cos(51);
 
// 2条曲线
plt.AddScatter(xs, sin);
plt.AddScatter(xs, cos);
  
// plot参数设置
plt.Title("aardio调用c# ScottPlot 控件");
plt.XLabel("X轴");
plt.YLabel("Y轴");
var Crosshair = plt.AddCrosshair(15.0, 0.25);
Crosshair.VerticalLine.IsVisible = false;
Crosshair.HorizontalLine.IsVisible = false;
Chart.Refresh(true);
 
Chart.MouseEnter = function(e,r){
    Crosshair.VerticalLine.IsVisible = true;
    Crosshair.HorizontalLine.IsVisible = true
    Chart.Refresh(false,false);
}
Chart.MouseLeave = function(e,r){
    Crosshair.VerticalLine.IsVisible = false;
    Crosshair.HorizontalLine.IsVisible = false;
    Chart.Refresh(false,false);
}
 
Chart.MouseMove = function(){
    var mouseCoordinates = Chart.GetMouseCoordinates(0,0);
    Crosshair.X = mouseCoordinates.Item1;
    Crosshair.Y = mouseCoordinates.Item2;
    Chart.Refresh(false,true);
}

 
winform.show();
win.loopMessage();


2022-03-09   #4

实时刷新方式:


screenshots.gif

import win.ui;
/*DSG{{*/
var winform = win.form(text="aardio form";right=759;bottom=469;bgcolor=8421504)
winform.add(
custom={cls="custom";text="自定义控件";left=0;top=0;right=760;bottom=470;bgcolor=12639424;db=1;dl=1;dr=1;dt=1;z=1}
)
/*}}*/

import dotNet;
var dll = dotNet.load("\ScottPlot.WinForms.dll");
var Chart = dll.new("ScottPlot.FormsPlot");
//绑定界面
dotNet.setParent(Chart,winform.custom);

var Plotdll = dotNet.load("\ScottPlot.dll");
var DataGen = Plotdll.import("ScottPlot.DataGen");
var plt = Chart.Plot;

//初始化一个数组
var liveData = table.array(400,0);
//设置初始曲线值,返回曲线
var liveplot = plt.AddSignal( liveData );
plt.AxisAutoX(0,0);
plt.SetAxisLimits(null,null,-1,2.5,0,0);
//显示一根垂直线,后面用来观察刷新移动
var vline = plt.AddVerticalLine(com.double(0), null,com.float(2));

// customize styling
plt.Title("Electrocardiogram Strip Chart");
plt.YLabel("Potential (mV)");
plt.XLabel("Time (seconds)");
plt.Grid(false);
//最后必须
Chart.Refresh(true,false);

var index = 0;
winform.setInterval(
	50,function(){
		if(index>399){
			index=0
		}
		//更新特定Y值
		liveplot.Update(index,math.random());
		//移动垂直线
		vline.X = index;
		//必须
		Chart.Refresh(true,false);
		
		index++;
	}
);


winform.show();
win.loopMessage();

定时器里更新数据, 有两种方式:

1, 就是上面那个用,更新特定Y轴数据

//更新特定Y值
liveplot.Update(index,math.random());

2,一次性更新所有数据

liveData = { ... };
liveplot.Ys = liveData;

3,利用新增的数组定义dotnet.double({...}),和C#进行内存共享, 直接更新数组值.

import dotNet;
var dll = dotNet.load("\ScottPlot.WinForms.dll");
var Chart = dll.new("ScottPlot.FormsPlot");
//绑定界面
dotNet.setParent(Chart,winform.custom);
  
var Plotdll = dotNet.load("\ScottPlot.dll");
var DataGen = Plotdll.import("ScottPlot.DataGen");
var plt = Chart.Plot;
  
/****------------初始化一个数组------****/
var data = table.array(400,0);
var liveData = dotNet.double(data);
/****-------------------------------****/
//设置初始曲线值,返回曲线
var liveplot = plt.AddSignal( liveData );
plt.AxisAutoX(0,0);
plt.SetAxisLimits(null,null,-1,2.5,0,0);
//显示一根垂直线,后面用来观察刷新移动
var vline = plt.AddVerticalLine(com.double(0), null,com.float(2));
  
// customize styling
plt.Title("Electrocardiogram Strip Chart");
plt.YLabel("Potential (mV)");
plt.XLabel("Time (seconds)");
plt.Grid(false);
//最后必须
Chart.Refresh(true,false);
  
var index = 0;
winform.setInterval(
    50,function(){
        if(index>399){
            index=0
        }
        /****-------------------------------****/
        //利用dotnet库新增特性, 和c#共享内存, 直接更新数组即可
        liveData[index+1]=math.random();
        /****-------------------------------****/
        //移动垂直线
        vline.X = index;
        //必须
        Chart.Refresh(true,false);
          
        index++;
    }
);

screenshots.gif

import win.ui;
/*DSG{{*/
var winform = win.form(text="aardio form";right=759;bottom=469;bgcolor=8421504)
winform.add(
custom={cls="custom";text="自定义控件";left=0;top=0;right=760;bottom=470;bgcolor=12639424;db=1;dl=1;dr=1;dt=1;z=1}
)
/*}}*/

import dotNet;
var dll = dotNet.load("\ScottPlot.WinForms.dll");
var Chart = dll.new("ScottPlot.FormsPlot");
//绑定界面
dotNet.setParent(Chart,winform.custom);

var Plotdll = dotNet.load("\ScottPlot.dll");
var DataGen = Plotdll.import("ScottPlot.DataGen");
var plt = Chart.Plot;

//初始化一个数组
var liveData = table.array(400,0);
//设置初始曲线值,返回曲线
var liveplot = plt.AddSignal( liveData );
plt.AxisAutoX(0,0);
plt.SetAxisLimits(null,null,-1,1,0,0);

// customize styling
plt.Title("Electrocardiogram Strip Chart");
plt.YLabel("Potential (mV)");
plt.XLabel("Time (seconds)");
plt.Grid(false);
//最后必须
Chart.Refresh(true,false);

winform.setInterval(
	50,function(){
		//整个更新
		table.shift(liveData,1);
		table.push(liveData,math.random());
		liveplot.Ys = liveData;
		//必须
		Chart.Refresh(true,false);
	}
);


winform.show();
win.loopMessage();

更多实时波形图示例: https://scottplot.net/faq/live-data/

2022-03-09   #5

多图表联动:

screenshots.gif

联动其实上就是当A移动的时候, 将剩下的BCD....其他窗口设置SetAxisLimits即可.

运行下面代码, 需要 aardio v34.34.0 版本以上. 因为dotnet库需要最新功能支持.


import win.ui;
/*DSG{{*/
var winform = win.form(text="aardio form";right=759;bottom=461;bgcolor=8421504)
winform.add(
custom={cls="custom";text="自定义控件";left=0;top=0;right=760;bottom=227;bgcolor=12639424;db=1;dl=1;dr=1;dt=1;z=1};
custom2={cls="custom";text="自定义控件";left=0;top=235;right=760;bottom=462;bgcolor=12639424;db=1;dl=1;dr=1;dt=1;z=2};
splitter={cls="splitter";left=0;top=229;right=760;bottom=234;bgcolor=32896;dl=1;dr=1;dt=0.5;horz=1;z=3}
)
/*}}*/

winform.splitter.split(winform.custom,winform.custom2)

import dotNet;
var dll = dotNet.load("\ScottPlot.WinForms.dll");
var Chart = dll.new("ScottPlot.FormsPlot");
//绑定界面
dotNet.setParent(Chart,winform.custom);

var Chart2 = dll.new("ScottPlot.FormsPlot");
//绑定界面
dotNet.setParent(Chart2,winform.custom2);

var Plotdll = dotNet.load("\ScottPlot.dll");
var DataGen = Plotdll.import("ScottPlot.DataGen");
 
var sin = DataGen.Sin(51);
var cos = DataGen.Cos(51);

Chart.Plot.AddSignal(sin);
Chart2.Plot.AddSignal(cos);

Chart.Refresh(true);
Chart2.Refresh(true);

Chart.AxesChanged = function(sender,e){
	var newAxisLimits = Chart.Plot.GetAxisLimits(0, 0);
	//disable events briefly to avoid an infinite loop
    Chart2.Configuration.AxesChangedEventEnabled = false;
    Chart2.Plot.SetAxisLimits(newAxisLimits);
    Chart2.Refresh(true);
    Chart2.Configuration.AxesChangedEventEnabled = true;
}
Chart2.AxesChanged = function(sender,e){
	var newAxisLimits = Chart2.Plot.GetAxisLimits(0, 0);
	//disable events briefly to avoid an infinite loop
    Chart.Configuration.AxesChangedEventEnabled = false;
    Chart.Plot.SetAxisLimits(newAxisLimits);
    Chart.Refresh(true);
    Chart.Configuration.AxesChangedEventEnabled = true;
}

winform.show();
win.loopMessage();


2022-03-10   #6

image.png

import dotNet;
var dll = dotNet.load("\ScottPlot.WinForms.dll");
var Chart = dll.new("ScottPlot.FormsPlot");
var plt = Chart.Plot;
//绑定界面
dotNet.setParent(Chart,winform.custom);
 
var Plotdll = dotNet.load("\ScottPlot.dll");
var DataGen = Plotdll.import("ScottPlot.DataGen");
var Tools = Plotdll.import("ScottPlot.Tools");

rs = table.array(400,0);
thetas = table.array(400,0);

for (i = 1; 400; 1)
{
    rs[i] = 1 + i * 0.01;
    thetas[i] = i * 2 * 3.1415 * 0.01;
}

// convert polar data to Cartesian data
data = Tools.ConvertPolarCoordinates(rs, thetas);

// plot the Cartesian data
plt.AddScatter(data.Item1, data.Item2);

// decorate the plot
plt.Title("Scatter Plot of Polar Data");
plt.AxisScaleLock(true);
 
Chart.Refresh(true);


2022-03-13   #7

image.png

import ScottPlot;
var Chart = ScottPlot.FormsPlot();
//绑定界面
dotNet.setParent(Chart,mainForm.custom);

var vArr = table.array(20,0);
var YArr = table.array(20,0);
for(i=1;20;1){
	vArr[i]=math.random()*100;
	YArr[i]=i;
}

var bar = Chart.Plot.AddBar(vArr, YArr);
bar.BarWidth = 1;
//bar.ShowValuesAboveBars = true;
//bar.HatchStyle = ScottPlot.Drawing.HatchStyle.StripedUpwardDiagonal;

// customize the plot style
Chart.Plot.YAxis.Label("Count (#)");
Chart.Plot.XAxis.Label("Height (cm)");
Chart.Plot.SetAxisLimits(null,null,0,null,0,0);

Chart.Refresh(true,false);


2022-03-14   #8

image.png


线性回归:

import System.ValueTuple;
import ScottPlot;
var Chart = ScottPlot.FormsPlot();
//绑定界面
dotNet.setParent(Chart,mainForm.custom);
var ys = ScottPlot.DataGen.NoisyLinear(null, 100,1,30, 20);
var xs = ScottPlot.DataGen.Consecutive(#ys);

var x1 = xs[1];
var x2 = xs[#xs];

var arr = System.ValueTuple.Create(dotNet.double(x1),dotNet.double(x2));
// use the linear regression fitter to fit these data
var model = ScottPlot.Statistics.LinearRegressionLine(xs, ys);

// plot the original data and add the regression line
Chart.Plot.Title('Linear Regression\n' ++ "Y = "++model.slope++"x + "++model.offset++ " (R² = "++model.rSquared++")");
Chart.Plot.AddScatter(xs, ys, null, 0);
Chart.Plot.AddLine(model.slope, model.offset, arr,null, 2);

Chart.Refresh(true,false);


2022-03-14   #9

image.png

import System.Drawing;
import ScottPlot;
var Chart = ScottPlot.FormsPlot();
//绑定界面
dotNet.setParent(Chart,mainForm.custom);
 
var vArr = ScottPlot.DataGen.RandomNormal(0, 1234, 178.4, 7.6);

var Histogram = ScottPlot.Statistics.Common.Histogram(vArr, 140, 220, 1, true);
var probabilities,binEdges = Histogram.Item1, Histogram.Item2;
var YArr = {};

for(i=1;#probabilities;1){
    YArr[i]=139+i;
}
        
var bar = Chart.Plot.AddBar(probabilities, YArr);
bar.BarWidth = 1;
bar.FillColor = System.Drawing.Color.LightGreen;
bar.BorderColor = System.Drawing.Color.MediumBlue;

var densities = ScottPlot.Statistics.Common.ProbabilityDensity(vArr, binEdges);
Chart.Plot.AddScatterLines(
    binEdges,
    densities,
    System.Drawing.Color.Black,
    2,
    ScottPlot.LineStyle.Dash);

// customize the plot style
Chart.Plot.Title("Adult Male Height");
Chart.Plot.YAxis.Label("Probability");
Chart.Plot.XAxis.Label("Height (cm)");
Chart.Plot.SetAxisLimits(null,null,0,null,0,0);
 
Chart.Refresh(true,false);


2022-03-14   #10

image.png

import System.Drawing
var arrow2 = Chart.Plot.AddArrow(27, -0.25, 23, -.5);
arrow2.Color = System.Drawing.Color.Red;
arrow2.MinimumLengthPixels = 100;


2022-03-14   #11

image.png

import System.Drawing;
import ScottPlot;
var Chart = ScottPlot.FormsPlot();
//绑定界面
dotNet.setParent(Chart,mainForm.custom);
var plt = Chart.Plot;

var bar1 = plt.AddBar({ 10, 13, 15 }, { 1, 5, 9 });
bar1.HatchStyle = ScottPlot.Drawing.HatchStyle.StripedUpwardDiagonal;
bar1.FillColor = System.Drawing.Color.Gray;
bar1.FillColorHatch = System.Drawing.Color.Black;
bar1.Label = "Series 1";

var bar2 = plt.AddBar({ 14, 15, 9 }, { 2, 6, 10 });
bar2.HatchStyle = ScottPlot.Drawing.HatchStyle.StripedWideDownwardDiagonal;
bar2.FillColor = System.Drawing.Color.DodgerBlue;
bar2.FillColorHatch = System.Drawing.Color.DeepSkyBlue;
bar2.Label = "Series 2";

var bar3 = plt.AddBar({ 13, 6, 14 }, { 3, 7, 11 });
bar3.HatchStyle = ScottPlot.Drawing.HatchStyle.LargeCheckerBoard;
bar3.FillColor = System.Drawing.Color.SeaGreen;
bar3.FillColorHatch = System.Drawing.Color.DarkSeaGreen;
bar3.Label = "Series 3";

// add a legend to display each labeled bar plot
plt.Legend(true,1/* Alignment.UpperRight*/);

// adjust axis limits so there is no padding below the bar graph
Chart.Plot.SetAxisLimits(null,null,0,20,0,0);
 
Chart.Refresh(true,false);


2022-03-14   #12

image.png

import ScottPlot;
var Chart = ScottPlot.FormsPlot();
//绑定界面
dotNet.setParent(Chart,mainForm.custom);
var plt = Chart.Plot;

var bar = plt.AddBar({ 26, 20, 23, 7, 16 }/*values*/, { 3, 2, 5, 1, 3 }/*errors*/, { 1, 2, 3, 4, 5 }/*positions*/);
bar.Orientation = ScottPlot.Orientation.Horizontal;
// adjust axis limits so there is no padding below the bar graph
Chart.Plot.SetAxisLimits(null,null,0,null,0,0);
 
Chart.Refresh(true,false);


2022-03-14   #13

image.png

import System.Drawing
import ScottPlot;
var Chart = ScottPlot.FormsPlot();
//绑定界面
dotNet.setParent(Chart,mainForm.custom);
var plt = Chart.Plot;

var xs = ScottPlot.DataGen.Consecutive(31);
var ys = ScottPlot.DataGen.Sin(31);
var colormap = ScottPlot.Drawing.Colormap.Viridis;

var myBubblePlot = plt.AddBubblePlot();
for (i = 1; #xs; 1)
{
    var fraction = i / #xs;
    myBubblePlot.Add(
        xs[i],
        ys[i],
        10 + i,
        colormap.GetColor(fraction, alpha: .8),
        2,
        System.Drawing.Color.Black
    );
}

plt.Title("Advanced Bubble Plot");
plt.AxisAuto(0.2, 0.25); // zoom out to accommodate large bubbles
 
Chart.Refresh(true,false);


2022-03-14   #14

image.png

import ScottPlot;
var Chart = ScottPlot.FormsPlot();
//绑定界面
dotNet.setParent(Chart,mainForm.custom);
var plt = Chart.Plot;
var values = { 11, 16, 7, 3, 14 };
var coxcomb = plt.AddCoxcomb(values);
coxcomb.FillColors = plt.Palette.GetColors(5, 0, 0.5);
coxcomb.SliceLabels = { "bikes", "blimps", "subs", "saucers", "rockets" };
plt.Legend(true);

Chart.Refresh(true,false);


2022-03-17   #15

步进图:

image.png

import ScottPlot;
var Chart = ScottPlot.FormsPlot();
//绑定界面
dotNet.setParent(Chart,mainForm.custom);
var plt = Chart.Plot;

var pointCount = 50;
var dataXs = ScottPlot.DataGen.Consecutive(pointCount);
var dataSin = ScottPlot.DataGen.Sin(pointCount);
var dataCos = ScottPlot.DataGen.Cos(pointCount);

plt.PlotStep(dataXs, dataSin);
plt.PlotStep(dataXs, dataCos);

//plt.XAxis.MajorGrid(true,System.Drawing.Color.Black,1,2);
//plt.YAxis.MajorGrid(true,System.Drawing.Color.Green,0.1,2);

Chart.Refresh(true,false);


2022-03-17   #16

image.png

import System.Drawing
import ScottPlot;
var Chart = ScottPlot.FormsPlot();
//绑定界面
dotNet.setParent(Chart,mainForm.custom);
var plt = Chart.Plot;

var xs = ScottPlot.DataGen.Range(0, 10, 0.1, true);
var sin = ScottPlot.DataGen.Sin(xs);
var cos = ScottPlot.DataGen.Cos(xs);

plt.AddFill(xs, sin );
plt.AddFill(xs, cos);
plt.AddHorizontalLine(0, System.Drawing.Color.Black);
plt.AxisAuto(0);
plt.Legend(true,0);

Chart.Refresh(true,false);


2022-03-17   #17

image.png

import System.Drawing
import ScottPlot;
var Chart = ScottPlot.FormsPlot();
//绑定界面
dotNet.setParent(Chart,mainForm.custom);
var plt = Chart.Plot;

var values = { 778, 283, 184, 76, 43 };
var labels = {"a","b","c","d","e"};
var pie = plt.AddPie(values);
pie.SliceLabels = labels;
pie.DonutSize = 0.4;//内圆
pie.DonutLabel = "demo"
pie.Explode = true;//分裂
pie.ShowValues = true;
pie.ShowLabels = true;
pie.ShowPercentages = true;

plt.Grid(false);
plt.XAxis.Ticks(false, false);
plt.YAxis.Ticks(false, false);
//plt.Legend(true);

Chart.Refresh(false,false);


2022-03-17   #18

image.png

import System.Drawing
import ScottPlot;
var Chart = ScottPlot.FormsPlot();
//绑定界面
dotNet.setParent(Chart,mainForm.custom);
var plt = Chart.Plot;


var xs = { 1, 2, 3, 4 };
var ys1 = { 1, 3, 1, 2 };
var ys2 = { 3, 7, 3, 1 };
var ys3 = { 5, 2, 5, 6 };

// plot line data as polygon corners
var paddedXs = ScottPlot.Tools.Pad(xs, 1,0,0,true);
plt.AddPolygon(paddedXs, ScottPlot.Tools.Pad(ys3), null,  2, System.Drawing.Color.Black);
plt.AddPolygon(paddedXs, ScottPlot.Tools.Pad(ys2), null,  2, System.Drawing.Color.Black);
plt.AddPolygon(paddedXs, ScottPlot.Tools.Pad(ys1), null/*System.Drawing.Color.Green*/,  2, System.Drawing.Color.Black);

plt.AxisAuto(0, 0);
plt.Title("Filled Line Plots");

Chart.Refresh(false,false);


2022-03-17   #19

image.png


import ScottPlot;
var Chart = ScottPlot.FormsPlot();
//绑定界面
dotNet.setParent(Chart,mainForm.custom);
var plt = Chart.Plot;

var xs = { 10, 22, 13, 14 };

plt.AddRadialGauge(xs);

Chart.Refresh(false,false);


2022-03-17   #20

image.png

import ScottPlot;
var Chart = ScottPlot.FormsPlot();
//绑定界面
dotNet.setParent(Chart,mainForm.custom);
var plt = Chart.Plot;

var values = {
    { 78, 83, 84, 76, 43 },
    { 100, 50, 70, 60, 90 }
};

plt.AddRadar(values);
Chart.Refresh(false,false);


2022-03-17   #21

所谓的散点图, 就是线图的线宽设为0

image.png

// 2条曲线
var sinplot = Chart.Plot.AddScatter(xs, sin);
var cosplot = Chart.Plot.AddScatter(xs, cos);
sinplot.LineWidth = 0;
cosplot.LineWidth = 0;


2022-03-17   #22

热力图

image.png

import ScottPlot;
var Chart = ScottPlot.FormsPlot();
//绑定界面
dotNet.setParent(Chart,mainForm.custom);
var plt = Chart.Plot;

var intensities = table.array(100,100,{});
for ( i = 1; 100; 1)
{
	for ( j = 1; 100; 1)
	{
		intensities[i][j] = (math.sin(i * 0.2) + math.cos(j * 0.2)) * 100;
	}
}
plt.AddHeatmap(intensities);

Chart.Refresh(true);


用热力图画个图片:

image.png

import ScottPlot;
var Chart = ScottPlot.FormsPlot();
//绑定界面
dotNet.setParent(Chart,mainForm.custom);
var plt = Chart.Plot;

import gdip.bitmap
var bitdata = gdip.bitmap("\1.png").lockData().bits;

var col = #bitdata.rows;
var row = #bitdata.rows[1].bytes/4;

var intensities = table.array(col,row,{});
for ( i = 1; col; 1)
{
	for ( j = 1; row; 1)
	{
		intensities[i][j] = bitdata.rows[i].bytes[1+(j-1)*3];
	}
}

plt.AddHeatmap(intensities);

Chart.Refresh(true);


2022-05-13   #23

更新个任意图例子:

screenshots.gif

import win.ui;
/*DSG{{*/
var mainForm = win.form(text="ScottPlot_Demo";right=796;bottom=627)
mainForm.add(
custom={cls="custom";text="自定义控件";left=0;top=0;right=797;bottom=628;bgcolor=12639424;db=1;dl=1;dr=1;dt=1;z=1}
)
/*}}*/

import dotNet;
var dll = dotNet.load("\res\ScottPlot.WinForms.dll");
var Chart = dll.new("ScottPlot.FormsPlot");
var plt = Chart.Plot;
//绑定界面
dotNet.setParent(Chart,mainForm.custom);

import gdip.bitmap
var bitdata = gdip.bitmap("res\1.png").lockData().bits;

var row = #bitdata.rows;
var col = #bitdata.rows[1].bytes/4;

var xs={};
var ys={};
var color={};
for ( i = 1; col; 1)
{
	for ( j = 1; row; 1)
	{
		if(bitdata.rows[i].bytes[1+(j-1)*3]<120){
			table.push(xs,j);
			table.push(ys,-1*i);
		}
	}
}

plt.AddScatter(xs, ys, null, 0);
Chart.Refresh(true);

mainForm.show();
return win.loopMessage();


2022-06-25   #24

实时显示波形数据 方式3: 

GIF.gif

import ScottPlot;
var Chart = ScottPlot.FormsPlot();
//绑定界面
dotNet.setParent(Chart,mainForm.custom);
//初始化一个超大数组
var data = table.array(1000,0);
var liveData = dotNet.double(data);
var livePlot = Chart.Plot.AddSignal(liveData);
Chart.Plot.SetAxisLimits(0,100,-2,2,0,0);

// customize styling
Chart.Plot.Title("Electrocardiogram Strip Chart");
Chart.Plot.YLabel("Potential (mV)");
Chart.Plot.XLabel("Time (seconds)");
//最后必须
//Chart.Refresh(true,false);

var index = 0;
mainForm.setInterval(
    10,function(){
        //更新数据点
        liveData[index+1] = math.sin((index)*0.05);
		livePlot.MaxRenderIndex = index;//控制显示点
		if(index%100==0){//放慢频率(1s), 扩大显示范围
			var currentRightEdge = Chart.Plot.GetAxisLimits(0,0).XMax;
			if(index>=currentRightEdge){//超过边界
				//边界扩大100
			 	Chart.Plot.SetAxisLimitsX(0,index+100);
			}
		}
		index ++;
		if(index>1000){//超过最大数据量重新开始,防止溢出
			index = 0;
			livePlot.MaxRenderIndex = index;
			Chart.Plot.SetAxisLimitsX(0,index+100);
		}
		//必须
        Chart.Refresh(true,false);
    }
);


2022-06-25   #25

哈哈哈哈...又更新

2022-06-29   #26

2022-06-29   #27

佩服!

2022-08-02   #28

请问柱状图顶部怎么显示数字

2022-08-02   #29

回复#28 @我高兴 :

顶楼介绍里有官方网址, 里面有示例, 多看文档示例

bar.ShowValuesAboveBars = true;
2022-08-02   #30

请问一下,横坐标怎么改成可以灵活调整的日期+时间,比如我按照分钟采集数据,显示横坐标,不知道咋搞,ToOADate()函数怎么引入aardio 和使用,求解答

2022-08-03   #31

回复#30 @ttfox :

import time.ole;
var tm = time.ole(); 
tm.year = 2022;
tm.month = 8;
tm.day = 1;

import System.ValueTuple;
import ScottPlot;
var Chart = ScottPlot.FormsPlot();
//绑定界面
dotNet.setParent(Chart,mainForm.custom);
 
var vArr = table.array(10,0);
var YArr = table.array(10,0);
for(i=1;10;1){
    vArr[i]=math.random()*100;
    //时间转数字
    YArr[i]=tonumber( tm.addday(7*i) );
}
 
var bar = Chart.Plot.AddBar(vArr, YArr);
bar.BarWidth = 1;

// customize the plot style
Chart.Plot.YAxis.Label("Count (#)");
Chart.Plot.XAxis.Label("Height (cm)");
Chart.Plot.SetAxisLimits(null,null,0,null,0,0);

//手动指定
//var xLabels = { "VII", "XXI", "XXXVII", "XLVI","VII", "XXI", "XXXVII", "XLVI","VII", "XXI" };
//Chart.Plot.XAxis.ManualTickPositions(YArr, xLabels);
//手动格式化,
//Chart.Plot.XAxis.TickLabelFormat('H/mm\n\ss',true); 
//自动按照时间格式
Chart.Plot.XAxis.DateTimeFormat(true); 

Chart.Refresh(true,false);

日期就是个时间戳,aardio范例>语言>时间日期 里有相关日期和时间的示例, scottplot里看官方的cookbook , 里面都有写 , 而且还可以自定义格式化, 具体这些功能你需要自己研究实验了 ,

image.png


格式化附录:

image.png

登录后方可回帖

登 录
信息栏
 私人小站

本站域名

ChengXu.XYZ

投诉联系:  popdes@126.com



快速上位机开发学习,本站主要记录了学习过程中遇到的问题和解决办法及上位机代码分享

这里主要专注于学习交流和经验分享.
纯私人站,当笔记本用的,学到哪写到哪.
如果侵权,联系 Popdes@126.com

友情链接
Aardio官方
Aardio资源网


才仁机械


网站地图SiteMap

Loading...