当前位置: 首页 > 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…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?

现有的 Redis 分布式锁库&#xff08;如 Redisson&#xff09;相比于开发者自己基于 Redis 命令&#xff08;如 SETNX, EXPIRE, DEL&#xff09;手动实现分布式锁&#xff0c;提供了巨大的便利性和健壮性。主要体现在以下几个方面&#xff1a; 原子性保证 (Atomicity)&#xff…...

Spring Security 认证流程——补充

一、认证流程概述 Spring Security 的认证流程基于 过滤器链&#xff08;Filter Chain&#xff09;&#xff0c;核心组件包括 UsernamePasswordAuthenticationFilter、AuthenticationManager、UserDetailsService 等。整个流程可分为以下步骤&#xff1a; 用户提交登录请求拦…...

Docker拉取MySQL后数据库连接失败的解决方案

在使用Docker部署MySQL时&#xff0c;拉取并启动容器后&#xff0c;有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致&#xff0c;包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因&#xff0c;并提供解决方案。 一、确认MySQL容器的运行状态 …...

水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关

在水泥厂的生产流程中&#xff0c;工业自动化网关起着至关重要的作用&#xff0c;尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关&#xff0c;为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多&#xff0c;其中不少设备采用Devicenet协议。Devicen…...

Pydantic + Function Calling的结合

1、Pydantic Pydantic 是一个 Python 库&#xff0c;用于数据验证和设置管理&#xff0c;通过 Python 类型注解强制执行数据类型。它广泛用于 API 开发&#xff08;如 FastAPI&#xff09;、配置管理和数据解析&#xff0c;核心功能包括&#xff1a; 数据验证&#xff1a;通过…...

【版本控制】GitHub Desktop 入门教程与开源协作全流程解析

目录 0 引言1 GitHub Desktop 入门教程1.1 安装与基础配置1.2 核心功能使用指南仓库管理日常开发流程分支管理 2 GitHub 开源协作流程详解2.1 Fork & Pull Request 模型2.2 完整协作流程步骤步骤 1: Fork&#xff08;创建个人副本&#xff09;步骤 2: Clone&#xff08;克隆…...