首页 > 其他分享 >[echarts]vue2项目中折柱图-柱形图伪3d效果实现

[echarts]vue2项目中折柱图-柱形图伪3d效果实现

时间:2024-04-10 14:59:43浏览次数:28  
标签:color data barWidth 柱形图 中折柱 vue2 offset var type

不知道是不是现在的版本更新了,echarts-gl在vue2项目中不能适配使用,难蹦

一.需求分析与设计思路

项目当中遇到改版升级,想要实现如下的一下折柱图的立体效果

想在原来平面柱状图的基础上,有立体的效果.本来打算用echarts-gl库来实现3d版的柱形图,但是引入和配置后,浏览器总是报不能识别的错误,为了尽快实现类似效果,就换做左右色差来做效果.

二.环境准备与依赖引入

主要组件库还是基于echarts 库,没有安装的直接在终端输入以下代码安装

npm i echarts

然后在你封装或者使用图表的地方引入使用即可

import * as echarts from 'echarts';

三.构建伪3d柱形图

1.首先按照惯例创建图表元素

<!-- 折线图 -->
<template>
  <div id="bar3d" style="width: 100%; height: 110%; padding-top: 20px; padding-left: 10px"></div>
</template>

当然,行内调整样式根据自己的情况

2.引入echarts,配置该组件需要接收的参数,我个人项目中的情况如下

import echartMixins from './echartMixins';
import * as echarts from 'echarts';
import echartMixins from './echartMixins';
//引入的混入中,主要封装了父组件需要往子组件中传递的x轴信息,y轴最大值信息,以及不同柱形以及折线的y轴信息
//依次为xAxisData,values,maxX



//声明下面变量来控制图表是否已经初始化
  data() {
    return {
      hasInitChart: false,
    };
  },

3.具体思路及代码实时

