记录 AntChart 的基本用法
图表不是必须的,但好看的图表,是一个产品中的亮点。
蚂蚁金服关于图表控件很多,可以分为三类:
Ant Design Charts
StatisticCard
指标卡G2
、G2Plot
、Ant Design Charts
什么关系?
G2
是 G2Plot
的底层依赖,使用了图形语法,使用成本相对较高,功能强大。G2Plot
是 G2
的上层封装,把图形语法装换成了配置项。Ant Design Charts
是 G2Plot
的 React 版本,功能和 G2Plot
同步,并内置了一些图相关的图表,例如流程图、组织架构图等。G2
或 G2Plot
实现。这里还有一个bizcharts
在Ant Design Pro
中使用,不知道会不会被淘汰。
StatisticCard
指标卡
Ant Design Charts
可以在程序中用
X6
做一些流程图
G6
做一些大数据分析用
用Ant Design Charts
能满足日常的基本使用,更方便与快捷。
安装
tyarn add @ant-design/charts
statistic:统计量。
如下图中的:进度 60.00% 就是统计信息。可以参考这个文档
可以设置的内容有:
例如下面的例子,设置了 title。 这里使用了formatter
,当然也可以使用优先级更高的customHtml
, 但是还不知道customHtml
怎么用。
const DemoRingProgress: React.FC = () => {var config = {height: 100,width: 100,autoFit: false,percent: 0.6,color: ['#F4664A', '#E8EDF3'],innerRadius: 0.85,radius: 0.98,statistic: {title: {style: {color: '#363636',fontSize: '12px',lineHeight: '14px',},formatter: function formatter() {return '进度';},},},};return <RingProgress {...config} />;};
annotations:空间标注。
强行在图上添加一个元素。
tooltip:工具提示
鼠标移动到某个节点,可以看到提示信息,具体参考这个文档
可以导出图片,具体见这个文档
鼠标点击图片上的元素时,可以获取相应的属性,具体见
通过得到实例,可以调用控件中的方法。具体参考这个文档
这个没有看明白,具体可以研究一下这个文档
这里用到了三个迷你图:
关键点:
迷你图的注意事项(与正常图片的区别):
访问量这个图表的代码如下:
import React from 'react';import { TinyArea } from '@ant-design/charts';import Tip from '../Tip';import { fakeVisitData } from '../../../service';// 得到模拟的数据const visitData = fakeVisitData();const TinyAreaVisits: React.FC = () => {// 必须返回一个number[]const data = visitData.map(item => item.value);const config = {height: 60,data,smooth: true,// 指定填充的颜色areaStyle: { fill: '#975fe4' },// 为了好看,将线的颜色变成了与背景颜色一样了。line: { color: '#fff' },// 按照自定义Tip来显示提示信息tooltip: {customContent: function customContent(index: number, items: any) {if (!visitData[index]) {return '';}return (<Tiptitle={visitData[index].date}value={visitData[index].value}color="#975fe4"/>);},},};return <TinyArea {...config} />;};export default TinyAreaVisits;
①②③④⑤⑥⑦⑧⑨
支付笔数,是一个柱状图,用下面的代码实现。
import React from 'react';import { TinyColumn } from '@ant-design/charts';import Tip from '../Tip';import { fakeVisitData } from '../../../service';// 得到模拟的数据const visitData = fakeVisitData();const TinyColumnPay: React.FC = () => {// 必须返回一个number[]const data = visitData.map(item => item.value);const config = {height: 60,data,// 按照自定义一个组建叫Tip,来显示提示信息tooltip: {customContent: function customContent(index: number, items: any) {if (!visitData[index]) {return '';}return (<Tiptitle={visitData[index].date}value={visitData[index].value}color={items[0].color}/>);},},};return <TinyColumn {...config} />;};export default TinyColumnPay;
这里的关键点是
这个问题还是在github
学习的,这里是具体的咨询过程。
代码
import React from 'react';import { Progress } from '@ant-design/charts';const TinyProgressActive: React.FC = () => {const config = {height: 60,percent: 0.736,// 框的大小barWidthRatio: 0.25,color: ['#13c2c2', '#E8EDF3'],// 这个用来显示目标值,里面还有很多属性需要熟悉annotations: [{type: 'line',start: ['80%', '30%'],end: ['80%', '70%'],top: false,style: {stroke: '#13c2c2',lineWidth: 2,},},],};// @ts-ignorereturn <Progress {...config} />;};export default TinyProgressActive;
官方例子
希望做成的样子
圆中心没有文字显示。
代码
import React from 'react';import { Col, Row } from 'antd';import NumberInfo from '../NumberInfo';import { RingProgress } from '@ant-design/charts';import type { OfflineDataType } from '../../service';type CustomTabProps = {data: OfflineDataType;};export default (props: CustomTabProps) => {const { data } = props;var config = {height: 60,width: 60,autoFit: false,percent: data.cvr,color: ['#58afff', '#E8EDF3'],// 控制环的代销innerRadius: 0.7,radius: 0.98,// 不显示中间那部分内容statistic: {content: false,},};return (<Row><Col span={12}><NumberInfo title={data.name} subTitle="转化率" gap={2} total={`${data.cvr * 100}%`} /></Col><Col span={12} style={{ paddingTop: 36 }}><RingProgress {...config} /></Col></Row>);};
案例
例如做出下面的样子,也是在网上问的
我撰写的代码
import React from 'react';import { Pie } from '@ant-design/charts';import accounting from 'accounting';type PieSalesProps = {data: { x: string; y: number }[];};const PieSales: React.FC<PieSalesProps> = (props: PieSalesProps) => {const { data } = props;const getY = (x: string) => {for (let i = 0; i < data.length; i += 1) {if (data[i].x === x) {return data[i].y;}}return 0;};const config = {appendPadding: 10,data,height: 400 - 50,// 弧度对应的字段angleField: 'y',// 颜色对应的字段colorField: 'x',// 饼图的半径,原点为画布中心。配置值域为 (0,1],1 代表饼图撑满绘图区域。radius: 0.68,// 饼图的内半径,原点为画布中心。配置值域为 (0,1] ,通过设置这个来做镂空图形innerRadius: 0.8,// 全局化配置图表数据元信息,以字段为单位进行配置meta: {x: {formatter: (v: string) => {return `${v} ${accounting.formatMoney(getY(v), '¥', 0)}`;},},// 将金额设定成Money的格式y: {formatter: (v: number) => {return `${accounting.formatMoney(v, '¥', 0)}`;},},},// 状态的属性state: {active: {style: {stroke: '#fff',},},},// 每个pie的间隔变大pieStyle: {stroke: '#fff',lineWidth: 4,},// 不在弧度上显示明细label: {content: '',},// 图表交互interactions: [{ type: 'element-selected' },{ type: 'element-active' },{ type: 'pie-statistic-active' },],};// @ts-ignorereturn <Pie {...config} />;};export default PieSales;
网友提供的代码
https://codesandbox.io/s/gifted-lehmann-63vhs?file=/App.tsx:873-1021
其中可以给汇总信息定义样式
statistic: {title: {formatter: () => 'title'},content: {style: {whiteSpace: 'pre-wrap',overflow: 'hidden',textOverflow: 'ellipsis',fontSize:10,},formatter: () => 'AntV',},},
官方的例子
原始数据文件,然后经过转换,转成雷达图要的数据结构
[{ "item": "Design", "a": 70, "b": 30 },{ "item": "Development", "a": 60, "b": 70 },{ "item": "Marketing", "a": 50, "b": 60 },{ "item": "Users", "a": 40, "b": 50 },{ "item": "Test", "a": 60, "b": 70 },{ "item": "Language", "a": 70, "b": 50 },{ "item": "Technology", "a": 50, "b": 40 },{ "item": "Support", "a": 30, "b": 40 },{ "item": "Sales", "a": 60, "b": 40 },{ "item": "UX", "a": 50, "b": 60 }]
转换的代码
const [data, setData] = useState([]);useEffect(() => {asyncFetch();}, []);const asyncFetch = () => {fetch('https://gw.alipayobjects.com/os/bmw-prod/bda695a8-cd9f-4b78-a423-3d6d547c10c3.json',).then(response => response.json()).then(json => setData(json)).catch(error => {console.log('fetch data failed', error);});};const { DataView } = DataSet;const dv = new DataView().source(data);dv.transform({type: 'fold',fields: ['a', 'b'], // 展开字段集key: 'user', // key字段value: 'score', // value字段});