echart图,多柱状图没有值不占位

本文介绍了在开发中如何解决ECharts图表中数据缺失造成的占位问题,通过实例展示了从数据预处理到代码实现的完整过程,重点在于代码调整和美化图表效果的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

开发过程中遇到这样一个问题

实现前的效果如图所示

没有数据的也会产生占位,导致页面效果不是很好

实现之后的效果

 

实现代码

 barDataList是后台返回的值

xAxname 是x轴的坐标

names 是对应的第一个x轴的数据名称

initBar() {
        let colorList = [
          "#2b9eff",
          "#ff8f41",
          "#c441fb",
          "#2fb74f",
          "#3b42d9",
          "#8f59e5",
          "#b20dee",
        ];
        let names = proxy.barDataList.map((item) => item.name);
        let xAxname = proxy.barDataList[0].nameArr
          ? proxy.barDataList[0].nameArr.map((item) => item)
          : [];
        proxy.barDataList.sort(bar.compare("name", true));
        let aXiasList = [];
        let seriesList = [];
        xAxname.forEach((res, key) => {
          let aXiasdata = [];
          xAxname.forEach(() => {
            aXiasdata.push("");
          });
          aXiasdata[key] = res;
          let obj = {
            type: "category",
            position: "bottom",
            data: aXiasdata,
          };
          aXiasList.push(obj);
        });
        proxy.barDataList.forEach((item, index) => {
          for (let i = 0; i < item.data.length; i++) {
            if (item.data[i] && item.data[i].count) {
              let newArrList = [];
              for (let a = 0; a < i; a++) {
                newArrList.push("");
              }
              newArrList[i] = item.data[i].count;
              let serObg = {
                name: item.name,
                type: "bar",
                xAxisIndex: i,
                data: newArrList,
                barWidth: 10,
                itemStyle: {
                  normal: {
                    color: colorList[index],
                  },
                },
              };
              seriesList.push(serObg);
            }
          }
        });
        let namenum = Math.floor(100 / names.length);
        let myChart = echarts.init(proxy.$refs.barChart);
        myChart.setOption({
          tooltip: {
            trigger: "axis",
            axisPointer: {
              label: {
                backgroundColor: "#6a7985",
              },
            },
            formatter: function (params) {
              let result = `<div>${params[0].name}</div>`;
              params.forEach(function (item) {
                let dotHtml =
                  '<span style="display:inline-block;margin-right:5px;border-radius:10px;width:10px;height:10px;background-color:' +
                  item.color +
                  '"></span>';
                result += item.value
                  ? `${dotHtml}${item.seriesName}: ${item.value}<br/>`
                  : "";
              });
              return result;
            },
          },
          grid: {
            height: proxy.barHeight,
            bottom: "30%",
            right: 50,
          },
          xAxis: aXiasList,
          yAxis: {
            type: "value",
            axisLabel: {
              color: "#FFFFFF",
              formatter: function (value, index) {
                if (value > 10000 && value <= 10000000) {
                  value = value / 10000 + "万";
                } else if (value >= 10000000) {
                  value = value / 10000000 + "千万";
                }
                return value;
              },
            },
            splitLine: {
              lineStyle: {
                color: "rgba(41,132,171, 0.2)",
              },
            },
          },
          series: seriesList,
        });
      },
