使用antv替代Echarts實現(xiàn)數(shù)據(jù)可視化圖表詳解
前言
技術(shù)永無止盡,多看看不同風(fēng)景
周一,還在愉快的為移動端框架添磚加瓦中,主管就過來詢問我,能騰出一周時間做些其他事情嗎,我有些詫異,這種語氣。問了需要做什么嗎,原來是業(yè)務(wù)部門有個大數(shù)據(jù)圖表沒有多余的人做,需要我去支援一波,雖然有點拒絕,但主管發(fā)話了,只能安排。
之前做可視化圖表都是用echarts,原因是第一次用的是它,后來就習(xí)慣了,基本上都能滿足自己的業(yè)務(wù)需求,對于文檔也比較熟悉,用的人也多,遇到問題就能快速的查到解決方案。有點不幸的是,這次客戶指名道姓只能采用阿里的antv,那我也就沒有第二個選擇了。
對于antv沒有太多的接觸,在它剛開源的時候,有去觀摩一下,很炫酷,相比于echarts更加好看,不過那時文檔沒那么全,示例也不是特別多,時至今日再去看,已經(jīng)很全面了,有多個不同場景系列,常用圖表的G2,數(shù)據(jù)關(guān)聯(lián)圖的G6,移動端可視化的F2,以及專注于地圖的L7,當(dāng)然還有對于之前這些基礎(chǔ)圖表做進(jìn)一層封裝的plot系類,比如@antv/g2plot、@antv/l7plot。
這次的開發(fā)關(guān)于PC的,所以主要會涉及到G2,L7。在開發(fā)過程中的感受,使用起來挺簡單的,但是有些屬性設(shè)置文檔沒有,需要從例子中去查找,然后網(wǎng)上關(guān)于它使用的文章也比較少,沒有echarts那么多,可能需要自己會時間去文檔和示例中自己找尋答案。
面積圖
折線圖是經(jīng)常使用并且比較容易的一種圖形,G2 中并沒有特定的圖表類型(柱狀圖、散點圖、折線圖等)的概念,用戶可以單獨繪制某一種類型的圖表,如餅圖,也可以繪制混合圖表,比如折線圖和柱狀圖的組合,折線圖和面積圖混合就可以實現(xiàn)如圖效果;

