基于 AntV G2Plot 来实现一个 堆叠柱状图 加 折线图 的多图层案例

news2024/10/7 8:28:20

前言

最近研究了一下antv/g2的组合图例,并尝试做了一个不算太难的组合图,下面介绍一下整个图里的实现过程。

最终效果图

先来看一下最终的效果图
在这里插入图片描述

该图表有两部分组成,一部分是柱状图,准确说是堆叠的柱状图,一个柱体有多部分组成,没部分占据一定的高度。这样可以看出每部分在整体的大致比例。第二个图表是在堆叠的柱状图上有一个折线图,折线图与柱状图共用X轴,与Y轴。 X轴上每个具体的类目,Y轴是0-100的数值。

实现步骤

在看到需求后,一般人的做法就是寻找最合适的案例,在案例的基础上 稍稍修改。正所谓他山之石,可以攻玉。站在巨人的肩膀。这个时候就体现了一个图表库案例的丰富性。
我是基于该案例做的开发,https://g2plot.antv.antgroup.com/zh/examples/plugin/multi-view/#combo-plot。与我要做的案例很类似。

首先要实现一个多图层图表,就要使用Mix这个类。

在该类里,配置多个图表,有一些公用的配置被提取出来啦。如tooltip,legend,annotations

多图层的配置api 文档 https://g2plot.antv.antgroup.com/api/advanced-plots/mix

在配置参数中, plots是一个很重要的配置参数,它是一个数组,每个元素,都代表一个图表。使用type表明图表的类型,使用options来配置该图表的配置参数。

完整代码

将一些代码复制到 案例的编辑器中,即可看到效果

import { Mix } from '@antv/g2plot';
const data = [
  { xCategory: '识记', type: '5-10%', value: [20, 52] },
  { xCategory: '识记', type: '25-50%', value: [52, 60] },
  { xCategory: '识记', type: '50-75%', value: [60, 62] },
  { xCategory: '识记', type: '75-90%', value: [62, 65] },
  { xCategory: '识记', type: '90-95%', value: [65, 87] },

  { xCategory: '理解', type: '5-10%', value: [30, 52] },
  { xCategory: '理解', type: '25-50%', value: [52, 60] },
  { xCategory: '理解', type: '50-75%', value: [60, 62] },
  { xCategory: '理解', type: '75-90%', value: [62, 65] },
  { xCategory: '理解', type: '90-95%', value: [65, 80] },

  { xCategory: '分析综合', type: '5-10%', value: [10, 52] },
  { xCategory: '分析综合', type: '25-50%', value: [52, 60] },
  { xCategory: '分析综合', type: '50-75%', value: [60, 62] },
  { xCategory: '分析综合', type: '75-90%', value: [62, 65] },
  { xCategory: '分析综合', type: '90-95%', value: [65, 99] },

  { xCategory: '鉴赏评价', type: '5-10%', value: [20, 52] },
  { xCategory: '鉴赏评价', type: '25-50%', value: [52, 60] },
  { xCategory: '鉴赏评价', type: '50-75%', value: [60, 62] },
  { xCategory: '鉴赏评价', type: '75-90%', value: [62, 65] },
  { xCategory: '鉴赏评价', type: '90-95%', value: [65, 95] },

  { xCategory: '表达应用', type: '5-10%', value: [15, 52] },
  { xCategory: '表达应用', type: '25-50%', value: [52, 60] },
  { xCategory: '表达应用', type: '50-75%', value: [60, 62] },
  { xCategory: '表达应用', type: '75-90%', value: [62, 65] },
  { xCategory: '表达应用', type: '90-95%', value: [65, 98] },
]

const cateMap = {
  '5-10%': { color: 'rgb(152,149,225)' },
  '25-50%': { color: 'rgb(165,193,225)' },
  '50-75%': { color: 'rgb(179,231,247)' },
  '75-90%': { color: 'rgb(155,232,220)' },
  '90-95%': { color: 'rgb(205,232,155)' },
}

