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

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

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();


24 个回复 | 最后更新于 4 天前
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();


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);


4 天前   #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;

console.dump(bitdata.rows[1].bytes[1000])
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();


4 天前   #24

回复#24 @admin :

火火火火火火

登录后方可回帖

登 录
信息栏
公告:
私人站, 专注分享, 可在分享中适当提问, 但谢绝纯提问, 否则不再提醒一律删帖, 谢谢合作!



本站域名:HtmLayout.Cn
aardio可以快速开发上位机,本站主要记录了学习过程中遇到的问题和解决办法及aardio代码分享

这里主要专注于aardio学习交流和经验分享.
纯私人站,当笔记本用的,学到哪写到哪.

Aardio 官方站:Aardio官方
Aardio最新功能:Aardio官方更新日志
本 站 主 站:Stm32cube中文网
Sciter中文在线文档Sciter在线学习文档
空间赞助:才仁机械
Loading...