vue3 echarts 堆叠柱状图动态多柱堆叠

在使用echarts堆叠柱状图的时候,常规堆叠柱状图每条柱子的堆叠种类是相同的,实际开发中可能存在不同的数据格式,此处以地区结合材料进行说明,例如 华南地区包含材料(金,银)华北地区包含(铜,金)这样就会出现数据出现差异的情况,echarts现有的堆叠柱状图无法满足需求,需要去手动转换数据

示例数据


let echartsArr = [
    {"materialName": "铜","totalQuantity": 49.959,"region": "华东"},
    {"materialName": "铜","totalQuantity": 2768.37, "region": "华东"},
    {"materialName": "黄金", "totalQuantity": 12450.45,"region": "海外"},
    {"materialName": "铜", "totalQuantity": 182.786, "region": "西南"},
    {"materialName": "铜", "totalQuantity": 100,"region": "华北"},
    {"materialName": "铜", "totalQuantity": 7.567,"region": "华南"},
    {"materialName": "铜", "totalQuantity": 980.614,"region": "西南"},
    {"materialName": "铜","totalQuantity": 17.3785, "region": "华东"},
    {"materialName": "铜","totalQuantity": 614.4005, "region": "华东"},
    {"materialName": "铜", "totalQuantity": 543.001,"region": "华东"},
    { "materialName": "铜","totalQuantity": 340.1462, "region": "华南"},
    {"materialName": "铜", "totalQuantity": 1370.1029, "region": "华南"}
]

需要把数据处理成echarts堆叠图数据格式

       // 处理数据格式
        // X轴坐标  数据排按照X轴排序 生成
        let xAxislegend = [...new Set(mapArrty(res.data.data, 'region'))]  // 
       // 材料名称 材料名称生成  图例  
        let legendData = [...new Set(mapArrty(res.data.data, 'materialName'))] || [] 
        // console.log(, 'totalNum')
        totalNum(res.data.data)
        let seriesData: any = []
        // 根据材料名称组合 echarts 堆叠柱状图数据格式
        legendData.map((val: any) => {
            seriesData.push({
                name: val, // 这个name需要和 legend 下面data里面的 name 对应起来
                type: 'bar', // 类型:柱状图
                // color: '#F56C6C', // 柱子颜色
                barWidth: 20,  // 柱子宽度
                stack: 'AS', // 两个柱子的 stack值相同时就会堆叠放置
                label: {
                    // show: true,  // 
                },
                showBackground: false, // 是否展示背后的阴影
                data: []
            },)
        })
         // 赋值data
         seriesData.map((item1: any) => {
         // totalNum用来获取的材料 对应的各个地区的材料总和
            let materialNameData: any = totalNum(res.data.data)
         // fillMissingValues 用来补全数据格式,有的地区会有这个材料有的地区没有,没有的地区按照X轴的排列顺序补充
            materialNameData[item1.name] = fillMissingValues(xAxislegend, materialNameData[item1.name])
            item1.data = Object.values(materialNameData[item1.name])
        })
//  对应的各个地区的材料总和
let totalNum = (items: any) => {
    let newArr = items.filter((val: any) => val.attribute5 && val.materialName && val.totalQuantity)
    const warehouseTotals = newArr.reduce((totals: any, item: any) => {
        const { materialName, totalQuantity, region} = item
        if (!totals[materialName]) {
            totals[materialName] = {}
        }
        if (!totals[materialName][region]) {
            totals[materialName][region] = 0
        }

        totals[materialName][region] += totalQuantity
        return totals
    }, {})
    // console.log(warehouseTotals, 'warehouseTotals')
    return warehouseTotals
}

// 补全数据格式
let fillMissingValues = (xAxislegend: any, copperData: any) => {
    // console.log(copperData, 'copperData')
    // 将缺失的数据补充  按照 xAxislegend的顺序排序
    var silverData: any = {}
    xAxislegend.forEach((region: any) => {
        silverData[region] = NP.strip(copperData[region]) || 0
    })
    // console.log(silverData, 'silverData')
    return silverData
}

// 获取对应的Key的数组 且不为空
let mapArrty = (data: any, key: any) => {
    let arr: any
    arr = data.filter((val: any) => val[key] != null).map((val: any) => val[key])
    return arr
}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值