首页 > 其他分享 >echarts 折线图拼接

echarts 折线图拼接

时间:2024-07-09 09:55:25浏览次数:11  
标签:const val myChart value 拼接 params 折线图 ref echarts

效果图:

 

<script setup lang="ts">
import * as echarts from 'echarts';
import { ref, watch, nextTick, computed } from 'vue';
import { useRouteParams } from '@/hooks/useRouteParams';
import { queryIncreaseTrend } from '@/api/warning';
import { formatPercent } from '@/utils/util';
import dayjs from 'dayjs';
import moment from 'moment';

const props = defineProps({
  originData: {
    type: Array,
    default: () => {
      return [];
    }
  },
  params: {
    type: Object,
    default: () => {}
  }
});
// @ts-ignore
let myChart: any = null;
const dailyChartRef = ref();
// @ts-ignore
const data1 = ref<any>([]);
// @ts-ignore
const data2 = ref<any>([]);
const dataNames = ref<any>([]);
const statDate = ref<any>([]);

const dateType = ref(props.params.period);
const statDateBegin = ref(props.params.statDateBeginStr);
const statDateEnd = ref(props.params.statDateEndStr);
const curId = ref(props.params.curId);
const DTD = ref(props.params.DTD);
const colors = ['#03B7D9', '#B2B6C5'];

const chartConfig = computed(() => {
  let data11 = [];
  let data12 = [];
  let data21 = [];
  let data22 = [];
  let dateIndex = statDate.value.indexOf(moment(statDateBegin.value).format('YYYYMMDD'));
  data11 = data1.value.map((v, i) => {
    if (i < dateIndex) {
      return undefined;
    } else {
      return v;
    }
  });
  data12 = data1.value.map((v, i) => {
    if (i <= dateIndex) {
      return v;
    } else {
      return undefined;
    }
  });

  data21 = data2.value.map((v, i) => {
    if (i < dateIndex) {
      return undefined;
    } else {
      return v;
    }
  });
  data22 = data2.value.map((v, i) => {
    if (i <= dateIndex) {
      return v;
    } else {
      return undefined;
    }
  });
  return {
    color: colors,
    title: {
      show: false,
      text: '近4周业务增速',
      left: 10,
      textStyle: {
        color: '#303133',
        fontWeight: 500
      },
      padding: [5, 10, 40, 0]
    },
    grid: {
      left: '14%',
      top: '14%',
      right: '10%'
    },
    legend: {
      data: ['增速1', '行业增速'],
      selected: { 增速1: true, 行业增速: true },
      bottom: 10,
      icon: 'rect',
      itemWidth: 10,
      itemHeight: 2
    },
    tooltip: {
      show: true,
      trigger: 'axis',
      // formatter: `{b0}<br/>{a0}: {c0}%<br />{a1}: {c1}%`,
      backgroundColor: 'rgba(50,50,50,0.8)',
      borderColor: 'rgba(57, 56, 56, 0.8)',
      textStyle: {
        color: 'rgba(255, 255, 255, 1)'
      },
      formatter: function (params, ticket, callback) {
        var htmlStr = '';
        var valMap = {};
        for (var i = 0; i < params.length; i++) {
          var param = params[i];
          var xName = param.name; //x轴的名称
          var seriesName = param.seriesName; //图例名称
          var value = param.value; //y轴值
          var color = param.color; //图例颜色

          //过滤无效值
          if (value == undefined) {
            continue;
          }

          //过滤重叠值
          if (valMap[seriesName] == value) {
            continue;
          }

          if (i === 0) {
            htmlStr += xName + '<br/>'; //x轴的名称
          }
          htmlStr += '<div>';
          //为了保证和原来的效果一样,这里自己实现了一个点的效果
          htmlStr +=
            '<span style="margin-right:5px;display:inline-block;width:10px;height:10px;border-radius:5px;background-color:' +
            color +
            ';"></span>';

          //圆点后面显示的文本
          htmlStr += seriesName + ':' + value;

          htmlStr += '</div>';
          valMap[seriesName] = value;
        }
        return htmlStr;
      }
    },
    xAxis: [
      {
        type: 'category',
        axisTick: {
          alignWithLabel: true
        },
        data: [],
        axisLabel: {
          // rotate: 0, // 旋转标签,根据实际情况调整角度
          // margin: 20, // 标签与轴线之间的距离
          interval: 0 // 强制显示所有标签
        },
        boundaryGap: false
      }
    ],
    yAxis: [
      {
        type: 'value',
        name: '率值',
        position: 'left',
        // min: 0,
        // axisLine: {
        //   show: false
        // },
        axisLabel: {
          formatter: '{value}%'
        }
      }
    ],
    series: [
      {
        name: '增速1',
        type: 'line',
        data: data11,
        symbolSize: 0,
        smooth: true,
        color: '#03B7D9'
      },
      {
        name: '增速1',
        type: 'line',
        data: data12,
        symbolSize: 0,
        smooth: true,
        color: '#B2B6C5'
      },
      {
        name: '行业增速',
        type: 'line',
        data: data21,
        symbolSize: 0,
        smooth: true,
        color: 'rgba(63, 103, 229, 1)'
      },
      {
        name: '行业增速',
        type: 'line',
        data: data22,
        symbolSize: 0,
        smooth: true,
        color: '#B2B6C5'
      }
    ]
  };
});

