echarts实现3D立体堆叠柱状图

基于这篇博客的灵感,在其基础上做了一些改动;

echarts叠加3D立体柱状图_黑色的糖果的博客-CSDN博客_echarts立体柱状堆叠图

效果图

实现代码:

var legends = ['A相','B相','C相'];
    var name = ['01:00','02:00','03:00','04:00','05:00','06:00','07:00','08:00','09:00','10:00','11:00','12:00','13:00'];
    // 数据数组1
    var data = [0.73,0.57,0.48,0.45,0.56,0.49,0.4,0.13,0.84,0.76,0.31,0.27,0.92];
    // 数据数组2
    var data2 = [1.44,1.44,1.44,1.44,1.44,1.44,1.44,1.44,1.44,1.44,1.44,1.44,1.44];
    var data3 = [1.44,1.44,1.44,1.44,1.44,1.44,1.44,1.44,1.44,1.44,1.44,1.44,1.44];
    var color = [
        {
            type: "linear",
            x: 0,
            x2: 1,
            y: 0,
            y2: 0,
            colorStops: [
                {
                    offset: 0,
                    color: "#a7f8f3",
                },
                {
                    offset: 0.5,
                    color: "#a7f8f3",
                },
                {
                    offset: 0.5,
                    color: "#62ccc6",
                },
                {
                    offset: 1,
                    color: "#62ccc6",
                },
            ],
        },
        {
            type: "linear",
            x: 0,
            x2: 1,
            y: 0,
            y2: 0,
            colorStops: [
                {
                    offset: 0,
                    color: "#fdb8b8",
                },
                {
                    offset: 0.5,
                    color: "#fdb8b8",
                },
                {
                    offset: 0.5,
                    color: "#f07070",
                },
                {
                    offset: 1,
                    color: "#f07070",
                },
            ],
        },        {
            type: "linear",
            x: 0,
            x2: 1,
            y: 0,
            y2: 0,
            colorStops: [
                {
                    offset: 0,
                    color: "#0ffdbf",
                },
                {
                    offset: 0.5,
                    color: "#0ffdbf",
                },
                {
                    offset: 0.5,
                    color: "#8ffd86",
                },
                {
                    offset: 1,
                    color: "#8ffd86",
                },
            ],
        },
    ];
    var barWidth = 30;
    var constData = [];
    var constData2 = [];
    var showData = [];
    var otherData = [];
    for (var i = 0; i < data.length; i++) {
        data[i] = Number(data[i]);
        data2[i] = Number(data2[i]);
        data3[i] = Number(data3[i]);
        otherData[i] = data[i] + data2[i] + data3[i];
        constData2[i] = data[i] + data2[i];
        if (data[i] <= 0) {
            constData.push(0);
            showData.push({
                value: 1,
                itemStyle: {
                    normal: {
                        borderColor: "rgba(0,0,0,0)",
                        borderWidth: 2,
                        color: "rgba(0,0,0,0)",
                    },
                },
            });
        } else {
            constData.push(1);
            if (data2[i] > 0) {
                showData.push({
                    value: data[i],
                    itemStyle: {
                        normal: {
                            borderColor: "#fdb8b8",// 第二个柱子底部的颜色
                            borderWidth: 2,
                            color: "#fdb8b8",
                        },
                    },
                });
            } else {
                showData.push({
                    value: data[i],
                    itemStyle: {
                        normal: {
                            borderColor: "#89e3ec",
                            borderWidth: 2,
                            color: "#89e3ec",
                        },
                    },
                });
            }
        }
    }
    console.log(constData)
    console.log(constData2)
    console.log(otherData)
    var option = {
        tooltip: {
            trigger: "axis",
            formatter: function (params) {
                return params[0].name + '<br/>'
                    + params[0].seriesName + ' : ' + (params[0].value).toFixed(2) + '<br/>'
                    + params[1].seriesName + ' : ' + (params[1].value).toFixed(2) + '<br/>'
                    + params[2].seriesName + ' : ' + (params[2].value).toFixed(2) + '<br/>';
            }
        },
        legend: {
            data: legends,
            selectedMode: false,//取消点击事件
            show: true
        },
        grid: {
            left: "3%", //图表距边框的距离
            right: "3%",
            top: "15%",
            bottom: "5%",
            containLabel: true,
        },
        xAxis: {
            data: name,
            axisTick: {
                show: false,
            },
        },
        yAxis: {
            name:'线损值/kWh',
            axisTick: {
                show: false,
            }
        },
        series: [
            {
                z: 1,
                name: legends[0],
                type: "bar",
                barWidth: barWidth,
                stack: "总量",
                color: color[0],
                data: data,
            },
            {
                z: 2,
                name:legends[1],
                type: "bar",
                barWidth: barWidth,
                stack: "总量",
                color: color[1],
                data: data2
            },
            {
                z: 3,
                name: legends[2],
                type: "bar",
                barWidth: barWidth,
                stack: "总量",
                color: color[2],
                data: data3
            },
            {
                z: 4,
                name: "项目",
                type: "pictorialBar",
                data: constData,
                symbol: "diamond",
                symbolOffset: ["0%", "50%"],
                symbolSize: [barWidth, 10],
                itemStyle: {
                    normal: {
                        color: color[0],
                    },
                },
                tooltip: {
                    show: false,
                },
            },
            {
                z: 5,
                name: "项目",
                type: "pictorialBar",
                data: constData2,
                symbolPosition: "end",
                symbol: "diamond",
                symbolOffset: ["0%", "-50%"],
                symbolSize: [barWidth, 10],
                itemStyle: {
                    normal: {
                        color: color[2],
                    },
                },
                tooltip: {
                    show: false,
                },
            },
            {
                z: 6,
                name: "项目",
                type: "pictorialBar",
                data: otherData,
                symbol: "diamond",
                symbolPosition: "end",
                symbolOffset: ["0%", "-50%"],
                symbolSize: [barWidth, 10],
                itemStyle: {
                    normal: {
                        color: color[2],
                    },
                },
                tooltip: {
                    show: false,
                },
            },
            {
                z: 7,
                name: "项目",
                type: "pictorialBar",
                symbolPosition: "end",
                data: showData,
                symbol: "diamond",
                symbolOffset: ["0%", "-50%"],
                symbolSize: [barWidth - 4, (10 * (barWidth - 4)) / barWidth],
                tooltip: {
                    show: false,
                },
            },
        ],
    };

