Echarts实现3D柱状图

Echarts实现3D柱状图

效果图

代码

html 复制代码
<!--
	此示例下载自 https://echarts.apache.org/examples/zh/editor.html?c=bar3d-dataset&gl=1
-->
<!DOCTYPE html>
<html lang="en" style="height: 100%">
<head>
    <meta charset="utf-8">
    <title>Echarts实现3D柱状图 - qipa250</title>
</head>
<body style="height: 100%; margin: 0">
<div id="qipa250" style="height: 100%"></div>

<script type="text/javascript" src="https://cdn.staticfile.org/jquery/3.7.1/jquery.min.js"></script>
<!--
<script type="text/javascript" src="https://registry.npmmirror.com/echarts/5.4.3/files/dist/echarts.min.js"></script>
-->
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts@5.4.1/dist/echarts.min.js"></script>
<!--  www.qipa250.com 奇葩天地网-->
 
 
<script type="text/javascript">

    var chartDom = document.getElementById('qipa250');
    var myChart = echarts.init(chartDom);
    var option;
    const labels = ['春节', '元宵节', '端午节', '中秋节', '国庆节'];
    const seriesData = [
        {
            label: '春节',
            value: [32],
        },
        {
            label: '元宵节',
            value: [24],
        },
        {
            label: '端午节',
            value: [42],
        },
        {
            label: '中秋节',
            value: [20],
        },
        {
            label: '国庆节',
            value: [70],
        }
    ]
    const colors = [
        [
            {offset: 0, color: 'rgba(126, 132, 191, 1)'},
            {offset: 1, color: 'rgba(126, 132, 191, 0.08)'},
        ],
        [
            {offset: 0, color: 'rgba(137, 163, 164, 1)'},
            {offset: 1, color: 'rgba(137, 163, 164, 0.09)'},
        ],
        [
            {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)'},
        ],
        [
            {offset: 0, color: 'rgba(34, 66, 186, 1)'},
            {offset: 1, color: 'rgba(34, 66, 186, 0.08)'},
        ],
    ];

    option = {
        xAxis: {
            axisTick: {
                show: false
            },
            nameTextStyle: {
                color: '#fff'
            },
            data: labels,
        },
        legend: {
            data: getlegendData(),
            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: getSeriesData()
    };
    // 定义柱状图左侧图形元素
    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);

    function getlegendData() {
        const data = [];
        labels.forEach((item, index) => {
            data.push(
                {
                    name: item,
                    itemStyle: {
                        color: new echarts.graphic.LinearGradient(1, 0, 0, 0, colors[index]),
                    },
                }
            )
        })
        return data
    }

    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,
                    itemStyle: {
                        color: () => {
                            return new echarts.graphic.LinearGradient(0, 0, 0, 1, colors[index]);
                        },
                    },
                }
            )
        })
        return data
    }

    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()
                }
            ]
        };
    }


    option && myChart.setOption(option);

    window.addEventListener('resize', myChart.resize);


</script>
</body>
</html>
相关推荐
孟陬1 小时前
Foobar 技术周刊#159:当看不懂代码时,如何高效排障调试。脏页陷阱:一条只读查询,写入数 TB 数据。推测解码:大模型加速利器
前端·人工智能·后端
Zhao-Jichao1 小时前
AI Prompting for Everyone 课程笔记 - P17 图像生成 Imaging Generation
前端
Highcharts.js2 小时前
智能数据分析组件Orbit 正式发布与快速上手体验教程
前端·人工智能·信息可视化·数据分析系统·highcharts·orbit·智能可视化
螺丝钉tina2 小时前
[Playwright ][16]Playwright + TypeScript API 自动化测试实战:API测试
前端·javascript·typescript
Jmyd01233 小时前
文物3D数字化的技术选型指南:从WW/T 0115标准到落地工程,一次讲透采集、建档、管理与展示
3d·系统架构·博物馆·数字展厅·博物馆数字化
小天源3 小时前
智叟云集系统 · 架构与职责分层
服务器·前端·数据库
Highcharts.js5 小时前
React 中原生支持使用 JSX 组件配置自定义表格 Highcharts Grid
前端·javascript·react.js·前端框架·jsx·highcharts·自定义表格
薛定谔的猫-菜鸟程序员5 小时前
Electron开发超详细教程(从入门到放弃)
前端·javascript·electron
最强小杰5 小时前
DeepSeek V4 Flash + Codex CLI 接入教程:原生 Responses API 适配,从配置到跑通收藏这篇就够了(2026)
java·前端·python·ai
静水leo6 小时前
使用 Whistle 拦截接口并模拟后端响应
前端