.NET开源、功能强大、跨平台的图表库 - LiveCharts2 - 追逐时光者 - 博客园
Excerpt
前言 今天大姚给大家分享一个.NET开源(MIT License)、功能强大、简单、灵活、跨平台的图表、地图和仪表库:LiveCharts2。 项目介绍 LiveCharts2是一个.NET开源、简单、灵活、交互式且功能强大的.NET图表、地图和仪表,现在几乎可以在任何地方运行如:Maui、Uno
思维导航
前言
今天大姚给大家分享一个.NET开源(MIT License)、功能强大、简单、灵活、跨平台的图表、地图和仪表库:LiveCharts2。
项目介绍
LiveCharts2是一个.NET开源、简单、灵活、交互式且功能强大的.NET图表、地图和仪表,现在几乎可以在任何地方运行如:Maui、Uno Platform、Blazor-wasm、WPF、WinForms、Xamarin、Avalonia、WinUI、UWP。
项目源代码
Blazor Wasm中快速使用
创建Blazor WebAssembly项目
安装NuGet
1 | <span data-lazy-bgimg="https://mmbiz.qpic.cn/mmbiz_svg/9M0PhLTmTIfnJACqtiacDthGHw41mFQWicrBGYYWQ04Qt99XiauHyhwtaxyFHrKXcYpn6Uficdtz8D1GDjW1CKp7dtIMhGgBnPOQ/640?wx_fmt=svg&from=appmsg" data-fail="0" highlighted="true"><code>NuGet包管理器中搜索:LiveChartsCore.SkiaSharpView.Blazor 点击安装。</code></span> |
注意:该包目前仍处于预发行阶段,尚未有正式版,很多同学反馈说找不到,是因为没有勾选:包括预发行版。
Basic Bars
View Model
1 | <span data-lazy-bgimg="https://mmbiz.qpic.cn/mmbiz_svg/9M0PhLTmTIfnJACqtiacDthGHw41mFQWicrBGYYWQ04Qt99XiauHyhwtaxyFHrKXcYpn6Uficdtz8D1GDjW1CKp7dtIMhGgBnPOQ/640?wx_fmt=svg&from=appmsg" data-fail="0" highlighted="true"><code>using CommunityToolkit.Mvvm.ComponentModel;<br>using LiveChartsCore;<br>using LiveChartsCore.SkiaSharpView;<br>using LiveChartsCore.SkiaSharpView.Painting;<br>using SkiaSharp;<br><br>namespace ViewModelsSamples.Bars.Basic;<br><br>public partial class ViewModel : ObservableObject<br>{<br> public ISeries[] Series { get; set; } =<br> {<br> new ColumnSeries<double><br> {<br> Name = "Mary",<br> Values = new double[] { 2, 5, 4 }<br> },<br> new ColumnSeries<double><br> {<br> Name = "Ana",<br> Values = new double[] { 3, 1, 6 }<br> }<br> };<br><br> public Axis[] XAxes { get; set; } =<br> {<br> new Axis<br> {<br> Labels = new string[] { "Category 1", "Category 2", "Category 3" },<br> LabelsRotation = 0,<br> SeparatorsPaint = new SolidColorPaint(new SKColor(200, 200, 200)),<br> SeparatorsAtCenter = false,<br> TicksPaint = new SolidColorPaint(new SKColor(35, 35, 35)),<br> TicksAtCenter = true,<br> // By default the axis tries to optimize the number of <br> // labels to fit the available space, <br> // when you need to force the axis to show all the labels then you must: <br> ForceStepToMin = true, <br> MinStep = 1 <br> }<br> };<br>}<br></code></span> |
HTML
1 | <span data-lazy-bgimg="https://mmbiz.qpic.cn/mmbiz_svg/9M0PhLTmTIfnJACqtiacDthGHw41mFQWicrBGYYWQ04Qt99XiauHyhwtaxyFHrKXcYpn6Uficdtz8D1GDjW1CKp7dtIMhGgBnPOQ/640?wx_fmt=svg&from=appmsg" data-fail="0" highlighted="true"><code>@page "/Bars/Basic"<br>@using LiveChartsCore.SkiaSharpView.Blazor<br>@using ViewModelsSamples.Bars.Basic<br><br><CartesianChart<br> Series="ViewModel.Series"<br> XAxes="ViewModel.XAxes"<br> LegendPosition="LiveChartsCore.Measure.LegendPosition.Right"><br></CartesianChart><br><br>@code {<br> public ViewModel ViewModel { get; set; } = new();<br>}<br></code></span> |
Delayed Animations
View model
1 | <span data-lazy-bgimg="https://mmbiz.qpic.cn/mmbiz_svg/9M0PhLTmTIfnJACqtiacDthGHw41mFQWicrBGYYWQ04Qt99XiauHyhwtaxyFHrKXcYpn6Uficdtz8D1GDjW1CKp7dtIMhGgBnPOQ/640?wx_fmt=svg&from=appmsg" data-fail="0" highlighted="true"><code>using System;<br>using System.Collections.Generic;<br>using CommunityToolkit.Mvvm.ComponentModel;<br>using LiveChartsCore;<br>using LiveChartsCore.Drawing;<br>using LiveChartsCore.Kernel;<br>using LiveChartsCore.SkiaSharpView;<br>using LiveChartsCore.SkiaSharpView.Drawing.Geometries;<br><br>namespace ViewModelsSamples.Bars.DelayedAnimation;<br><br>public partial class ViewModel : ObservableObject<br>{<br> public ViewModel()<br> {<br> var values1 = new List<float>();<br> var values2 = new List<float>();<br><br> var fx = EasingFunctions.BounceInOut; // this is the function we are going to plot<br> var x = 0f;<br><br> while (x <= 1)<br> {<br> values1.Add(fx(x));<br> values2.Add(fx(x - 0.15f));<br> x += 0.025f;<br> }<br><br> var columnSeries1 = new ColumnSeries<float><br> {<br> Values = values1,<br> Stroke = null,<br> Padding = 2<br> };<br><br> var columnSeries2 = new ColumnSeries<float><br> {<br> Values = values2,<br> Stroke = null,<br> Padding = 2<br> };<br><br> columnSeries1.PointMeasured += OnPointMeasured;<br> columnSeries2.PointMeasured += OnPointMeasured;<br><br> Series = new List<ISeries> { columnSeries1, columnSeries2 };<br> }<br><br> private void OnPointMeasured(ChartPoint<float, RoundedRectangleGeometry, LabelGeometry> point)<br> {<br> var perPointDelay = 100; // milliseconds<br> var delay = point.Context.Entity.MetaData!.EntityIndex * perPointDelay;<br> var speed = (float)point.Context.Chart.AnimationsSpeed.TotalMilliseconds + delay;<br><br> point.Visual?.SetTransition(<br> new Animation(progress =><br> {<br> var d = delay / speed;<br><br> return progress <= d<br> ? 0<br> : EasingFunctions.BuildCustomElasticOut(1.5f, 0.60f)((progress - d) / (1 - d));<br> },<br> TimeSpan.FromMilliseconds(speed)));<br> }<br><br> public List<ISeries> Series { get; set; }<br>}<br></code></span> |
HTML
1 | <span data-lazy-bgimg="https://mmbiz.qpic.cn/mmbiz_svg/9M0PhLTmTIfnJACqtiacDthGHw41mFQWicrBGYYWQ04Qt99XiauHyhwtaxyFHrKXcYpn6Uficdtz8D1GDjW1CKp7dtIMhGgBnPOQ/640?wx_fmt=svg&from=appmsg" data-fail="0" highlighted="true"><code>@page "/Bars/DelayedAnimation"<br>@using LiveChartsCore.SkiaSharpView.Blazor<br>@using ViewModelsSamples.Bars.DelayedAnimation<br><br><CartesianChart<br> Series="ViewModel.Series"><br></CartesianChart><br><br>@code {<br> public ViewModel ViewModel { get; set; } = new();<br>}<br></code></span> |
项目更多图表截图
项目源码地址
更多项目实用功能和特性欢迎前往项目开源地址查看👀,别忘了给项目一个Star支持💖。
优秀项目和框架精选
该项目已收录到C#/.NET/.NET Core优秀项目和框架精选中,关注优秀项目和框架精选能让你及时了解C#、.NET和.NET Core领域的最新动态和最佳实践,提高开发工作效率和质量。坑已挖,欢迎大家踊跃提交PR推荐或自荐(让优秀的项目和框架不被埋没🤞)。
DotNetGuide技术社区交流群
- DotNetGuide技术社区是一个面向.NET开发者的开源技术社区,旨在为开发者们提供全面的C#/.NET/.NET Core相关学习资料、技术分享和咨询、项目框架推荐、求职和招聘资讯、以及解决问题的平台。
- 在DotNetGuide技术社区中,开发者们可以分享自己的技术文章、项目经验、学习心得、遇到的疑难技术问题以及解决方案,并且还有机会结识志同道合的开发者。
- 我们致力于构建一个积极向上、和谐友善的.NET技术交流平台。无论您是初学者还是有丰富经验的开发者,我们都希望能为您提供更多的价值和成长机会。