当我用AI为开发AntV图表插上想象的翅膀后

news2024/12/23 22:18:42

前言

做前端图表时,最耗时的就是找配置参数,比如你在使用AntV G2时,为了更加美观,拉大数据之间的差距,需要将y轴设置一个最小值,由于每个图表的参数少说十几个,多达二十多个,一个一个找,势必会浪费很多时间,更何况有时你找的参数并不在某一具体的图表模块,而是在公共的图表组件配置模块中。这个时候我就思考,这些寻找配置参数,毫无技术性的,耗时的工作能不能交个AI来做?所以在日常的开发图表的过程中,遇到问题,我刻意地去利用AI去完成。下面看一下我在实际开发中的几个案例

几个案例

第一个案例是,在一个折线图中,为y轴设置最小值,我是这样向AI提问,
在antv g2plot 的折线图表中,如何设置y轴的最小值?
给出的答案是 :

在 AntV G2Plot 的折线图表中,可以通过修改 Y 轴的 min 属性来设置 Y 轴的最小值。具体操作如下:

import { Line } from '@antv/g2plot';

const data = [
  { year: '1991', value: 15468 },
  { year: '1992', value: 16100 },
  { year: '1993', value: 15900 },
  { year: '1994', value: 17409 },
  { year: '1995', value: 17000 },
  { year: '1996', value: 31056 },
  { year: '1997', value: 31982 },
  { year: '1998', value: 32040 },
  { year: '1999', value: 33233 },
];

const linePlot = new Line('container', {
  data,
  xField: 'year',
  yField: 'value',
  yAxis: {
    min: 14000, // 设置 Y 轴的最小值为 14000
  },
});

linePlot.render();

以上代码中,我们通过在 yAxis 属性中设置 min 值为 14000 来将 Y 轴的最小值设置为 14000,你也可以根据需要自行更改。

这个答案确实是正确的,只需要将AI提供的代码复制到官方案例的编辑器中,就能显示效果。

后来我又遇到一个问题,就是在一个折线图中,只有一条折线,无法显示图例Legend。于是我询问了AI,给出的答复是需要使用seriesField: 'category', 每一条数据需要配置 category属性,用于区分线段类型。category的值的数量决定这个图表中有多少条折线。这样设计没问题,但就是当只有一条线段时,也必须设置一个category,并且是相同的值。所以在特殊场景下,这个api的设计是有点不那么优雅。

还有一个例子,当我在使用G6画一个图排版时,有一个需求是拖拽一个节点到另一节点上,当这样操作时,使两者联一条线。这是一个很好理解的场景。但如果对于G6不太熟悉的人,可能好扒好一会文档。但如果你问AI的话,有可能会得出这样一个答案

// 创建 G6 实例
const graph = new G6.Graph({
  container: 'graph-container',
  width: 800,
  height: 600,
  modes: {
    // 支持节点拖拽和边连接的交互模式
    default: ['drag-node', 'drag-canvas', 'click-select'],
  },
  defaultEdge: {
    type: 'line',
  },
});

// 注册自定义节点类型
G6.registerNode('circle', {
  draw(cfg, group) {
    const shape = group.addShape('circle', {
      attrs: {
        x: 0,
        y: 0,
        r: 20,
        stroke: '#666',
        fill: 'white',
        lineWidth: 2,
      }
    });
    group.addShape('text', {
      attrs: {
        x: 0,
        y: 0,
        textAlign: 'center',
        textBaseline: 'middle',
        text: cfg.label,
        fontSize: 14,
        fill: '#333',
      },
    });
    return shape;
  },
});

// 注册自定义边类型
G6.registerEdge('smooth', {
  getPath(points) {
    const startPoint = points[0];
    const endPoint = points[points.length - 1];
    const hgap = Math.abs(endPoint.x - startPoint.x);
    if (endPoint.x > startPoint.x) {
      return [
        ['M', startPoint.x, startPoint.y],
        ['C', startPoint.x + hgap / 4, startPoint.y, endPoint.x - hgap / 4, endPoint.y, endPoint.x, endPoint.y],
      ];
    }
    return [
      ['M', startPoint.x, startPoint.y],
      ['C', startPoint.x - hgap / 4, startPoint.y, endPoint.x + hgap / 4, endPoint.y, endPoint.x, endPoint.y],
    ];
  },
});

