作者:陈超超 Ant Design Blazor

项目贡献者,拥有十多年从业经验,长期基于.Net技术栈进行架构与开发产品的工作,现就职于正泰集团。 邮箱:timchen@live.com

欢迎各位读者有任何问题联系我,我们共同进步。

背景

目前Blazor中可用的图表组件库主要有以下几个

  • ant-design-blazor/ant-design-charts-blazor

    • 基于G2Plot
  • mariusmuntean/ChartJs.Blazor
    • 基于ChartJs
  • blazor-cn/Blazor.ECharts
    • 基于ECharts

ant-design-charts-blazor是我主导完成的,相关使用教程可参阅《进击吧!Blazor!》系列入门教程 第一章 7.图表

然而这些图表库无不例外的采用的JS库进行二次分装,基本实现方式雷同,我以ant-design-charts-blazor举例

大致逻辑如下

  1. 首先通过IJSRuntime接口与自己开发的own.js进行交互
  2. own.js中对图表库的api做了简单封装,主要目的是减少.razorG2Plot的交互,毕竟IJSRuntime接口调用js对象没有js之间直接相互调用方便
  3. G2Plot会在Canvas中绘制出图表
  4. 图表中的一些事件通过own.js进行捕捉后通过IJSRuntime反馈给.razor

ant-design-charts-blazor的技术实现方式可详见我之前的文章用Blazor技术封装G2Plot实现Charts组件

看了上述内容,我们思考一下,Blazor技术将C#带到了前端,我们却继续使用着JS的图表库,合理吗?

明显不合理,所以我们应该去创建一个基于Blazor技术构建的图表库替代上面的JS库。

到这里还有一个小问题,就是Canvas提供的接口都是面向JS的,那么我们需要另外一个绘图技术,需兼顾功能和性能,其实不用选,SVG,就是你了。

可缩放矢量图形(Scalable Vector Graphics,SVG),是一种用于描述二维的矢量图形,基于 XML 的标记语言。作为一个基于文本的开放网络标准,SVG能够优雅而简洁地渲染不同大小的图形,并和CSS,DOM,JavaScript和SMIL等其他网络标准无缝衔接。

BlazorCharts

BlazorCharts是我主导的开源项目,目标是创建一个基于Blazor技术,使用简单,功能相对丰富的图表库。

项目地址:https://github.com/TimChen44/blazor-charts

项目信息

首先,确定一个图标,俗话说图标确定后项目就完成了一半,以本人的能力,只能将图表和@合并,设计出“缝合怪”作为我的图标

接着,再确定我们组件的一些基本理念,我今后的设计尽我所能满足这些理念。

  • 使用简单

    组件库是拿来用的,所以使用方式要简单,使用方法要符合常规逻辑,争取使用时最大可能的减少对文档的依赖。

  • 功能实用

    实现一堆极少场景才会使用的图表,不如集中精力做好用的最多的那些图表。

    实现一堆极少场景才会使用的功能,不如集中精力做好用的最多的那些功能。

  • 信息直观

    使用图表的核心目的是解决表格数据显示不直观的问题,所以不论功能、布局、颜色、动画都是为了这个服务。

实现方式介绍

首先我们看一下图表包含的基本元素

基于这个结构,下面是我项目的类图,通过一些抽象,将图表的一些元素进行了归纳。

图表中每一个元素的大小位置变化都会影响到其他元素,所以位置和布局的确定存在一个先后关系,顺序如下

graph LR
图表 --> 标题
标题 --> 图例
图例 --> 坐标轴
坐标轴 --> X轴宽度
坐标轴 --> Y轴高度
X轴宽度 --> Y轴宽度
Y轴高度 --> X轴高度
Y轴宽度 --> 系列组
X轴高度 --> 系列组
系列组 --> 系列A
系列组 --> 系列B
系列组 --> 系列C

图表效果

下面是一个最简单的图表示例

所需的配置

<BcChart Height="600" Width="800" Data="DemoData.Githubs" CategoryField="x=>x.Year.ToString()">
<BcTitle Title="图表示例" TData="Github"></BcTitle>
<BcAxesY TData="Github" GridLineMajor="true" GridLineMinor="true"></BcAxesY>
<BcLegend TData="Github" BorderWidth="1" Position="LegendPosition.Bottom"></BcLegend>
<BcColumnSeries TData="Github" ValueFunc="x=>x.Sum(y=>y.View)" GroupName="View"></BcColumnSeries>
<BcColumnSeries TData="Github" ValueFunc="x=>x.Sum(y=>y.Start)" GroupName="Start"></BcColumnSeries>
<BcLineSeries TData="Github" ValueFunc="x=>x.Sum(y=>y.Fork)" GroupName="Fork" IsSecondaryAxis="true"></BcLineSeries>
</BcChart>

所需的数据

static class DemoData
{
public static List<Github> Githubs = new List<Github>()
{
new Github(){Year=2017,View =2500,Start=800,Fork=400},
new Github(){Year=2018,View =2200,Start=900,Fork=800},
new Github(){Year=2019,View =2800,Start=1100,Fork=700},
new Github(){Year=2020,View =2600,Start=1400,Fork=900},
};
}

更多内容请观看《Balzor Day 2021》的视频