第一版的时候,我是想采用拼接的方法来达到立体的效果,具体就是在配置每个y轴柱形的数据时,将每个柱形分为3部分组成, 上部-中部-下部,设置头部/底部为椭圆效果,中部为左右色差效果,具体效果和代码如下图

  methods: {
    init() {
      //绿色
      const data = [1700, 800, 1700, 600, 800, 1700];
      //蓝色
      const data2 = [2600, 1400, 3350, 1400, 1400, 3350];
      const sideData = data.map((item) => item + 90);
      const sideData2 = data.map((item) => item + 90);
      var serveTBar = echarts.init(document.getElementById('bar3d'));
      serveTBar.setOption(getEcharts3DBar());

      function getEcharts3DBar() {
        //蓝色
        var colorArr2 = ['rgba(11, 83, 128)', 'rgba(2, 143, 224)'];
        //绿色
        var colorArr = ['rgb(12, 109, 122)', 'rgba(1, 241, 228)'];
        //绿色
        var color = {
          type: 'linear',
          x: 0,
          x2: 1,
          y: 0,
          y2: 0,
          colorStops: [
            {
              offset: 0,
              color: colorArr[0],
            },
            {
              offset: 0.5,
              color: colorArr[0],
            },
            {
              offset: 0.5,
              color: colorArr[1],
            },
            {
              offset: 1,
              color: colorArr[1],
            },
          ],
        };
        var color2 = {
          type: 'linear',
          x: 0,
          x2: 1,
          y: 0,
          y2: 0,
          colorStops: [
            {
              offset: 0,
              color: colorArr2[0],
            },
            {
              offset: 0.5,
              color: colorArr2[0],
            },
            {
              offset: 0.5,
              color: colorArr2[1],
            },
            {
              offset: 1,
              color: colorArr2[1],
            },
          ],
        };
        var barWidth = 15;
        var option = {
          tooltip: {
            trigger: 'axis',
            formatter: function (params) {
              var str = params[0].name + ':';
              params.filter(function (item) {
                if (item.componentSubType == 'bar') {
                  str += '<br/>' + item.seriesName + ':' + item.value;
                }
              });
              return str;
            },
          },
          //图表大小位置限制
          grid: {
            x: '10%',
            x2: '5%',
            y: '15%',
            y2: '15%',
          },
          xAxis: {
            data: ['1月', '2月', '3月', '4月', '5月', '6月'],
            //坐标轴
            axisLine: {
              show: true,
              lineStyle: {
                width: 1,
                color: '#214776',
              },
              textStyle: {
                color: '#fff',
                fontSize: '10',
              },
            },
            type: 'category',
            axisLabel: {
              textStyle: {
                color: '#C5DFFB',
                fontWeight: 500,
                fontSize: '14',
              },
            },
            axisTick: {
              textStyle: {
                color: '#fff',
                fontSize: '16',
              },
              show: false,
            },
            axisLine: {
              show: true,
              lineStyle: {
                type: 'dashed', //线的类型 虚线
                color: '#DEDEDE',
              },
            },
          },
          yAxis: {
            name: '自定义显示',
            nameTextStyle: {
              color: '#DEDEDE',
              fontSize: 12,
              padding: 10,
            },
            min: 0, //最小
            max: 3500, //最大
            interval: 500, //相差
            type: 'value',
            splitLine: {
              show: true,
              lineStyle: {
                type: 'dashed', //线的类型 虚线0
                opacity: 0.2, //透明度
              },
            },
            axisTick: {
              show: false,
            },
            axisLine: {
              show: false,
            },
            //坐标值标注
            axisLabel: {
              show: true,
              textStyle: {
                color: '#C5DFFB',
              },
            },
          },
          series: [
            //中
            {
              z: 1,
              name: '绿色',
              type: 'bar',
              barWidth: barWidth,
              barGap: '0%',
              data: data,
              itemStyle: {
                normal: {
                  color: color,
                  //柱形图上方标题
                  label: {
                    show: true,
                    position: 'top',
                    textStyle: {
                      color: 'rgb(1, 255, 250)',
                      fontSize: 8,
                    },
                  },
                },
              },
            },
            //下
            {
              z: 2,
              name: '绿色',
              type: 'pictorialBar',
              data: sideData,
              symbol: 'roundRect',
              symbolOffset: ['-75%', '50%'],
              symbolSize: [barWidth, 10],
              itemStyle: {
                normal: {
                  color: color,
                },
              },
              tooltip: {
                show: false,
              },
            },
            //上
            {
              z: 3,
              name: '绿色',
              type: 'pictorialBar',
              symbolPosition: 'end',
              data: data,
              symbol: 'roundRect',
              symbolOffset: ['-75%', '-50%'],
              symbolSize: [barWidth - 4, (10 * (barWidth - 4)) / barWidth],
              itemStyle: {
                normal: {
                  borderWidth: 2,
                  color: colorArr[2],
                },
              },
              tooltip: {
                show: false,
              },
            },
            {
              z: 1,
              name: '蓝色',
              type: 'bar',
              barWidth: barWidth,
              barGap: '50%',
              data: data2,
              itemStyle: {
                normal: {
                  color: color2,
                  //柱形图上方标题
                  label: {
                    show: true,
                    position: 'top',
                    textStyle: {
                      color: 'rgb(2, 157, 246)',
                      fontSize: 8,
                    },
                  },
                },
              },
            },
            {
              z: 2,
              name: '蓝色',
              type: 'pictorialBar',
              data: sideData2,
              symbol: 'roundRect',
              symbolOffset: ['75%', '50%'],
              symbolSize: [barWidth, 10],
              itemStyle: {
                normal: {
                  color: color2,
                },
              },
              tooltip: {
                show: false,
              },
            },
            {
              z: 3,
              name: '蓝色',
              type: 'pictorialBar',
              symbolPosition: 'end',
              data: data2,
              symbol: 'roundRect',
              symbolOffset: ['75%', '-50%'],
              symbolSize: [barWidth - 4, (10 * (barWidth - 4)) / barWidth],
              itemStyle: {
                normal: {
                  borderWidth: 2,
                  color: colorArr2[2],
                },
              },
              tooltip: {
                show: false,
              },
            },
          ],
        };
        return option;
      }
    },
  },

但是这样设置静态柱形图,微调下看着或许是没有什么影响,但是当你多个柱形的时候,点击上方的legend标签来控制柱形的显示与隐藏时,每个柱形原本的上部和下部就会偏移,不能很好的控制上和下部的相对定位,于是边保留了部分代码,换做下面的一种类似效果

第二版效果如下

