项目中使用Echarts图表treemap制作

news2024/11/19 0:20:30

Examples - Apache ECharts

页面结构

<template>
  <div class="echart-chart" :id="id"></div>
</template>
<script>
import { getOption } from './chartOption';
export default {
  name: 'TreeMapChart',
  props: ['id', 'data', 'type'],
  data() {
    return {
      setTimeoutId: null
    };
  },
  watch: {
    data: {
      handler() {
        if (this.chart) {
          this.setOption();
        }
      },
      deep: true,
      immediate: false
    },
    type: {
      handler() {
        if (this.chart) {
          this.setOption();
        }
      },
      deep: true,
      immediate: false
    }
  },
  methods: {
    initChart() {
      this.chart = window.echarts.init(document.getElementById(this.id));
    },
    setOption() {
      this.chart.setOption(getOption(this.data, this.id, this.type), true);
    },
    resize() {
      this.setTimeoutId && clearTimeout(this.setTimeoutId);
      setTimeout(() => {
        this.chart && this.chart.resize();
      }, 500);
    }
  },
  created() {
    window.addEventListener('resize', this.resize);
  },
  async mounted() {
    // setTimeout(() => {
    await this.$nextTick();
    this.initChart();
    this.setOption();
    // }, 300)
  },
  unmounted() {
    this.chart && this.chart.dispose();
    window.removeEventListener('resize', this.resize);
  }
};
</script>
<style lang="less" scoped>
.echart-chart {
  width: 100%;
  height: 100%;
}
</style>

参数配置

涨跌幅 负的是绿的,正的是红的然后根据颜色深浅表现出来程度

遍历数据加 itemStyle: { // 这里配置每个块的颜色
color:'blue'
},用rgba(r,g,b,a) 把透明度设置在0.3~1 之间,根据数值大小自己设置

import { mockData } from './mock.js';
const formatUtil = window.echarts.format;
import { formatValue, formatNumber } from '@/views/Prices/Hooks/useUtils.js';

// 给每一项添加itemStyle 实现每个单独设置样式
const getData = (data) => {
  return data.map((item) => {
    return {
      ...item,
      itemStyle: {
        borderWidth: 0,
        gapWidth: 2,
        color: item?.flag >= 0 ? '#4DD7A1' : '#E87B7B'
      }
    };
  });
};

export function getOption(diskData, id, type) {
  if (!diskData) {
    diskData = mockData;
  }
  diskData = getData(diskData);
  console.log('diskData', diskData);
  return {
    title: [
      {
        show: false
      }
    ],
    tooltip: {
      //弹出框配置
      formatter: function (info) {
        let value = info.value;
        let name = info.name;
        // if (id == 'treeMapVolume') {
        //   let tip = `<div class="tree-map-tooltip">
        //     <div>${name}</div>
        //     成交量: <span>$${formatUtil.addCommas(value)}亿</span>
        //   </div>`;
        //   return tip;
        // }
        let tip;
        switch (type) {
          case 1:
            tip = `<div class="tree-map-tooltip">
            <div>${name}</div>
            成交量: <span>$${formatNumber(value)}</span>
          </div>`;
            break;
          case 2:
            tip = `<div class="tree-map-tooltip">
            <div>${name}</div>
            价格变化: <span>$${formatUtil.addCommas(value)}%</span>
          </div>`;
            break;
          case 3:
            tip = `<div class="tree-map-tooltip">
            <div>${name}</div>
            爆仓金额: <span>$${formatUtil.addCommas(value)}万</span>
          </div>`;
            break;
          case 4:
            tip = `<div class="tree-map-tooltip">
            <div>${name}</div>
            持仓: <span>$${formatUtil.addCommas(value)}亿</span>
          </div>`;
            break;
          default:
            break;
        }
        return tip;
      },
      backgroundColor: 'rgba(0,0,0,0.9)',
      padding: 0,
      borderWidth: 0,
      textStyle: {
        color: '#fff'
      }
    },
    series: [
      {
        name: 'All',
        type: 'treemap',
        roam: false,
        nodeClick: false,
        width: '100%',
        height: '100%',
        label: {
          show: true,
          position: ['5%', '30%'],
          formatter: (info) => {
            if (id == 'treeMapVolume') {
              let tip = [
                `{nameClass${info.dataIndex}|${info.name}}`,
                `{valueClass${info.dataIndex}|$${formatNumber(info.value)}}`
              ].join('\n');
              return tip;
            }
          },
          rich: {
            //块内文字样式
            nameClass1: {
              fontSize: 36,
              lineHeight: 50,
              fontWeight: 600
            },
            nameClass2: {
              fontSize: 27,
              fontWeight: 600
            },
            nameClass3: {
              fontSize: 18,
              fontWeight: 600
            },
            nameClass4: {
              fontSize: 12,
              fontWeight: 600
            },
            valueClass1: {
              fontSize: 20,
              fontWeight: 400
            },
            valueClass2: {
              fontSize: 16,
              fontWeight: 400
            }
          }
        },
        itemStyle: {
          borderColor: '#fff'
        },
        levels: [
          {
            color: ['#4DD7A1', '#E87B7B', '#777F8D'],
            itemStyle: {
              borderWidth: 0,
              gapWidth: 2,
              borderColor: '#000'
            }
          }
        ],
        data: diskData,
        breadcrumb: {
          show: false //隐藏底部导航条
        }
      }
    ]
  };
}