const plot = new Mix('container', {
  appendPadding: 8,
  tooltip: { shared: true },
  syncViewPadding: true,
  legend: {
    layout: 'horizontal',
    position: 'top',
    marker: {
      style: {
        r: 7,
      },
    },
  },
  plots: [
    {
      type: 'column',
      options: {
        data,
        xField: 'xCategory',
        yField: 'value',
        isRange: true,
        seriesField: 'type',
        yAxis: {
          grid: null,
          nice: true,
          line: {
            style: {
              stroke: '#aaa',
            },
          },
        },
        color: ({ type }) => {
          return cateMap[type].color
        },
        meta: {
          value: {
            min: 0,
            max: 100,
            formatter(val) {
              return val + '%'
            },
          },
        },
        tooltip: true,
      },
    },
    {
      type: 'line',
      options: {
        data: [
          { date: '识记', ctype: '本校', value: 20 },
          { date: '理解', ctype: '本校', value: 30 },
          { date: '分析综合', ctype: '本校', value: 50 },
          { date: '鉴赏评价', ctype: '本校', value: 80 },
          { date: '表达应用', ctype: '本校', value: 95 },
        ],
        seriesField: 'ctype',
        point: {
          size: 5,
          shape: 'circle',
          style: {
            fill: 'white',
            stroke: '#5B8FF9',
            lineWidth: 2,
          },
        },
        lineStyle: {
          lineDash: [5, 5],
        },
        xField: 'date',
        yField: 'value',
        xAxis: false,
        yAxis: false,
        smooth: true,
        color: '#dddddd',
      },
    },
  ],
})

plot.render() 

踩的坑

  • 第二个图表的legend 与第一个图表的 legend不能放到一列
    如下图
    在这里插入图片描述
    这是两列。

  • 尽量不要使用nice 属性,并且设置y轴的 min max值
    由于第一个图表 和第二个图表是共用Y轴,为了保证值的统一,两个图例的单位和起点,终点必须一致。
    否则可能会出现这样的情况,折线的点为64,但点却高于75。
    在这里插入图片描述

  • 第三个坑点就 两个图例的tooltip可能会遮挡,如下图
    在这里插入图片描述

后记

基于最近使用antv g2的体验,稍微谈一下自己的感觉。

  • 相比echarts,配置更加具有简单、易用
  • 相比echarts,文档质量算不得优秀
  • 案例只能说刚刚够用,并不算丰富

相对应的解决办法就是 ,开展一些活动,调动广大开发者的参与积极性,优化,完善文档。
提交更加丰富多彩的案例。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/663189.html

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

相关文章

【TA100】图形 3.5 Early-z和Z-prepass

一、深度测试:Depth Test 1.回顾深度测试的内容 深度测试位于渲染管线哪个位置 ○ 深度测试位于逐片元操作中、模板测试后、透明度混合前 为什么做深度测试 ● 深度测试可以解决:物体的可见遮挡性问题 ○ 我们可以用一个例子说明 ■ 图的解释&…

windows应急整理

windows应急整理 Virustotal 网站分析恶意样本 BrowingHistoryView 查看浏览器所有历史记录,可能会请求攻击者的恶意网站或者下载东西 启动项检查 开机启动项文件夹 msconfig 注册表run 键值查看 启动项 临时文件检查,temp 目录权限特殊,容易成为被利用对象 %temp%查看 tem…

华为HCIP第一天---------RSTP

一、介绍 1、以太网交换网络中为了进行链路备份,提高网络可靠性,通常会使用冗余链路,但是这也带来了网络环路的问题。网络环路会引发广播风暴和MAC地址表震荡等问题,导致用户通信质量差,甚至通信中断。为了解决交换网…

C# WebSocketSharp 框架的用法

效果: 一、概述 WebSocketSharp 是一个 C# 实现 websocket 协议客户端和服务端,WebSocketSharp 支持RFC 6455;WebSocket客户端和服务器;消息压缩扩展;安全连接;HTTP身份验证;查询字符串,起始标题和Cookie;通过HTTP代理服务器连接;.NET Framework 3.5或更高版本(包括…

腾讯云服务器云监控是什么?

腾讯云服务器云监控是什么?云监控用于监控云服务器性能资源指标如CPU利用率、内存使用量、内网外网出入带宽、TCP连接数、硬盘IOPS、硬盘IO等性能指标,云服务器吧建议免费开通云监控功能。 什么是云监控? 腾讯云服务器CVM云监控是什么&…

从小白到大神之路之学习运维第43天---第三阶段----LVS-----keepalived+LVS(DR)搭建部署

第三阶段基础 时 间:2023年6月19日 参加人:全班人员 内 容: keepalivedLVS(DR)搭建部署 目录 一、作用 技术特点: 与nginx的区别: 安全性: 配置文件: 二、环境简介 三、操作步骤 …

SPEC 2006 gcc version 8.3.0 (Uos 8.3.0.3-3+rebuild) x86_64 源码编译tools 错误处理笔记

编译tools 拷贝tools到安装目录 cp /mnt/iso/tools /opt/speccpu2006/ -r 执行编译 su rootcd /opt/speccpu2006/tools/src sh -x buildtools 错误 undefined reference to __alloca 编辑./make-3.82/glob/glob.c,注释掉以下宏判断 you should not run config…

