首页 > 其他分享 >若依框架整合Echarts图表

若依框架整合Echarts图表

时间:2024-06-03 14:01:11浏览次数:21  
标签:图表 canvas const type 若依 data Echarts

若依框架整合Echarts图表

一、前端

1、放置Echarts图表的div

 <el-col :span="12">
     <div :class="className" :style="{height:height,width:width}" :ref="'chart'"/>
</el-col>

​ 注:ref里的字段,需为字符串

2、前端需要导入的包

import LineChart from '@/views/dashboard/LineChart.vue' //折线图 如需要使用若依封装好的Echarts图表组件,再引入
import * as echarts from 'echarts'					  //导入echarts
require('echarts/theme/macarons') 			   	      //Echarts主题
import resize from '../../dashboard/mixins/resize'     //重新绘制尺寸

3、vue文件中default相关参数

export default {
	mixins: [resize],
    components: { LineChart },						//无需引入的组件则无需配置
    props: {
    className: {								   //Echarts图表绑定的类名
      type: String,
      default: 'chart'
    },
    width: {									  //Echarts图表的宽度
      type: String,
      default: '100%'
    },
    height: {									  //Echarts图表的高度
      type: String,
      default: '400px'
    },
    autoResize: {								  //是否自动绘制图表尺寸
      type: Boolean,
      default: true
    },
  },
    data() {
    return {
      chart: null, 								//Echarts图表实例对象,对应div中ref引用
      chartData: null,							//数据1:Echarts数据data为数组
      chartMap:null,							//数据2:Echarts数据data为Map
      //日期格式
      options : { year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', second: '2-digit' },
    };
  }
}

4、Echarts相关方法

1)图表初始化

/**
	图表初始化
*/
initChartCu() {
    if (this.$refs.chart) {
        //参数1:初始化的图表实例对象  参数2:主题(非必填参数)
        this.chart = echarts.init(this.$refs.chart, 'macarons') 
    }
},

2)图表配置

/** 
	图表配置 
		参数1:图表实例对象
		参数2:图表标题
		参数3:图表legendData数组
		参数4:每个点纵坐标名称
		参数5:数据
*/
setChartOptions(chart, titleText, legendData, seriesName, data, type) {
	//定义通用option
    const option = {
        title: { text: titleText, left: 'center', textStyle: { fontSize: 20 } },
        grid: { left: 10, right: 10, bottom: 20, top: 50, containLabel: true },
        tooltip: { trigger: 'axis', axisPointer: { type: 'cross' }, padding: [5, 10] },
        yAxis: { type: 'value' },
        legend: { data: legendData, top: 30 },
        toolbox: {
            show: true,
            right: 15,
            feature: {
                magicType: {
                    title: { line: '切换为折线图', bar: '切换为柱状图' },
                    type: ['line', 'bar'],
                    textStyle: { color: 'white' }
                },
                dataView: { title: '数据视图', readOnly: false, textStyle: { color: 'white' } },
                restore: { title: '还原', textStyle: { color: 'white' } },
                saveAsImage: { title: '保存为图片', textStyle: { color: 'white' } }
            }
        },
        option.dataZoom = [{ type: 'inside', start: 0, end: 100 }, { type: 'slider', start: 0, end: 100 }];
    };
	//举例(代码可进一步优化)
    //定义横坐标与纵坐标数据为null
    let xData = null;
    let yData = null;
    //type为1,表示数据为数组类型
    if (type === 1 && Array.isArray(data)) {
        //根据后端数据来构造xData与yData
        //示例:横坐标为时间戳  纵坐标为数值
        xData = data.map(item => item.time);
        yData = data.map(item => item.value);
        option.series =  [{ name: seriesName, data: yData, type: 'line', smooth: true }];
        option.xAxis ={ type: 'category', data: xData.map(timestamp => new Date(timestamp).toLocaleTimeString())}
    }  //type为2,表示数据为map类型
    else if (type === 2 && (data !== null && data !== undefined)){
        //定义yData为数组
        yData = [];
        //遍历传入的map,将数据放入yData中
        data.forEach((waveData, key) => {
            yData.push(waveData.map(item => item));
        });
        option.series = legendData.map((name, index) => ({ name, data: yData[index], type: 'line', smooth: true }));
        option.xAxis ={ type: 'category', data: xData };
    }else {
        yData = []
    }
	//设置配置
    chart.setOption(option);
},

