日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Echarts自定義圖形的方法參考

瀏覽:275日期:2022-06-01 13:43:36
目錄
  • 前言
  • 1.自定義圖形最后的效果是這樣的:
  • 2.注冊自定義的圖形
  • 3.extendShape
  • 4.使用echarts注冊這三個圖形
  • 5.使用自定義的形狀
  • 總結

前言

在一個前端大屏項目中,有一個模塊使用到了自定義的,由三個面組成的偽3D柱形圖。在此處記錄一下,方便后續自定義的時候參考一下。涉及到了zrender里面的一些方法,還特意去zrender看了些示例和文檔。

1.自定義圖形最后的效果是這樣的:

圖形由三個面組成,需要定義三個形狀。用cubeleft,cubetop,cuberight來分別定義左側面,頂部面以及右側面。

2.注冊自定義的圖形

echarts官方文檔處:Documentation - Apache ECharts

我們需要定義一個這樣的類,然后再通過echarts來注冊這個類,后續就可以通過類名來使用了。

3.extendShape

    // 繪制左側面    const CubeLeft = echarts.graphic.extendShape({    shape: {x: 0,y: 0    },    buildPath: function(ctx, shape) {const xAxisPoint = shape.xAxisPointconst c0 = [shape.x, shape.y]const c1 = [shape.x - 13, shape.y - 13]const c2 = [xAxisPoint[0] - 13, xAxisPoint[1] - 13]const c3 = [xAxisPoint[0], xAxisPoint[1]]ctx.moveTo(c0[0], c0[1]).lineTo(c1[0], c1[1]).lineTo(c2[0], c2[1]).lineTo(c3[0], c3[1]).closePath()    }     })    // 繪制右側面    const CubeRight = echarts.graphic.extendShape({    shape: {x: 0,y: 0    },    buildPath: function(ctx, shape) {const xAxisPoint = shape.xAxisPointconst c1 = [shape.x, shape.y]const c2 = [xAxisPoint[0], xAxisPoint[1]]const c3 = [xAxisPoint[0] + 18, xAxisPoint[1] - 9]const c4 = [shape.x + 18, shape.y - 9]ctx.moveTo(c1[0], c1[1]).lineTo(c2[0], c2[1]).lineTo(c3[0], c3[1]).lineTo(c4[0], c4[1]).closePath()    }})    // 繪制頂面    const CubeTop = echarts.graphic.extendShape({    shape: {x: 0,y: 0    },    buildPath: function(ctx, shape) {const c1 = [shape.x, shape.y]const c2 = [shape.x + 18, shape.y - 9]const c3 = [shape.x + 5, shape.y - 22]const c4 = [shape.x - 13, shape.y - 13]ctx.moveTo(c1[0], c1[1]).lineTo(c2[0], c2[1]).lineTo(c3[0], c3[1]).lineTo(c4[0], c4[1]).closePath()    }     })

這段代碼主要是看buildpath如何使用,zrender的官方文檔中,并沒有直接告訴這個方法的兩個參數是干什么用的,只給了一個示例,從這個示例中,可以知道這兩個參數具體怎么用。

示例網址:https://github.com/ecomfe/zrender/blob/master/test/pin.html

第一個參數是path,第二參數是shape。path可以理解為一個canvas中的繪制畫筆,可以設置路徑并且閉合路徑。

第二個參數在echarts中,是自定義的custom傳遞過來的,因此可以通過這個對象獲取到我們一個很熟悉的屬性 xAxisPoint。

繪制的兩個面中,只有左側和右側面需要有填充高度,頂部不需要,所以頂部的形狀就沒有使用xAxisPoint這個屬性。

這也是很好理解的,因為我們自定義的偽圓柱體里面的填充物肯定是有一個高度的。填充多少根據我們的數據來知道,讓它看起來確實是被某種東西從底部開始增多填充了。

拿比較簡單的頂部來舉例:

buildPath: function(ctx, shape) {    const c1 = [shape.x, shape.y]    const c2 = [shape.x + 18, shape.y - 9]    const c3 = [shape.x + 5, shape.y - 22]    const c4 = [shape.x - 13, shape.y - 13]    ctx.moveTo(c1[0], c1[1]).lineTo(c2[0], c2[1]).lineTo(c3[0], c3[1]).lineTo(c4[0],c4[1]).closePath()}

繪制的四邊形,其實就是四個頂點,我們只需要用moveTo來控制路徑就行,在最后那個點進行閉合就行。偏移量是固定的值,可以根據情況自己去設置不同的值來扭曲這個四邊形。

其中c1是底部的頂點,c2是右側的頂點,c3是頂部的頂點,c4是右側的頂點。其他兩個面也是類似的。

4.使用echarts注冊這三個圖形

