当前位置: 首页 > news >正文

WPF图表控件库

LiveCharts:

LiveCharts2预览版、内存管理不是很好,长时间持续更新的情况下,内存溢出,慎用

数据加载量不能太大(1000点左右 开始卡)

第一步:下载LiveChart NuGet包

第二步:引用:
 xmlns:lvc="clr-namespace:LiveCharts.Wpf;assembly=LiveCharts.Wpf"
第三步:使用:
折线图:CartesianChart
  1. XAML中使用:

一个图表对应多个序列,可以是多个折线图和多个柱状图

属性:

PointGeometrySize:折线图上的白点大小

LineSmoothness:折线图圆滑曲线

ScalesYAt:对齐到哪个Y轴(因为可以写多个Y轴,所以需要对应一下)

CartesianChart:设置坐标

AxisX:设置X坐标 需要Labels数量和Values数量保持一致

AxisY:纵坐标一般设置做大数值和最小数值

Separator:设置步长

Sections:设置预警线

<lvc:CartesianChart><lvc:CartesianChart.Series><lvc:LineSeries Values="23, 11, 99, 70, 87, 87, 84, 91, 55, 27, 79, 70, 70, 10, 14, 24, 27, 89, 61, 39" Stroke="Orange" Fill="#1F00" PointGeometrySize="0" LineSmoothness="0" Title="折线图"/><lvc:ColumnSeries Values="23, 11, 99, 70, 87, 87, 84, 91, 55, 27, 79, 70, 70, 10, 14, 24, 27, 89, 61, 39"Title="柱状图" ScalesYAt="0" MaxColumnWidth="20" Fill="Green"/></lvc:CartesianChart.Series><lvc:CartesianChart.AxisX><lvc:Axis Labels="a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v"><lvc:Axis.Separator><lvc:Separator Step="1" Stroke="Red" StrokeDashArray="3,3"/></lvc:Axis.Separator></lvc:Axis></lvc:CartesianChart.AxisX><lvc:CartesianChart.AxisY><lvc:Axis MinValue="0" MaxValue="100"><lvc:Axis.Separator><lvc:Separator Step="20" Stroke="Green" StrokeDashArray="3,3" /></lvc:Axis.Separator><lvc:Axis.Sections><lvc:AxisSection Value="75" Stroke="Red" StrokeThickness="1" /></lvc:Axis.Sections></lvc:Axis><lvc:Axis MinValue="0" MaxValue="2" LabelFormatter="{Binding YLableFormatter}"><lvc:Axis.Separator><lvc:Separator Step="0.4" StrokeDashArray="3,3" StrokeThickness="0" /></lvc:Axis.Separator></lvc:Axis></lvc:CartesianChart.AxisY></lvc:CartesianChart>

显示结果:

因为设置Y轴坐标的时候,是double类型,所以导致精度丢失,需要设置LabelFormatter

C#处理精度丢失代码:

// 保留两位小数
public Func<double, string> YLableFormatter { get; set; } = d =>d.ToString("0.00");

处理之后的效果: 没有问题

  1. C#中给表格赋值:

XAML代码:

<lvc:CartesianChart Series="{Binding SeriesList}"/>

C#赋值核心代码:

public SeriesCollection SeriesList { get; set; } = new SeriesCollection();// 可以使用C#进行动态赋值
SeriesList.Add(new LineSeries
{Values = new ChartValues<double> { 75, 14, 36, 33, 89, 76, 23, 21, 77, 90, 21, 22, 54, 90, 32, 47, 97, 81, 63, 21 },Title = "压力",Stroke = Brushes.Green,
});

效果图:

环形图 :Gauge

属性

Uses360Mode:是否使用360度

From:从多少开始

To:到多少结束

Value:值多少

<lvc:Gauge Uses360Mode="True" From="0" To="100" Value="85" />

显示效果:

仪表盘:AngularGauge

属性:

Sections:仪表警戒线

FromValue:从多少位置开始

ToValue:到多少位置结束

LabelsStep:每一个的步长

TicksStep:小格的步长

Wedge:整个的角度

TicksForeground:刻度线的颜色

Foreground:字体颜色

SectionsInnerRadius:环形圆角度

Value:值

