Echarts 3D立体堆叠柱状图

实现效果如下图

1:堆叠柱状图组成

      其实是利用5部分拼接而成得,3个底部菱形和2个直角边,直角边利用两种颜色得对比渲染而成.

2:具体代码实现
<script lang="ts" setup>
import { ref, onMounted } from 'vue';
import * as echarts from 'echarts';

const echart = ref<any>();
const color = [
    {
        type: "linear",
        x: 0,
        x2: 1,
        y: 0,
        y2: 0,
        colorStops: [
            {
                offset: 0,
                color: "#12509D",
            },
            {
                offset: 0.5,
                color: "#12509D",
            },
            {
                offset: 0.5,
                color: "#1870DA",
            },
            {
                offset: 1,
                color: "#1870DA",
            },
        ],
    },
    {
        type: "linear",
        x: 0,
        x2: 1,
        y: 0,
        y2: 0,
        colorStops: [
            {
                offset: 0,
                color: "#23D2DA",
            },
            {
                offset: 0.5,
                color: "#23D2DA",
            },
            {
                offset: 0.5,
                color: "#25DEE6",
            },
            {
                offset: 1,
                color: "#25DEE6",
            },
        ],
    },
];
const barWidth = 30;
const xData = ["1月", "2月", "3月"];
// 总数据
const allData = [1000, 660, 800];
// 完成数据
const completeData = [720, 532, 301];
const topData = ref<any>([]);
const milddleData = ref<any>([]);

//计算堆叠数据为多少
for (var i = 0; i < allData.length; i++) {
    allData[i] = Number(allData[i]);
    completeData[i] = Number(completeData[i]);
    milddleData.value[i] = allData[i] - completeData[i];
    if (allData[i] <= 0) {
        topData.value.push({
            value: 0,
            itemStyle: {
                normal: {
                    borderColor: "red",
                    borderWidth: 2,
                    color: "rgba(0,0,0,0)",
                },
            },
        });
    } else {
        if (milddleData[i] > 0) {
            topData.value.push({
                value: allData[i],
                itemStyle: {
                    normal: {
                        borderColor: "#29F1FA",
                        borderWidth: 2,
                        color: "#29F1FA",
                    },
                },
            });
        } else {
            topData.value.push({
                value: allData[i],
                itemStyle: {
                    normal: {
                        borderColor: "#1D8EF3",
                        borderWidth: 2,
                        color: "#1D8EF3",
                    },
                },
            });
        }
    }
};

onMounted(() => {
    init();
});

let init = () => {
    var myChart = echarts.init(echart.value);

    var option;

    option = {
        tooltip: {
            trigger: 'axis',
        },
        // 调整图像x轴
        xAxis: {
            data: xData,
            axisTick: {
                show: false,
            },
            axisLabel: {
                show: true,
            },
            axisLine: {
                show: true,
            },
        },
        //调整图像y轴
        yAxis: {
            axisTick: {
                show: false,
            },
            axisLine: {
                show: true,
            },
            axisLabel: {
                show: true,
            },
            splitLine: {
                show: true,
                lineStyle: {
                    color: '#FFFFFF',
                    width: 1,
                    opacity: 0.11,
                }
            }
        },
        //图像展示部分
        series: [
            {
                z: 1,
                name: "消耗",
                type: "bar",
                stack: '1',
                barWidth: barWidth,
                // stack: "总量",
                color: color[0],
                data: completeData,
            },
            {
                z: 2,
                name: "剩余",
                type: "bar",
                stack: '1',
                barWidth: barWidth,
                // stack: "总量",
                color: color[1],
                data: milddleData.value,
            },
            //某个柱形的底部
            {
                z: 3,
                name: "中部",
                type: "pictorialBar",
                data: completeData,
                symbol: "diamond",
                symbolPosition: "end",
                symbolOffset: ["0%", "-50%"],
                symbolSize: [barWidth, 10],
                itemStyle: {
                    normal: {
                        color: color[1],
                    },
                },
                tooltip: {
                    show: false,
                },
            },
            {
                z: 4,
                name: "总量",
                type: "pictorialBar",
                symbolPosition: "end",
                data: topData.value,
                symbol: "diamond",
                symbolOffset: ["0%", "-50%"],
                symbolSize: [barWidth - 4, (10 * (barWidth - 4)) / barWidth],
                tooltip: {
                    show: true,
                },
                itemStyle: {
                    normal: {
                        label: {
                            formatter: "{c}",
                            show: true,
                            position: "top",
                            textStyle: {
                                fontWeight: 400,
                                fontSize: "13",
                                color: "#F2F7FA",
                                lineHeight: 20,
                            },
                        },
                    }
                }
            },

        ],

    }
    option && myChart.setOption(option);

};
</script>

不足之处欢迎指正 !!!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Echarts中,可以使用堆叠(stack)属性来实现多个堆叠柱状图的简写。具体步骤如下: 1. 首先,引入Echarts库和相关的样式文件。 2. 创建一个容器元素,用于显示图表。 3. 定义一个配置项对象,包含图表的基本设置和数据。 4. 在配置项对象中,使用series属性来定义多个堆叠柱状图。 5. 在每个堆叠柱状图的series属性中,设置type为'bar',表示柱状图类型。 6. 在每个堆叠柱状图的series属性中,设置stack属性为相同的值,表示这些柱状图要进行堆叠。 7. 在每个堆叠柱状图的series属性中,设置data属性为对应的数据。 8. 最后,使用echarts.init方法初始化图表,并使用setOption方法将配置项应用到图表中。 以下是一个简单的示例代码: ```javascript // 引入Echarts库和相关的样式文件 <script src="echarts.min.js"></script> // 创建一个容器元素,用于显示图表 <div id="chart"></div> // 定义一个配置项对象,包含图表的基本设置和数据 var option = { // 设置图表的标题、坐标轴等属性 title: { text: '堆叠柱状图示例' }, xAxis: { data: ['A', 'B', 'C', 'D', 'E'] }, yAxis: {}, series: [ // 第一个堆叠柱状图 { name: '图例1', type: 'bar', stack: '堆叠', data: [100, 200, 300, 400, 500] }, // 第二个堆叠柱状图 { name: '图例2', type: 'bar', stack: '堆叠', data: [200, 300, 400, 500, 600] }, // 第三个堆叠柱状图 { name: '图例3', type: 'bar', stack: '堆叠', data: [300, 400, 500, 600, 700] } ] }; // 初始化图表并应用配置项 var chart = echarts.init(document.getElementById('chart')); chart.setOption(option); ``` 这样,就可以实现多个堆叠柱状图的简写了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值