// 注冊三個面圖形    echarts.graphic.registerShape("CubeLeft", CubeLeft)    echarts.graphic.registerShape("CubeRight", CubeRight)    echarts.graphic.registerShape("CubeTop", CubeTop)

5.使用自定義的形狀

其他的數據都和正常使用echarts一樣,不同的地方在于series的配置。

series數組中,總共放置二個對象。第一個對象如下:

{type: "custom",renderItem: function(params, api) {    const location = api.coord([api.value(0), api.value(1)])    return {type: "group",children: [{    type: "CubeLeft",    shape: {api,x: location[0],y: location[1],xAxisPoint: api.coord([api.value(0), 0])    },    style: {fill: "rgba(47,102,192,.27)",stroke: "black"    },    z2: 999}, {    type: "CubeRight",    shape: {api,x: location[0],y: location[1],xAxisPoint: api.coord([api.value(0), 0])    },    style: {fill: "rgba(59,128,226,.27)",stroke: "black"    },    z2: 999}, {    type: "CubeTop",    shape: {api,x: location[0],y: location[1],xAxisPoint: api.coord([api.value(0), 0])    },    style: {fill: "rgba(72,156,221,.27)",stroke: "black"    },    z2: 999}]    }},data: MAX}

最主要的還是renderItem里面的邏輯,這個方法返回一個對象,對象就是我們自定義的一個group組。renderItem可以返回的對象在文檔中都有說明:Documentation - Apache ECharts

我們定義的那三個面,需要把它看成一個整體,所以renderItem返回的是一個類型為group的對象,另外三個形狀作為children保存在數組中。

其中的shape參數,會在buildpath中使用到。

style中設置了它的填充顏色和邊框線顏色。然后使用z2定義這個echarts的顯示層級為最上級。如果不使用它,下面用于填充的會將其遮擋住。

這里也只是定義了第一個自定義的形狀,也就是最外層的那個偽3d柱體。第二個自定義形狀是要填充的形狀。

{type: "custom",renderItem: (params, api) => {    const location = api.coord([api.value(0), api.value(1)])    var color = new echarts.graphic.LinearGradient(0, 0, 0, 1, [{offset: 1,color: "#FEFD53"    },    {offset: 0,color: "#f7c824"    }]    );    return {type: "group",children: [{    type: "CubeLeft",    shape: {api,xValue: api.value(0),yValue: api.value(1),x: location[0],y: location[1],xAxisPoint: api.coord([api.value(0), 0])    },    style: {fill: color,stroke: "red"    }}, {    type: "CubeRight",    shape: {api,xValue: api.value(0),yValue: api.value(1),x: location[0],y: location[1],xAxisPoint: api.coord([api.value(0), 0])    },    style: {fill: color,stroke: "red"    }}, {    type: "CubeTop",    shape: {api,xValue: api.value(0),yValue: api.value(1),x: location[0],y: location[1],xAxisPoint: api.coord([api.value(0), 0])    },    style: {fill: color,stroke: "red"    }}]    }},data: VALUE}

內部填充的圖形,使用了一個線性漸變的顏色用來填充。邊框線使用紅色。與第一個不同的是,style里面的風格,以及data使用的數據。這里的data使用value具體的數值。而外殼的圖形使用的數據是max最大值。這樣就會有一個漸變顏色填充的紅色邊框圖形,填充到了一個黑色邊框的柱體中。

這樣就自定義好了一個視覺上的3d柱體形狀的圖表了。

總結

到此這篇關于Echarts自定義圖形的文章就介紹到這了,更多相關Echarts自定義圖形內容請搜索以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持!