<lvc:AngularGauge Grid.Row="1" Grid.Column="1" FromValue="50" ToValue="250" LabelsStep="50" TicksStep="25" Wedge="270" TicksForeground="White"Foreground="White" FontWeight="Bold" FontSize="16" SectionsInnerRadius="0.5" Value="180"><lvc:AngularGauge.Sections><lvc:AngularSection FromValue="50" ToValue="200" Fill="Orange" /><lvc:AngularSection FromValue="200" ToValue="260" Fill="Red" /></lvc:AngularGauge.Sections>
</lvc:AngularGauge>

效果:

ScottPlot:考虑性能, 建议这个 号称500万点数据无压力

第一步:下载ScottPlot NuGet包

第二步:引用:
  xmlns:sp ="clr-namespace:ScottPlot;assembly=ScottPlot.Wpf"
第三步:使用:

注意:此控件只可以C#代码进行赋值

<sp:WpfPlot Name="wpf_plot" />

C#代码:

属性:

DataGen:模拟数据加载

Refresh():刷新表格 当数据变化的时候 刷新表格数据

YAxis:第一个Y轴

YAxis2:第二个Y轴

YAxisIndex:对应的Y轴

AddAxis:可以建立多个轴 XY都可以

ManualTickSpacing:轴显示的时间格式化

TickLabelFormat:刻度标签格式化

TickLabelStyle:标签样式

AddHorizontalLine:添加Y轴预警线

AddVerticalLine:添加X轴预警线

using ScottPlot;
using System.Windows;namespace XH.CustomLesson.ChartLib
{/// <summary>/// ScottPlotTestWindow.xaml 的交互逻辑/// </summary>public partial class ScottPlotTestWindow : Window{public ScottPlotTestWindow(){InitializeComponent();this.Loaded += ScottPlotTestWindow_Loaded;}private void ScottPlotTestWindow_Loaded(object sender, RoutedEventArgs e){// 数据加载var plt = wpf_plot.Plot;// 模拟序列数据double[] datas = DataGen.RandomWalk(new Random(),1000000);plt.AddSignal(datas);// 不调 Refresh 会报错 必须调用Refresh() // YAxis:第一个Y轴// YAxis2:第二个Y轴plt.YAxis2.Ticks(true);plt.YAxis2.Color(System.Drawing.Color.Red);datas = DataGen.Cos(1000000);var series = plt.AddSignal(datas);//YAxisIndex 对应的Y轴 series.YAxisIndex = 1;// 可以有多个轴 第三个Y轴var yAxis3 = plt.AddAxis(ScottPlot.Renderable.Edge.Right,10,"新轴",System.Drawing.Color.Blue);datas = DataGen.Sin(1000000);series = plt.AddSignal(datas);series.YAxisIndex = 10;// 第二个X轴plt.XAxis2.Ticks(true);plt.XAxis2.Color(System.Drawing.Color.Green);datas = DataGen.Random(new Random(),100);var barPlot = plt.AddBar(datas, System.Drawing.Color.Orange);barPlot.XAxisIndex = 1;barPlot.YAxisIndex = 1;// 第三个X轴var xAxis3 = plt.AddAxis(ScottPlot.Renderable.Edge.Bottom,3, "第三个X轴", System.Drawing.Color.OrangeRed);xAxis3.Ticks(true);xAxis3.DateTimeFormat(true);// X轴时间格式化xAxis3.ManualTickSpacing(20, ScottPlot.Ticks.DateTimeUnit.Day);// 斜着显示xAxis3.TickLabelStyle(rotation: 45);// 第四个Y轴var yAxis4 = plt.AddAxis(ScottPlot.Renderable.Edge.Left,4, "第四个Y轴", System.Drawing.Color.OrangeRed);yAxis4.Ticks(true);yAxis4.DateTimeFormat(true);// Y轴格式化yAxis4.TickLabelFormat("P1", false);// 添加第三个数据序列 并且对齐到第三个X轴 和 第四个Y轴datas = DataGen.Sin(1000);double[] x_datas = new double[1000];DateTime dateTime = DateTime.Now;for (int i = 0; i < x_datas.Length; i++){x_datas[i] = dateTime.AddDays(i).ToOADate();}    var scatterPlot = plt.AddScatterLines(x_datas, datas, System.Drawing.Color.Green);scatterPlot.YAxisIndex = 4;scatterPlot.XAxisIndex = 3;// 预警线var hl = plt.AddHorizontalLine(0.8, System.Drawing.Color.Red);// 对应到哪个Y轴//hl.YAxisIndex = 4;plt.AddVerticalLine(DateTime.Now.AddDays(50).ToOADate());wpf_plot.Refresh();}}
}

