干货ScottPlot4向ScottPlot5迁移
- 干货满满
- 1.背景
- 2.需求的引出
- 3.先说结论
- 1.好消息
- 2.坏消息
- 4.迁移的部分笔记
- Color
- ScottPlot.Plottable
- ScottPlot.Plottables中的对象如何定义
- 添加 ScottPlot.Plottable.ScatterPlot 对象
- Scatter
- Polygon
- Marker也类似
- Scatter的marker
- formsPlot1
- Render()没有了
- 定义
- 锁定Y轴
- 获取鼠标位置
- Scatter
- 配置相关
- 锁定图表
- 总结
干货满满
为什么说干货满满,是因为就是现在,就在当下,如果有这样的需求:ScottPlot4向ScottPlot5迁移,那么你去GPT问也没有正确的答案。我是说当下任何一个GPT目前都不行。
所以,至少在当下,是原创。因为各论坛也没有。
1.背景
我是个很懒人,众所周知我是能完成功能,绝不多做一点。所以,如果要我去做一件事,特别是从XX n升级 n+1,我是绝对没有兴趣的。
但是确实遇到了问题。
因为发现加载的数据足够多时,它就锁住不动了。见下图。
我的E14小破本,就不争气进狂叫半天。有时能活过来,有时就不行了。
特别是这里右键,想要还原,就灰了。
或者鼠标一直在转。
这确是一个问题。
当然,在最终的版本,这可能也不是问题,因为那时,可以利用过滤器,建一个数据窗,将视图保护起来,每次只显示很少的数据。
但现在,我还没有那样的时间。
其实我也有ScottPlot 4.1 的代码,但现在能不折腾就不折腾了,不想去看代码。
事实上,这种情况是很容易定位的。因为只需要pause一下,一般就能定位到出问题的位置。
但这机会,还是留给其它人吧~~~
2.需求的引出
在这样的情况下,我想到了是不是新的版本,性能能够好一些。正好今天上午就算是完成了本周的进度。早晨来早了,以至于忘了刷卡。好吧。说正事。
有时间,可以试一下。
3.先说结论
1.好消息
1。 的确 5上面没有这个问题。
我再详细说明一个这个问题,大至是如果数据量特别大,放大到第4次,ScottPlot 4就开始卡了。而且这种卡,是无法反转的。
我的机器也还成吧,没有独立显卡,内存16G。而且装的是windows10.
同样的情况,在5上,是没有的!
初始
第3次 zoom
第5次,还是正常的,而且能看到右键菜单:
第8次放大
第10次放大
总之不卡,也能还原。
这算是一个好的消息。
但坏消息,我们慢慢道来!
2.坏消息
2。 绝对不推荐用ScottPlot 5!
因为之前,我介绍过一些ScottPlot 5的一些问题,所以我是一直避之唯恐不急。
所以,当我用它时,才知道,真是难用极了。
有许多想要吐槽的。
但是我不想多说了,因为当你用的时候你就清楚了是吧。
本文只说有用的,下面的干货就是如何来迁移!
4.迁移的部分笔记
说明,这里只有很少的一部分,因为有一些我也没研究。
Color
不是这事有多重要,我是想到那写到哪。
5.0 用 ScottPlot.Color 代替了 System.Drawing.Color
带来的问题如何解决?
1。 应将所有与ScottPlot相关的部分,都改为 ScottPlot.Color
2。 划重点:
类例这样进行转换
ScottPlot.Plottables.Polygon
task_polygon.FillColor = ScottPlot.Color.FromColor(System.Drawing.Color.White);
ScottPlot.Plottable
ScottPlot.Plottable不见了。
这里要写很多字,本应该,因为这事,初期引起了我的恐慌。因为我用了特别多,网上查不到,其5.0源代码中,也查不到。
后来逐渐才知道,
改成
ScottPlot.Plottables
后面加了一个s。
但是,要注意,5.0与4.0是完全不同的东西,不要认为只是换了namespace就OK了。
从来没有这样的情况发生!
ScottPlot.Plottables中的对象如何定义
4.0
ScottPlot.Plottable.Polygon
在5
ScottPlot.Plottables.Polygon
4.0
ScottPlot.Plottable.ScatterPlot
5.0
ScottPlot.Plottables.Scatter
添加 ScottPlot.Plottable.ScatterPlot 对象
Scatter
4.0
//create genline
public ScottPlot.Plottable.ScatterPlot CreateGenLine(Plot plt)
{
task_line = new ScottPlot.Plottable.ScatterPlot(line_xs, line_ys);
task_line.MarkerSize = 0;
task_line.Color = CmbTask.Generated.CategoryColor;
task_line.LineWidth = 0.01;
plt.Add(task_line);
return task_line;
}
5.0
//create genline
public ScottPlot.Plottables.Scatter CreateGenLine(Plot plt)
{
ScottPlot.Plottables.Scatter task_line = plt.Add.Scatter(line_xs, line_ys,CmbTask.Generated.CategoryColor);
return task_line;
}
Polygon
4.0
public Polygon CreateTaskPolygon(Plot plt)
{
task_polygon = plt.AddPolygon(xs_tsk_rect, ys_tsk_rect);
if (null != CmbTask.Ended) {
task_polygon.Color = CmbTask.Ended.CategoryColor;
} else {
task_polygon.Color = Color.White;
}
return task_polygon;
}
5.0
public ScottPlot.Plottables.Polygon CreateTaskPolygon(Plot plt)
{
ScottPlot.Plottables.Polygon
task_polygon = plt.Add.Polygon(xs_tsk_rect, ys_tsk_rect);
if (null != CmbTask.Ended)
{
task_polygon.FillColor = CmbTask.Ended.CategoryColor;
}else {
task_polygon.FillColor = ScottPlot.Color.FromColor(System.Drawing.Color.White);
}
return task_polygon;
}
Marker也类似
ScottPlot.Plottable.MarkerPlot Marker
var marker = new ScottPlot.Plottable.MarkerPlot();
marker.X = xArValues[curindex++];
marker.Y = ycurValues;
marker.MarkerSize = 9;
marker.MarkerShape = markerShape;
marker.Color = task.CategoryColor;
task.Marker = marker;
plt.Add(marker);
改为
ScottPlot.Plottables.Marker Marker
var marker = plt.Add.Marker(x: xArValues[curindex++], y: ycurValues);
marker.MarkerSize = 9;
marker.MarkerStyle.Shape = markerShapes;
marker.MarkerStyle.FillColor = task.CategoryColor;
task.Marker = marker;
Scatter的marker
4.0
MarkerShape markerShape;
markerShape = MarkerShape.filledSquare;
var curScatter = plt.AddScatter(xArValues, yArValues, markerShape: markerShape)
5.0
MarkerShape markerShapes;
markerShapes = MarkerShape.FilledSquare;
var curScatter = plt.Add.Scatter(xArValues, yArValues);
curScatter.MarkerShape = markerShapes;
formsPlot1
Render()没有了
this.formsPlot1.Refresh();
定义
private ScottPlot.FormsPlot formsPlot1;
this.formsPlot1 = new ScottPlot.FormsPlot();
改为
this.formsPlot1 = new ScottPlot.WinForms.FormsPlot();
private ScottPlot.WinForms.FormsPlot formsPlot1;
还是因为跨平台。。。就是laji,我从来都是反对跨平台的。
锁定Y轴
private void chkLockY_CheckedChanged(object sender, EventArgs e)
{
bool isLocked = ((CheckBox)sender).Checked;
formsPlot1.Configuration.LockVerticalAxis = isLocked;
}
改为
private void chkLockY_CheckedChanged(object sender, EventArgs e)
{
bool isLocked = ((CheckBox)sender).Checked;
plt.Axes.Rules.Add(new ScottPlot.AxisRules.LockedVertical(plt.Axes.Left, plt.Axes.Left.Range.Min, plt.Axes.Left.Range.Max));
}
获取鼠标位置
private void formsPlot1_MouseUp(object sender, MouseEventArgs e)
{
(double x, double y) = formsPlot1.GetMouseCoordinates();
改为:
Coordinates mouseNow = formsPlot1.Plot.GetCoordinates(e.X, e.Y);
Scatter
上面写过了,再写一遍
var curScatter = plt.AddScatter(xArValues, yArValues, lineStyle: LineStyle.DashDotDot);
改为:
var curScatter = plt.Add.Scatter(xArValues, yArValues);
配置相关
锁定图表
4。0
formsPlot1.Configuration.RightClickDragZoom = false;
5。0
formsPlot1.UserInputProcessor.RightClickDragZoom(false);
复杂了太多。
总结
1。 命令空间加了s
2。 对象必须由Scott来生成,用户不能自己创建了。
3。 一些模糊的属性名称没了。例如Color,都改为类似FillColor之类的。
4。很多地方,非常糟糕,甚至从示例的比较中,就能知道5.0有多糟糕。