3)图表清空

/**
	清空echarts配置	
*/
this.chart.clear()
this.chart.setOption({})
this.chartData = null;
this.chartMap  = null;

5、watch监听函数

watch: {
    //举例:监听到echartData数据变更,进行重新设置echarts图表的Options
    chartData: {
      deep: true,
      handler(val) { 
        this.setChartOptions(this.chart, '功率图', ['功率图'], '功率', val,1)
      }
    },
    //举例:监听到chartMap数据变更,进行重新设置echarts图表的Options
    chartMap: {
      deep: true,
      handler(val) {
        //如果后端传回来的数据为map格式,那么需要进行判断
        //如果数据不为null并且类型为object
        if (val !== null && typeof val === 'object'){
          //根据自身需求来构造Echarts配置中的legendData以及seriesData
          //举例(代码可进一步优化)
          const dataA = val['A相电流'];
          const dataB = val['B相电流'];
          const dataC = val['C相电流'];
          if (Array.isArray(dataA) && Array.isArray(dataB) && Array.isArray(dataC)) {
            const legendData = ['A相电流', 'B相电流', 'C相电流'];
            const seriesData = [dataA, dataB, dataC];
            this.setChartOptions(this.chart, '电流波形图', legendData, '电流波形', seriesData,2);
          } else {
            console.error('Data in chartMap is not in the expected format');
          }
        }else {
          this.setChartOptions(this.chartCurrentWave, '电流波形图', [], '电流波形', null,2);
        }
      }
   },
}

6、将Echarts图转化为Canvas

示例:表格中有一列为一个字符串类型的数组,需要将其绘制为图表并在表格中展示,即非触发式绘制图表

1)表格数据

<el-table-column label="电流波形" align="center" prop="currentWave" width="200">
    <template slot-scope="scope">
		<!-- 利用waveCanvas + 每行数据的id 拼接为图表的唯一id -->
		<canvas ref="waveCanvas" width="200" height="50" :id="'waveCanvas-'+ scope.row.id" ></canvas>
    </template>
</el-table-column>

2)相关方法

/**
	将图表转换为canvas图
	参数1:数据
	参数2:canvas图Id
*/
currentCanvas(waveData,canvasId) {
      //将字符串类型的数组转为JSON格式,即变为数组[]格式
      const data = JSON.parse(waveData)
      //通过DOM节点获取到canvas图表
      this.$nextTick(() => {
        const canvas = document.getElementById(canvasId);
        if (!canvas) {
          console.error("Canvas not found for ID: " + canvasId);
          return;
        }
	   
        const ctx = canvas.getContext('2d');
        if (!ctx) {
          console.error("Unable to get 2D context for canvas with ID: " + canvasId);
          return;
        }
        ctx.clearRect(0, 0, canvas.width, canvas.height);
        //数值有正有负
        const maxValue = Math.max(...data.map(Math.abs)); // 取绝对值后的最大值
        const minValue = Math.min(...data); // 最小值
        const range = maxValue - minValue;
        const stepX = canvas.width / (data.length - 1);
        const stepY = canvas.height / range;

        ctx.beginPath();
        ctx.moveTo(0, canvas.height - (data[0] - minValue) * stepY);

        for (let i = 1; i < data.length; i++) {
          ctx.lineTo(i * stepX, canvas.height - (data[i] - minValue) * stepY);
        }

        ctx.strokeStyle = 'blue';
        ctx.lineWidth = 2;
        ctx.stroke();

      });
    },
//从后台请求回数据后,进行转换
this.waveList.forEach(item => {
    this.currentCanvas(item.currentWave,'waveCanvas-'+item.id);
});

