在 Blazor 中使用 Chart.js 快速创建数据可视化图表
前言
BlazorChartjs 是一个在 Blazor 中使用 Chart.js 的库(支持Blazor WebAssembly和Blazor Server两种模式),它提供了简单易用的组件来帮助开发者快速集成数据可视化图表到他们的 Blazor 应用程序中。本文我们将一起来学习一下在 Blazor 中使用 Chart.js 快速创建数据可视化图表。
Blazor是什么?
Blazor是一种新兴的Web应用程序框架,具有很大的潜力和发展前景。Blazor是在.NET和Razor上构建的用户界面框架,它采用了最新的Web技术和.NET框架优势,可以使用C# 编程语言编写Web 应用程序,它不仅可以提高开发效率,还可以提供更好的用户体验和更好的可维护性。
详细介绍可以看这篇文章:全面的ASP.NET Core Blazor简介和快速入门
创建Blazor WebAssembly应用
创建名为ChartjsExercise的Blazor WebAssembly应用:



安装NuGet
安装PSC.Blazor.Components.Chartjs包:

添加以下脚本
打开index.html文件,在页面末尾添加以下脚本:
<script src="_content/PSC.Blazor.Components.Chartjs/lib/Chart.js/chart.js"></script>
<script src="_content/PSC.Blazor.Components.Chartjs/Chart.js" type="module"></script>

引入组件
打开你的_Imports.razor文件并添加以下内容:
@using PSC.Blazor.Components.Chartjs
@using PSC.Blazor.Components.Chartjs.Enums
@using PSC.Blazor.Components.Chartjs.Models
@using PSC.Blazor.Components.Chartjs.Models.Common
@using PSC.Blazor.Components.Chartjs.Models.Bar
@using PSC.Blazor.Components.Chartjs.Models.Bubble
@using PSC.Blazor.Components.Chartjs.Models.Doughnut
@using PSC.Blazor.Components.Chartjs.Models.Line
@using PSC.Blazor.Components.Chartjs.Models.Pie
@using PSC.Blazor.Components.Chartjs.Models.Polar
@using PSC.Blazor.Components.Chartjs.Models.Radar
@using PSC.Blazor.Components.Chartjs.Models.Scatter

柱状图
创建BarSimple.razor组件:


razor页面代码
@page "/BarSimple"
@using ChartjsExercise.Model
<h3>柱状图</h3><Chart Config="_config" @ref="_chart" Height="500px"></Chart>@code {private BarChartConfig? _config;private Chart? _chart;protected override async Task OnInitializedAsync(){_config = new BarChartConfig(){Options = new Options(){Responsive = true,MaintainAspectRatio = false,Plugins = new Plugins(){Legend = new Legend(){Align = Align.Center,Display = true,Position = LegendPosition.Right}},Scales = new Dictionary<string, Axis>(){{Scales.XAxisId, new Axis(){Stacked = true,Ticks = new Ticks(){MaxRotation = 0,MinRotation = 0}}},{Scales.YAxisId, new Axis(){Stacked = true}}}}};_config.Data.Labels = BarSimpleData.SimpleBarText;_config.Data.Datasets.Add(new BarDataset(){Label = "Value",Data = BarSimpleData.SimpleBar.Select(l => l.Value).ToList(),BackgroundColor = Colors.Palette1,BorderColor = Colors.PaletteBorder1,BorderWidth = 1});}
}
BarSimpleData
public class BarSimpleData{public static List<string> SimpleBarText = new List<string>() { "一月", "二月", "三月", "四月", "五月", "六月", "七月" };public static List<DataItem> SimpleBar = new List<DataItem>(){new DataItem() { Name = "一月", Value = 65 },new DataItem() { Name = "二月", Value = 59 },new DataItem() { Name = "三月", Value = 80 },new DataItem() { Name = "四月", Value = 81 },new DataItem() { Name = "五月", Value = 56 },new DataItem() { Name = "六月", Value = 55 },new DataItem() { Name = "七月", Value = 40 }};}
展示效果

饼图
创建PieSimple.razor组件:

razor页面代码
@page "/PieSimple"
@using ChartjsExercise.Model
<h3>饼图</h3><Chart Config="_config" @ref="_chart" Height="500px"></Chart>@code {private PieChartConfig? _config;private Chart? _chart;protected override async Task OnInitializedAsync(){_config = new PieChartConfig(){Options = new PieOptions(){Responsive = true,MaintainAspectRatio = false}};_config.Data.Labels = PieSimpleData.SimplePieText;_config.Data.Datasets.Add(new PieDataset(){Label = "数据集",Data = PieSimpleData.SimplePie.ToList(),BackgroundColor = Colors.PaletteBorder1,HoverOffset = 4});}
}
PieSimpleData
public class PieSimpleData{public static List<string> SimplePieText = new List<string>() { "一月", "二月", "三月", "四月" };public static List<decimal?> SimplePie = new List<decimal?>() { 300, 50, 100, 20 };}
展示效果

折线图
创建LineSimple.razor组件:

razor页面代码
@page "/LineSimple"
@using ChartjsExercise.Model<h3>折线图</h3><Chart Config="_config" @ref="_chart" Height="500px"></Chart>@code {private LineChartConfig? _config;private Chart? _chart;protected override async Task OnInitializedAsync(){_config = new LineChartConfig(){};_config.Data.Labels = LineSimpleData.SimpleLineText;_config.Data.Datasets.Add(new LineDataset(){Label = "数据集",Data = LineSimpleData.SimpleLine.ToList(),BorderColor = Colors.PaletteBorder1.FirstOrDefault(),Tension = 0.1M,Fill = false,PointRadius = 15,PointStyle = PointStyle.Cross});}private void AddValue(){Random rd = new Random();_chart.AddData(new List<string?>() { "August" }, 0, new List<decimal?>() { rd.Next(0, 200) });}
}
LineSimpleData
public class LineSimpleData{public static List<string> SimpleLineText = new List<string>() { "一月", "二月", "三月", "四月", "五月", "六月", "七月" };public static List<decimal?> SimpleLine = new List<decimal?>() { 65, 59, 80, 81, 86, 55, 40 };public static List<decimal?> SimpleLine2 = new List<decimal?>() { 33, 25, 35, 51, 54, 76, 60 };public static List<decimal?> SimpleLine3 = new List<decimal?>() { 53, 91, 39, 61, 39, 87, 23 };}
展示效果

配置菜单导航栏
在组件NavMenu.razor中配置:
<div class="top-row ps-3 navbar navbar-dark"><div class="container-fluid"><a class="navbar-brand" href="">ChartjsExercise</a><button title="Navigation menu" class="navbar-toggler" @onclick="ToggleNavMenu"><span class="navbar-toggler-icon"></span></button></div>
</div><div class="@NavMenuCssClass nav-scrollable" @onclick="ToggleNavMenu"><nav class="flex-column"><div class="nav-item px-3"><NavLink class="nav-link" href="" Match="NavLinkMatch.All"><span class="bi bi-house-door-fill-nav-menu" aria-hidden="true"></span> Home</NavLink></div><div class="nav-item px-3"><NavLink class="nav-link" href="BarSimple"><span class="bi bi-plus-square-fill-nav-menu" aria-hidden="true"></span>柱状图</NavLink></div><div class="nav-item px-3"><NavLink class="nav-link" href="PieSimple"><span class="bi bi-plus-square-fill-nav-menu" aria-hidden="true"></span>饼图</NavLink></div><div class="nav-item px-3"><NavLink class="nav-link" href="LineSimple"><span class="bi bi-plus-square-fill-nav-menu" aria-hidden="true"></span>折线图</NavLink></div></nav>
</div>@code {private bool collapseNavMenu = true;private string? NavMenuCssClass => collapseNavMenu ? "collapse" : null;private void ToggleNavMenu(){collapseNavMenu = !collapseNavMenu;}
}
更多图表效果截图
-
更多图表效果展示可以查看官网示例地址:https://chartjs.puresourcecode.com