unittest教程__测试报告(6)

用例执行完成后,执行结果默认是输出在屏幕上,其实我们可以把结果输出到一个文件中,形成测试报告。 unittest自带的测试报告是文本形式的,如下代码: import unittestif __name__ __main__:# 识别指定目录下所有以tes…

springcloud 中RestTemplate 是怎么和 ribbon整合,实现负载均衡的?源码分析

一、RestTemplate 拦截器了解 RestTemplate 内置了一个 ClientHttpRequestInterceptor,这个是一个拦截器操作,我们可以在请求的前后做一些事情。然后我们看一下这个类,这个类里面 有一个 intercept方法。我们看下这个实现类,里面有一个 LoadBalancerInterceptor实现类。 …

pm2详解

对于后台进程的管理,常用的工具是crontab,可用于两种场景:定时任务和常驻脚本。关于常驻脚本,今天介绍一款更好用的工具:pm2,基于nodejs开发的进程管理器,适用于后台常驻脚本管理,同…

whisper语音识别部署及WER评价

1.whisper部署 详细过程可以参照:🏠 创建项目文件夹 mkdir whisper cd whisper conda创建虚拟环境 conda create -n py310 python3.10 -c conda-forge -y 安装pytorch pip install --pre torch torchvision torchaudio --extra-index-url 下载whisper p…

STM32单片机LED显示屏驱动原理与实现

STM32单片机驱动LED显示屏的原理与实现方法与Arduino类似,但涉及到的具体硬件资源和库函数可能会有所不同。下面是一个详细的介绍: 原理: STM32单片机驱动LED显示屏的原理是通过控制GPIO引脚的电平状态来控制LED的亮灭。通过设置引脚的输出电…

Jetpack Compose中的附带效应及效应处理器

Jetpack Compose中的附带效应及效应处理器 将在任何可组合函数范围之外运行的代码称为附带效应。 为什么要编写在任何可组合函数范围之外的代码? 这是因为可组合项的生命周期和属性(例如不可预测的重组)会执行可组合项的重组。 让我们通过一…

软考高级系统架构设计师(一) 考什么

目录 一、背景 二、软考(高级)的用途 三、考什么 第一科:综合知识 第二科:案例分析 第三科:论文 四、系统架构设计师常见的考试内容 五、模拟与训练 一、背景 系统架构设计师,属于软考高级考试中的一种。 二、软考(高级)…

Node搭建前端服务Mysql数据库交互一篇搞定

目录 介绍 安装环境及数据准备 代码示例 mysql连接工具类 测试方法文件 单表总量查询 单表条件查询 新增数据 修改 删除 ​编辑 ​编辑 联表查询 联表过滤 搭配express服务搭建api使用 介绍 在前端开发中,可以使用纯node前端进行服务搭建与mysql进行数据库的交互,这样…

Bun vs. Node.js

Bun vs. Node.js 你知道 Bun 吗?Bun 是新的 JavaScript 运行时,最近在技术领域引起轰动,它声称比 Node.js 更好。本文将展示如何使用基准分数对其进行测试。 在本文中,我们将介绍最近在技术领域引起轰动的新的 Bun 运行时。我们…

螯合剂试剂:DOTA-CH2-Ph-azide(HCl salt),分子式:C21H34Cl3N7O6,的相关参数信息

文章关键词:双功能螯合剂,azide叠氮 为大家介绍(CAS:N/A),试剂仅用于科学研究,不可用于人类,非药用,非食用。 分子式:C21H34Cl3N7O6 分子量:586.9 英文名称&a…

限定国家及时间|心理学老师如期赴意大利访学

S老师由于个人情况变化需要办理CSC改派,并限定了国家且要求年底出国。我们最终用意大利巴里大学的邀请函,助其成功申请了CSC改派并如期出国。 S老师背景: 申请类型: CSC访问学者 工作背景: 高校教师 教育背景&#…

Python基础知识进阶之数据爬虫

一、爬虫概述 爬虫是指利用网络抓取模块对某个网站或者某个应用中有价值的信息进行提取。还可以模拟用户在浏览器或者APP应用上的操作行为,实现程序自动化。简单来说就是我们把互联网有价值的信息都比喻成大的蜘蛛网,而各个节点就是存放的数据&#xff0…

如何写出让业务满意的性能测试报告

目录 前言 需求背景 测试报告的作用是什么? 业务团队更关注哪些内容? 输出让业务满意的性能测试报告 总结 前言 写出一份让业务满意的性能测试报告,需要充分理解和呈现测试结果,结合业务需求进行分析和解读。 这篇文章&am…