去除上部和下部的组合,只保留了色差的效果,代码如下

    initChart(xAxisData, values, maxX) {
      var serveTBar = echarts.init(document.getElementById('bar3d'));
      serveTBar.setOption(getEcharts3DBar());

      function getEcharts3DBar() {
        //提醒数
        var colorArr2 = ['rgba(232, 137, 187,1)', 'rgba(232, 137, 187,0.7)'];
        //预加载
        var colorArr = ['rgba(249, 218, 142,1)', 'rgba(240, 234, 142,0.7)'];
        //互认数
        var colorArr3 = ['rgba(89, 172, 176,1)', 'rgba(89, 172, 176,0.7)'];
        //引用数
        var colorArr4 = ['rgba(104, 221, 250,1)', 'rgba(104, 221, 250,0.7)'];
        //颜色设置
        var color = {
          type: 'linear',
          x: 0,
          x2: 1,
          y: 0,
          y2: 0,
          colorStops: [
            {
              offset: 0,
              color: colorArr[1], // 不透明
            },
            {
              offset: 0.5,
              color: colorArr[1], // 不透明
            },
            {
              offset: 0.5,
              color: colorArr[0], // 更透明
            },
            {
              offset: 1,
              color: colorArr[0], // 更透明
            },
          ],
        };
        var color2 = {
          type: 'linear',
          x: 0,
          x2: 1,
          y: 0,
          y2: 0,
          colorStops: [
            {
              offset: 0,
              color: colorArr2[1],
            },
            {
              offset: 0.5,
              color: colorArr2[1],
            },
            {
              offset: 0.5,
              color: colorArr2[0],
            },
            {
              offset: 1,
              color: colorArr2[0],
            },
          ],
        };
        var color3 = {
          type: 'linear',
          x: 0,
          x2: 1,
          y: 0,
          y2: 0,
          colorStops: [
            {
              offset: 0,
              color: colorArr3[1],
            },
            {
              offset: 0.5,
              color: colorArr3[1],
            },
            {
              offset: 0.5,
              color: colorArr3[0],
            },
            {
              offset: 1,
              color: colorArr3[0],
            },
          ],
        };
        var color4 = {
          type: 'linear',
          x: 0,
          x2: 1,
          y: 0,
          y2: 0,
          colorStops: [
            {
              offset: 0,
              color: colorArr4[1],
            },
            {
              offset: 0.5,
              color: colorArr4[1],
            },
            {
              offset: 0.5,
              color: colorArr4[0],
            },
            {
              offset: 1,
              color: colorArr4[0],
            },
          ],
        };
        //柱子宽度
        var barWidth = 10;
        var option = {
          tooltip: {
            trigger: 'axis',
            axisPointer: {
              type: 'cross',
              crossStyle: {
                color: '#999',
              },
            },
            backgroundColor: 'rgba(16, 29, 66,0.8)',
            textStyle: {
              color: '#fff',
            },
            borderColor: '#63acf3',
          },
          grid: {
            x: '10%',
            x2: '15%',
            y: '20%',
            y2: '25%',
          },
          legend: {
            data: ['预加载', '提醒数', '互认数', '引用数', '互认率'],
            textStyle: {
              color: '#fff',
            },
            itemWidth: 6,
            itemHeight: 3,
          },
          xAxis: {
            data: xAxisData,
            type: 'category',
            axisPointer: {
              type: 'shadow',
            },
            //字体颜色
            axisLabel: {
              textStyle: {
                color: '#fff',
              },
            },
            axisLabel: {
              interval: 0,
              textStyle: {
                color: 'fff',
                fontWeight: 500,
                fontSize: '12',
              },
            },
          },
          yAxis: [
            {
              type: 'value',
              name: '次',
              nameTextStyle: {
                color: '#fff', // 白色
              },
              min: 0,
              max: maxX,
              interval: maxX / 5,
              axisLabel: {
                formatter: function (value) {
                  return value / 10000 + '万';
                },
                textStyle: {
                  color: '#fff', // 白色
                },
              },
            },
            {
              type: 'value',
              name: '',
              nameTextStyle: {
                color: '#fff', // 白色
              },
              min: 0,
              max: 100,
              interval: 20,
              axisLabel: {
                formatter: '{value} %',
                textStyle: {
                  color: '#fff', // 白色
                },
              },
            },
          ],
          series: [
            {
              name: '预加载',
              type: 'bar',
              barWidth: barWidth,
              barGap: '15%',
              data: values[3],
              symbol: 'roundRect',
              itemStyle: {
                normal: {
                  color: color,
                },
              },
              tooltip: {
                valueFormatter: function (value) {
                  return value + ' 次';
                },
              },
            },
            {
              name: '提醒数',
              type: 'bar',
              barWidth: barWidth,
              barGap: '15%',
              data: values[1],
              symbol: 'roundRect',
              itemStyle: {
                normal: {
                  color: color2,
                },
              },
              tooltip: {
                valueFormatter: function (value) {
                  return value + ' 次';
                },
              },
            },
            {
              name: '互认数',
              type: 'bar',
              barWidth: barWidth,
              barGap: '15%',
              data: values[0],
              symbol: 'roundRect',
              itemStyle: {
                normal: {
                  color: color3,
                },
              },
              tooltip: {
                valueFormatter: function (value) {
                  return value + ' 次';
                },
              },
            },
            {
              name: '引用数',
              type: 'bar',
              barWidth: barWidth,
              barGap: '15%',
              data: values[2],
              symbol: 'roundRect',
              itemStyle: {
                normal: {
                  color: color4,
                },
              },
              tooltip: {
                valueFormatter: function (value) {
                  return value + ' 次';
                },
              },
            },
            {
              name: '互认率',
              type: 'line',
              yAxisIndex: 1,
              data: values[4],
              color: 'rgba(241, 161, 105,0.9)',
              tooltip: {
                valueFormatter: function (value) {
                  return value + ' %';
                },
              },
            },
          ],
        };
        return option;
      }
    },
