通过七析BI自定义组件实现3D效果图表渲染

devtools/2024/10/18 6:04:18/
关于可视化的一些概念已经在之前的文章进行了大概的介绍,接下来我们会更加深入探讨关于呈现效果的内容。

为什么要用3D图表在仪表盘中进行呈现?

当讨论到这个问题的时候,自然就会回归到一个核心:3D与2D的呈现效果有什么区别?

我们知道,在分析数据的时候,可以自己定义数据统计的维度,基于比较常见的销售数据,结合七析BI可视化引擎,进行数据统计。下面展示下不同维度层面呈现的区别:

不同维度在视觉层面的区别

一维呈现

一维图形在视觉层面就是只有一个方向,一般以长短这个概念表示对应数据的大小,在此基础上我们只能呈现一个指标,所以这里只会有单个指标的存在。柱状图的高矮确定了值的大小。

一维图形

二维呈现

聪明的小伙伴已经知道了二维呈现就是有两个方向的视觉效果,常见的二维呈现就是矩形。图形的长宽组合在一起才会有对应的视觉效果。

在数学呈现上就是我们常见的平面直角坐标系,对应到图表中就是x轴,y轴。x轴作为分析维度,y轴作为度量,就可以呈现出不同维度中度量的差异;一般可以进行比较简单的横向或者纵向差异对比。

在上面咱们的场景中,如果要分析订单中不同商品的利润,就需要多增加一个分析维度,以此区分不同类别。

三维呈现

三维呈现就是咱们今天比较核心的点了。三维基于二维增加了一个维度,相当于从原来的平面变成了有高度的概念,也就是咱们对于周边物体的认知,能摸到的东西都是存在长宽高,在视觉层面都是“立体”的。

对应咱们认知的就是立体直角坐标系,有x,y,z轴,在这个坐标系中每个点都至少包含三个维度的信息。

在七析BI中,我们可以很简单地进行三个维度的分析,也是基于上面的场景。如果说要分析不同客户群体在对应类别中产生的利润,我们只需要在七析BI的图表设计器中将“类别”与“客户细分”作为分维度,利润作为度量字段,则可以快速生成对应的图表。

在图中可以很自然就能看出哪个值最大,哪个值最小,但是如果我们要进行同类购买群体在不同类别中的利润,就不够直观了,这个时候转换为三维呈现的话,效果就会比起平面条形图更为直观。

七析BI自定义组件介绍

七析BI提供了JS图表的能力给用户,让有一定开发能力的用户自由地编写符合业务分析要求的图表效果。

自定义组件与七析BI系统的内嵌逻辑

七析BI将数据处理与图形渲染分为了两个模块,用户配置行列分析维度定义了数据结构,选择图表类型并且进行对应的图表配置定义了图表渲染的模式及细节。当用户希望有更多的呈现方式时,可以使用“自定义图表”类型进行自定义渲染。依靠七析BI的数据分析能力,不需要过多操心数据的聚合问题,即可快速编写出所需要的图表样式。

自定义组件基本原理

目前系统内的渲染引擎都是基于Echarts.js进行渲染,所以自定义组件的核心逻辑就是根据获取到的数据进行echarts配置项的编写然后调用渲染函数;自定义组件会提供渲染引擎中的echarts图表实例给开发者,让开发者可以从echarts的原生能力入手进行开发。

如何通过七析BI进行3D自定义组件渲染

数据的配置

自定义组件的数据配置与普通图表的配置是一样的,通过行列配置生成对应的数据定义,在自定义组件中通过BI.data()获取当前配置的数据,数据的返回格式是标准的数组形式,开发者可以根据数组进行数据的组合,以满足最终的渲染要求。

自定义组件中数据获取

在自定义组件中可以编写JS代码进行数据处理及渲染定义,其中BI对象是自定义组件进行上下文沟通的重要接口,可以通过此对象调用BI.data()获取实时的数据返回,或者通过BI.getEchartsInstance()获取到对应的echarts图表对象实例。

在自定义组件中使用BI.data() 获取数据,可以看到实时的数据返回结果及格式。

渲染代码编写

下面的代码可以提供参考,如果有更多的效果需要实现的话,建议查询echarts的官方文档,里面的内容非常全面。

通过echarts进行3D图表渲染主要有以下要点:

1.3D网格定义 option.grid3D

option.grid3D = {boxWidth: 100,boxDepth: 100,light: {main: {intensity: 1.2,shadow: true},ambient: {intensity: 0.3}} 
}

2.x, y, z轴定义 option.xAxis3D option.yAxis3D option.zAxis3D,此处需要根据需要定义轴的类型,确定type是 'category' 或者是 'value'。一般来说我们会以维度字段作为x,y轴,让度量值作为z轴进行高低的对比,可以更好地在高度层面进行同类对比或者全局对比

option.xAxis3D = {type: 'category',data: catagory,name: '类别'}
option.yAxis3D = {type: 'category',data: customType,name: '客户类型'}
option.zAxis3D = {type: 'value',name: '利润'},

3.数据定义 series,因为此处只有一组数据,所以只需要保证一组data中返回的数据是满足x,y,z的顺序即可。需要注意的是,此处的数据都是数组的形式,不要与对象格式混用了