<think>好的,我现在需要帮用户解决如何用ECharts实现瀑布的问题。首先,用户提到了他们找到了引用[2],里面提到了瀑布的原理和适用场景,所以可能已经有一定的背景知识,但需要具体的实现步骤和示例。 首先,我得回忆一下ECharts瀑布的基本结构。瀑布通常用来展示数据的累加过程,比如预算的变化。每个柱子可能代表正数或负数,且部分柱子是累计ECharts没有直接叫“瀑布”的表类型,但可以通过配置柱状图来实现。 接下来,我需要考虑如何配置数据系列。可能需要使用stack属性来堆叠柱子,同时设置同的颜色区分正负。此外,可能需要在数据中设置占位符,使得某些柱子看起来像是从前面柱子的顶端开始,而是从零开始。 然后,数据处理部分。用户的数据可能是一个数组,需要转换成包含value和itemStyle的对象数组。例如,正数用绿色,负数用红色,中间的过渡项可能需要透明或其他处理。 然后,示例代码的结构。需要引入ECharts,初始化实例,设置option。其中,x轴可能是分类数据,y轴是数。系列中的每个数据点需要正确配置,特别是占位符的部分,可能用字符串作为标签,并且设置透明颜色。 还需要考虑例、提示框、标题等配置,确保表清晰易懂。可能还需要处理坐标轴的标签和刻度,避免显示必要的元素。 用户可能遇到的问题包括堆叠正确、颜色设置错误或者数据转换的问题。这时候需要检查stack的配置是否正确,每个数据点的itemStyle是否覆盖了全局样式,以及占位符的是否正确计算。 最后,要确保代码示例能够运行,并且符合用户的实际需求,比如展示预算消耗的过程。可能还需要提醒用户安装ECharts的方式,如npm安装或者CDN引入,但根据用户提供的引用,他们可能已经知道如何引入了,所以示例代码中可能需要详细说明这部分。 总结步骤:安装ECharts,准备数据,配置option,初始化表。数据转换是关键,需要处理占位符和样式。同时,提供相关的问题,帮助用户进一步学习优化和应用场景。</think>以下是如何使用ECharts实现瀑布的详细步骤及示例: ### 一、实现步骤 1. **安装ECharts** 通过npm安装或直接引入CDN: ```bash npm install echarts --save # 通过npm安装 ``` ```html <script src="https://cdn.jsdelivr.net/npm/echarts@5.4.2/dist/echarts.min.js"></script> <!-- CDN引入 --> ``` 2. **数据准备** 瀑布数据需包含初始、中间增减和最终,例如: $$ \text{预算数据} = [初始, +增量1, -减量1, +增量2, ..., 最终] $$ 3. **核心配置项** ```javascript const option = { xAxis: { type: 'category', data: ['初始预算', '采购', '人力', '营销', '总预算'] }, yAxis: { type: 'value' }, series: [{ type: 'bar', stack: '总量', // 关键配置:堆叠效果 itemStyle: { color: '#5470C6' }, data: [12000, 3000, -4000, 2000, null] // null表示占位数据点 }, { type: 'bar', stack: '总量', itemStyle: { color: '#91CC75' }, data: [0, 0, 0, 0, 13000] // 最终单独显示 }] }; ``` ### 二、完整示例代码 ```html <div id="chart" style="width: 600px;height:400px;"></div> <script> const chart = echarts.init(document.getElementById('chart')); const data = [ { value: 12000, itemStyle: { color: '#5470C6' } }, // 初始预算 { value: 3000, itemStyle: { color: '#91CC75' } }, // 收入 { value: -4000, itemStyle: { color: '#EE6666' } }, // 支出 { value: 2000, itemStyle: { color: '#91CC75' } }, // 收入 { value: 13000, itemStyle: { color: '#5470C6' } } // 总预算 ]; const option = { title: { text: '项目预算消耗瀑布' }, tooltip: { trigger: 'axis' }, xAxis: { type: 'category', data: ['初始预算', '采购支出', '人力成本', '营销收入', '最终预算'] }, yAxis: { type: 'value' }, series: [{ name: '预算变化', type: 'bar', stack: '总量', label: { show: true, position: 'inside' }, data: data.map((item, index) => ({ value: index === data.length -1 ? null : Math.abs(item.value), itemStyle: item.itemStyle })) }] }; chart.setOption(option); </script> ``` ### 三、关键原理说明 1. **堆叠效果** 通过`stack: '总量'`实现柱子的堆叠,每个柱子基于前一个柱子的顶部位置绘制,形成累加效果[^2]。 2. **颜色区分** 使用同颜色编码正负(绿色表示收入,红色表示支出),最终预算通常与初始同色系。 3. **占位技巧** 最后一个数据点设置为`null`并单独定义样式,避免重复计算累计
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值