模拟数据

export const mockData = [
  {
    value: 345,
    name: 'BC',
    flag: 1
  },
  {
    value: 117,
    name: 'EH',
    flag: 1
  },
  {
    value: 36,
    name: 'TB',
    flag: 1
  },
  {
    value: 31,
    name: 'WD',
    flag: 1
  },
  {
    value: 24,
    name: 'SL',
    flag: 0
  },
  {
    value: 22,
    name: 'XP',
    flag: -1
  },
  {
    value: 15,
    name: 'BZ',
    flag: -1
  },
  {
    value: 10,
    name: 'BH',
    flag: -1
  }
];

使用

<TreeMapChart :id="treeMapID" :data="treeMapData" :type="isCheck" />

import TreeMapChart from '@/components/PricesCharts/TreeMapChart';
const isCheck = ref(1);
const treeMapID = ref('treeMapVolume');
const treeMapData = ref(null);

参考 

const option = {
    tooltip: {},
    series: [
        {
            name: 'test treemap',
            type: 'treemap',
            visualMin: -100,    //决定颜色的最小值
            visualMax: 100,     //决定颜色的最大值
            visualDimension: 1, //决定颜色看 value 的哪一个值, 1=> 第2个值
            levels: [
                {                                           //第一层
                    color: ['#942e38', '#aaa', '#269f3c'],  //颜色
                    colorMappingBy: 'value',                //用value来决定颜色
                    itemStyle: {
                        borderWidth: 2,
                        borderColor: '#333',
                        gapWidth: 1
                    }
                },
                {                                           //第二层 => 可设定不同颜色
                    color: ['#942e38', '#aaa', '#269f3c'],
                    colorMappingBy: 'value',
                    itemStyle: {
                        borderWidth: 1,
                        borderColor: '#333',
                        gapWidth: 1
                    }
                },
            ],
            data: [
                {
                    name: 'A',
                    value: [15, -35],                       // 第一层: 第一个值决定区块大小,第二个值决定颜色
                    children: [
                        {
                            name: 'A01',
                            value: [10, -70]                // 第二层: 第一个值决定区块大小,第二个值决定颜色
                        },
                        {
                            name: 'A02',
                            value: [3, 20]
                        },
                        {
                            name: 'A03',
                            value: [2, 60]
                        }
                    ]
                },
                {
                    name: 'B',
                    value: [10, 47],
                    children: [
                        {
                            name: 'B01',
                            value: [5, 100]
                        },
                        {
                            name: 'B02',
                            value: [4, -20]
                        },
                        {
                            name: 'B03',
                            value: [1, 50]
                        },
                    ]
                },
                {
                    name: 'C',
                    value: [10, 5],
                },
            ]
        }
    ]
};

注意可设定不同层用不同颜色

color: ['#942e38', '#aaa', '#269f3c'],  //颜色
colorMappingBy: 'value',                //用value来决定颜色

然后

visualMin: -100,    //决定颜色的最小值
visualMax: 100,     //决定颜色的最大值
visualDimension: 1, //决定颜色看 value 的哪一个值, 1=> 第2个值