option.series = [{type: 'bar3D',data: data.map(item => {return {value: [item['类别|1713924638045'], item['细分|1713924690397'], item['profit|1713924642501']]}}),shading: 'lambert',label: {show: true,fontSize: 16,borderWidth: 1,textStyle:{color: '#000'}},emphasis: {label: {fontSize: 20,color: '#900'},itemStyle: {color: '#900'}}}]

图表渲染

完成渲染定义之后,我们最后将option放入到echarts实例即可。通过咱们BI.getEchartsInstance()获取到的实例,进行setOption(),点击运行,就可以看到刚刚编写的效果了。

BI.getEchartsInstance().setOption(option)

当然了,我们还可以进行颜色配置或者光影配置,让图表具有更丰富的视觉呈现。如:可以通过visualMap进行颜色配置,或者series.shading进行三维图形的着色效果配置,有兴趣的小伙伴可以自己进行摸索。

完整的代码参考

var data = BI.data()
console.log('data==', data)var catagory = data.map(item => {return item['类别|1713924638045']
})
// 对类别进行去重
catagory = Array.from(new Set(catagory))var customType = data.map(item => {return item['细分|1713924690397']
})
// 对分类进行去重
customType = Array.from(new Set(customType))
var chartInstance = BI.getEchartsInstance()const options = {tooltip: {},visualMap: {max: 150000,inRange: {color: ['#313695','#4575b4','#74add1','#abd9e9','#e0f3f8','#ffffbf','#fee090','#fdae61','#f46d43','#d73027','#a50026']}},grid3D: {boxWidth: 100,boxDepth: 100,light: {main: {intensity: 1.2,shadow: true},ambient: {intensity: 0.3}}},xAxis3D: {type: 'category',data: catagory,name: '类别'},yAxis3D: {type: 'category',data: customType,name: '客户类型'},zAxis3D: {type: 'value',name: '利润'},series: [{type: 'bar3D',data: data.map(item => {return {value: [item['类别|1713924638045'], item['细分|1713924690397'], item['profit|1713924642501']]}}),shading: 'lambert',label: {show: true,fontSize: 16,borderWidth: 1,textStyle:{color: '#000'}},emphasis: {label: {fontSize: 20,color: '#900'},itemStyle: {color: '#900'}}}]
}console.log('options===', options)chartInstance.setOption(options)

http://www.ppmy.cn/devtools/34476.html

相关文章

CMakeLists.txt语法规则:提供信息的变量说明一

一. 简介 前面几篇文章学习了 CMakeLists.txt语法中 部分常用命令。 接下来学习CMakeLists.txt语法中部分常用变量,变量也是 cmake 中的一个重头戏,cmake 提供了很多内置变量。每一个变量都有它自己的含义,可以通过如下链接地址查询到所有…

Github 2024-05-06 开源项目日报 Top10

根据Github Trendings的统计,今日(2024-05-06统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Jupyter Notebook项目2Python项目2C#项目1JavaScript项目1Cuda项目1TypeScript项目1Rust项目1C项目1简单、纯净的C/CUDA中的LLM培训 创建周期:…

GO语言核心30讲 实战与应用 (第一部分)

原站地址:Go语言核心36讲_Golang_Go语言-极客时间 一、测试的基本规则和流程 1. GO程序主要分三类测试:功能测试、性能测试,以及示例测试。 示例测试和功能测试差不多,但它更关注程序打印出来的内容。 2. 测试文件的名称应该以…

Phi-2:小型语言模型令人惊人的能力

导语 phi-系列模型是微软研究团队推出的轻量级人工智能模型,旨在实现“小而精”的目标,能够实现在低功耗设备上例如智能手机和平板电脑上部署运行。截止目前,已经发布到了phi-3模型,本系列博客将沿着最初的phi-1到phi-1.5&#x…

基于LLama3、Langchain,Chroma 构建RAG

概要: 使用Llama3 Langchain和ChromaDB创建一个检索增强生成(RAG)系统。这将允许我们询问有关我们的文档(未包含在训练数据中)的问题,而无需对大型语言模型(LLM)进行微调。在使用RA…

Unity DOTS1.0(8) Aspect核心机制分析

Aspect 概念: ASPECT是一种用于描述Entity的特性或特征的概念。ASPECT通常用于在系统中筛选出具有特定组件集合的实体。 你可以把5~6个组件得引用保存到一个数据对象里面(Aspect),你通过Aspect就可以拿到这些组件得引用,从而访问这些组件数据; Unity 会…

读天才与算法:人脑与AI的数学思维笔记19_深度数学

1. 深度数学 1.1. 组合与选择,是发明新事物的两个不可或缺的条件 1.1.1. 保尔瓦雷里(Paul Valry) 1.2. 利用以往的数学定理证明过程训练算法,以发现新的定理 1.3. 谷歌设在伦敦的总部整体有一种现代牛津大学的感觉&#xff0c…

Cocos Creator UICanvas详解与2D游戏配置详解

前言 Cocos Creator是一款强大的2D游戏开发引擎,提供了丰富的工具和组件来帮助开发者快速制作出优秀的游戏作品。其中,UICanvas是Cocos Creator中一个非常重要的组件,用于管理游戏中的UI界面。 在本文中,我们将深入探讨Cocos Cr…