国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

基于echarts開發(fā)的3D餅圖

這篇具有很好參考價值的文章主要介紹了基于echarts開發(fā)的3D餅圖。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

基于echarts開發(fā)的3D餅圖

可以自動旋轉(zhuǎn),鼠標高亮選中

第一步

echarts-gl 裝包

"echarts": "^5.2.0",
"echarts-gl": "^2.0.8",

我用的是上面兩個版本,最開始因為echarts-gl 和echarts 版本不對應(yīng),報錯找了半天,大坑,所以一定要下載對應(yīng)的版本,建議直接復制到項目中package.json文件中,然后npm i 自動裝包就行了

第二步

封裝成了一個插件,可以直接復制到自己項目中查看,數(shù)據(jù)為模擬數(shù)據(jù)文章來源地址http://www.zghlxwxcb.cn/news/detail-508004.html

<template>
  <div style="width:100%;height:100%">
    <div ref="basicDataPie" style="width:100%;height:100%"></div>
  </div>
</template>
<script>
import * as echarts from "echarts";
import "echarts-gl";
export default {
  data() {
    return {
      data: [
        { name: "視頻", value: 20, itemStyle: { color: "#0783FA" } },
        { name: "作業(yè)", value: 18, itemStyle: { color: "#07D1FA" } },
        { name: "考試", value: 22, itemStyle: { color: "#20E6A4" } },
        { name: "課件", value: 15, itemStyle: { color: "#D18161" } },
        { name: "實驗", value: 25, itemStyle: { color: "#FFE649" } },
      ],
    };
  },
  mounted() {
    this.$nextTick(() => {
      this.echartsPie();
    });
  },
  methods: {
    echartsPie() {
      let hoveredIndex = "";
      let chartDom = this.$refs["basicDataPie"];
      let myChart = echarts.init(chartDom);
      const getPie3D = (pieData, internalDiameterRatio) => {
        //internalDiameterRatio:透明的空心占比
        let series = [];
        let sumValue = 0;
        let startValue = 0;
        let endValue = 0;
        let k = 1;
        pieData.sort((a, b) => {
          return b.value - a.value;
        });
        // 為每一個餅圖數(shù)據(jù),生成一個 series-surface 配置
        for (let i = 0; i < pieData.length; i++) {
          sumValue += pieData[i].value;
          let seriesItem = {
            name:
              typeof pieData[i].name === "undefined"
                ? `series${i}`
                : pieData[i].name,
            type: "surface",
            parametric: true,
            wireframe: {
              show: false,
            },
            pieData: pieData[i],
            pieStatus: {
              selected: false,
              hovered: false,
              k: k,
            },
            radius: "50%",
            center: ["10%", "10%"],
          };

          if (typeof pieData[i].itemStyle != "undefined") {
            let itemStyle = {};
            typeof pieData[i].itemStyle.color != "undefined"
              ? (itemStyle.color = pieData[i].itemStyle.color)
              : null;
            typeof pieData[i].itemStyle.opacity != "undefined"
              ? (itemStyle.opacity = pieData[i].itemStyle.opacity)
              : null;
            seriesItem.itemStyle = itemStyle;
          }
          series.push(seriesItem);
        }

        // 使用上一次遍歷時,計算出的數(shù)據(jù)和 sumValue,調(diào)用 getParametricEquation 函數(shù),
        // 向每個 series-surface 傳入不同的參數(shù)方程 series-surface.parametricEquation,也就是實現(xiàn)每一個扇形。
        for (let i = 0; i < series.length; i++) {
          endValue = startValue + series[i].pieData.value;
          series[i].pieData.startRatio = startValue / sumValue;
          series[i].pieData.endRatio = endValue / sumValue;
          series[i].parametricEquation = getParametricEquation(
            series[i].pieData.startRatio,
            series[i].pieData.endRatio,
            false,
            false,
            k,
            series[i].pieData.value
          );
          startValue = endValue;
        }
        let boxHeight = getHeight3D(series, 15); //通過傳參設(shè)定3d餅/環(huán)的高度,26代表26px
        // 準備待返回的配置項,把準備好的 legendData、series 傳入。
        let option = {
          backgroundColor: "#fff",
          tooltip: {
            backgroundColor: "#fff",
            formatter: (params) => {
              if (
                params.seriesName !== "mouseoutSeries" &&
                params.seriesName !== "pie3d"
              ) {
                let bfb = (
                  (option.series[params.seriesIndex].pieData.endRatio -
                    option.series[params.seriesIndex].pieData.startRatio) *
                  100
                ).toFixed(2);
                return (
                  `${params.seriesName}<br/>` +
                  `<span style="display:inline-block;margin-right:5px;border-radius:10px;width:10px;height:10px;background-color:${params.color};"></span>` +
                  `${bfb}%`
                );
              }
            },
          },
          legend: {
            bottom: "3%",
            itemGap: 20,
            icon: "path://M0,12L12,12C12,5.37258,6.62742,0,0,0L0,12Z",
          },
          title: {
            text: "課程總課時:68",
            left: "left",
            top: "2%",
            textStyle: {
              fontWeight: 500,
              fontSize: 16,
              color: "#3D3D3D",
            },
          },
          xAxis3D: {
            min: -1,
            max: 1,
          },
          yAxis3D: {
            min: -1,
            max: 1,
          },
          zAxis3D: {
            min: -1,
            max: 1,
          },
          grid3D: {
            show: false,
            boxHeight: boxHeight, //圓環(huán)的高度
            left: 0,
            top: 0, //3d餅圖的位置
            viewControl: {
              //3d效果可以放大、旋轉(zhuǎn)等,請自己去查看官方配置
              alpha: 25, //角度
              distance: 250, //調(diào)整視角到主體的距離,類似調(diào)整zoom
              rotateSensitivity: 0, //設(shè)置為0無法旋轉(zhuǎn)
              zoomSensitivity: 0, //設(shè)置為0無法縮放
              panSensitivity: 0, //設(shè)置為0無法平移
              autoRotate: true, //自動旋轉(zhuǎn)
            },
          },
          series: series,
        };
        return option;
      };

      //獲取3d丙圖的最高扇區(qū)的高度
      const getHeight3D = (series, height) => {
        series.sort((a, b) => {
          return b.pieData.value - a.pieData.value;
        });
        return (height * 15) / series[0].pieData.value;
      };

      // 生成扇形的曲面參數(shù)方程,用于 series-surface.parametricEquation
      const getParametricEquation = (
        startRatio,
        endRatio,
        isSelected,
        isHovered,
        k,
        h
      ) => {
        // 計算
        let midRatio = (startRatio + endRatio) / 2;
        let startRadian = startRatio * Math.PI * 2;
        let endRadian = endRatio * Math.PI * 2;
        let midRadian = midRatio * Math.PI * 2;
        // 如果只有一個扇形,則不實現(xiàn)選中效果。
        if (startRatio === 0 && endRatio === 1) {
          isSelected = false;
        }
        // 通過扇形內(nèi)徑/外徑的值,換算出輔助參數(shù) k(默認值 1/3)
        k = typeof k !== "undefined" ? k : 1 / 3;
        // 計算選中效果分別在 x 軸、y 軸方向上的位移(未選中,則位移均為 0)
        let offsetX = isSelected ? Math.cos(midRadian) * 0.1 : 0;
        let offsetY = isSelected ? Math.sin(midRadian) * 0.1 : 0;
        // 計算高亮效果的放大比例(未高亮,則比例為 1)
        let hoverRate = isHovered ? 1.05 : 1;
        // 返回曲面參數(shù)方程
        return {
          u: {
            min: -Math.PI,
            max: Math.PI * 3,
            step: Math.PI / 32,
          },
          v: {
            min: 0,
            max: Math.PI * 2,
            step: Math.PI / 20,
          },
          x: function (u, v) {
            if (u < startRadian) {
              return (
                offsetX +
                Math.cos(startRadian) * (1 + Math.cos(v) * k) * hoverRate
              );
            }
            if (u > endRadian) {
              return (
                offsetX +
                Math.cos(endRadian) * (1 + Math.cos(v) * k) * hoverRate
              );
            }
            return offsetX + Math.cos(u) * (1 + Math.cos(v) * k) * hoverRate;
          },
          y: function (u, v) {
            if (u < startRadian) {
              return (
                offsetY +
                Math.sin(startRadian) * (1 + Math.cos(v) * k) * hoverRate
              );
            }
            if (u > endRadian) {
              return (
                offsetY +
                Math.sin(endRadian) * (1 + Math.cos(v) * k) * hoverRate
              );
            }
            return offsetY + Math.sin(u) * (1 + Math.cos(v) * k) * hoverRate;
          },
          z: function (u, v) {
            if (u < -Math.PI * 0.5) {
              return Math.sin(u);
            }
            if (u > Math.PI * 2.5) {
              return Math.sin(u) * h * 0.1;
            }
            return Math.sin(v) > 0 ? 1 * h * 0.1 : -1;
          },
        };
      };

      let option = getPie3D(this.data, 0.8);
      //是否需要label指引線,如果要就添加一個透明的2d餅狀圖并調(diào)整角度使得labelLine和3d的餅狀圖對齊,并再次setOption
      option.series.push({
        // name: "pie3d",
        type: "pie",
        label: {
          show: false,
          position: "inside",
          formatter: "{c}%",
        },
        // startAngle: -25, //起始角度,支持范圍[0, 360]。
        clockwise: false, //餅圖的扇區(qū)是否是順時針排布。上述這兩項配置主要是為了對齊3d的樣式
        radius: ["65%", "65%"],
        center: ["55%", "48%"], //指示線的位置
        itemStyle: {
          opacity: 0,
        },
      });
      option && myChart.setOption(option);

      myChart.on("mouseover", function (params) {
        // 準備重新渲染扇形所需的參數(shù)
        let isSelected;
        let isHovered;
        let startRatio;
        let endRatio;
        let k;
        let i;

        // 如果觸發(fā) mouseover 的扇形當前已高亮,則不做操作
        if (hoveredIndex === params.seriesIndex) {
          return;

          // 否則進行高亮及必要的取消高亮操作
        } else {
          // 如果當前有高亮的扇形,取消其高亮狀態(tài)(對 option 更新)
          if (hoveredIndex !== "") {
            // 從 option.series 中讀取重新渲染扇形所需的參數(shù),將是否高亮設(shè)置為 false。
            isSelected = option.series[hoveredIndex].pieStatus.selected;
            isHovered = false;
            startRatio = option.series[hoveredIndex].pieData.startRatio;
            endRatio = option.series[hoveredIndex].pieData.endRatio;
            k = option.series[hoveredIndex].pieStatus.k;
            i =
              option.series[hoveredIndex].pieData.value ===
              option.series[0].pieData.value
                ? 35
                : 10;
            // 對當前點擊的扇形,執(zhí)行取消高亮操作(對 option 更新)
            option.series[hoveredIndex].parametricEquation =
              getParametricEquation(
                startRatio,
                endRatio,
                isSelected,
                isHovered,
                k,
                i
              );
            option.series[hoveredIndex].pieStatus.hovered = isHovered;

            // 將此前記錄的上次選中的扇形對應(yīng)的系列號 seriesIndex 清空
            hoveredIndex = "";
          }

          // 如果觸發(fā) mouseover 的扇形不是透明圓環(huán),將其高亮(對 option 更新)
          if (
            params.seriesName !== "mouseoutSeries" &&
            option.series[params.seriesIndex].pieStatus
          ) {
            // 從 option.series 中讀取重新渲染扇形所需的參數(shù),將是否高亮設(shè)置為 true。
            isSelected = option.series[params.seriesIndex].pieStatus.selected;
            isHovered = true;
            startRatio = option.series[params.seriesIndex].pieData.startRatio;
            endRatio = option.series[params.seriesIndex].pieData.endRatio;
            k = option.series[params.seriesIndex].pieStatus.k;

            // 對當前點擊的扇形,執(zhí)行高亮操作(對 option 更新)
            option.series[params.seriesIndex].parametricEquation =
              getParametricEquation(
                startRatio,
                endRatio,
                isSelected,
                isHovered,
                k,
                option.series[params.seriesIndex].pieData.value + 5
              );
            option.series[params.seriesIndex].pieStatus.hovered = isHovered;

            // 記錄上次高亮的扇形對應(yīng)的系列號 seriesIndex
            hoveredIndex = params.seriesIndex;
          }

          // 使用更新后的 option,渲染圖表
          myChart.setOption(option);
        }
      });
    },
  },
};
</script>

