echarts折线图单位为Bit/s的数据展示

需求:单位为Bit/s的数据需要换算y轴、legend和tooltip的单位;
显示数据时需要换算单位是因为数据以比特每秒(Bit/s)的形式返回,但是在实际展示中,可能更方便和易读的是使用其他单位,例如Gb/s、Mb/s、Kb/s等等

换算Y轴的单位:需要根据负 Y 轴关键字处理y轴刻度值,并将数据放在-y轴

实现思路:判断legend中是否含有negative_y_keyword关键字,含有的放到负轴,需要转成负数(后端返回的都是正数);换算y轴的单位

   data.value = props.series.metrics?.map((item: any, index: any) => {
        /* 判断legend中是否含有negative_y_keyword关键字,含有的放到正轴 */
        const isNegative = item.legend.includes(props.series.negative_y_keyword);
        return {
          name: item.legend,
          type: 'line',
          symbol: 'none',
          data: item.values.map((value: any) => {
            let yValue = parseInt(value[1], 10);
            if (isNegative === true) {
              yValue = -yValue;
            }
            return [value[0], yValue];
          }),
          color: color[index % 10],
          lineStyle: {
            width: 1, // 设置曲线的粗细,单位为像素
          },
          areaStyle: { opacity: 0.1 }, // 设置曲线阴影的透明度
        };
      });
  /* Bit/s的Y坐标轴数据单位转换 */
  const yAxisTransUnit = (total: number) => {
    if (total > 1000000000 || total < -1000000000) {
      return `${(total / 1000000000).toFixed(1)} Gb/s`;
    }
    if (total === 1000000000) {
      return `1 Gb/s`;
    }
    if (total === -1000000000) {
      return `-1 Gb/s`;
    }
    if (total < 1000000000 && total >= 1000000) {
      return `${(total / 1000000).toFixed(1)} Mb/s`;
    }
    if (total > -1000000000 && total <= -1000000) {
      return `${(total / 1000000).toFixed()} Mb/s`;
    }
    if (total === -1000000) {
      return `-1 Mb/s`;
    }
    if (total === 1000000) {
      return `1 Mb/s`;
    }
    return `${(total / 1000).toFixed(1)} Kb/s`;
  };

tooltip单位需要转换,都保持+值

  /* tooltip单位需要转换,都保持+值 */
  const transSpeedUnit = (total: number) => {
    const absTotal = Math.abs(total); // 获取绝对值
    if (absTotal > 1000000000) {
      return `${(absTotal / 1000000000).toFixed(2)} Gb/s`;
    }
    if (absTotal <= 1000000000 && absTotal >= 1000000) {
      return `${(absTotal / 1000000).toFixed(2)} Mb/s`;
    }
    return `${(absTotal / 1000).toFixed(2)} Kb/s`;
  };

legend需要计算avg,max,last值,并换算单位

/* 单位为Bit/s时对图例进行单位转换 */
        const mean =
          props.series.unit === 'Bit/s'
            ? transSpeedUnit(calculateMean(values))
            : calculateMean(values).toFixed(2) + props.series.unit;
        const max =
          props.series.unit === 'Bit/s'
            ? transSpeedUnit(Math.max(...values))
            : Math.max(...values) + props.series.unit;
        const last =
          props.series.unit === 'Bit/s'
            ? transSpeedUnit(values[values.length - 1])
            : values[values.length - 1] + props.series.unit;

对图例的数值排序

1.先统一单位再排序,再换算单位(太麻烦了)

  /* 对图例数据排序 */
  const handleChange = (tableData: any, extra: any) => {
    if (extra.type === 'sorter' && extra.sorter) {
      const { direction, field } = extra.sorter;
      if (props.series.unit === 'Bit/s') {
        // 统一成bit/s
        legendList.value.forEach((item: any) => {
          item.mean = convertToBitsPerSecond(item.mean);
          item.max = convertToBitsPerSecond(item.max);
          item.last = convertToBitsPerSecond(item.last);
        });
        legendList.value.sort((a: any, b: any) => {
          const valueA = a[field];
          const valueB = b[field];
          if (direction === 'ascend') {
            return valueA - valueB;
          }
          if (direction === 'descend') {
            return valueB - valueA;
          }
          return 0;
        });
        // 格式化单位
        legendList.value.forEach((item: any) => {
          item.mean = transSpeedUnit(item.mean);
          item.max = transSpeedUnit(item.max);
          item.last = transSpeedUnit(item.last);
        });
      } else {
        legendList.value.sort((a, b) => {
          const valueA = parseFloat(a[field].replace('%', ''));
          const valueB = parseFloat(b[field].replace('%', ''));
          if (direction === 'ascend') {
            return valueA - valueB;
          }
          if (direction === 'descend') {
            return valueB - valueA;
          }
          return 0;
        });
      }
    }
  };

2.在视图处换算单位

<template #mean="{ record }">
        <span
          v-if="props.series.unit !== 'Bit/s'"
          :class="{ 'highlighted-row': !record.checked && data.length !== legendList?.length }"
          >{{ record.mean }}{{ props.series.unit }}</span
        >
        <span
          v-else
          :class="{ 'highlighted-row': !record.checked && data.length !== legendList?.length }"
          >{{ transUnit(record.mean, props.series.unit) }}</span
        >
      </template>
  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
展示一年的数据echarts折线图中,你可以按照以下步骤进行操作: 1. 引用中提供的代码,将echarts的库文件加载到页面中。 2. 创建一个div元素,设置它的id为"main",用于容纳图表。 3. 在script标签中,初始化echarts实例并指定图表的配置项和数据。配置项可以包括标题、图例、x轴和y轴等设置。 4. 使用ajax请求从后台获取数据,并在请求成功后更新图表的x轴和数据系列的值。 5. 在document.ready函数中调用ajax请求,可以实现页面加载后自动加载数据并更新图表。 以下是你可以参考的代码示例: ```javascript // 基于准备好的dom,初始化echarts实例 var myChart = echarts.init(document.getElementById('main')); // 指定图表的配置项和数据 var option = { // 设置标题 title: { text: '一年内价格涨幅趋势图' }, // 设置图例 legend: { data: ['价格'] }, // 设置x轴 xAxis: { data: [] }, // 设置y轴 yAxis: {}, // 设置数据系列 series: [{ name: '价格', type: 'line', // 折线图 data: [] }] }; // 设置图表的配置项 myChart.setOption(option); // 页面加载后自动加载数据 $(document).ready(function() { $.ajax({ type: "POST", url: "http://localhost:8080/getData", // 后台接口地址 dataType: "json", contentType: 'text/json,charset=utf-8', data: { id: 你的参数 }, success: function(jsonData) { // 更新图表的x轴和数据系列 myChart.setOption({ xAxis: { data: jsonData.months }, series: [{ name: '价格', data: jsonData.results }] }); } }); }); ``` 以上代码会将一年内的数据折线图的形式展示出来。你可以根据实际情况修代码中的数据来源和参数设置。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [ECharts图表组件使用](https://download.csdn.net/download/baidu_20608025/10210680)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [利用实体类转JSONObject,实现Echart趋势图动态显示向前一年数据](https://blog.csdn.net/qq_38902274/article/details/101061318)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值