常用參數(shù)文檔
圖表
| 屬性 | 說明 | 類型 | 默認(rèn)值 |
|---|---|---|---|
| container | 指定 chart 繪制的 DOM,可以傳入 DOM id,也可以直接傳入 dom 實例 | string | HTMLElement | - |
| autoFit | 圖表是否自適應(yīng)容器寬高, 如果用戶設(shè)置了 height,那么會以用戶設(shè)置的 height 為準(zhǔn) | boolean | false |
| width | 圖表寬度 | number | - |
| height | 圖表高度 | number | - |
| padding | 圖表內(nèi)邊距 | 'auto'|number |number[] | 'auto' |
度量 scale
| 屬性 | 說明 | 類型 | 默認(rèn)值 |
|---|---|---|---|
| min | 設(shè)置對應(yīng)坐標(biāo)系的最小值 | any | - |
| max | 設(shè)置對應(yīng)坐標(biāo)系的最小值 | any | - |
| range | 坐標(biāo)系的繪制范圍,一般不用修改 | [number,number] | [0, 1] |
| alias | 數(shù)據(jù)字段的顯示別名,一般用于字段對應(yīng)中文名稱設(shè)置 | string | - |
| nice | 自動調(diào)整 min、max | boolean | false |
提示 tooltip
| 屬性 | 說明 | 類型 | 默認(rèn)值 |
|---|---|---|---|
| showTitle | 是否展示 tooltip 標(biāo)題 | boolean | false |
| shared | true 表示合并當(dāng)前點對應(yīng)的所有數(shù)據(jù)并展示,false 表示只展示離當(dāng)前點最逼近的數(shù)據(jù)內(nèi)容 | boolean | false |
| showCrosshairs | 是否顯示 tooltips 輔助線。 | boolean | false |
坐標(biāo)系 axis
| 屬性 | 說明 | 類型 | 默認(rèn)值 |
|---|---|---|---|
| line | 坐標(biāo)軸線的配置項,null 表示不展示 | null | object | - |
| tickLine | 坐標(biāo)軸刻度線線的配置項,null 表示不展示 | null | object | - |
| grid | 坐標(biāo)軸網(wǎng)格線的配置項,null 表示不展示 | null | object | - |
chart.line(options)
用于繪制折線圖、曲線圖、階梯線圖等。
chart.area(options)
用于繪制區(qū)域圖(面積圖)、層疊區(qū)域圖、區(qū)間區(qū)域圖等。
geom.position()
配置 position 通道映射規(guī)則
示例:
// 數(shù)據(jù)結(jié)構(gòu): [{ x: 'A', y: 10, color: 'red' }]
geom.position('x*y');
geom.color()
配置圖表顏色
// 基礎(chǔ)顏色設(shè)置
geom.color('#1890ff');
// 漸變
geom.color("l(90) 0:#0b83de 1:#0c1c2d")
geom.shape()
圖形相關(guān)設(shè)置,文檔上的說明不是很全,可以從圖表示例獲取相應(yīng)信息
| 屬性 | 說明 |
|---|---|
| smooth | 用于折線圖平滑設(shè)置 |
<template>
<div id="container"></div>
</template>
<script>
import { Chart } from "@antv/g2";
export default {
mounted() {
// 數(shù)據(jù)源
const data = [
{ time: "8/1", value: 240 },
{ time: "8/10", value: 600 },
{ time: "8/20", value: 350 },
{ time: "8/31", value: 470 },
];
// 初始化圖表,列出圖表屬性
const chart = new Chart({
container: "container",
autoFit: true,
height: 276,
padding: [100, 20, 30, 40],
});
// 圖表關(guān)聯(lián)數(shù)據(jù)chart.position()方法決定的,在下面有設(shè)置chart.position("time*value")
// 前面為x軸,所以 time 為 x 軸, value 為 y 軸
chart.data(data);
// 度量
// x,y軸坐標(biāo)系是根據(jù)
chart.scale({
// y軸坐標(biāo)系設(shè)置
value: {
min: 0,
nice: true,
alias: "用戶",
},
// x軸坐標(biāo)系設(shè)置
time: {
range: [0, 1],
},
});
// 提示信息
chart.tooltip({
// 是否顯示輔助線
showCrosshairs: true,
// 是否合并所有點展示
shared: false,
});
// value 坐標(biāo)系設(shè)置
chart.axis("value", {
grid: null,
tickLine: null,
});
// time 坐標(biāo)系設(shè)置
chart.axis("time", {
line: null,
tickLine: null,
});
// 圖表繪制設(shè)置
// 面積圖
chart
.area()
.position("time*value")
.color("l(90) 0:#0b83de 1:#0c1c2d")
.shape("smooth");
// 折線圖
chart.line().position("time*value").color("#0b83de").shape("smooth");
// 渲染圖表
chart.render();
},
};
</script>
柱狀圖
柱狀圖在日常數(shù)據(jù)分析中正常都會使用,也比較直觀,這邊我列了使用到的一些屬性,其他的跟上面的常用參數(shù)文檔是一致