显示结果:

OxyPlot

LightingChart 付费

相关文章:

WPF图表控件库

LiveCharts&#xff1a; LiveCharts2预览版、内存管理不是很好&#xff0c;长时间持续更新的情况下&#xff0c;内存溢出&#xff0c;慎用 数据加载量不能太大&#xff08;1000点左右 开始卡&#xff09; 第一步&#xff1a;下载LiveChart NuGet包 第二步&#xff1a;引用&a…...

JAVA-WEB资源配置

用JAVA进行编写WEB项目时&#xff0c;我们一般需要对WEB进行统一配置&#xff0c;例如制定拦截路径、页面解析器、跨域配置、fastjson报文解析、文件上传大小配置等。 Getter Setter Configuration public class WebConfiguration extends WebMvcConfigurationSupport {priva…...

分享一个基于微信小程序的宠物服务中心的设计与实现(源码、调试、LW、开题、PPT)

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人 八年开发经验&#xff0c;擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等&#xff0c;大家有这一块的问题可以一起交流&…...

时空自回归模型(STAR)及 Stata 具体操作步骤

目录 一、引言 二、文献综述 三、理论原理 四、实证模型 五、稳健性检验 六、程序代码及解释 附录 数据预处理 生成时空权重矩阵 一、引言 时空自回归模型&#xff08;Spatial-Temporal Autoregressive Model&#xff0c;简称 STAR&#xff09;在分析具有时空特征的数…...

SpringCloud集成XXL-JOB定时任务

项目场景&#xff1a; XXL-JOB是一个分布式任务调度平台&#xff0c;它能够帮助开发者轻松地实现任务的定时执行、任务调度和任务管理 接入步骤 下载XXL-JOB压缩包 链接: xxl-job XXL-JOB做为子模块 将压缩包解压&#xff0c;项目二级新建目录xxl-job&#xff0c;放入目录…...

《财经网》揭秘格行销量第一的秘籍!年销百万台,获千万级网红推荐!

随身WiFi已成为当下网红爆款神器&#xff0c;却为何频频陷入用户信任的危机&#xff1f;低价诱惑背后的限速陷阱、流量虚标&#xff0c;市场看似繁华&#xff0c;实则暗藏玄机。然而&#xff0c;就在这片混沌与质疑交织的迷雾中&#xff0c;一个品牌悄然崛起&#xff0c;以惊人…...

Java 中 Integer 类的比较行为

在 Java 中&#xff0c;Integer 类的比较行为有其特定的规则&#xff0c;这些规则涉及到缓存和对象比较。让我们分析一下你提供的代码&#xff1a; java public class test2_4 { public static void main(String[] args){Integer a 100;Integer b 100;Integer c 1000;Int…...

C# 通过反射(Reflection)调用不同名泛型方法

在C#中&#xff0c;通过反射调用泛型方法时&#xff0c;如果方法的名称或参数类型有所不同&#xff0c;那么你需要根据具体的情况来构造合适的MethodInfo对象。由于你提到的是调用“不同名”的泛型方法&#xff0c;这意味着你需要首先确定具体要调用的方法名&#xff0c;然后再…...

Spring Boot整合Drools入门:实现订单积分规则

文章目录 项目结构Maven配置配置Drools订单实体类订单积分规则测试规则总结 在开发过程中&#xff0c;我们经常遇到需要根据业务规则来进行决策的场景。比如&#xff0c;电商平台可能需要根据订单金额为用户添加相应的积分。为了灵活地处理这些业务规则&#xff0c;我们可以借助…...

【C语言】文件操作函数详解

目录 C语言文件操作函数详解表格汇总1. fopen2. fclose3. fread4. fwrite5. fseek6. ftell7. rewind8. fprintf9. fscanf10. feof11. ferror12. clearerr13. 总结14. 附录&#xff1a;函数参考表15. 结束语相关文章&#xff1a; C语言文件操作函数详解 C语言提供了一组标准库函…...