// 监听节点间的拖拽事件
graph.on('node:dragstart', (e) => {
  const { item } = e;
  graph.getEdges().forEach((edge) => {
    if (edge.getSource() === item || edge.getTarget() === item) {
      graph.setItemState(edge, 'selected', true);
    }
  });
});

// 创建新的边
graph.on('node:drag', (e) => {
  const { item } = e;
  graph.getEdges().forEach((edge) => {
    if (edge.getSource() === item) {
      const model = edge.getModel();
      model.startPoint = {
        x: item.getModel().x,
        y: item.getModel().y,
      };
      graph.updateItem(edge, model);
    }
    if (edge.getTarget() === item) {
      const model = edge.getModel();
      model.endPoint = {
        x: item.getModel().x,
        y: item.getModel().y,
      };
      graph.updateItem(edge, model);
    }
  });
});

// 配置 G6 实例
graph.data({
  nodes: [
    { id: 'node1', label: 'Node 1', x: 100, y: 100, type: 'circle' },
    { id: 'node2', label: 'Node 2', x: 400, y: 100, type: 'circle' },
    { id: 'node3', label: 'Node 3', x: 250, y: 300, type: 'circle' },
  ],
  edges: [
    { source: 'node1', target: 'node2', type: 'smooth' },
    { source: 'node1', target: 'node3', type: 'smooth' },
    { source: 'node2', target: 'node3', type: 'smooth' },
  ],
});
graph.render();

并且在该案例中,还使用自定义节点,而不是简单使用内置的节点。拿到代码后就拷贝到项目里试一下,然后在简单的调试,有时AI会自己瞎编一些官方不支持的API,这个时候谁调试的好,谁就更优秀。

在AI的加持下,我们不必再记忆那么多API,也不用翻找那么多的文档,只需要做的是狠狠地优化自己的问题。
如何使用工具,提高效率一直是人类社会永恒不变的话题。你用半天写的代码,别人用AI加调试,2小时就搞定的。

再讲一个例子,有一次我们测试人员觉得散点图中的图例mark太小了,于是我找了一下图例的配置文档,并询问了AI,都没有得到正确答案。读者们也可以试一试,这个问题别人也有遇到,2019年 在这个帖子里 https://ask.csdn.net/questions/771964/54235171?spm=1001.2014.3001.5501
这是因为g2 的marker 使用的是一个很通用的配置参数,其中的是 marker 的样式配置数据类型 为 ShapeAttrs 。你在文档经常遇到这个参数,用于规定图形的一些样式。这个配置参数里有
有关绘图属性 可以查看官方文档
https://g2plot.antv.antgroup.com/api/graphic-style

最后我不得一个一个属性去尝试,并不是跟着文档去调试,而且是跟着TS类型的定义。
最后,找到了我想要的 要想改变 图例中marker的大小,可以使用
legend.marker.style.r
如下配置

 legend: {
  layout: 'horizontal',
  position: 'top',
  marker: {
    style: {
      r: 7,
    },
  },
},

因为我的marker是 图形,三角形,菱形,正方形,都能正常扩大或缩小,但在线性marker上,线只会延长,并不会加粗。
所以要注意一下。在绘制图形的属性介绍中,没有关于r参数的介绍, 其实这也是 g2plot 文档留下的坑。每个属性并没有解释到很具体。

在AI 时代,如果官方资料库没有做好的话,那么就AI就很难为其赋能,提供有效准确的解决方案。

使用前的预备知识

在使用AI搭配AntV 画图表时,我们必须有一些基本的概念,了解一些名词。如果你不知道那种

使用颜色、大小、形状区分不同的数据类型的图表的辅助元素,用于图表中数据的筛选的东西叫做图例Legend,那么你就无法提图例相关的问题。所有在使用AI工具画图表前,全面了解一下图表的名词是很有必要的。

当然这个问题你也可以问AI,你可以这样提问:
请详细介绍一下AntV G2Plot 图表中涉及的组件名词,英文及作用,

AI 大致会给出这样的答案:
AntV G2Plot是一款基于G2的可视化图表库,包含了丰富的组件。以下是AntV G2Plot中涉及到的主要组件及其英文和作用:

  1. Chart:抽象出来的画布类,提供画布初始化、销毁、重绘等方法。

  2. Geometry:几何体,负责数据处理和绘制。如:line(折线)、area(面积)、interval(柱状)、point(散点)等。

  3. Axis:坐标轴组件,分为数值轴、分类轴、时间轴等。

  4. Tooltip:鼠标悬浮提示框,展示数据详细信息。

  5. Legend:图例组件,可以展示不同系列的名称和颜色。

  6. Label:标签组件,可以在图表上标注文字或者数据等信息。

  7. Guide:辅助线组件,可以在图表上添加辅助线、文本等元素。

  8. Annotation:注释组件,可以在图表上添加注释信息,如标题、副标题等。

  9. Interaction:交互组件,包括缩放、平移、选中、高亮等交互方式。

  10. Theme:主题组件,可以更改图表的整体样式,如背景色、字体大小等。

