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

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

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

瀏覽:127日期: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久久,三上悠亚国产精品一区二区三区
    蜜桃视频欧美| 日本免费一区二区三区四区| 激情综合五月| 精品中文字幕一区二区三区四区| 国产精品亚洲综合久久| 国产精品亚洲产品| 麻豆视频久久| 手机在线电影一区| 日韩高清中文字幕一区二区| 日本а中文在线天堂| 成人精品天堂一区二区三区| 欧美1区免费| 亚洲在线电影| 亚洲精品麻豆| 国产精品www.| 神马午夜在线视频| 激情五月综合| 亚洲一区区二区| 蜜桃久久av一区| 日韩毛片一区| 久久久精品国产**网站| 黄色在线观看www| 1024精品一区二区三区| 日韩天堂av| 欧美欧美黄在线二区| 国产精品久久久久蜜臀| 99久久婷婷| 视频一区欧美日韩| 国产精品久久久久久久免费软件| 成人在线丰满少妇av| 午夜欧美理论片| 欧美一级二级视频| 欧美黄页在线免费观看| 91亚洲一区| 爽好多水快深点欧美视频| 久久激情综合网| 国产精选在线| 热久久国产精品| 欧美片网站免费| av免费不卡国产观看| 日本大胆欧美人术艺术动态| 国产激情久久| 99久久婷婷| 91p九色成人| 国产精品字幕| 婷婷综合成人| 欧美sm一区| 中文字幕日本一区| 久久精品午夜| 美女久久网站| 国产91在线播放精品| 国产亚洲在线| 精品精品99| 亚洲欧美日本日韩| 久久久国产精品网站| 午夜国产一区二区| 国产精品porn| 欧美在线亚洲综合一区| 国产精品黄网站| 一区二区自拍| 日韩1区2区| 日韩欧乱色一区二区三区在线| 91欧美日韩| 日韩国产一二三区| 国产一区清纯| 久久爱www.| 亚洲欧美日韩国产一区二区| 国产成人精品一区二区免费看京| 视频一区二区三区在线| 福利视频一区| 日韩福利在线观看| 亚洲少妇在线| 亚洲国产福利| 欧美啪啪一区| 国产一区白浆| 久久久水蜜桃av免费网站| 91精品视频一区二区| 国产伊人精品| 久久精品亚洲| 91精品丝袜国产高跟在线| 午夜精品亚洲| 日韩欧美一区二区三区在线观看| 国产精品三级| 男女男精品视频网| 国产精品字幕| 精品一区二区三区免费看| 午夜天堂精品久久久久| 一区二区自拍| 在线日韩电影| 久久精品官网| 国产理论在线| 久久精品三级| 日韩在线网址| 久久福利影视| 欧美日韩国产一区精品一区| 亚洲一级少妇| 四虎国产精品免费观看| 91成人在线| 视频一区日韩| 一级欧美视频| 久久国产精品亚洲77777| 国产一区欧美| 人人精品亚洲| 日产精品一区| 亚洲精品成人图区| 岛国精品一区| 国产成人精品免费视| 麻豆国产91在线播放| 国产精品视频一区二区三区| 91精品啪在线观看国产爱臀| 亚洲九九精品| 四虎国产精品免费久久| 丝瓜av网站精品一区二区| 日韩一区二区久久| 国产视频一区免费看| 亚洲高清影视| 日韩一级不卡| 亚洲一区欧美激情| 丝袜美腿亚洲色图| 亚洲尤物av| 日韩精彩视频在线观看| 97久久精品| 欧美啪啪一区| 国产欧美二区| 久久av中文| 久久影视三级福利片| 久久男人av| 中文字幕av一区二区三区人| 美女少妇全过程你懂的久久| 欧美一区二区三区高清视频 | 欧美日韩色图| 水蜜桃久久夜色精品一区| 日韩1区2区| 国产精品丝袜xxxxxxx| 亚洲欧洲免费| 国产一区二区三区四区五区 | 日韩欧美2区| 丝袜亚洲精品中文字幕一区| 99国产精品私拍| 狠狠色狠狠色综合日日tαg| 精品美女视频| 欧美日韩国产传媒| 开心激情综合| 亚洲精品少妇| 久久av在线| 亚洲欧洲一区二区天堂久久| 另类欧美日韩国产在线| 一区在线免费观看| 国产精品久久久久av电视剧| 国产精品一区三区在线观看| 亚洲精选91| 久久蜜桃精品| 欧美天堂一区| 日韩毛片视频| 一区二区小说| 欧洲av一区二区| 久久精品官网| 欧美日韩国产综合网| 日韩电影免费在线观看| 日韩一区免费| 亚洲黄色网址| 国产成人精品一区二区三区视频| 精品黄色一级片| 少妇精品导航| 麻豆精品91| 成人亚洲一区| 日韩中文影院| 在线精品亚洲| 国产极品一区| 欧美精品一区二区久久| 国产成人精品免费视| 美女久久网站| 日韩不卡一二三区| 五月国产精品| 精品视频自拍| 欧美亚洲激情| 香蕉久久久久久久av网站| 亚洲综合电影| 国产精品中文字幕亚洲欧美 | 美女精品久久| 国产剧情一区| 蜜桃av一区二区在线观看| 精品女同一区二区三区在线观看| 久久黄色影院| 国产精品字幕| 麻豆精品在线播放| 成人国产精品久久| 国产精品久久久久77777丨| 亚洲欧洲日韩| 日韩福利视频导航| 国产亚洲一卡2卡3卡4卡新区| 综合视频一区| 国产乱码精品| 欧美黑人巨大videos精品| 国产精品香蕉| 久久久久中文| 蜜桃视频一区二区三区在线观看| 蜜桃久久久久久| 久久一区精品| 国产精品主播|