Java 垃圾回收,看一遍就懂

了解 Java 垃圾收集的工作原理并优化应用程序中的内存使用情况。详细了解 Java 中内存管理的复杂性。 垃圾收集是一个关键过程&#xff0c;可以帮助任何Java 开发公司。编程语言中的这一强大功能可以巧妙地管理内存分配和释放&#xff0c;防止内存泄漏并优化资源利用率。它就像…...

手把手教你CNVD漏洞挖掘 + 资产收集

0x1 前言 挖掘CNVD漏洞有时候其实比一般的edusrc还好挖&#xff0c;但是一般要挖证书的话&#xff0c;还是需要花时间的&#xff0c;其中信息收集&#xff0c;公司资产确定等操作需要花费一定时间的。下面就记录下我之前跟一个师傅学习的一个垂直越权成功的CNVD漏洞通杀&#…...

华为云低代码AstroZero技巧教学1:表格的超链接赋能

在低代码AstroZero的标准页面设计和构建上&#xff0c;我们总是在思考如何让用户体验能够更加流畅。 为此&#xff0c;我们特推出低代码AstroZero技巧教学系列合集&#xff0c;让各位开发者能够更加方便快捷地掌握低代码AstroZero的操作技巧。 本次技巧内容&#xff1a; 在As…...

https握手过程详解

https握手过程详解 上一篇《HTTPS通讯全过程》中https握手过程实际上还有更多的细节&#xff0c;为什么会这样设计呢&#xff1f;是因为一开始将握手过程时&#xff0c;吧步骤说的太详细会导致更难理解惹。所以我就先在上一篇把部分细节忽略&#xff0c;把原来几步的过程先简化…...

Lesson 63 Thank you, doctor

Lesson 63 Thank you, doctor 词汇 better a. 更好的 搭配&#xff1a;feel better     get better 感觉好些了    成语&#xff1a;Better late than never.       晚做总比不做好。       Half a loaf is better than no bread.       有比没有好。…...

使用python和matlab实现BP神经网络算法的分析比较

分析和比较使用Python和MATLAB实现BP神经网络算法实现的复杂度、代码可读性、库支持、性能以及应用的灵活性等。 1. BP神经网络的基本原理 BP神经网络(Back Propagation Neural Network)是一种多层前馈神经网络,通过反向传播算法来训练网络。其基本思想是利用梯度下降法,…...

智慧卫生间环境传感器有哪些?智慧卫生间的特点@卓振思众

随着科技的进步和人们对生活品质的要求不断提高&#xff0c;智慧卫生间作为现代化设施的代表&#xff0c;越来越受到关注。智慧卫生间不仅仅是在外观设计上做文章&#xff0c;更在于其背后强大的智能系统&#xff0c;特别是环境传感器的应用&#xff0c;让厕所的管理和使用变得…...

智能分班结果自动发布系统

新学期&#xff0c;校园里又将迎来一批充满活力的新生。对于老师们来说&#xff0c;除了准备教学计划和课程内容&#xff0c;还有一项看似简单却颇为繁琐的任务——发布分班。传统的分班信息发布方式&#xff0c;通常是老师们一个个私信给学生家长&#xff0c;家长们收到信息后…...

vue 后台管理 指定项目别名