數(shù)據(jù)標(biāo)簽 label
| 屬性 | 說明 | 類型 | 默認(rèn)值 |
|---|---|---|---|
| offset | 相對數(shù)據(jù)點的偏移距離 | number | - |
| offsetX | 相對于數(shù)據(jù)點在 X 方向的偏移距離 | number | - |
| offsetY | 相對于數(shù)據(jù)點在 Y 方向的偏移距離 | number | - |
| style | 文本圖形屬性樣式,設(shè)置顏色需要用 fill | number | - |
chart.coordinate()
圖表坐標(biāo)系設(shè)置
| 屬性 | 說明 | 類型 | 默認(rèn)值 |
|---|---|---|---|
| rotate | 配置旋轉(zhuǎn)度數(shù),使用弧度制 | number | - |
| reflect | 沿 x 方向鏡像或者沿 y 軸方向映射 | x | y | - |
| scale | 沿著 x 和 y 方向的縮放比率 | number, number | - |
| transpose | x,y 軸置換,常用于條形圖和柱狀圖之間的轉(zhuǎn)換 | - | - |
chart.interval(options)
用于繪制柱狀圖、直方圖、南丁格爾玫瑰圖、餅圖、條形環(huán)圖(玉缺圖)、漏斗圖等。
<template>
<div id="container"></div>
</template>
<script>
import { Chart } from "@antv/g2";
export default {
mounted() {
// 數(shù)據(jù)源
const data = [
{ type: "香蕉", value: 460 },
{ type: "蘋果", value: 600 },
{ type: "菠蘿", value: 390 },
{ type: "榴蓮", value: 205 },
];
// 初始化圖表
const chart = new Chart({
container: "container",
autoFit: true,
height: 276,
padding: [50, 60, 10, 60],
});
// 關(guān)聯(lián)數(shù)據(jù)
chart.data(data);
// 圖表關(guān)聯(lián)數(shù)據(jù)chart.position()方法決定的,在下面有設(shè)置chart.position("type*value")
// 前面為x軸,所以 type 為 x 軸, value 為 y 軸
// 設(shè)置 x 軸坐標(biāo)系
chart.axis("type", {
grid: null,
tickLine: null,
line: null,
});
// 設(shè)置 y 軸坐標(biāo)系
chart.axis("value", {
grid: null,
label: null,
});
// 隱藏圖例
chart.legend(false);
// x,y 軸置換
chart.coordinate().transpose();
// chart.interval(options) 柱狀圖
// geom.position() 配置 position 通道映射規(guī)則
// geom.size 設(shè)置圖形大小
// geom.color 設(shè)置圖形顏色
// geom.label 數(shù)據(jù)標(biāo)簽設(shè)置
chart
.interval()
.position("type*value")
.size(12)
.color("#678ef2")
.label("value", {
style: {
fill: "#8d8d8d",
},
offset: 10,
});
chart.interaction("element-active");
// 渲染圖形
chart.render();
},
};
</script>
地圖
antv文檔對于地圖的描述不是特別全,比如地圖等級viewLevel、地圖邊界設(shè)置、地圖顏色配置,這些都要結(jié)合實例慢慢摸索,我實現(xiàn)了比較常用的中國地圖,包含toolTip,以及省的散點圖,只要修改地圖等級viewLevel,配合相應(yīng)數(shù)據(jù)就能實現(xiàn)不同省市的散點圖了,大家可以舉一反三。
我這邊是采用@antv/l7plot,內(nèi)部就分裝了地圖相關(guān)繪制,如果采用是@antv/l7,它主要是根據(jù)請求地圖路徑坐標(biāo)數(shù)據(jù)請求繪制,數(shù)據(jù)也挺龐大的,會比較麻煩一些。
這邊就不放圖了,可以在Github運行查看
地圖容器配置項 map
| 屬性 | 說明 | 類型 | 默認(rèn)值 |
|---|---|---|---|
| type | 地圖底圖類型,amap: 高德地圖,mapbox: Mapbox 地圖 | string | amap |
| center | 初始中心經(jīng)緯度 | number[] | [0, 0] |
| pitch | 初始傾角 | number | 0 |
| zoom | 初始縮放層級 | number | 0 |
| style | 內(nèi)置樣式: dark: 黑暗,light: 明亮,normal: 普通,blank: 無底圖 | string | dark |
| logo | 是否顯示 logo | boolean | true |
地圖等級 viewLevel
| 屬性 | 說明 |
|---|---|
| level | 層級 國家;"country"、省份:"province"、市:"city"、縣:"district" |
| adcode | 層級編碼 中國;100000、浙江?。?quot;330000"、杭州市:"330100"、西湖區(qū):"330106" |
<template>
<div id="container"></div>
</template>
<script>
import { Choropleth } from "@antv/l7plot";
// 地圖數(shù)據(jù)
import data from "../data/userMap";
export default {
mounted() {
// 初始化地圖
// eslint-disable-next-line no-unused-vars
const map = new Choropleth("container", {
// 地圖容器配置
map: {
type: "mapbox",
style: "blank",
center: [120.19382669582967, 30.258134],
zoom: 3,
pitch: 0,
logo: false,
},
// 關(guān)聯(lián)數(shù)據(jù)
source: {
data: data,
joinBy: { sourceField: "code" },
},
// 地圖等級
viewLevel: {
level: "country",
adcode: 100000,
},
// 根據(jù)容器寬高自定義圖表
autoFit: true,
// 設(shè)置地圖顏色
color: {
field: "value",
value: ["#B8E1FF", "#7DAAFF", "#3D76DD", "#0047A5", "#001D70"],
scale: { type: "quantile" },
},
// 邊框
chinaBorder: {
// 國界
national: null,
// 爭議
dispute: { color: "#ccc", width: 1, opacity: 0.8, dashArray: [2, 2] },
// 海洋
coast: { color: "#ccc", width: 0.7, opacity: 0.8 },
// 港澳
hkm: { color: "gray", width: 0.7, opacity: 0.8 },
},
// 邊界顏色
style: {
opacity: 1,
stroke: "rgb(93,112,146)",
lineWidth: 0.6,
lineOpacity: 1,
},
// 數(shù)據(jù)標(biāo)簽
label: {
visible: false,
},
// 選擇高亮
state: {
active: { stroke: "black", lineWidth: 1 },
},
// 提示
tooltip: {
inPlot: false,
items: ["name", "code", "value"],
},
});
},
};
</script>
<style lang="less" scoped>
#container {
width: 100%;
height: 300px;
}
</style>
小結(jié)
如果你還沒了解antv,現(xiàn)在它應(yīng)該進(jìn)入你的視野了,他提供了很多炫酷的圖表,以及強大的圖表功能,就算現(xiàn)在用不到,下次做個嘗試也未嘗不可,可能你會喜歡上它,并且替換掉echarts。
就舉這些圖表例子了,文章相關(guān)的例子源碼也上傳到Github了。這次開發(fā)過程中,也是把antv文檔上上下下翻了好幾遍,對于使用方式以及屬性有一定的了解,如果你是剛剛要使用antv或者使用中遇到問題,可以評論區(qū)留言,共同成長,fighting~
以上就是使用antv替代Echarts實現(xiàn)數(shù)據(jù)可視化圖表詳解的詳細(xì)內(nèi)容,更多關(guān)于Echarts數(shù)據(jù)可視化圖表的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
vue使用this.$message不生效的部分原因及解決方案
這篇文章主要介紹了vue使用this.$message不生效的部分原因及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-09-09
vue-socket.io接收不到數(shù)據(jù)問題的解決方法
這篇文章主要介紹了解決vue-socket.io接收不到數(shù)據(jù)問題的解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05
vue router中mode history、base的作用說明
這篇文章主要介紹了vue router中mode history、base的作用說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-05-05
前端Vue?select下拉框使用以及監(jiān)聽事件詳解
由于前端項目使用的是Vue.js和bootstrap整合開發(fā),中間用到了select下拉框,這篇文章主要給大家介紹了關(guān)于前端Vue?select下拉框使用以及監(jiān)聽事件的相關(guān)資料,需要的朋友可以參考下2024-03-03
淺談vue-cli加載不到dev-server.js的解決辦法
本篇文章主要介紹了淺談vue-cli加載不到dev-server.js的解決辦法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-11-11

