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

Echarts餅圖4.0(3D環(huán)形圖、包含透明效果)

這篇具有很好參考價值的文章主要介紹了Echarts餅圖4.0(3D環(huán)形圖、包含透明效果)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

參考鏈接:https://blog.csdn.net/weixin_41326021/article/details/120195920
原始文件鏈接:https://download.csdn.net/download/Y1914960928/87884880

代碼:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Echarts餅圖3d,環(huán)形圖(包含透明效果)</title>
    <script type="text/javascript" src="https://fastly.jsdelivr.net/npm/echarts@5.4.2/dist/echarts.min.js"></script>
    <script src="https://cdn.bootcdn.net/ajax/libs/echarts-gl/2.0.8/echarts-gl.min.js"></script>
    <!-- <script type="text/javascript" src="https://fastly.jsdelivr.net/npm/echarts-gl@2/dist/echarts-gl.min.js"></script> -->
</head>

<body>
    <div id="chart" style="width: 800px;height: 500px;background: #131d2b;"></div>
</body>
<script>
    // 繪圖顏色
    const color = ['#255edd', '#ee9b2c', '#37dfcd']
    const optionData = [{
        name: '數(shù)據(jù)1',
        value: 100
    },{
        name: '數(shù)據(jù)2',
        value: 200
    },{
        name: '數(shù)據(jù)3',
        value: 300
    }] // 繪圖數(shù)據(jù)
    let myChart = null // 繪圖dom
    let option = {} // 繪圖的對象

    // 初始化單個繪圖的樣式
    function setLabel () {
        optionData.forEach((item, index) => {
            item.itemStyle = {
              color: color[index]
            }
            item.label = {
              normal: {
                show: false, // 是否顯示
                color: color[index],
                formatter: [
                  '{a|}',
                  '{b|{c}}{b|單位}',
                ].join('\n'), // 用\n來換行
                rich: {
                  a: {
                    color: '#fff',
                    fontSize: 28,
                    lineHeight: 40,
                    align: 'center'
                  },
                  b: {
                    fontSize: 20,
                    color: '#fff',
                  }
                }
              }
            }
            item.labelLine = {
              normal: {
                show: false,
                lineStyle: {
                  width: 1,
                  color: 'rgba(255,255,255,0.7)'
                }
              }
            }
        })
    }

    // 圖表初始化
    function initChart () {
        myChart = echarts.init(document.getElementById('chart'))
        // 傳入數(shù)據(jù)生成 option, 構(gòu)建3d餅狀圖, 參數(shù)工具文件已經(jīng)備注的很詳細(xì)
        option = getPie3D(optionData, 0.9, 240, 28, 20, 0.5)
        myChart.setOption(option)
        // 自適應(yīng)
        window.onresize = function () {
            myChart.resize()
        }
        // 監(jiān)聽鼠標(biāo)移入移出
        bindListen(myChart,option)
    }
       

    // 監(jiān)聽鼠標(biāo)事件,實現(xiàn)餅圖選中效果(單選),近似實現(xiàn)高亮(放大)效果。
    // optionName是防止有多個圖表進行定向option傳遞,單個圖表可以不傳,默認(rèn)是opiton
    function bindListen (myChart, option) {
        let selectedIndex = ''
        let hoveredIndex = ''
        // 監(jiān)聽點擊事件,實現(xiàn)選中效果(單選)
        myChart.on('click', (params) => {
            // 讀取重新渲染扇形所需的參數(shù),將是否選中進行取反。
            let item = option.series[params.seriesIndex]
            const isSelected = !item.pieStatus.selected
            const isHovered = item.pieStatus.hovered
            const k = item.pieStatus.k
            const startRatio = item.pieData.startRatio
            const endRatio = item.pieData.endRatio
            // 如果之前選中過其他扇形,將其取消選中(對 option 更新)
            if (selectedIndex !== '' && selectedIndex !== params.seriesIndex) {
                let subItem = option.series[selectedIndex]
                subItem.parametricEquation = getParametricEquation(
                    subItem.pieData.startRatio,
                    subItem.pieData.endRatio,
                    false,
                    false,
                    k,
                    subItem.pieData.value
                )
                subItem.pieStatus.selected = false
            }
            // 對當(dāng)前點擊的扇形,執(zhí)行選中/取消選中操作(對 option 更新)
            item.parametricEquation = getParametricEquation(
                startRatio,
                endRatio,
                isSelected,
                isHovered,
                k,
                item.pieData.value
            )
            item.pieStatus.selected = isSelected
            // 如果本次是選中操作,記錄上次選中的扇形對應(yīng)的系列號 seriesIndex
            selectedIndex = isSelected ? params.seriesIndex : null
            // 重新渲染圖表
            myChart.setOption(option)
        })
        // 監(jiān)聽 mouseover,近似實現(xiàn)高亮(放大)效果
        myChart.on('mouseover', (params) => {
            // 準(zhǔn)備重新渲染扇形所需的參數(shù)
            let isSelected = null
            let isHovered = null
            let startRatio = null
            let endRatio = null
            let k = null
            // 如果觸發(fā) mouseover 的扇形當(dāng)前已高亮,則不做操作
            // 否則進行高亮及必要的取消高亮操作
            if (hoveredIndex !== params.seriesIndex) {
                // 如果當(dāng)前有高亮的扇形,取消其高亮狀態(tài)(對 option 更新)
                if (hoveredIndex !== '') {
                // 從 option.series 中讀取重新渲染扇形所需的參數(shù),將是否高亮設(shè)置為 false。
                let hoverItem = option.series[hoveredIndex]
                isSelected = hoverItem.pieStatus.selected
                isHovered = false
                startRatio = hoverItem.pieData.startRatio
                endRatio = hoverItem.pieData.endRatio
                k = hoverItem.pieStatus.k
                // 對當(dāng)前點擊的扇形,執(zhí)行取消高亮操作(對 option 更新)
                hoverItem.parametricEquation = getParametricEquation(
                    startRatio,
                    endRatio,
                    isSelected,
                    isHovered,
                    k,
                    hoverItem.pieData.value
                )
                hoverItem.pieStatus.hovered = isHovered
                // 將此前記錄的上次選中的扇形對應(yīng)的系列號 seriesIndex 清空
                hoveredIndex = ''
                }
                // 如果觸發(fā) mouseover 的扇形不是透明圓環(huán),將其高亮(對 option 更新)
                if ((params.seriesName !== 'mouseoutSeries') && (params.seriesName !== 'pie2d')) {
                    // 從 option.series 中讀取重新渲染扇形所需的參數(shù),將是否高亮設(shè)置為 true。
                    let item = option.series[params.seriesIndex]
                    isSelected = item.pieStatus.selected
                    isHovered = true
                    startRatio = item.pieData.startRatio
                    endRatio = item.pieData.endRatio
                    k = item.pieStatus.k
                    // 對當(dāng)前點擊的扇形,執(zhí)行高亮操作(對 option 更新)
                    item.parametricEquation = getParametricEquation(
                        startRatio,
                        endRatio,
                        isSelected,
                        isHovered,
                        k,
                        item.pieData.value + 60
                    )
                    item.pieStatus.hovered = isHovered
                    // 記錄上次高亮的扇形對應(yīng)的系列號 seriesIndex
                    hoveredIndex = params.seriesIndex
                }
                // 重新渲染圖表
                myChart.setOption(option)
            }
            })
        // 修正取消高亮失敗的 bug
        myChart.on('globalout', () => {
            // 準(zhǔn)備重新渲染扇形所需的參數(shù)
            let isSelected = null
            let isHovered = null
            let startRatio = null
            let endRatio = null
            let k = null
            // 如果當(dāng)前有高亮的扇形,取消其高亮狀態(tài)(對 option 更新)
            if (hoveredIndex !== '') {
                // 從 option.series 中讀取重新渲染扇形所需的參數(shù),將是否高亮設(shè)置為 false。
                let hoverItem = option.series[hoveredIndex]
                isSelected = hoverItem.pieStatus.selected
                isHovered = false
                startRatio = hoverItem.pieData.startRatio
                endRatio = hoverItem.pieData.endRatio
                k = hoverItem.pieStatus.k
                // 對當(dāng)前點擊的扇形,執(zhí)行取消高亮操作(對 option 更新)
                hoverItem.parametricEquation = getParametricEquation(
                    startRatio,
                    endRatio,
                    isSelected,
                    isHovered,
                    k,
                    hoverItem.pieData.value
                )
                hoverItem.pieStatus.hovered = isHovered
                // 將此前記錄的上次選中的扇形對應(yīng)的系列號 seriesIndex 清空
                hoveredIndex = ''
            }
            // 使用更新后的 option,渲染圖表
            myChart.setOption(option)
        })
    }


    // 工具函數(shù)
    /**
     * 繪制3d圖
     * @param pieData 總數(shù)據(jù)
     * @param internalDiameterRatio:透明的空心占比
     * @param distance 視角到主體的距離
     * @param alpha 旋轉(zhuǎn)角度
     * @param pieHeight 立體的高度
     * @param opacity 餅或者環(huán)的透明度
     */
    function getPie3D (pieData, internalDiameterRatio, distance, alpha, pieHeight, opacity = 1) {
        const series = []
        let sumValue = 0
        let startValue = 0
        let endValue = 0
        let legendData = []
        const k = 1 - internalDiameterRatio
        // 對數(shù)據(jù)做一個排序
        pieData.sort((a, b) => {
            return b.value - a.value
        })
        // 將每一條數(shù)據(jù)生成一個曲面
        // 配置項:https://echarts.apache.org/zh/option-gl.html#series-surface.type
        for (let i = 0; i < pieData.length; i++) {
            sumValue += pieData[i].value
            const seriesItem = {
                name: !pieData[i].name ? `series${i}` : pieData[i].name,
                type: 'surface',
                parametric: true,
                wireframe: {
                    show: false
                },
                pieData: pieData[i],
                pieStatus: {
                    selected: false,
                    hovered: false,
                    k: k
                },
                center: ['10%', '50%']
            }
            if (pieData[i].itemStyle) { // 有配置過每一項的參數(shù)
                let itemStyle = {}
                itemStyle.color = pieData[i].itemStyle.color || opacity
                itemStyle.opacity = pieData[i].itemStyle.opacity || opacity
                seriesItem.itemStyle = itemStyle
            }
            series.push(seriesItem)
        }
        
        // 實現(xiàn)每一個扇形
        legendData = []
        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
            const bfb = formatFloat(series[i].pieData.value / sumValue, 4)
            legendData.push({
                name: series[i].name,
                value: bfb
            })
        }
        const boxHeight = getHeight3D(series, pieHeight) // 設(shè)定3d餅/環(huán)的高度,單位是px
        // 準(zhǔn)備待返回的配置項,把準(zhǔn)備好的 legendData、series 傳入。
        const option = {
            legend: {
                show: false,
                data: legendData,
                orient: 'vertical',
                left: 10,
                top: 10,
                itemGap: 10,
                textStyle: {
                    color: '#A1E2FF'
                },
                icon: 'circle',
                formatter: function (param) {
                    const item = legendData.filter(item => item.name === param)[0]
                    return `${item.name}  ${item.value}`
                }
            },
            labelLine: {
                show: true,
                lineStyle: {
                    color: '#fff'
                }
            },
            label: {
                show: true,
                position: 'outside',
                formatter: ' \n{c} n5n3t3z%'
            },
            tooltip: {
                backgroundColor: '#033b77',
                borderColor: '#21f2c4',
                textStyle: {
                    color: '#fff',
                    fontSize: 13
                },
                formatter: params => {
                    let name = params.seriesName
                    if ((name !== 'mouseoutSeries') && (name !== 'pie2d')) {
                        let pieData = series[params.seriesIndex].pieData
                        return (
                            `${name}<br/>` +
                            `<span style="display:inline-block;margin-right:5px;border-radius:10px;width:10px;height:10px;background-color:${params.color};"></span>` +
                            `${pieData.value}`
                        )
                    }
                }
            },
            xAxis3D: {
                min: -1,
                max: 1
            },
            yAxis3D: {
                min: -1,
                max: 1
            },
            zAxis3D: {
                min: -1,
                max: 1
            },
            grid3D: {
                show: false,
                boxHeight: boxHeight, // 圓環(huán)的高度
                viewControl: { // 3d效果
                    alpha, // 角度
                    distance, // 調(diào)整視角到主體的距離,類似調(diào)整zoom
                    rotateSensitivity: 0, // 設(shè)置為0無法旋轉(zhuǎn)
                    zoomSensitivity: 0, // 設(shè)置為0無法縮放
                    panSensitivity: 0, // 設(shè)置為0無法平移
                    autoRotate: false // 自動旋轉(zhuǎn)
                }
            },
            series: series
        }
        return option
    }
    
    /**
     * 生成扇形的曲面參數(shù)方程
     */
    function getParametricEquation (startRatio, endRatio, isSelected, isHovered, k, h) {
        const midRatio = (startRatio + endRatio) / 2
        const startRadian = startRatio * Math.PI * 2
        const endRadian = endRatio * Math.PI * 2
        const midRadian = midRatio * Math.PI * 2
        // 如果只有一個扇形,則不實現(xiàn)選中效果。
        if (startRatio === 0 && endRatio === 1) {
            isSelected = false
        }
        // 通過扇形內(nèi)徑/外徑的值,換算出輔助參數(shù) k(默認(rèn)值 1/3)
        k = k || 1 / 3
        // 計算選中效果分別在 x 軸、y 軸方向上的位移(未選中,則位移均為 0)
        const offsetX = isSelected ? Math.cos(midRadian) * 0.1 : 0
        const offsetY = isSelected ? Math.sin(midRadian) * 0.1 : 0
        // 計算高亮效果的放大比例(未高亮,則比例為 1)
        const 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
            }
        }
    }

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

    /**
     * 格式化浮點數(shù)
     */
    function formatFloat(num, n) {
        let f = parseFloat(num)
        if (isNaN(f)) {
            return false
        }
        f = Math.round(num * Math.pow(10, n)) / Math.pow(10, n) // n 冪
        let s = f.toString()
        let rs = s.indexOf('.')
        // 判定如果是整數(shù),增加小數(shù)點再補0
        if (rs < 0) {
            rs = s.length
            s += '.'
        }
        while (s.length <= rs + n) {
            s += '0'
        }
        return s
    }


    setLabel()
    initChart()
  </script>
