echarts中动态生成多个series,并设置不同颜色

该博客介绍了如何从后台获取数据并在Vue中利用Echarts库创建柱状图。通过在methods和created生命周期钩子中定义函数,实现了数据的获取和图表的绘制。柱状图的每个系列使用了渐变颜色,并且图表会根据窗口大小自动调整。

 1、从后台获取数据,在methods里面定义

getMonthContractCount() {
        this.$api.getMonthContractCount().then(res => {
          if (res && res.data && res.data.code == '0') {
            let info = res.data.data
            //有两条数据,有个templateName,对应的有两个series
            if (info.length > 0) {
              let month = info[0].list.map(item => item.month)
              let name = info.map(item => item.templateName)
              this.drawContractaddChart(info, month, name)
            }
          }
        })
      },

2、在created里面

created() {
      this.getMonthContractCount();
    },

3、在methods里面定义画echarts方法

drawContractaddChart(dataList, month, name) {
        const myChart = echarts.init(document.getElementById('addContract-chart'));
        myChart.setOption({
          grid: { //调整图表上下左右位置
            top: '20%',
            left: '3%',
            right: '3%',
            bottom: '3%',
            containLabel: true
          },
          legend: {
            data: name,
            itemHeight: 8,
            itemWidth: 16,
            icon: 'roundRect',
            textStyle: {
              color: '#999'
            },
            top: '0px',
            right: '10px'
          },
          tooltip: {
            trigger: 'axis'
          },
          xAxis: {
            type: 'category',
            data: month,
            axisTick: {
              show: false
            },
            axisLine: {
              lineStyle: {
                color: '#C2C2C2'
              }
            },
            axisLabel: {
              show: true,
              interval: 0,
              rotate: 0,
            },
          },
          yAxis: {
            type: 'value',
            minInterval: 1,
            axisLine: {
              lineStyle: {
                color: '#C2C2C2'
              }
            }
          },
          series: (function() {
            let colorArr = [
              ['#98E9FB ', '#00D2FF'],
              ['#A6C2FB ', '#4E87FA'],
              ['#fd9e40', '#FB9633 '],
            ];
            var series = [];
            for (var i = 0; i < dataList.length; i++) {
              var item = {
                name: dataList[i].templateName,
                type: "bar",
                barWidth: 15,
                itemStyle: {
                  barBorderRadius: [10, 10, 0, 0],
                  color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
                      offset: 0,
                      color: colorArr[i][0]
                    },
                    {
                      offset: 1,
                      color: colorArr[i][1]
                    }
                  ])
                },
                data: dataList[i].list.map(item2 => item2.contractCount)
              };
              series.push(item);
            }
            return series;
          })(),
        });
        //随着屏幕大小调节图表
        window.addEventListener("resize", () => {
          myChart.resize();
        });
      },

### 实现 EChartsSeries 数据的动态生成 为了实现在 ECharts 图表中动态生成 `series` 数据,可以采用多种方法。一种常见的方式是在 JavaScript 或 Vue.js 环境下操作 ECharts 的配置项。 #### 方法一:JavaScript环境下的实现方式 当不知道具体会有多少条数据时,在 ECharts 配置对象 (`option`) 中将 `series` 设置成一个空数组,随着新数据的到来不断向该数组添加新的系列[^1]: ```javascript let option = { series: [] // 初始化为空数组 }; // 假设有新增的数据到来 function addSeriesData(newData){ newData.forEach(item => { option.series.push({ name: item.name, type: 'line', // 可以根据实际需求调整图表类型 data: item.data }); }); // 更新图表强制替换旧数据而非追加 myChart.setOption(option, true); } ``` 此代码片段展示了如何接收一批新的序列数据(`newData`)通过遍历这些数据构建相应的 `series` 对象加入到现有的选项配置当中去。最后调用 `setOption()` 函数刷新视图的同时传递第二个参数为 `true` 来确保只保留最新的一组数据而不与之前的记录混合在一起。 #### 方法二:Vue.js框架内的解决方案 对于使用 Vue.js 构建的应用程序来说,则可以通过定义组件的方法来处理这个问题。下面是一个简化版的例子说明怎样在 Vue 组件内部完成相同的功能[^2]: ```html <template> <div ref="barChart"></div> </template> <script> export default { methods:{ chartInit(legend,xAxis,newResult){ const option={ legend:{data:legend}, xAxis:{type:'category',data:xAxis}, yAxis:[{}], series:newResult.map((item)=>{ return{ name:item.name, type:'bar', data:item.value } }) }; this.$nextTick(()=>{ if(this.chartInstance)this.chartInstance.dispose(); this.chartInstance=echarts.init(this.$refs.barChart); window.addEventListener('resize',()=>this.chartInstance.resize()); this.chartInstance.setOption(option); }); } }} </script> ``` 这里的关键在于每当需要更新图表的时候先销毁当前存在的实例再重新创建一个新的实例,从而避免了重复绘制的问题;另外还监听窗口大小变化事件以便及时调整图表尺寸适应页面布局的变化。 #### 方法三:基于接口返回的数据自动生成多条折线 如果目标是依据后台 API 返回的结果自动形成多个折线(或其他类型的)图形,那么可以根据接收到的具体结构灵活地组装出所需的 `series` 数组成员[^3]: 假设服务器端传回了一个 JSON 格式的响应体,其中包含了若干个项目的名称及其对应的时间序列数值列表。此时就可以按照如下逻辑编写函数来自动生成适合展示给用户的图表内容: ```javascript async function fetchAndRenderLineChartData(){ try{ const response=await axios.get('/api/data'); let fixedLines=['A','B','C','D']; // 定义四条固定线条的名字 let dynamicSeries=response.data.projects.map(project=>{ return { name:`Project ${project.id}`, type:'line', smooth:true, showSymbol:false, lineStyle:{width:2}, emphasis:{focus:'series'}, data:Object.values(project.metrics).map(metric=>metric.value) }; }).concat(fixedLines.map(name=>({name,type:'line'}))); renderEcharts(dynamicSeries); }catch(error){console.error(error);} } function renderEcharts(seriesArray){ let option={...}; option.series=seriesArray; myChart.setOption(option); } ``` 上述例子中首先获取到了远程服务提供的原始资料集,接着从中提取出了所有非固定的项目作为额外增加进去的新线条,同时也保持了一定数量的基础参照物不变。最终把两者结合起来构建成完整的 `series` 列表供后续渲染之用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

~犇犇~

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

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

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

打赏作者

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

抵扣说明:

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

余额充值