標簽: JavaScript
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产一区精品福利| 日韩激情一区二区| 青青国产91久久久久久| 亚洲精品欧美| 色婷婷成人网| 亚洲精品影视| 欧美日韩一区二区三区不卡视频| 欧美偷窥清纯综合图区| 久久超级碰碰| 精品国产成人| 欧美freesex黑人又粗又大| 久久久国产精品网站| 久久亚洲影院| 免费观看久久久4p| 蜜臀久久久99精品久久久久久| 欧美国产另类| 免费视频一区三区| 欧美1区2区3区| 99xxxx成人网| 色老板在线视频一区二区| 国产毛片一区二区三区| 免费人成在线不卡| 97se综合| 黄色成人精品网站| 久久精品国产亚洲aⅴ| 米奇777超碰欧美日韩亚洲| 国模精品一区| 欧美日韩精品一区二区三区视频 | 日韩高清不卡一区| 国产精品一区二区三区av| 久久一区精品| 国产精品字幕| 亚洲v天堂v手机在线| 欧美日韩18| 91偷拍一区二区三区精品| 中文在线中文资源| 中文一区在线| 国产剧情一区二区在线观看| 亚洲永久av| 免费精品视频最新在线| 国产欧美综合一区二区三区| 欧美二三四区| 亚洲小说春色综合另类电影| 欧美交a欧美精品喷水| 日韩理论片av| 爽爽淫人综合网网站| 国产精品一级| 激情婷婷亚洲| 国产日产一区| 日韩大片在线播放| 亚洲免费激情| 另类综合日韩欧美亚洲| 国产麻豆久久| 日韩精品中文字幕一区二区| 成人台湾亚洲精品一区二区| 99热精品在线| 久久亚洲人体| 三级欧美韩日大片在线看| 麻豆一区二区三区| 亚洲欧美网站| 岛国av在线播放| 蜜臀va亚洲va欧美va天堂| 欧美激情网址| 亚洲一级特黄| 国产精品115| 久久久天天操| 久久国产日韩欧美精品| 日韩视频二区| 日韩av在线播放网址| 亚洲一区二区三区四区电影| 黄色在线观看www| 69堂精品视频在线播放| 亚洲调教视频在线观看| 国产精品九九| 香蕉久久久久久久av网站| 久久久久久网| 国产欧美日韩精品高清二区综合区 | 国产精品日韩精品在线播放| 激情丁香综合| 精品国产亚洲一区二区三区| 亚洲狼人精品一区二区三区| 亚洲性色视频| 成人在线黄色| 国产欧美日韩综合一区在线播放| 黄色成人在线网址| 超碰成人av| 国产精品一区二区中文字幕| 蜜臀av亚洲一区中文字幕| 成人啊v在线| 国产极品一区| 日韩精品三级| 欧美sss在线视频| 视频在线观看一区| 成人国产精品一区二区免费麻豆| 亚洲制服欧美另类| 999国产精品视频| 久久精品天堂| 国产亚洲精品美女久久| 亚州欧美在线| 丝袜a∨在线一区二区三区不卡| 久久久久免费av| 正在播放日韩精品| 成人精品高清在线视频| 国产精品国码视频| 97成人超碰| 日本不卡高清| 天堂久久av| 亚洲日本三级| 91久久国产| 欧洲在线一区| 成人免费电影网址| 欧美成a人免费观看久久| 欧美久久天堂| 日韩影院二区| 欧美日韩国产观看视频| 成人国产精品久久| 给我免费播放日韩视频| 精品国产黄a∨片高清在线| 久久一区亚洲| 国产一区丝袜| 日韩av在线播放网址| 色黄视频在线观看| 999久久久国产精品| 国产传媒av在线| 天堂√8在线中文| 99国产精品免费视频观看| 亚洲性视频h| 欧美日韩国产一区二区三区不卡 | 欧洲精品一区二区三区| 久久久人人人| 欧美1区免费| 亚洲激情黄色| 日韩一区二区三区精品| 中文字幕乱码亚洲无线精品一区| 亚洲精品免费观看| 国产探花在线精品一区二区| 老司机精品视频在线播放| 精品国产不卡| 日韩欧美三级| 亚洲精品电影| 亚洲毛片一区| 国产精品久久免费视频| 首页国产精品| 精品一区在线| 一区二区91| 久久99影视| 丝袜美腿诱惑一区二区三区 | 亚洲香蕉视频| 91欧美日韩在线| 岛国精品一区| 美女毛片一区二区三区四区| 日韩精品一级中文字幕精品视频免费观看 | 美女毛片一区二区三区四区| 午夜亚洲精品| 日韩精品一区二区三区中文 | 蜜臀av一区二区在线免费观看| 日韩精品免费观看视频| 国产精品久久久久久久久久白浆| 日本精品黄色| 中文日韩欧美| 国产精品一区二区三区四区在线观看| 都市激情国产精品| 免费在线看一区| 视频一区二区不卡| 久久的色偷偷| 亚洲女同中文字幕| 69堂精品视频在线播放| 91亚洲国产| 免费人成在线不卡| 精品视频在线观看网站| 尤物精品在线| 国产精品igao视频网网址不卡日韩| 日韩毛片视频| 亚洲精品无播放器在线播放| 超碰成人av| 亚洲精品在线a| 日韩国产一区| 日本亚洲欧洲无免费码在线| 韩日一区二区| 丝袜诱惑制服诱惑色一区在线观看| 久久爱www成人| 欧美 日韩 国产一区二区在线视频| 日本成人在线不卡视频| 成人日韩在线观看| 香蕉久久一区| 亚洲1234区| 国产毛片久久久| av亚洲免费| 欧美精品不卡| 亚洲欧洲午夜| 成人一区不卡| 青青国产91久久久久久| 国产二区精品| 精品入口麻豆88视频| 久久高清国产| 新版的欧美在线视频| 日韩高清欧美激情| 午夜国产精品视频| 久久久久免费| 久久精品xxxxx|