const initChart = () => {
  if (dailyChartRef.value) {
    // @ts-ignore
    if (!myChart) {
      myChart = echarts.init(dailyChartRef.value);
    } else {
      // @ts-ignore
      myChart.clear();
    }

    chartConfig.value.xAxis[0].data = dataNames.value;
    myChart && myChart.setOption(chartConfig.value);
    setTimeout(() => {
      myChart && myChart.resize();
    }, 1000);
    myChart.on('legendselectchanged', function (params: any) {
      let option = chartConfig.value;
      let selected_value = Object.values(params.selected);
      if (selected_value.every((val) => !val)) {
        option.legend[0].selected[params.name] = true;
      }

      myChart.setOption(option);
    });
  }
};

const init = async () => {
  const commonParams = {
    manageAreaId: curId.value,
    queryType: dateType.value,
    startTimeStr: dayjs(statDateBegin.value).format('YYYY/MM/DD'),
    endTimeStr: dayjs(statDateEnd.value).format('YYYY/MM/DD')
  };
  console.log(commonParams);
  let res: any = await queryIncreaseTrend(commonParams);
  dataNames.value = [];
  statDate.value = [];
  data1.value = [];
  data2.value = [];
  if (res) {
    res.forEach((item: any, index: number) => {
      statDate.value[index] = item.statDate;
      dataNames.value[index] = item.timeSection;
      data1.value[index] = formatPercent(item.ztoIncreaseRate, 2, false);
      data2.value[index] = formatPercent(item.industryIncreaseRate, 2, false);
    });
  }

  nextTick(() => {
    initChart();
  });
};

watch(
  () => props.params,
  (val, oldVal) => {
    if (val) {
      // if (val.statDateBeginStr == val.statDateEndStr) return
      console.log(val);
      dateType.value = val.period;
      statDateBegin.value = val.statDateBeginStr;
      statDateEnd.value = val.statDateEndStr;
      DTD.value = val.DTD;

      if (val.curId) {
        curId.value = Number(val.curId);
      }
      init();
    }
  },
  {
    // immediate: true,
    deep: true
  }
);
</script>

<template>
  <div class="line-box">
    <div class="title">业务增速近7天趋势</div>
    <div ref="dailyChartRef" class="line-echarts"></div>
  </div>
</template>

<style scoped lang="scss">
.line-box {
  background: #fff;
  border-radius: 8px;
  color: #303133;
  padding-top: 16px;

  //padding: 16px;
  .title {
    font-size: 17px;
    font-weight: bold;
    padding-left: 16px;

    .text {
      font-size: 13px;
    }
  }

  .line-echarts {
    width: 100%;
    height: 220px;
  }
}
</style>

 