标签:图表,canvas,const,type,若依,data,Echarts
From: https://www.cnblogs.com/jundong2177/p/18228745

相关文章

  • 若依框架数据导入功能
    @AutowiredprotectedValidatorvalidator;@OverridepublicStringimportData(Listlist,booleanupdateSupport){//TODO:修改T为实际数据对象if(CollectionUtils.isEmpty(list)){thrownewServiceException("导入数据不能为空!");}intsuccessNum=0;intfailureNum......
  • 学术图表的基本配色方法
    不论是商业图表还是专业图表,图表的配色都极其关键。图表配色主要有彩色和黑白两种配色方案。刘万祥老师曾提出:“在我看来,普通图表与专业图表的差别,很大程度就体现在颜色运用上。”对于科学图表,大部分国内的期刊杂志要求黑白的论文图表;而国外大部分的期刊杂志允许彩色的图......
  • Echarts 指定 series 中的数据对应指定类型的X轴或Y轴
    文章目录需求分析需求下图中,既有折线又有柱状图,也就是说X轴既有value的类型,又有category类型的数据,如果都要在一张图中展示,分析因为数据来源不同,且数据所对应的X轴和Y轴也不同,所以需要在设置数据源时添加所对应的索引xAxisIndex和yAxisIndex......
  • Echarts 实现自定义曲线的弧度
    文章目录问题分析问题分析在ECharts中,可以通过控制数据点的位置来调整曲线的弧度。具体来说,可以通过设置数据项的控制点来调整曲线的形状。ECharts中的折线图和曲线图都是通过控制点来绘制曲线的,可以通过设置数据项的控制点来调整曲线的弧度。以下是一......
  • 3.4K Star!一个高性能的跨平台图表库!支持H5、APP、及各种小程序!太强了!
    大家好!我是赵老师,专门搜罗分享一些优秀开源项目、工具软件等以及进行一些原创技术分享和干货文章分享!喜欢的童鞋可以点个关注加在看,大家也可以在留言区进行探讨,谢谢啦!这是一款专为小程序而生的高性能跨平台图表库。它支持H5图表、APP图表以及各类小程序图表(包括微信小程序、......
  • 封装通用 ECharts 图表组件(三):环形图实现
    在数据可视化领域,ECharts是一个非常流行且功能强大的图表库。它提供了丰富的图表类型,能够满足各种复杂的数据展示需求。在本系列的第三篇文章中,我们将探讨如何封装一个通用的ECharts环形图组件。什么是环形图?环形图是一种特殊的饼图,它由一个内圆和一个外圆组成,中间的部分是......
  • 封装通用 ECharts 图表组件(四):分格柱状图实现
    在数据可视化的世界中,ECharts以其强大的功能和灵活性,成为了开发者们的首选图表库之一。继我们之前探讨的环形图封装之后,本文将带领大家进入另一个实用且美观的图表类型——分格柱状图的封装实现。分格柱状图简介分格柱状图是一种特殊的柱状图,它通过将每个柱子分割成多个小格......
  • echarts饼图给legend图例增加自定义点击事件
    echarts图例点击会有一个默认的点击事件,会把点击的图例对应的legend取消解决办法legendselectchanged事件中将取消选中的legend动态设置回来,主要代码如下:letchart=echarts.init(document.getElementById('main'),null)//图例点击事件chart.on('legendselectchanged',(pa......
  • pyecharts生成图片
      #-*-coding:utf-8-*-frompyechartsimportoptionsasoptsfrompyecharts.chartsimportPieimportpymysqlfromsnapshot_phantomjsimportsnapshotfrompyecharts.renderimportmake_snapshotimportdatetimel_mysql_server="192.168.1.14"......
  • echarts渐变内置生成器echarts.graphic.LinearGradient
    在使用echarts绘制图表时,如果需要使用渐变色,则应使用echarts内置的渐变色生成器echarts.graphic.LinearGradientseries:[{name:'',type:'bar',barMaxWidth:20,label:{show:true,color:'#fff',},......