以上这些组件都是AntV G2Plot中常用的组件,在使用G2Plot进行可视化图表开发时,这些组件都是需要用到的。

在我们了解这些名词时,需要和图表具体看到UI对应起来。下面是AntV G2Plot 的一些图表组件的UI描述

图例(legend)

图例(legend)是图表的辅助元素,使用颜色、大小、形状区分不同的数据类型,用于图表中数据的筛选。
在这里插入图片描述

坐标轴 - Axis

坐标轴指二维空间中统计图表中的轴,它用来定义坐标系中数据在方向和值的映射关系的图表组件
在这里插入图片描述

缩略轴 - Slider

在这里插入图片描述

悬浮提示 - Tooltip

提示信息 Tooltip,指当鼠标悬停在图表上或者手指点按移动设备的某个数据点时,以交互提示信息的形式展示该点的数据,比如该点的值,数据单位等。
在这里插入图片描述

图表标注 - Annotations

图形标注,Annotation,作为图表的辅助元素,主要用于在图表上标识额外的标记注解。

在这里插入图片描述

点击此处可以访问 图标组件

后记

在AI的时代,做任何事都不妨都借助一下AI这个工具,提高效率,早点下班回家玩游戏。
当你用AI为开发AntV图表插上想象的翅膀后,你会发现,一天做十几个复杂的图表根本不是问题。

或许有一天让AI 来写图表库,并撰写更新文档,并写出案例,最后在由AI提供给使用者。完成闭环。哈哈哈。。。

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

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

相关文章

C# 反射 (Reflection) 的常用功能

目录 一、概述 二、实例化类 三、反射赋值 四、获取字段值 五、获取字段名 六、获取字段类型 七、调用方法 结束 一、概述 反射指程序可以访问、检测和修改它本身状态或行为的一种能力。 程序集包含模块,而模块包含类型,类型又包含成员。反射则…

华为认证 | HCIE-Datacom 考试大纲

01 HCIE-Datacom考试概述 02 HCIE-Datacom考试内容 HCIE-Datacom V1.0 考试覆盖数据通信领域:路由交换高阶技术、企业网络架构全景、园区网络典型架构与技术、华为CloudCampus解决方案设计与部署、广域互联网络典型架构与技术、华为SD-WAN解决方案设计与部署、广域…

人机接口回路原理(四)

五、硬件时钟电路 接口插件设置了一个硬件时钟电路,由一片MC146818时钟芯片及辅助元器件组成,如图1-35所示。 MC146818芯片是智能式硬件时钟,其内部由电子时钟和存储器两部分组成。可计年、月、日、时、分、秒、星期;能…

时间序列中的无监督表示学习

自监督学习中,有一个常用的方法是对比学习; 2.  时间序列的表示学习 1.1 采用对比学习的方式 Time-series representation learning via temporal and contextual contrasting(IJCAI’21) 本文采用对比学习的方式进行时间序列表示学习。首先对于同一…

告别原始 UI 样式,拥抱 Fluent Design 风格 PyQt/PySide 组件库

简介 这是一个使用 PyQt/PySide 编写的 Fluent Design 风格的组件库,支持亮暗主题无缝切换和自定义主题色,搭配 QtDesigner 可以快速开发美观的界面。github 仓库地址为 https://github.com/zhiyiYo/PyQt-Fluent-Widgets ,演示视频可以在哔哩…

夏至后,这些农事活动要注意管理

夏至过后,温度会进一步攀登,较高的气温和光照会让夏作物生长更加旺盛。接下来就让我们看看在这些夏作物在种植时都需要注意哪些方面吧! 一、蔬菜管理 夏白菜、夏甘蓝、夏菜花都是在6月下旬开始育早熟的菜花苗,秋大棚中的芹菜也是…

超强总结,性能测试实战(购物业务板块)真实压测场景...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 购物网站购物流程…

人工智能(pytorch)搭建模型13-pytorch搭建RBM(受限玻尔兹曼机)模型,调通模型的训练与测试