ECharts 是一个由百度开源的数据可视化库,支持多种图表类型并提供丰富的配置选项。实现多组立体柱状图堆叠可以展示数据之间的对比,并通过堆叠效果清晰地表示各部分占比。 ### 实现步骤 #### 步骤 1: 准备数据结构 为了创建堆叠立体柱状图,你需要准备一组或多组数据,每组数据代表一个类别下的多个值,这些值将用于堆叠显示。例如: ```javascript var data = [ {name: 'A', type: 'bar1', value: 20}, {name: 'B', type: 'bar1', value: 40}, {name: 'C', type: 'bar1', value: 60}, // 第二组柱状图 {name: 'A', type: 'bar2', value: 15}, {name: 'B', type: 'bar2', value: 30}, {name: 'C', type: 'bar2', value: 45} ]; ``` 这里每个元素都是一个包含`name`、`type`和`value`属性的对象,`type`标识了这根柱子属于哪一组。 #### 步骤 2: 使用ECharts初始化图表 首先引入 ECharts 的 JS 文件,然后初始化图表容器和配置项: ```html <!-- 引入EchartsJS文件 --> <script src="https://cdn.bootcdn.net/ajax/libs/echarts/5.4.1/echarts.min.js"></script> <div id="main" style="width: 600px;height:400px;"></div> <script> // 初始化ECharts实例 var myChart = echarts.init(document.getElementById('main')); // 配置项 var option = { xAxis: { type: 'category', data: ['A', 'B', 'C'] }, yAxis: { type: 'value' }, series: [{ name: '第一组柱状图', type: 'bar', stack: 'stack', data: [20, 40, 60], label: { show: true, position: 'top' } }, { name: '第二组柱状图', type: 'bar', stack: 'stack', data: [15, 30, 45], label: { show: true, position: 'top' } }] }; // 设置图表选项 myChart.setOption(option); </script> ``` 在这个例子中,我们设置了一个 `stack: 'stack'` 来表明我们需要堆叠的系列。 #### 步骤 3: 动态更新数据 如果你需要动态添加或修改数据,可以在图表外部处理这个过程,然后重新设置 `option.series.data` 并触发 `myChart.resize()` 或 `myChart.setOption()` 来更新视图。 ### 相关问题: 1. **如何调整ECharts中的颜色和样式**? 调整ECharts的颜色和样式通常通过`series`配置项的`color`属性实现,也可以使用主题管理或自定义CSS样式覆盖默认样式。 2. **在ECharts中如何添加交互功能,如点击事件或悬停提示**? 可以通过`data`数组中的额外配置项或使用`toolbox`组件来添加交互功能,比如鼠标悬浮时显示数据标签或点击事件。 3. **如何优化ECharts性能以适应大量数据集**? 对于大数据集,可以考虑使用ECharts的数据筛选功能、动态加载、分块展示等策略,以及优化数据清洗和预处理流程。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宁漂打工仔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值