以下的值为例:第一个值决定区块的大小,第二个值决定颜色(因为 visualDimension= 1)

然后值为 -50 ⇒ 0 是灰色(#aaa),-100是暗红色(#942e38),所以 -50 是浅红色

name: 'A',
value: [10, -50],  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1462106.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LaWGPT—基于中文法律知识的大模型

文章目录 LaWGPT&#xff1a;基于中文法律知识的大语言模型数据构建模型及训练步骤两个阶段二次训练流程指令精调步骤计算资源 项目结构模型部署及推理 LawGPT_zh&#xff1a;中文法律大模型&#xff08;獬豸&#xff09;数据构建知识问答模型推理训练步骤 LaWGPT&#xff1a;基…

红蓝对抗:网络安全领域的模拟实战演练

引言&#xff1a; 随着信息技术的快速发展&#xff0c;网络安全问题日益突出。为了应对这一挑战&#xff0c;企业和组织需要不断提升自身的安全防护能力。红蓝对抗作为一种模拟实战演练方法&#xff0c;在网络安全领域得到了广泛应用。本文将介绍红蓝对抗的概念、目的、过程和…

微服务篇之监控

一、为什么要监控 1.问题定位 假设客户端查询一些东西的时候&#xff0c;需要经过网关&#xff0c;然后服务A调用服务H&#xff0c;服务H调用K&#xff0c;服务K调用MySQL&#xff0c;当查询不出来的时候&#xff0c;我们不能快速定位到底是哪个服务的问题&#xff0c;这就需要…

量子加密机的工作原理是什么

量子加密机&#xff0c;作为现代加密技术的一大飞跃&#xff0c;正逐渐成为信息安全领域的研究热点。与传统的加密方法相比&#xff0c;量子加密技术以其独特的优势&#xff0c;为信息安全提供了更为坚实的保障。 量子加密的核心在于利用量子力学的特性&#xff0c;尤其是量子纠…

uni-app 开发调试自动打开手机屏幕大小界面(Aidex移动端开发项目)

上效果&#xff1a; 下载Aidex的移动端项目并打开&#xff1a; 若依-ruoyi-AiDex-Uniapp: 若依-Ruoyi APP 移动解决方案&#xff0c;基于uniappuView封装的一套基础模版&#xff0c;开箱即用&#xff0c;免费开源&#xff0c;一份代码多终端适配&#xff0c;支持H5、支付宝小程…

Python hasattr函数

在Python编程中&#xff0c;hasattr()函数是一个非常有用的内置函数之一&#xff0c;用于检查对象是否具有指定的属性或方法。这个函数能够帮助我们在运行时动态地检查对象的属性和方法&#xff0c;从而避免由于缺少属性或方法而导致的异常。本文将深入探讨Python中的hasattr()…

unity学习(36)——角色选取界面(自制美工)

1.添加一个背景图片&#xff0c;记不住可以查之前的资料&#xff08;4&#xff09; 图片拖入asset&#xff0c;属性设成sprite&#xff1b;把图片拖到source image中&#xff1b;colour白色&#xff08;透明&#xff0c;点一下右边的笔即可&#xff09;&#xff1b;material为…

《Python 语音转换简易速速上手小册》第2章 Python 编程基础(2024 最新版)

文章目录 2.1 Python 语言基础2.1.1 基础知识深入基础总结 2.1.2 主要案例&#xff1a;数据分析脚本案例介绍案例 Demo案例分析 2.1.3 扩展案例 1&#xff1a;自动化邮件发送案例介绍案例 Demo案例分析 2.1.4 扩展案例 2&#xff1a;网页数据抓取案例介绍案例 Demo案例分析 2.2…

fastApi笔记05-路径参数和数值校验

使用Path可以对路径参数声明与Query相同类型的校验和元数据 from typing import Annotatedfrom fastapi import FastAPI, Path, Queryapp FastAPI()app.get("/items/{item_id}") async def read_items(item_id: Annotated[int, Path(title"The ID of the item …

怎样使用Pyglet库给推箱子游戏画关卡地图

目录 pyglet库 画图事件 按键事件 程序扩展 关卡地图 pyglet库 是一个跨平台的Python多媒体库&#xff0c;提供了一个简单易用的接口来创建窗口、加载图像和视频、播放音频、处理用户输入事件以及进行2D图形绘制。特别适合用于游戏开发、视听应用以及其它需要高效图形渲染…

32单片机基础:OLED调试工具的使用

下面会介绍OLED显示屏的驱动函数模块&#xff0c;先学会如何使用&#xff0c;至于OLED屏幕的原理和代码编写&#xff0c; 我们之后会再写一篇。 现在我们就是用OLED当一个调试的显示屏&#xff0c;方便我们调试程序。 为什么要调试呢&#xff0c;是为了方便我们看现象&#…

提升网络质量:UDPspeeder 实现网络优化与提速

提升网络质量&#xff1a;UDPspeeder 实现网络优化与提速 背景与意义原理与功能使用方法未来展望相关链接服务 在当今高度互联的网络环境下&#xff0c;网络质量的优化和提速对于用户体验至关重要。针对高延迟和丢包率较高的网络链路&#xff0c;UDPspeeder 提供了一种前向纠错…

推荐一个内网穿透工具,支持Windows桌面、Linux、Arm平台客户端

神卓互联是一款常用的内网穿透工具&#xff0c;它可以将本地服务器映射到公网上&#xff0c;并提供域名或子域名给外部访问。神卓互联具有简单易用、高速稳定的特点&#xff0c;支持Windows桌面版、Linux版、Arm版客户端&#xff0c;以及硬件等。 神卓互联内网穿透技术简介 企…

AndroidStudio 2024-2-21 Win10/11最新安装配置(Ktlion快速构建配置,gradle镜像源)

AndroidStudio 2024 Win10/11最新安装配置 教程目的&#xff1a; (从安装到卸载) &#xff0c;针对Kotlin开发配置&#xff0c;gradle-8.2-src/bin下载慢&#xff0c;以及Kotlin构建慢的解决 好久没玩AS了,下载发现装个AS很麻烦,就觉得有必要出个教程了(就是记录一下:嘻嘻) 因…

【力扣 - 二叉树的直径】

题目描述 给你一棵二叉树的根节点&#xff0c;返回该树的 直径 。 二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。 两节点之间路径的 长度 由它们之间边数表示。 提示&#xff1a; 树中节点数目在范围 [1, 10000] 内…

Java基础API(2) String、StringBuilder详解

文章目录 &#x1f378;1. String类&#x1f349;&#x1f349;1.1 String概述&#x1f349;&#x1f349;1.2 String类的构造方法&#x1f349;&#x1f349;1.3 创建字符串对象的区别对比&#x1f349;&#x1f349;1.4 字符串的比较1.4.1 字符串的比较 &#x1f349;&#x…

为企业打造的人脸美肤解决方案

随着人工智能和图像处理技术的飞速发展&#xff0c;美颜美肤技术在众多领域&#xff0c;特别是社交娱乐、电子商务和广告行业中的应用日益广泛。为了满足企业对于高质量图像处理的需求&#xff0c;美摄科技推出了一款先进的基础人脸美肤解决方案。 美摄科技的基础人脸美肤解决…

Pytorch 复习总结 3

Pytorch 复习总结&#xff0c;仅供笔者使用&#xff0c;参考教材&#xff1a; 《动手学深度学习》Stanford University: Practical Machine Learning 本文主要内容为&#xff1a;Pytorch 多层感知机。 本文先介绍了多层感知机的用法&#xff0c;再就训练过程中经常出现的过拟…

数据结构 计算结构体大小

一、规则&#xff1a; 操作系统制定对齐量&#xff1a; 64位操作系统&#xff0c;默认8Byte对齐 32位操作系统&#xff0c;默认4Byte对齐 结构体对齐规则&#xff1a; 1.结构体整体的大小&#xff0c;需要是最大成员对齐量的整数倍 2.结构体中每一个成员的偏移量需要存在…

IDEA 2021.3激活

1、打开idea&#xff0c;在设置中查找Settings/Preferences… -> Plugins 内手动添加第三方插件仓库地址&#xff1a;https://plugins.zhile.io搜索&#xff1a;IDE Eval Reset 插件进行安装。应用和使用&#xff0c;如图