项目源码地址
更多项目实用功能和特性欢迎前往项目开源地址查看👀,别忘了给项目一个Star支持💖。
-
GitHub开源地址:https://github.com/erossini/BlazorChartjs
-
ChartjsExercise文章示例:https://github.com/YSGStudyHards/DotNetExercises/tree/master/ChartjsExercise
优秀项目和框架精选
该项目已收录到C#/.NET/.NET Core优秀项目和框架精选中,关注优秀项目和框架精选能让你及时了解C#、.NET和.NET Core领域的最新动态和最佳实践,提高开发工作效率和质量。坑已挖,欢迎大家踊跃提交PR推荐或自荐(让优秀的项目和框架不被埋没🤞)。
-
GitHub开源地址:https://github.com/YSGStudyHards/DotNetGuide/blob/main/docs/DotNet/DotNetProjectPicks.md
-
Gitee开源地址:https://gitee.com/ysgdaydayup/DotNetGuide/blob/main/docs/DotNet/DotNetProjectPicks.md
相关文章:
在 Blazor 中使用 Chart.js 快速创建数据可视化图表
前言 BlazorChartjs 是一个在 Blazor 中使用 Chart.js 的库(支持Blazor WebAssembly和Blazor Server两种模式),它提供了简单易用的组件来帮助开发者快速集成数据可视化图表到他们的 Blazor 应用程序中。本文我们将一起来学习一下在 Blazor 中…...
SQL server 2022和SSMS的使用案例1
一,案例讲解 二,实战讲解 实战环境 你需要确保你已经安装完成SQL Server 2022 和SSMS 20.2 管理面板。点此跳转至安装教程 SQL Server2022Windows11 专业工作站SSMS20.2 1,连接数据库 打开SSMS,连接数据库。 正常连接示意图&…...
【每日算法】Day 16-1:跳表(Skip List)——Redis有序集合的核心实现原理(C++手写实现)
解锁O(log n)高效查询的链表奇迹!今日深入解析跳表的数据结构设计与实现细节,从基础概念到Redis级优化策略,彻底掌握这一平衡树的优雅替代方案。 一、跳表核心思想 跳表(Skip List) 是一种基于多层有序链表的概率型数…...
前沿科技:3D生成领域技术与应用分析
以下是关于3D生成领域的详细分析,涵盖技术发展、应用场景、挑战与未来趋势、市场动态及典型案例: 一、技术发展与核心方法 3D表示方法 显式表示:包括点云、网格(三角形或四边形)和分层深度图像(LDI),适合直接操作和渲染,但细节复杂度高。 隐式表示:如神经辐射场(NeR…...
Spring Boot 3.4.3 基于 JSqlParser 和 MyBatis 实现自定义数据权限
前言 在企业级应用中,数据权限控制是保证数据安全的重要环节。本文将详细介绍如何在 Spring Boot 3.4.3 项目中结合 JSqlParser 和 MyBatis 实现灵活的数据权限控制,通过动态 SQL 改写实现多租户、部门隔离等常见数据权限需求。 一、环境准备 确保开发环境满足以下要求: …...
GO语言学习(14)GO并发编程
目录 🌈前言 1.goroutine🌟 2.GMP模型🌟 2.1 GMP的由来☀️ 2.2 什么是GMP☀️ 3.channel 🌟 3.1 通道声明与数据传输💥 3.2 通道关闭 💥 3.3 通道遍历 💥 3.4 Select语句 Ǵ…...
【Audio开发二】Android原生音量曲线调整说明
一,客制化需求 客户方对于音量加减键从静音到最大音量十五个档位区域的音量变化趋势有定制化需求。 二,音量曲线调试流程 Android根据不同的音频流类型定义不同的曲线,曲线文件存放在/vendor/etc/audio_policy_volumes.xml或者default_volu…...
sass报错,忽略 Sass 弃用警告,降级版本
最有效的方法是创建一个 .sassrc.json 文件来配置 Sass 编译器。告诉 Sass 编译器忽略来自依赖项的警告消息。 解决方案: 1. 在项目根目录创建 .sassrc.json 文件: {"quietDeps": true }这个配置会让 Sass 编译器忽略所有来自依赖项&#x…...
spring-security原理与应用系列:HttpSecurity.filters
目录 AnyRequestMatcher WebSecurityConfig HttpSecurity AbstractInterceptUrlConfigurer AbstractAuthenticationProcessingFilter 类图 在前面的文章《spring-security原理与应用系列:securityFilterChainBuilders》中,我们遗留了一个问题&…...
JVM生产环境问题定位与解决实战(六):总结篇——问题定位思路与工具选择策略
本文已收录于《JVM生产环境问题定位与解决实战》专栏,完整系列见文末目录 引言 在前五篇文章中,我们深入探讨了JVM生产环境问题定位与解决的实战技巧,从基础的jps、jmap、jstat、jstack、jcmd等工具,到JConsole、VisualVM、MAT的…...
数据仓库项目启动与管理
数据仓库项目启动与管理 确定项目 评估项目就绪情况 项目就绪的三个条件 强力型高级业务管理发起人 对数据仓库解决方案的影响有先见之明是所在组织内有影响的领导者要求严格,但是又比较现实,会为其他成员提供强力支持 强制型业务动机 数据仓库系统和战略性业务动机紧密结合…...
并行治理机制对比:Polkadot、Ethereum 与 NEAR
治理是任何去中心化网络的基础。它塑造了社区如何发展、如何为创新提供资金、如何应对挑战以及如何随着时间的推移建立信任。随着 Web3 的不断发展,决定这些生态系统如何做出决策的治理模型也在不断发展。 在最近的一集的【The Decentralized Mic】中, Polkadot 汇…...
利用 PHP 爬虫按关键字搜索淘宝商品
在当今数字化时代,网络爬虫技术已成为获取网络数据的重要手段之一。淘宝作为国内最大的电商平台之一,拥有海量的商品信息。通过 PHP 爬虫技术,我们可以实现按关键字搜索并抓取淘宝商品信息。以下将详细介绍如何使用 PHP 实现这一功能。 一、…...
在未归一化的线性回归模型中,特征的尺度差异可能导致模型对特征重要性的误判
通过数学公式来更清晰地说明归一化对模型的影响,以及它如何改变特征的重要性评估。 1. 未归一化的情况 假设我们有一个线性回归模型: y β 0 β 1 x 1 β 2 x 2 ϵ y \beta_0 \beta_1 x_1 \beta_2 x_2 \epsilon yβ0β1x1β2x2ϵ 其…...
TDengine tar.gz和docker两种方式安装和卸载
下载地址 3.1.1.0 Linux版本 安装包 下载地址 3.1.1.0 docker 镜像 下载地址 3.1.1.0 Window客户端 1. 将文件上传至服务器后解压 tar -zxvf TDengine-server-3.1.1.0-Linux-x64.tar.gz 2. tar.gz安装 解压文件后,进入相应子目录,执行其中的 install.…...
【STM32设计】基于STM32的智能门禁管理系统(指纹+密码+刷卡+蜂鸣器报警)(代码+资料+论文)
本课题为基于单片机的智能门禁系统,整个系统由AS608指纹识别模块,矩阵键盘,STM32F103单片机,OLED液晶,RFID识别模块,继电器,蜂鸣器等构成,在使用时,用户可以录入新的指纹…...
贪心算法,其优缺点是什么?
什么是贪心算法? 贪心算法(Greedy Algorithm)是一种在每一步选择中都采取在当前状态下最优(局部最优)的选择,从而希望导致全局最优解的算法策略。 它不像动态规划那样考虑所有可能的子问题,而是做出局部最优选择,依赖这些选择来…...
java知识梳理(二)
一.lambda表达式 作用:Lambda 表达式在 Java 8 引入,主要用于简化匿名内部类的写法,特别是在函数式编程场景中,比如 函数式接口、流式 API(Streams)、并发编程等。它让 Java 代码更简洁、可读性更强&#x…...
鸿蒙Flutter实战:20. Flutter集成高德地图,同层渲染
本文以同层渲染为例,介绍如何集成高德地图 完整代码见 Flutter 鸿蒙版 Demo 概述 Dart 侧 核心代码如下,通过 OhosView 来承载原生视图 OhosView(viewType: com.shaohushuo.app/customView,onPlatformViewCreated: _onPlatformViewCreated,creation…...
c++中%符号使用的注意事项/易错点
在C中,% 是取模运算符(modulus operator),用于计算两个数相除后的余数。虽然它的用法看起来简单,但在实际编程中有一些需要注意的细节和易错点。以下是关键注意事项: 1. 操作数必须为整数类型 % 只能用于整…...
AI辅助下基于ArcGIS Pro的SWAT模型全流程高效建模实践与深度进阶应用
目前,流域水资源和水生态问题逐渐成为制约社会经济和环境可持续发展的重要因素。SWAT模型是一种基于物理机制的分布式流域水文与生态模拟模型,能够对流域的水循环过程、污染物迁移等过程进行精细模拟和量化分析。SWAT模型目前广泛应用于流域水文过程研究…...
Java 基础-30-单例设计模式:懒汉式与饿汉式
在软件开发中,单例设计模式(Singleton Design Pattern)是一种常用的设计模式,它确保一个类只有一个实例,并提供一个全局访问点。这种模式通常用于管理共享资源(如数据库连接池、线程池等)或需要…...
尚语翻译图册翻译|专业图册翻译|北京专业翻译公司推荐|专业文件翻译报价
内容概要 尚语翻译公司聚焦多语种产品图册翻译的竞价推广服务,通过行业垂直化运营构建差异化竞争力。其核心服务覆盖机械制造、医疗器械、电子元件三大领域,依托ISO 17100认证的翻译流程和Trados术语管理系统,实现技术文档的精准转化。为提升…...
杂篇-行业分类一二-2(通、专用设备制造,汽车制造)
接上篇, 本篇列举制造业中另外几个细分行业:通用设备制造,专用设备制造,汽车制造业。 一、通用设备制造 分类 序号 类别名称 说明 1 锅炉及原动设备制造 1 锅炉及辅助设备制造 指各种蒸汽锅炉、汽化锅炉,以及…...
[笔记.AI]大模型训练 与 向量值 的关系
(借助 DeepSeek-V3 辅助生成) 大模型在训练后是否会改变向量化的值,取决于模型的训练阶段和使用方式。以下是详细分析: 1. 预训练阶段:向量化值必然改变 动态调整过程: 在预训练阶段(如BERT、…...
LeetCode 解题思路 30(Hot 100)
解题思路: 递归参数: 生成括号的对数 n、结果集 result、当前路径 path、左括号数 open、右括号数 close。递归过程: 当当前路径 path 的长度等于 n * 2 时,说明已经生成有效括号,加入结果集。若左括号数小于 n&…...
Java EE(18)——网络原理——应用层HTTP协议
一.初识HTTP协议 HTTP(HyperText Transfer Protocol,超文本传输协议)是用于在客户端(如浏览器)和服务器之间传输超媒体文档(如HTML)的应用层协议。 HTTP协议发展至今发布了多个版本,其中1.0,1.…...
强大而易用的JSON在线处理工具
强大而易用的JSON在线处理工具:程序员的得力助手 在当今的软件开发世界中,JSON(JavaScript Object Notation)已经成为了数据交换的通用语言。无论是前端还是后端开发,我们都经常需要处理、验证和转换JSON数据。今天&a…...
Qt笔记----》不同环境程序打包
文章目录 概要1、windows环境下打包qt程序2、linux环境下打包qt程序2.1、程序目录2.2、创建一个空文件夹2.3、添加依赖脚本2.4、打包过程2.4.1、添加程序依赖库2.4.2、添加Qt相关依赖库 概要 qt不同运行环境下打包方式:windows/linux 1、windows环境下打包qt程序 …...
企业服务器备份软件,企业服务器备份的方法有哪些?
企业服务器备份需综合考虑数据量、业务连续性要求(RTO/RPO)、合规性及成本等因素。以下是分场景的工具和方法指南: 一、备份软件推荐 1. 80KM备份软件 80KM备份软件可以进行很复杂的备份方式,也可以内网对内网备份、还能内网的…...