</html>

效果圖:

echarts4.0,Echarts,echarts,3d,前端文章來源地址http://www.zghlxwxcb.cn/news/detail-611974.html

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

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

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

相關(guān)文章

  • echarts-pie---------3D曲狀環(huán)形餅圖實現(xiàn)?。。? decoding=

    echarts-pie---------3D曲狀環(huán)形餅圖實現(xiàn)?。?!

    此套代碼可以直接再echarts官網(wǎng)中的此處運行

    2024年02月14日
    瀏覽(25)
  • echarts看板效果圖:流光折線圖、3d柱狀圖、3d餅圖、3d地圖

    echarts看板效果圖:流光折線圖、3d柱狀圖、3d餅圖、3d地圖

    現(xiàn)在展廳的大看板是越花里胡哨越好,不過真的挺難做的。好在可以百度找到一些大神的作品進行參考。 下面的內(nèi)容都是基于 echarts 5.3.3 和 vue3 。另外demo都是參考別人的案例。 效果圖 代碼 本質(zhì)上是兩條線組合在一起的,一條是靜態(tài)的線條,一條是動態(tài)的線條。相關(guān)屬性都

    2024年02月06日
    瀏覽(25)
  • echarts 餅圖 環(huán)形圖 lable添加下劃線
  • 記錄--ECharts — 餅圖相關(guān)功能點(內(nèi)環(huán)、外環(huán)、環(huán)形間隔、環(huán)形文字、輪播動畫)

    記錄--ECharts — 餅圖相關(guān)功能點(內(nèi)環(huán)、外環(huán)、環(huán)形間隔、環(huán)形文字、輪播動畫)

    記錄一下在公司遇到的一些功能,以及相關(guān)實現(xiàn) 以上的內(nèi)容我花了一周時間去實現(xiàn)的,自己也覺得時間很長,但主要因為很少使用ECharts,導(dǎo)致使用的過程中大部分的時間都在查文檔。 對于上面的這些功能點,其實算是寫了兩遍吧,這周一開了個Code Review,因為涉及到公共組

    2024年02月05日
    瀏覽(62)
  • 【Echarts】Echarts餅圖樣式-添加內(nèi)圈陰影達到立體效果

    【Echarts】Echarts餅圖樣式-添加內(nèi)圈陰影達到立體效果

    實現(xiàn)思想: 最終效果: 1.在series中添加內(nèi)圈餅圖 2.保持內(nèi)圈高亮,達到陰影效果 完整script代碼:

    2024年01月23日
    瀏覽(30)
  • 【echarts】使用 ECharts 繪制3D餅圖

    【echarts】使用 ECharts 繪制3D餅圖

    在數(shù)據(jù)可視化中,餅圖是表達數(shù)據(jù)占比信息的常見方式。ECharts 作為一個強大的數(shù)據(jù)可視化庫,除了標(biāo)準(zhǔn)的二維餅圖,也支持更加生動的三維餅圖繪制。本文將指導(dǎo)你如何使用 ECharts 來創(chuàng)建一個3D餅圖,提升你的數(shù)據(jù)展示效果。 在 ECharts 中,3D 餅圖主要是通過 surface 類型的圖

    2024年04月27日
    瀏覽(20)
  • vue3+heightchart實現(xiàn)3D餅圖,echarts3D餅圖,3D餅圖引導(dǎo)線實現(xiàn)

    vue3+heightchart實現(xiàn)3D餅圖,echarts3D餅圖,3D餅圖引導(dǎo)線實現(xiàn)

    ?附上 heightcharts 官網(wǎng)地址? Highcharts 演示 | Highcharts https://www.hcharts.cn/demo/highcharts 首先需要下載一下 heightcharts執(zhí)行命令 ?然后初始化: 如此你就得到了一個3D餅圖?

    2024年02月13日
    瀏覽(26)
  • echarts實現(xiàn)3D餅圖

    echarts是一款強大的數(shù)據(jù)可視化工具,它可以幫助我們快速、簡單地創(chuàng)建各種圖表。 要在echarts中實現(xiàn)3D餅圖,需要使用echarts的 series 系列中的 pie3D 組件。 下面是一個簡單的例子,展示如何使用echarts創(chuàng)建3D餅圖: 上面的代碼中,我們使用了 pie3D 組件,并設(shè)置了半徑范圍為 [\\\'

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

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

    2023.6.30今天我學(xué)習(xí)了如何使用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日
    瀏覽(27)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包