越多越好 文章目录 一、指定项目路径别名二、全局loading进度条实现三、动态页面标题的实现四、全局刷新 和 全屏 一、指定项目路径别名 在 vite.config.js 里配置 import path from "path"export default defineConfig({resolve:{alias:{"~":path.resol…...

【Python机器学习】FP-growth算法——构建FP树

在第二次扫描数据集时会构建一棵FP树。为构建一棵树&#xff0c;需要一个容器来保存树。 创建FP树的数据结构 FP树要比书中其他树更加复杂&#xff0c;因此需要创建一个类来保存树的每一个节点&#xff1a; class treeNode:def __init__(self,nameValue,numOccur,parentNode…...

蓝桥杯备赛避坑指南:PWM互补输出和死区设置里那些容易忽略的细节

蓝桥杯嵌入式实战&#xff1a;PWM互补输出与死区设置的七个致命误区 在蓝桥杯嵌入式赛道的竞赛环境中&#xff0c;PWM互补输出功能几乎是每年必考的核心考点。但令人惊讶的是&#xff0c;超过60%的参赛选手会在死区设置和互补通道配置环节出现严重错误——轻则导致波形异常影响…...

Cookie 和 Session 分别存储在客户端还是服务端?

从“存包凭条”到“后台存包柜”&#xff1a;Cookie 与 Session 的存储位置深度剖析1. 引言&#xff1a;超市存包处的“凭条”与“存包柜”2. 前置知识&#xff1a;HTTP 的“健忘症”3. Cookie&#xff1a;客户端的“小凭条”3.1 是什么&#xff1f;3.2 解决什么问题&#xff1…...

掺氢燃气轮机Simulink动态仿真模型探索

掺氢燃气轮机simulink动态仿真模型 1. 西门子5MW和260MW(v94.3a)模型设计点 2. 可选择加pid控制或开环动态仿真模型 3. 功率可以为输入也可以为输出&#xff0c;供选择 4. 掺氢气比例可以动态调节 5. 输出参数包括燃烧室出口温度&#xff0c;流量&#xff0c;动力涡轮出口温度&…...

Transformers音频分类终极指南:3步实现智能环境音识别

Transformers音频分类终极指南&#xff1a;3步实现智能环境音识别 【免费下载链接】transformers huggingface/transformers: 是一个基于 Python 的自然语言处理库&#xff0c;它使用了 PostgreSQL 数据库存储数据。适合用于自然语言处理任务的开发和实现&#xff0c;特别是对于…...

从零搭建私有物联网网络:LoRaWAN服务器实战指南

从零搭建私有物联网网络&#xff1a;LoRaWAN服务器实战指南 【免费下载链接】lorawan-server Compact server for private LoRaWAN networks 项目地址: https://gitcode.com/gh_mirrors/lo/lorawan-server 在物联网部署浪潮中&#xff0c;私有服务器搭建已成为企业和开发…...

重构AI训练数据管理流程:BooruDatasetTagManager如何提升图像标签标注效率83%

重构AI训练数据管理流程&#xff1a;BooruDatasetTagManager如何提升图像标签标注效率83% 【免费下载链接】BooruDatasetTagManager 项目地址: https://gitcode.com/gh_mirrors/bo/BooruDatasetTagManager 在AI模型训练的数据准备阶段&#xff0c;图像标签管理是决定模…...

对于对话中的反讽识别,OpenClaw 的模型是否结合了语调特征?

关于OpenClaw模型在反讽识别中是否结合了语调特征&#xff0c;这个问题其实触及了当前自然语言处理中一个相当微妙的领域。从技术实现的角度来看&#xff0c;OpenClaw这类基于Transformer架构的大语言模型&#xff0c;其训练数据主要来源于互联网上的文本语料&#xff0c;比如网…...

SurfaceView视觉优化实战:圆角与渐变蒙层的完美结合

1. SurfaceView视觉优化的核心价值 在Android开发中&#xff0c;SurfaceView因其独特的双缓冲机制和独立的绘图线程&#xff0c;成为视频播放、游戏渲染等高性能场景的首选组件。但原生SurfaceView的直角边框和单调的呈现方式&#xff0c;常常与现代化UI设计语言格格不入。我在…...

如何修复 n8n Postgres 节点中的“节点未设置任何凭据”错误:一篇真正能照着操作的排障博客

如果你在用 n8n 连 Postgres 的时候&#xff0c;突然看到一句让人有点懵的报错&#xff1a;Node has no credentials set 或者中文界面里类似&#xff1a;节点未设置任何凭据先别慌。这个报错看起来像系统在跟你打哑谜&#xff0c;但它的真实意思其实非常朴素&#xff1a; 这个…...

CentOS 7 无线网卡“失踪”排查指南:从驱动到NetworkManager的全面诊断

1. 无线网卡消失的常见症状与初步检查 当你打开CentOS 7准备连接Wi-Fi时&#xff0c;突然发现系统提示"No Wi-Fi Adapter found"&#xff0c;这种突如其来的网络"失踪"问题确实让人头疼。作为系统管理员&#xff0c;我遇到过太多次类似情况&#xff0c;有时…...