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

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

基于Echarts實現繪制立體柱狀圖的示例代碼

瀏覽:124日期:2022-06-02 08:49:04
目錄
  • 前言
  • 實現方法
    • 先寫一個常規的柱狀圖
    • echarts的配置選項
  • 效果圖

    前言

    大家好,我是梁木由。之前在做大屏可視化項目時,UI設計了一個立體形狀的柱狀圖,根據之前做的一些圖表的項目沒有能復用的,沒有做過這種立體形狀的圖表,打開echarts也沒看到有相關的demo,看下如何實現

    實現方法

    先寫一個常規的柱狀圖

    在這個基礎上進行改進

    <div id="main"></div>?#main{  width: 500px;  height: 350px;}?var chartDom = document.getElementById("main");var myChart = echarts.init(chartDom);var option;?option = {  xAxis: {    axisTick: {      show: false    },    nameTextStyle: {      color: "#fff"    },    data: ["春節", "元宵節", "端午節", "中秋節"]  },  legend: {    data: ["春節", "元宵節", "端午節", "中秋節"],    right: "25",    top: "18",    icon: "rect",    itemHeight: 10,    itemWidth: 10,    textStyle: {      color: "#000"    }  },  yAxis: {    type: "value",    axisLabel: {      color: "#000"    },    splitLine: {      show: true,      lineStyle: {type: "dashed",color: ["#ccc"]      }    }  },  series: [    {      data: [{ name: "春節", value: 24 },{ name: "端午節", value: 44 },{ name: "中秋節", value: 32 },{ name: "春節", value: 50 }      ],      barWidth: 30,      type: "bar"    }  ]};??option && myChart.setOption(option);

    echarts的配置選項

    首先呢我們看下echarts的配置選項

    那我們看所有的type 沒有立體柱狀圖的類型,但是呢我們看最后一項type: custom,什么意思呢,自定義系列,那就是說我們可以選擇custom 類型來實現立體柱狀圖

    renderItem

    type為custom可以自定義系列圖形元素渲染。

    根據查看配置項,發現有一個renderItem函數,custom 系列需要開發者自己提供圖形渲染的邏輯。這個渲染邏輯一般命名為 renderItem

    看下renderItem函數的介紹

    renderItem 函數提供了兩個參數:

    params:包含了當前數據信息和坐標系的信息。

    {    context: // {Object} 一個可供開發者暫存東西的對象。生命周期只為:當前次的渲染。    seriesId: // {string} 本系列 id。    seriesName: // {string} 本系列 name。    seriesIndex: // {number} 本系列 index。    dataIndex: // {number} 數據項的 index。    dataIndexInside: // {number} 數據項在當前坐標系中可見的數據的 index(即 dataZoom 當前窗口中的數據的 index)。    dataInsideLength: // {number} 當前坐標系中可見的數據長度(即 dataZoom 當前窗口中的數據數量)。    actionType: // {string} 觸發此次重繪的 action 的 type。    coordSys: // 不同的坐標系中,coordSys 里的信息不一樣,含有如下這些可能:    coordSys: {type: "cartesian2d",x: // {number} grid rect 的 xy: // {number} grid rect 的 ywidth: // {number} grid rect 的 widthheight: // {number} grid rect 的 height    },    coordSys: {type: "calendar",x: // {number} calendar rect 的 xy: // {number} calendar rect 的 ywidth: // {number} calendar rect 的 widthheight: // {number} calendar rect 的 heightcellWidth: // {number} calendar cellWidthcellHeight: // {number} calendar cellHeightrangeInfo: {    start: // calendar 日期開端    end: // calendar 日期結尾    weeks: // calendar 周數    dayCount: // calendar 日數}    },    coordSys: {type: "geo",x: // {number} geo rect 的 xy: // {number} geo rect 的 ywidth: // {number} geo rect 的 widthheight: // {number} geo rect 的 heightzoom: // {number} 縮放的比率。如果沒有縮放,則值為 1。例如 0.5 表示縮小了一半。    },    coordSys: {type: "polar",cx: // {number} polar 的中心坐標cy: // {number} polar 的中心坐標r: // {number} polar 的外半徑r0: // {number} polar 的內半徑    },    coordSys: {type: "singleAxis",x: // {number} singleAxis rect 的 xy: // {number} singleAxis rect 的 ywidth: // {number} singleAxis rect 的 widthheight: // {number} singleAxis rect 的 height    }}

    其中,關于 dataIndexdataIndexInside 的區別:

    • dataIndex 指的 dataItem 在原始數據中的 index。
    • dataIndexInside 指的是 dataItem 在當前數據窗口中的 index。

    [renderItem.arguments.api] 中使用的參數都是 dataIndexInside 而非 dataIndex,因為從 dataIndex 轉換成 dataIndexInside 需要時間開銷。

    api:是一些開發者可調用的方法集合。

    所有屬性

    {[value], [coord] , [size] , [style] , [styleEmphasis] , [visual] , [barLayout] , [currentSeriesIndices] , [font], [getWidth] , [getHeight], [getZr], [getDevicePixelRatio]}

    我們使用renderItem來自定義元素會使用到renderItem.api的三個方法,先來介紹下這三個方法

    • [api.value(...)],意思是取出 dataItem 中的數值。例如 api.value(0) 表示取出當前 dataItem 中第一個維度的數值。
    • [api.coord(...)],意思是進行坐標轉換計算。例如 var point = api.coord([api.value(0), api.value(1)]) 表示 dataItem 中的數值轉換成坐標系上的點。
    • [api.size(...)] ,表示得到坐標系上一段數值范圍對應的長度。

    看下代碼實現

    series:  getSeriesData()?function getSeriesData() {  const data = [];  seriesData.forEach((item, index) => {    data.push(      {type: "custom",name: item.label,renderItem: function (params, api) {  return getRenderItem(params, api);},data: item.value,      }    )  })  return data}?function getRenderItem(params, api) {  // params.seriesIndex表示本系列 index  const index = params.seriesIndex;  // api.coord() 坐標轉換計算  // api.value() 取出當前項中的數值  let location = api.coord([api.value(0) + index, api.value(1)]);  // api.size() 坐標系數值范圍對應的長度  var extent = api.size([0, api.value(1)]);  return {    type: "rect",    shape: {      x: location[0] - 20 / 2,      y: location[1],      width: 20,      height: extent[1]    },    style: api.style()  };}

    來看下我們的實現效果

    柱狀圖效果出來了,那來看下怎么將柱狀圖改為立體圖

    return_group

    我看到renderItem可以返回一個return_group類型,來看看這個類型的介紹

    • group 是唯一的可以有子節點的容器。
    • group 可以用來整體定位一組圖形元素。

    那就是說我們可以將設定一組圖形元素然后組合到一起形成立體柱狀圖

    那么問題又來了怎么設定一組圖形元素呢?

    graphic

    這個呢是關于圖形相關的方法,再來了解兩個API

    graphic.extendShape

    創建一個新的圖形元素

    graphic.registerShape

    注冊一個開發者定義的圖形元素

    創建圖形元素

    那我們先來創建一個新的圖形元素

    const leftRect = echarts.graphic.extendShape({    shape: {      x: 0,      y: 0,      width: 19, //柱狀圖寬      zWidth: 8, //陰影折角寬      zHeight: 4, //陰影折角高    },    buildPath: function (ctx, shape) {      const api = shape.api;      const xAxisPoint = api.coord([shape.xValue, 0]);      const p0 = [shape.x - shape.width / 2, shape.y - shape.zHeight];      const p1 = [shape.x - shape.width / 2, shape.y - shape.zHeight];      const p2 = [xAxisPoint[0] - shape.width / 2, xAxisPoint[1]];      const p3 = [xAxisPoint[0] + shape.width / 2, xAxisPoint[1]];      const p4 = [shape.x + shape.width / 2, shape.y];?      ctx.moveTo(p0[0], p0[1]);       ctx.lineTo(p1[0], p1[1]);      ctx.lineTo(p2[0], p2[1]);      ctx.lineTo(p3[0], p3[1]);      ctx.lineTo(p4[0], p4[1]);      ctx.lineTo(p0[0], p0[1]);      ctx.closePath();    },  });??const rightRect = echarts.graphic.extendShape({    shape: {      x: 0,      y: 0,      width: 18,      zWidth: 15,      zHeight: 8,    },    buildPath: function (ctx, shape) {      const api = shape.api;      const xAxisPoint = api.coord([shape.xValue, 0]);      const p1 = [shape.x - shape.width / 2, shape.y - shape.zHeight / 2];      const p3 = [xAxisPoint[0] + shape.width / 2, xAxisPoint[1]];      const p4 = [shape.x + shape.width / 2, shape.y];      const p5 = [xAxisPoint[0] + shape.width / 2 + shape.zWidth, xAxisPoint[1]];      const p6 = [shape.x + shape.width / 2 + shape.zWidth, shape.y - shape.zHeight / 2];      const p7 = [shape.x - shape.width / 2 + shape.zWidth, shape.y - shape.zHeight];      ctx.moveTo(p4[0], p4[1]);       ctx.lineTo(p3[0], p3[1]);      ctx.lineTo(p5[0], p5[1]);      ctx.lineTo(p6[0], p6[1]);      ctx.lineTo(p4[0], p4[1]);?      ctx.moveTo(p4[0], p4[1]);      ctx.lineTo(p6[0], p6[1]);      ctx.lineTo(p7[0], p7[1]);      ctx.lineTo(p1[0], p1[1]);      ctx.lineTo(p4[0], p4[1]);      ctx.closePath();    },  });

    注冊圖形元素

    echarts.graphic.registerShape("leftRect", leftRect);echarts.graphic.registerShape("rightRect", rightRect);

    再來修改一下return_group

    function getRenderItem(params, api) {  const index = params.seriesIndex;  let location = api.coord([api.value(0) + index, api.value(1)]);  var extent = api.size([0, api.value(1)]);  return {    type: "group",    children: [      {type: "leftRect",shape: {  api,  xValue: api.value(0) + index,  yValue: api.value(1),  x: location[0],  y: location[1]},style: api.style()      },      {type: "rightRect",shape: {  api,  xValue: api.value(0) + index,  yValue: api.value(1),  x: location[0],  y: location[1]},style: api.style()      }    ]  };}

    再來看下效果

    可以看到立體形狀的柱狀圖已經實現了,那還有個缺點就是顏色需要再按照設計圖來改改

    const colors = [    [      { offset: 0, color: "rgba(26, 132, 191, 1)" },      { offset: 1, color: "rgba(52, 163, 224, 0.08)" },    ],    [      { offset: 0, color: "rgba(137, 163, 164, 1)" },      { offset: 1, color: "rgba(137, 163, 164, 0.08)" },    ],    [      { offset: 0, color: "rgba(44, 166, 166, 1)" },      { offset: 1, color: "rgba(44, 166, 166, 0.08)" },    ],    [      { offset: 0, color: "rgba(34, 66, 186, 1)" },      { offset: 1, color: "rgba(34, 66, 186, 0.08)" },    ],  ];?//在getSeriesData添加itemStyleitemStyle: {       color: () => {      return new echarts.graphic.LinearGradient(0, 0, 0, 1, colors[index]);       },},

    效果圖

    以上就是基于Echarts實現繪制立體柱狀圖的示例代碼的詳細內容,更多關于Echarts繪制立體柱狀圖的資料請關注其它相關文章!

    標簽: JavaScript
    日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
    国产日韩亚洲| 国产一区二区三区不卡视频网站 | 久久xxxx| 免费av一区| 亚洲深夜影院| 亚洲+小说+欧美+激情+另类| 日韩亚洲精品在线观看| 国产欧美日韩精品一区二区三区 | 蜜臀国产一区二区三区在线播放| 欧美在线影院| 美女久久一区| 久久国产视频网| 国产精品久久观看| 99久久精品费精品国产| 99视频精品| 亚洲精品少妇| 国内自拍视频一区二区三区| 免费成人网www| 青草久久视频| 久久精品在线| 日韩av电影一区| 国产伦久视频在线观看| 免费av一区| 国产精品任我爽爆在线播放| 99久久视频| 日韩高清二区| 香蕉国产精品| 精品国产午夜肉伦伦影院| 国产精品三上| 福利视频一区| 在线观看一区| 国产精品字幕| 国产激情久久| 日韩在线一区二区| 亚洲欧洲高清| 欧美啪啪一区| 蜜臀91精品国产高清在线观看| 国产精品美女在线观看直播| 亚洲欧洲日本mm| 一区二区三区四区日本视频| 日韩精品一页| 欧美福利一区| аⅴ资源天堂资源库在线| 亚洲影视一区| 悠悠资源网久久精品| 精品国产一区二区三区av片| 亚洲一二av| 精品日韩视频| 福利精品在线| 欧美久久亚洲| 综合激情视频| 国产精品美女久久久浪潮软件| 精品视频一二| 国产精品99精品一区二区三区∴ | 久久av超碰| 日韩高清电影一区| 在线精品视频一区| 人人爽香蕉精品| 伊人精品一区| 五月天av在线| av高清一区| 91精品婷婷色在线观看| 日韩一区电影| 久久婷婷一区| 欧美粗暴jizz性欧美20| 欧美女激情福利| 蜜桃视频一区二区三区在线观看| 香蕉久久久久久久av网站| 亚洲激情不卡| 亚洲美女久久| 欧美日韩一区二区三区不卡视频 | 欧美亚洲日本精品| 日韩成人a**站| 久久国产免费| 亚洲一区观看| 亚洲精品成a人ⅴ香蕉片| 天堂va在线高清一区| 国产日韩中文在线中文字幕| 奇米色欧美一区二区三区| 欧美亚洲国产日韩| 日韩1区在线| 免费不卡中文字幕在线| 亚洲综合中文| 国产乱码精品一区二区三区亚洲人| 欧美日韩中出| 999久久久免费精品国产| 日韩中文字幕视频网| 日本一二区不卡| 国产精品毛片在线看| 久久亚洲精精品中文字幕| 丝袜美腿一区| 无码日韩精品一区二区免费| 国产视频一区二| 久久免费视频66| 婷婷亚洲综合| 麻豆中文一区二区| 首页国产欧美日韩丝袜| 狠狠久久伊人中文字幕| 快she精品国产999| 久久久久免费av| 欧美极品一区二区三区| 中文字幕av亚洲精品一部二部| 麻豆国产91在线播放| 日韩精品一二三区| 国产一区清纯| 日韩av一级| 麻豆91精品视频| 91欧美极品| 久久香蕉精品| 国产综合婷婷| 日韩精品首页| 欧美精品日日操| 97国产成人高清在线观看| 国产日韩三级| 欧美日一区二区在线观看| 亚洲精品美女91| 蜜桃视频一区二区| 视频在线观看一区二区三区| 亚洲小说欧美另类婷婷| 久久视频国产| 久久青草久久| 久久婷婷亚洲| 国产一区日韩一区| 中文字幕高清在线播放| 久久亚洲资源中文字| 久久亚洲黄色| 天堂а√在线最新版中文在线| 成人一区而且| 国产高潮在线| 免费久久久久久久久| 国产99久久久国产精品成人免费| 成人福利av| 欧美精品黄色| 日韩和欧美一区二区| 国产日韩高清一区二区三区在线| 欧美va天堂在线| 成人综合一区| 日本中文字幕一区二区| 久久av导航| 麻豆国产精品777777在线| 国产精品三级| 久久美女性网| 亚久久调教视频| 精品国产中文字幕第一页| 久久精品免费一区二区三区| 美女尤物久久精品| 国产亚洲久久| 99久久激情| 青青草精品视频| 高潮一区二区| 日韩不卡一二三区| 中文在线а√在线8| 日韩在线一二三区| 国产精品视频一区二区三区| 色在线视频观看| 日韩视频1区| 一本大道色婷婷在线| 亚洲无线观看| 99久精品视频在线观看视频| 欧美亚洲tv| 伊人久久婷婷| 在线天堂资源www在线污| 日韩精品久久久久久久软件91| 国产99在线| 久久99影视| 日本成人在线网站| 欧美午夜不卡| 天堂√8在线中文| 你懂的国产精品永久在线| 99精品在线观看| 成人国产精选| 久久影视三级福利片| 日韩精品一二三四| 日韩亚洲在线| 国产在线日韩| 999国产精品999久久久久久| 久久中文精品| 国产精品啊啊啊| 国产欧美一区二区三区国产幕精品| 亚洲经典在线| 伊人久久亚洲美女图片| 神马日本精品| 欧美日韩精品在线一区| 欧美黄色网页| 国产一区二区三区网| 精品视频一二| 欧美激情另类| 日韩中文在线播放| 亚洲成人国产| 91成人精品| 伊人成人在线视频| 久久福利毛片| 亚洲专区视频| 国产欧美日韩一区二区三区在线| 日本国产一区| 精品国产欧美日韩| 久久久夜夜夜| 免费欧美日韩| 欧美日本二区| 国产精品网在线观看|