ScottPlot5 WindowsForm
ScottPlot5 是.Net的一个图表控件库;支持WPF,WindowsForm,Avalonia, Eto, WinUI, Blazor(仅WebAssembly),本次测试为WindowsForm环境;
本文章源码
步骤
- 创建.Net8 WindowsForm工程
- 引用如下两个包
<PackageReference Include="ScottPlot.Avalonia" Version="5.0.20" />
<PackageReference Include="ScottPlot.WinForms" Version="5.0.20" />
- 主界面增加FormsPlot控件设置Dock为Fill,并设置窗体最大化
- 写代码
- 启动WinForm工程
主要代码
private void Form1_Load(object? sender, EventArgs e)
{
if (first)
{
StartPlot();
}
first = false;
}
private void StartPlot()
{
InitLines();
if (timer == null)
{
timer = new(); // 每隔1秒触发一次
timer.Interval = 1000;
timer.Tick += TimerElapsed;
timer.Start();
}
}
private void InitLines()
{
if (plot == null) return;
// PlotFont = Fonts.Detect("实时数据");
plot.Plot.Axes.Title.Label.Text = "RealTime Data:实时数据";
plot.Plot.Axes.Title.Label.FontName = PlotFont;
plot.Plot.Clear();
Lines = new LineModel[LineCount];
DateTime start = DateTime.Now;
for (int i = 0; i < LineCount; i++)
{
Lines[i] = new LineModel();
Lines[i].Init(i + 1, plot.Plot, start);
}
plot.Plot.Benchmark.IsVisible = true;
}
public void UpdateData(DateTime ts, double[] data)
{
int Min = Math.Min(data.Length, Lines.Length);
if (Min <= 0) return;
for (int i = 0; i < Min; i++)
{
UpdateData(i, ts, data[i]);
}
Render();
}
private void UpdateData(int i, DateTime ts, double latestValue)
{
var tmp = Lines[i];
tmp.UpdateData(ts, latestValue);
}
public void Render()
{
plot.Plot.Axes.AutoScale();
plot.Refresh();
}
private void TimerElapsed(object? sender, EventArgs e)
{
//InvokeAsync(() =>
double[] data = new double[LineCount];
for (int i = 0; i < LineCount; i++)
{
data[i] = Generate.RandomData.RandomNumber(100);
}
UpdateData(DateTime.Now, data);
}
效果
刚启动时FPS有80,稳定后约50FPS
已知问题
- Title不显示,可能设计就是这样的,可另外添加