大家好,我是微学AI,今天给大家介绍一下人工智能(pytorch)搭建模型13-pytorch搭建RBM(受限玻尔兹曼机)模型,调通模型的训练与测试。RBM(受限玻尔兹曼机)可以在没有人工标注的情况下对数据进行学习。其原理类似于我们人类学习的过程&#xff0c…

Redis简单动态字符串SDS

目录 前言 一.SDS定义 二.SDS与C字符串的区别 2.1 常数复杂度获取字符串的长度 2.2 杜绝缓冲区溢出 2.3 减少修改字符串时带来的内存重分配次数 2.3.1 空间预分配 2.3.2 惰性空间释放 2.4 二进制安全 2.5 兼容部分C字符串函数 2.6 总结 三.SDS缺点 前言 Redis没有直接使用C语…

gRPC教程与应用

gRPC是是谷歌一个开源的跨语言的RPC框架,面向移动和 HTTP/2 设计。 grpc中文网 在 gRPC 里客户端应用可以像调用本地对象一样直接调用另一台不同的机器上服务端应用的方法,使得您能够更容易地创建分布式应用和服务。 gRPC 也是基于以下理念&#xff1…

python3+requests+unittest接口自动化测试

1.环境准备 python3 pycharm编辑器 2.框架目录展示 (该套代码只是简单入门,有兴趣的可以不断后期完善) (1)run.py主运行文件,运行之后可以生成相应的测试报告,并以邮件形式发送;…

【C++进阶】红黑树实现

文章目录 红黑树的概念红黑树的性质红黑树节点的定义红黑树结构红黑树的插入1.按照二叉搜索的树规则插入新节点2.进行旋转和变色源码 红黑树的验证中序遍历判断是否满足二叉搜索树判断是否满足红黑树 完整源码 红黑树的概念 红黑树,是一种二叉搜索树,但…

基于spss的多元统计分析 之 单/双因素方差分析 多元回归分析(1/8)

实验目的: 1.掌握单样本t检验、两样本t检验、配对样本t检验、单因素方差分析、多元回归分析的基本原理; 2.熟悉掌握SPSS软件或者R软件关于单因素、多因素方差分析、多元回归分析的基本操作; 3.利用实验指导…

2.3C++保护成员

C 保护成员 在C中,可以使用保护成员 protected,来提高代码的安全性。 我用大白话解释一下什么是保护成员:说白了就是为了防止其他类直接访问或修改其成员加的一个措施。 目的是保护,成员的私有性和可见性。 C 类的保护 可以为…

web 语音通话 jssip

先把封装好的地址安上(非本人封装):webrtc-webphone: 基于JsSIP开发的webrtc软电话 jssip中文文档:jssip中文开发文档(完整版) - 简书 jssip使用文档:(我没有运行过,但…

Nginx服务器,在window系统中的使用(前端,nginx的应用)

简介:Nginx是一个轻量级、高性能的HTTP和反向代理web服务器,且支持电子邮件(IMAP/POP3)代理服务,特点是占用内存少,并发能力强,给我们来了很多的便利,国内大部分网站都有使用nginx&a…

18款奔驰S350升级后排座椅记忆功能,提升您乘坐舒适性

带有记忆功能的座椅可以存储三个的座椅设置以及行车电脑中的舒适性设置。只要按一下按钮就可以跳到记忆模式,让座椅回到上一次设置。

使用 BigQuery Omni,发现跨云地理空间分析的优势

【本文由 Cloud Ace 整理发布。Cloud Ace 是谷歌云全球战略合作伙伴,拥有 300 多名工程师,也是谷歌最高级别合作伙伴,多次获得 Google Cloud 合作伙伴奖。作为谷歌托管服务商,我们提供谷歌云、谷歌地图、谷歌办公套件、谷歌云认证…

第十章详解synchronized锁升级

文章目录 升级的流程为什么要引入锁升级这套流程多线程访问情况具体流程 轻量级锁如何使用CAS实现轻量级锁CAS加锁成功CAS加锁失败CAS进行解锁 总结何时变为重量级锁 锁膨胀自旋优化 偏向锁主要作用偏向状态测试撤销偏向锁 撤销 - 调用对象 hashCode撤销 - 其它线程使用对象撤销…

js:codemirror实现在线代码编辑器代码高亮显示

CodeMirror is a versatile text editor implemented in JavaScript for the browser. It is specialized for editing code, and comes with a number of language modes and addons that implement more advanced editing functionality. 译文:CodeMirror是一个多…