BlazorCharts 原生图表库的建设历程的更多相关文章

  1. 【可视化】DataV接入ECharts图表库 可视化利器强强联手

    DataV接入ECharts图表库 可视化利器强强联手 摘要: 两个扛把子级产品的结合,而且文末有彩蛋. DataV 数据可视化是搭建每年天猫双十一作战大屏的幕后功臣,ECharts 是广受数据可视化 ...

  2. 微信小程序的跨平台图表库开发

    写在前面 微信小程序出来已经有一段时间了,github上也有很多人开源了很多项目.但是由于微信平台的限制(底层Canvas能力调用为一系列JSBridge封装),图表的制作一直是个比较头疼的问题.当前 ...

  3. Android开源图表库介绍

    XCL-Charts XCL-Charts V1.8     Android开源图表库(XCL-Charts is a free charting library for Android platfo ...

  4. 双11不再孤单,结识ECharts---强大的常用图表库

    又是一年双十一,广大单身狗们有没有很寂寞(好把,其实我也是)!但是这次的双十一,我不再孤单,因为结识了一个js的强大的图表库---ECharts. 最近做软件工程项目的时候,由于设计图中有柱状图和饼图 ...

  5. XCL-Charts图表库中柱形图的同源风格切换介绍

    柱形图是被使用最多的图之中的一个,在写XCL-Charts这个Android图表库时,为它花费的时间相当多,不是由于有多难绘制,而是要在设计时怎样才干保证图基类能适应各种情况,能灵活满足足够多的需求, ...

  6. 我的Android进阶之旅------>【强力推荐】Android开源图表库XCL-Charts版本发布及展示页

    因为要做图表相关的应用,后来百度发现了一个很好的Android开源图表库(XCL-Charts is a free charting library for Android platform.) 下面 ...

  7. Android开源图表库XCL-Charts版本号公布及展示页

    XCL-Charts V2.1 Android开源图表库(XCL-Charts is a free charting library for Android platform.) XCL-Charts ...

  8. 基于canvas实现的高性能、跨平台的股票图表库--clchart

    什么是 ClChart? ClChart是一个基于canvas创建的简单.高性能和跨平台的股票数据可视化开源项目.支持PC.webApp以及React Native和Weex等平台.在React Na ...

  9. Flutter ChartSpace:通过跨端 Canvas 实现图表库

    基于Flutter 的图形语法库,通过跨端 Canvas ,将基于 Javascript 的图形语法库 ChartSpace 扩展至 Flutter 端 作者:字节跳动终端技术--胡珀 背景 数据平台 ...

随机推荐

  1. hdu5033 最大仰望角

    题意:       给你n个楼房排成一条直线,楼房可以看成是宽度为1的线段,然后给你m组询问,每组询问给你一个坐标,输出在当前坐标仰望天空的可视角度. 思路:       n比较大,O(n*m)肯定跪 ...

  2. js中return;、return true、return false;区别

    一.返回控制与函数结果 语法为:return 表达式 语句结束函数执行,返回调用函数,而且把表达式的值作为函数的结果 二.返回控制 无函数结果,语法为:return; 在大多数情况下,为事件处理函数返 ...

  3. (转)VMware中桥接模式与NAT模式的区别

    bridged networking(桥接模式) 在这样的模式下.VMWare虚拟出来的操作系统就像是局域网中的一台独立的主机,它能够訪问网内不论什么一台机器. 在桥接模式下.你须要手工为虚拟系统配置 ...

  4. 前端基础问题:CSS vertical-align 属性

    CSS vertical-align 属性与基线的那些事~ 定义和用法: vertical-align 属性设置元素的垂直对齐方式. vertical-align只对内联元素(inline.inlin ...

  5. ThreadLocal不好用?那是你没用对!

    在 Java 中,如果要问哪个类使用简单,但用好最不简单?我想你的脑海中一定会浮现出一次词--"ThreadLocal". ​ 确实如此,ThreadLocal 原本设计是为了解决 ...

  6. 解决移动端300ms延迟fastclick

    为什么要使用fastclick 移动设备上的浏览器默认会在用户点击屏幕大约延迟300毫秒后才会触发点击事件,这是为了检查用户是否在做双击.为了能够立即响应用户的点击事件,才有了fastclick. f ...

  7. MFC Object 与 Windows Object

    MFC Object 和 Windows Object的含义 Window Object(Window对象)是Win32下用句柄表示的Windows操作系统对象.MFC Object(MFC对象)是C ...

  8. 没有发生GC也进入了安全点?这段关于安全点的JVM源码有点意思!

    文末 JVM 思维导图,有需要的可以自取 熟知并发编程的你认为下面这段代码的执行结果是怎么样的? 我如果说,执行流程是: t1 线程和 t2 线程一直执行 num 的累加操作 主线程睡眠 1 秒,1 ...

  9. Linux下线程pid和tid

    #include <stdio.h> #include <pthread.h> #include <sys/types.h> #include <sys/sy ...

  10. Java_集合之一

    1.Collection集合 1.1数组和集合的区别[理解] 相同点 都是容器,可以存储多个数据 不同点 数组的长度是不可变的,集合的长度是可变的 数组可以存基本数据类型和引用数据类型 集合只能存引用 ...