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

news2024/9/25 13:21:16
关于可视化的一些概念已经在之前的文章进行了大概的介绍,接下来我们会更加深入探讨关于呈现效果的内容。

为什么要用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.coloradmin.cn/o/1644571.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Find My无线麦|苹果Find My技术与无线麦结合,智能防丢,全球定位

无线麦采用数字信号处理技术,能够实现高质量的录音效果。同时,其采用多种降噪技术,能够更好地降低底噪和环境噪声,提供更好的音质。无线麦在直播中的作用不仅仅是提供高质量的录音效果,它还能够增强直播的效果,提升听众的观感和体…

什么牌子的充电宝质量好且耐用?精选四款性价比高充电宝

对于我这种只要有空,手机基本是不离手的,从早到晚都是离不开手机,点外卖需要用到手机,看剧需要用到手机,反正各种活动都是离不开手机,但是手机总会有没电的时候,这时候要么是找个插座充电&#…

DEM(高程)数据下载及计算可见性

数据下载 下载链接: 地理空间数据云 (gscloud.cn) 数据部分介绍 ASTER是美国宇航局Terra航天器(1999年发射)上的五台仪器之一,在日本为经济产业省(METI)建造。美国/日本联合科学团队负责仪器设计、校准和数据验证。 高级星载热发射和反射辐射计(ASTER)全球数字高程…

社交媒体数据恢复:哔哩哔哩

哔哩哔哩数据恢复的方法 在哔哩哔哩平台上,数据恢复的过程可能会因为数据丢失的原因不同而有所差异。以下是根据搜索结果总结的几种常见数据恢复方法: 1. 误删历史记录的恢复 如果你不小心误删了哔哩哔哩的历史记录,那么很抱歉&#xff0c…

【Linux系统化学习】网络套接字(编写简单的UDP服务端和客户端)

目录 理解源IP地址和目的IP地址 认识端口号 端口号和进程ID的区别 源端口号和目的端口号 认识TCP和UDP协议 TCP协议 UDP协议 网络字节序 socket编程接口 socket常见API sockaddr结构 简单的UDP网络程序 UDP服务端 创建套接字 填充本地网络信息 绑定 收取消息 …

打造亚马逊爆款秘诀:流量、排名与自养号测评的完美结合

亚马逊是一个产品为王的平台,只要我们的产品好,就会有更多的流量,有流量还怕我们的产品卖不出去?身为新手我们店无流量该怎么办,今天教给你们五个获取流量的方法。 1.自然检索 那是我们常说的自然流量,通…

spring中的bean是线程安全的嘛

在Spring框架中,bean默认情况下不是线程安全的。Spring容器在初始化bean时,会为其创建一个单例实例,这个实例在整个应用中是唯一的,并且只会被初始化一次。由于这个特性,bean在默认情况下不是线程安全的。 然而&#…

在Ubuntu上安装docker

一、安装docker 更新系统包列表: sudo apt-get update安装必要的依赖软件包,使apt可以通过HTTPS使用repository。 sudo apt-get install apt-transport-https ca-certificates curl software-properties-common添加Docker的阿里云GPG密钥:…

WP Rocket插件下载:加速您的WordPress网站,提升用户体验

在互联网速度决定用户体验的今天,一个快速加载的网站对于吸引和保留访问者至关重要。WP Rocket插件,作为一款专为WordPress设计的高性能缓存插件,提供了一套完整的解决方案,帮助您优化网站性能,提升用户体验。 [WP Ro…

Begin 版本:2023/01/11 知更鸟WordPress主题优化版

主题下载地址:Begin主题优化版.zip 适用于博客、新闻、公司、图片、小说、文档、商城、资源下载、网址导航等多种类型网站

Redis 实战之客户端属性

客户端属性 套接字描述符名字标志输入缓冲区命令与命令参数命令的实现函数输出缓冲区身份验证时间总结 客户端状态包含的属性可以分为两类: 一类是比较通用的属性, 这些属性很少与特定功能相关, 无论客户端执行的是什么工作, 它们…

(二十一)springboot实战——Spring AI劲爆来袭

前言 本节内容是关于Spring生态新发布的Spring AI的介绍,Spring AI 是一个面向人工智能工程的应用框架。其目标是将 Spring 生态系统的设计原则,如可移植性和模块化设计,应用到人工智能领域,并推广使用普通的Java对象&#xff08…

DSN Injection(CVE-2022-3023)

DSN DSN通常指数据源名称(Data Source Name),它被用于存储数据库连接信息,如数据库服务器的地址、数据库名、用户名以及密码等,以便软件能够利用这些信息连接到数据库。 DSN Injection DSN注入(DSN Injecti…

Web安全:SQL注入漏洞详解,SQL注入常见功能、危害、分类、判断注入点、注入方式

「作者简介」:2022年北京冬奥会网络安全中国代表队,CSDN Top100,就职奇安信多年,以实战工作为基础对安全知识体系进行总结与归纳,著作适用于快速入门的 《网络安全自学教程》,内容涵盖系统安全、信息收集等…

nginx--rewrite

功能 Nginx服务器利用ngx_http_rewrite_module 模块解析和处理理rewrite请求,此功能依靠PCRE(Perl Compatible Regular Expressions),因此编译之前要安装PCRE库,rewrite是nginx服务器的重要功能之一,用于实现URL的重写&#xff0…

上位机图像处理和嵌入式模块部署(树莓派4b下ros安装方法)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 随着嵌入式开发板算力越来越强,很多的同学开始用树莓派做一些ros开发的工作。目前来说,ros有两个版本,分别是ro…

ChatGPT 4.0 直接用 !!!Code Copilot编程大模型、DALL-E AI绘图、绘制流程图、上传文件

嗨,你好呀,我是哪吒。 这一年最让人揪心的热点,就是各种层出不穷的AI技术。 原以为它只是短暂霸屏,但现实却赤裸裸展示了,什么叫AI抢走你的饭碗,连招呼都不打一声! 什么策划方案、公众号文案、营销卖点、…

电脑切换窗口快捷键,让你轻松驾驭多个任务

在使用电脑时,经常需要切换不同的窗口,以便快速地访问不同的应用程序或任务。为了提高效率,掌握一些电脑切换窗口快捷键是非常重要的。本文将介绍三种在电脑上切换窗口的方法,帮助您更加高效地进行多任务处理。 方法1:…

SAP PP学习笔记11 - PP中的MRP相关概念,参数,配置

上文讲了作业区的概念及配置。 SAP PP学习笔记08 - 作业区(工作中心Work Center),作业区Customize-CSDN博客 SAP PP学习笔记09 - 作业区(工作中心Work Center)Customize2(管理码,班次顺序&…

菜鸡学习netty源码(五)—— EventLoop

1.EventLoop的类关系图 2. EventExecutor /*** 返回自身的对象* Returns a reference to itself.*/OverrideEventExecutor next();/*** 获取所属的EventExecutorGroup* Return the {link EventExecutorGroup} which is the parent of this {link EventExecutor},*/EventExecuto…