标签:const,val,myChart,value,拼接,params,折线图,ref,echarts
From: https://www.cnblogs.com/xiaonanxun/p/18291144

相关文章

  • 获取Echarts的geoJson文件(省市/区县)
    1.获取市的级别直接使用阿里云提供的工具直接获取: https://datav.aliyun.com/portal/school/atlas/area_selector#&lat=32.62087018318113&lng=118.43261718749999&zoom=4和 https://map.easyv.cloud/和 https://geojson.hxkj.vip/  2.获取县和区的细到街道的geoJson,需......
  • React+TS前台项目实战(二十六)-- 高性能可配置Echarts图表组件封装
    文章目录前言CommonChart组件1.功能分析2.代码+详细注释3.使用到的全局hook代码4.使用方式5.效果展示总结前言Echarts图表在项目中经常用到,然而,重复编写初始化,更新,以及清除实例等动作对于开发人员来说是一种浪费时间和精力。因此,在这篇文章中,将封装一个“高......
  • ENVI无缝镶嵌、拼接栅格数据的方法
      本文介绍基于ENVI软件,利用“SeamlessMosaic”工具实现栅格遥感影像无缝镶嵌的操作。  在遥感图像镶嵌拼接:ENVI的PixelBasedMosaicking工具操作方法这篇文章中,我们介绍了在ENVI软件中通过“PixelBasedMosaicking”工具实现栅格遥感影像的镶嵌的方法。这一工具虽然可以......
  • 项目解决方案:4G实时视频接入、多画面拼接,融合三维实景的设计方案
    目录一、项目需求1、视频接入要求2、视频拼接要求3、其他项目要求二、方案设计1、前端设备设计方案1.1设计思路1.2设备端设计2、系统整体设计方案2.1总体设计2.1无线4G/5G的带宽限制2.2视频拼接服务器的说明三、产品介绍1、AS-V1000视频平台2、AS-VJ900视频拼......
  • echarts中Label标签与数据项颜色设置为同一种颜色
    echarts5中默认标签颜色不会跟数据项颜色保持一致,而是全都是黑色。想要实现label颜色和它的数据项颜色一致,需要手动继承颜色,设置label{color:'inherit'}即可解决label标签颜色与数据项颜色一致。  https://echarts.apache.org/examples/zh/editor.html?c=pie-simple注意:......
  • 邮件显示统计图表echarts-java+phantomjs实现
    邮件显示统计图表echarts-java+phantomjs实现项目背景是产品业务上的订阅推送,纯java后端实现,通过邮件将统计报表发送给用户。这里会涉及一些关键点:首先是统计图表的生成,我们采用常见的echarts,简单易用,支持图表类型丰富美观;java后端实现可使用echarts-java来实现图表的生成......
  • Echarts中的折线图,多个Y轴集中在左侧(在Vue中使用多个Y轴的折线图)
    简述:在ECharts中,创建一个带有多个Y轴的折线图,并且将这些Y轴都集中显示在图表的左侧,可以通过合理配置yAxis和series的属性来实现。简单记录一.函数代码drawCarNumEcs(){//初始化echarts图表,并绑定到id为"cfog_four"的DOM元素上varmyChart=this.$ec......
  • echarts 饼状图 富文本设置 drawChart2
    <template><divstyle="height:100%"><divstyle="display:flex;width:100%;height:100%;"><divstyle="flex:1;width:100%;height:100%;"><div:id="myChartId"style="......
  • cesium 添加 Echarts图层(航线图)
    cesium添加Echarts航线图(下面附有源码)1、实现思路1、在scene上面新增一个canvas画布2、通坐标转换,将经纬度坐标转为屏幕坐标来实现3、将ecarts中每个series数组中元素都加coordinateSystem:‘cesiumEcharts’2、示例代码<!DOCTYPEhtml><htmllang=......
  • rust 字符串拼接
    提问rust字符串拼接方式回答format!("{}{}",s1,s2);fnmain(){lets1="Hello";lets2="World";//Usingformat!macroforconcatenationletresult=format!("{}{}",s1,s2);println!("......