到了這里,關(guān)于基于echarts開發(fā)的3D餅圖的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • echarts 實現(xiàn)3D餅圖

    echarts 實現(xiàn)3D餅圖

    2023.6.30今天我學習了如何使用echarts渲染一個3d的餅圖,效果如下: 相關(guān)代碼如下:

    2024年02月17日
    瀏覽(19)
  • 用echarts實現(xiàn)3d餅圖

    用echarts實現(xiàn)3d餅圖

    安裝echarts和echarts-gl npm install echarts npm install echarts-gl echarts版本5.x的話需要對應(yīng)echarts-gl版本2.x echarts版本4.x的話需要對應(yīng)echarts-gl版本1.x 指定版本命令?npm install echarts-gl@1.1.2 1.關(guān)鍵函數(shù),生成扇形的曲面參數(shù)方程,用于 series-surface Documentation - Apache ECharts官網(wǎng)series-surface介紹?

    2024年02月16日
    瀏覽(25)
  • echarts的3D餅圖

    echarts的3D餅圖

    1、需要安裝 2、使用方法 3、案例 效果圖: 需要底座背景圖自取

    2024年01月21日
    瀏覽(17)
  • echarts-3D立體餅圖(1)

    echarts-3D立體餅圖(1)

    先看效果圖 1、echarts的版本使用的是: script src=\\\"https://cdn.bootcdn.net/ajax/libs/echarts/5.4.1/echarts.min.js\\\"/script script src=\\\"https://cdn.bootcdn.net/ajax/libs/echarts-gl/2.0.8/echarts-gl.js\\\"/script 2、餅圖可自旋轉(zhuǎn),鼠標移上也可轉(zhuǎn)動,不想讓旋轉(zhuǎn)grid3D:{viewControl:{autoRotate:false}} 3、 3D餅圖主義echarts的

    2024年02月09日
    瀏覽(24)
  • vue中使用echarts與echarts-gl 實現(xiàn)3D餅圖環(huán)形餅圖

    vue中使用echarts與echarts-gl 實現(xiàn)3D餅圖環(huán)形餅圖

    注意:我不知道版本差異會不會有影響(可以指定版本 也可以借鑒我的) 指定版本命令 加個@后面跟版本號即可 成功之后可以在package.json中檢查是否安裝成功(如上圖) 引入位置:我沒有在main.js中全局引用,而是哪個頁面用到就引入哪里 代碼: 注意:我沒有封裝起來(你

    2024年02月03日
    瀏覽(56)
  • echarts實現(xiàn)3D柱狀圖(視覺層面)和3D餅圖

    echarts實現(xiàn)3D柱狀圖(視覺層面)和3D餅圖

    原理: 立體圖形從一個方向只能看到三個面,于是我們通過echarts圖表實現(xiàn) 頂部,明面,和暗面。 效果圖如下: 需要四份數(shù)據(jù), 兩個柱子的數(shù)據(jù)+X軸數(shù)據(jù)+顏色數(shù)據(jù), 通過 setData 和 setColor 生成需要的數(shù)據(jù),橫向柱狀圖同理,參照代碼中注釋。 以下是完整案例代碼: 3D餅圖沒

    2024年02月16日
    瀏覽(24)
  • echarts3d餅圖

    echarts3d餅圖

    效果圖: 安裝echarts 在package.json文件中添加 如圖 main.js中引入 完整代碼如下(示例): HTML代碼 js腳本代碼 css樣式代碼 如有疑問歡迎留言

    2024年02月12日
    瀏覽(15)
  • Vue2 Echarts 3D餅圖

    2024年01月19日
    瀏覽(15)
  • echarts如何實現(xiàn)3D餅圖(環(huán)形圖)?

    echarts如何實現(xiàn)3D餅圖(環(huán)形圖)?

    一、實現(xiàn)的效果 二、具體步驟 1.安裝依賴 npm install echarts? 2.引入echarts import * as echarts from \\\'echarts\\\'; ?注意:這里需要用到echarts-gl,必須單獨引入才可以 import \\\'echarts-gl\\\'; 3.echarts部分代碼 我知道這部分內(nèi)容很多,但只要cv去用就可以了, getParametricEquation 這個函數(shù)不用改(我也不

    2024年03月28日
    瀏覽(21)
  • echarts中餅圖的tooltip根據(jù)鼠標位置改變彈出位置

    echarts中餅圖的tooltip根據(jù)鼠標位置改變彈出位置

    echarts中的tooltip.position屬性配置參考??echarts配置手冊 問題:使用echarts繪制餅圖,tooltip的彈出位置會遮擋住圖表。 需求:tooltip的彈出位置在餅圖外圈,不遮擋圖表內(nèi)容,切根據(jù)鼠標的位置而改變。 解決方法:在tooltip的配置項中對position進行配置,使用回調(diào)函數(shù)實現(xiàn)tooltip彈

    2024年02月08日
    瀏覽(63)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包