四、需求分析与设计思路

比较匆忙哈,相信肯定还有好的方法,有好的方法的大佬欢迎指点迷津.

标签:color,data,barWidth,柱形图,中折柱,vue2,offset,var,type
From: https://blog.csdn.net/2301_77838211/article/details/137590412

相关文章

  • 前端小白的学习之路(Vue2 二)
    提示:学习vue2的第二天,笔记记录:自定义指令,事件修饰符,属性计算,属性监听,属性过滤目录一、自定义指令1.全局注册2.局部注册二、事件修饰符 1.常用事件修饰符1)事件相关修饰符2)键盘事件相关修饰符3)鼠标事件相关修饰符三、属性计算四、属性监听五、属性过滤一、自定......
  • Vue2 + Spring Boot的题库管理和在线考试系统
    一个demo从0到1的搭建~使用mybatisplus快速开发springboot项目(一)--初始化-CSDN博客使用mybatisplus快速开发springboot项目(二)--业务实现_如何用mybatis-plus写业务-CSDN博客使用mybatisplus快速开发springboot项目(三)--JWT拦截器-CSDN博客使用mybatisplus快速开发springboot......
  • Vue2中使用iframe展示文件流(PDF)以及blob类型接口错误展示返回值
    需求使用iframe展示后端接口传输来的文件流(pdf),如果接口返回错误则弹出提示html部分<iframe:src="url"width="100%"/>接口部分//接口封装已忽略,注意:如需接口接收文件流,请在请求中加入responseType:'blob'以及type:"application/json;chartset=UTF-8"function......
  • vue2生命周期及在不同生命周期做哪些事情
    Vue的生命周期就是vue实例从创建到销毁的全过程,也就是newVue()开始就是vue生命周期的开始。Vue实例有⼀个完整的⽣命周期,也就是从开始创建、初始化数据、编译模版、挂载Dom->渲染、更新->渲染、卸载等⼀系列过程,称这是Vue的⽣命周期。钩子函数是Vue生命周期中每个阶段......
  • Vue2 —— 学习(一)
    (二)简单案例1.实现过程容器设置Vue实例设置 2.实现结果 3.注意事项(三)Vue插件​编辑三、Vue模板语法 (一)插值语法{{}}:(二)指令语法v-四、Vue数据绑定  (一)单向数据绑定:(二)双向数据绑定: 五、el和data的两种写法(一)查看实例(二)el:1.第一种写法:直接写2.第......
  • Vue2和3中的插槽区别及其简单案例
    vue中的插槽是什么,官方解释是:Vue实现了一套内容分发的API,这套API的设计灵感源自WebComponents规范草案,将<slot>元素作为承载分发内容的出口......vue2插槽和vue3插槽基本概念是一致的,也是匿名插槽、具名插槽、作用域插槽三种,只是基础语法有一些区别。下面让我们温习......
  • Vue2电商前台项目(一):项目前的初始化及搭建
    一、项目初始化创建项目:sudovuecreateapp1.项目配置(1)浏览器自动打开在package.json文件中,serve后面加上--open"scripts":{"serve":"vue-cli-serviceserve--open","build":"vue-cli-servicebuild","lint":&q......
  • Vue2.x指令
    Vue对于一些常用的页面功能进行了指令封装,这些指令可以以Html元素属性的方式使用。1.v-show指令v-show指令的作用是:根据指令中表达式的真假,来控制指令标签中内容的显示或隐藏。<!--dom对象:一个大的容器来使用我们的vue中的数据与方法--> <divid="app"> <!--Vue......
  • vue2 +element-ui图片上传示例
    这里使用了一个没有用的裁剪插件,需要先下载它[email protected]然后在main.js引入:importVueCropperfrom'vue-cropper'Vue.use(VueCropper)1、html部分:<template><el-formref="form":model="form"label-width="1.2rem&qu......
  • Vue2 和 Vue3 中的 v-model 的区别#记录
    vue3对v-model的语法进行了改动。vue2中有两种方式实现数据的双向绑定(组件与外部数据的双向绑定),一种是使用v-model,另一种是使用v-bind.sync修饰符。vue2中的v-model,主要是进行value属性的绑定和input事件的派发。<ChildComponentv-model="pageTitle"/>//等价于<Child......