Echarts+D3气泡图

Echarts+D3气泡图(相邻效果,气泡之间不叠加)

在这里插入图片描述

<template>
  <div ref="chart" style="width: 500px; height: 500px"></div>
</template>

<script setup>
import * as echarts from 'echarts/core'
import { DatasetComponent, TooltipComponent, VisualMapComponent } from 'echarts/components'
import { CustomChart } from 'echarts/charts'
import { CanvasRenderer } from 'echarts/renderers'
echarts.use([DatasetComponent, TooltipComponent, VisualMapComponent, CustomChart, CanvasRenderer])
import * as d3 from 'd3'
import { ref, onMounted } from 'vue'

const chart = ref(null)

const colorList = [
  '#5470c6',
  '#91cc75',
  '#fac858',
  '#ee6666',
  '#73c0de',
  '#3ba272',
  '#fc8452',
  '#9a60b4',
  '#ea7ccc'
]

let option = {}
let seriesData = [
  {
    depth: 1,
    id: 'city',
    index: 0,
    value: 2
  },
  {
    depth: 1,
    id: 'city.孝感',
    index: 6,
    value: 6
  },
  {
    depth: 1,
    id: 'city.武汉',
    index: 1,
    value: 36
  },
  {
    depth: 1,
    id: 'city.荆州',
    index: 2,
    value: 26
  },
  {
    depth: 1,
    id: 'city.咸宁',
    index: 3,
    value: 16
  },
  {
    depth: 1,
    id: 'city.仙桃',
    index: 4,
    value: 6
  },
  {
    depth: 1,
    id: 'city.潜江',
    index: 5,
    value: 10
  },
  {
    depth: 1,
    id: 'city.十堰',
    index: 6,
    value: 8
  }
]

let displayRoot = stratify1()

function stratify1() {
  return d3
    .stratify()
    .parentId(function (d) {
      return d.id.substring(0, d.id.lastIndexOf('.'))
    })(seriesData)
    .sum(function (d) {
      return d.value || 0
    })
    .sort(function (a, b) {
      return b.value - a.value
    })
}

function overallLayout(params, api) {
  let context = params.context
  d3
    .pack()
    .size([api.getWidth() - 2, api.getHeight() - 2])
    .padding(0)(displayRoot)
  context.nodes = {}

  displayRoot.descendants().forEach(function (node) {
    context.nodes[node.id] = node
  })
}

function renderItem(params, api) {
  let context = params.context
  let idx = params.dataIndex

  // Only do that layout once in each time `setOption` called.
  // 每次调用“setOption”时,只能进行一次布局。
  if (!context.layout) {
    context.layout = true
    overallLayout(params, api)
  }

  let nodePath = api.value('id')
  let nodeName = nodePath
    .slice(nodePath.lastIndexOf('.') + 1)
    .split(/(?=[A-Z][^A-Z])/g)
    .join('\n')
  let node = context.nodes[nodePath]
  if (node.id === 'city') {
    node.r = 0
  }

  if (!node) {
    // Reder nothing.
    return
  }

  let colorTop = colorList[idx % colorList.length]
  let colorBottom = colorList[(idx + 1) % colorList.length]

  // 创建线性渐变对象
  let linearGradient = new echarts.graphic.LinearGradient(0, 0, 0, 1, [
    { offset: 0, color: colorTop },
    { offset: 1, color: colorBottom }
  ])

  //   // 创建线性渐变对象
  //   let linearGradient = new echarts.graphic.LinearGradient(0, 0, 0, 1, [
  //     {
  //       offset: 0,
  //       color: 'rgb(55, 255, 255)' // 渐变起始颜色
  //     },
  //     {
  //       offset: 0.5,
  //       color: 'rgb(155, 105, 255)' // 渐变起始颜色
  //     },
  //     {
  //       offset: 1,
  //       color: 'rgb(255, 0, 255)' // 渐变结束颜色
  //     }
  //   ])

  let z2 = api.value('depth') * 2
  return {
    type: 'circle',
    shape: {
      cx: node.x,
      cy: node.y,
      r: node.r
    },
    // transition: ['shape'],
    z2: z2,
    textContent: {
      type: 'text',
      style: {
        // transition: isLeaf ? 'fontSize' : null,
        text: nodeName,
        fill: '#fff',
        fontFamily: 'Arial',
        width: node.r * 1.3,
        overflow: 'truncate',
        fontSize: node.r / 3
      },
      emphasis: {
        style: {
          overflow: null,
          fontSize: Math.max(node.r / 3, 12)
        }
      }
    },
    textConfig: {
      position: 'inside'
    },
    style: {
      fill: linearGradient
    },
    emphasis: {
      style: {
        fontFamily: 'Arial',
        fontSize: 12,
        shadowBlur: 20,
        shadowOffsetX: 3,
        shadowOffsetY: 5,
        shadowColor: 'rgba(0,0,0,0.3)'
      }
    }
  }
}

option = {
  dataset: {
    source: seriesData
  },
  tooltip: {},
  hoverLayerThreshold: Infinity,
  series: [
    {
      type: 'custom',
      colorBy: 'data',
      renderItem: renderItem,
      progressive: 0,
      coordinateSystem: 'none',
      encode: {
        tooltip: 'value',
        itemName: 'id'
      }
    }
  ]
}

const initEcharts = () => {
  const myChart = echarts.init(chart.value)
  myChart.setOption(option)
}

onMounted(() => {
  initEcharts()
})
</script>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

准确率达 91.74%!东南大学提出光伏电池缺陷检测模型,首次引入神经结构搜索

乘着从全球吹来的「绿色发展、低碳转型」东风&#xff0c;光伏 (photovoltaic, PV) 产业自进入 21 世纪以来&#xff0c;便以令世人惊叹的速度迅猛向前发展。在我国&#xff0c;光伏发电更是呈现出前所未有的活力。根据 2023 年 4 月国家能源局公布的当年 1-3 月份全国电力工业…

【IO】进程间通信

A程序代码&#xff1a; #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <errno.h> #include <fcntl.h> #include <string.h> int main(int argc, const char *argv[]) {if(mkfifo…

Redis缓存【重点】

参考链接 https://xiaolincoding.com/redis/cluster/cache_problem.html#%E7%BC%93%E5%AD%98%E9%9B%AA%E5%B4%A9 目录 缓存雪崩大量数据同时过期Redis 故障宕机 缓存击穿第一种方案&#xff0c;非法请求的限制第二种方案&#xff0c;缓存空值或者默认值第三种方案&#xff0c;使…

Docker中使用nginx-rtmp推拉网络摄像头视频流

前言&#xff1a; 该部分比较麻烦&#xff0c;闹腾了好久&#xff08;ffmpeg推拉流没学过&#xff0c;事实证明依葫芦画瓢是不行滴&#xff0c;后面有时间再学吧&#xff09;&#xff0c;后来借助chatGPT勉强解决&#xff0c;但不是很懂。因个人能力有限&#xff0c;只复述操作…

合泰HT66F2390----定时器中断学习笔记

前言 无需多言 直接开始定时器中断 的学习 通过上次的PWM学习&#xff0c;上次用的是周期型TM定时器模块 这次使用标准型TM定时器模块&#xff08;STM&#xff09; 代码 #include <HT66F2390.h>void Timer0_Init(void){_stm0c0 0b00001000;_stm0c1 0b11000001;_stm…

Vmware虚拟机安装openEuler 20.03 LTS(openEuler20.03)

文章目录 vmware虚拟机安装openEuler 20.03 LTS安装硬件设备&#xff08;略&#xff09;安装OS镜像下载镜像版本发布说明开始安装&#xff08;vmware虚拟机&#xff09;安装操作系统必要操作关闭防火墙设置selinux为宽容模式系统内核问题禁用系统内核更新 ~~禁用yum update和dn…

Ubuntu18.04运行ORB-SLAM3

ORB-SLAM3复现(ubuntu18) 文章目录 ORB-SLAM3复现(ubuntu18)1 坐标系与外参Intrinsic parameters2 内参Intrinsic parameters2.1 相机内参① 针孔模型Pinhole② KannalaBrandt8模型③ Rectified相机 2.2 IMU内参 3 VI标定—外参3.1 Visual calibration3.2 Inertial calibration…

构造pop链

反序列化视频笔记 第一步&#xff1a;找到目标触发echo调用$flag 第二步&#xff1a;触发_invoke函数调用appeng函数$varflag.php&#xff08;把对象当成函数&#xff09; 第三步&#xff1a;给$p赋值为对象&#xff0c;即function成为对象Modifier却被当成函数调用&#xff…

基于springboot+vue的校园网上店铺

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

Android开发者必看,我的移动开发春季历程

热修复介绍 1.开发流程 当项目出现紧急bug时&#xff0c;传统的开发流程是发布新版本&#xff0c;引导用户覆盖安装。抛开平台审核上线的时间不说&#xff0c;一天重复下载安装至少两次的用户体验是很差的。而热修复的出现完美解决了这个问题&#xff0c;用户在收到服务器推送…

概要了解postman、jmeter 、loadRunner

postman还蛮好理解的&#xff0c;后续复习的话着重学习关联接口测试即可&#xff0c;感觉只要用几次就会记住&#xff1a; 1 从接口的响应结果当中提取需要的数据 2 设置成环境变量/全局变量&#xff08;json value check 、set environment para 3写入到下一个接口的请求数据中…

python三剑客之一——Numpy

温故而知新&#xff0c;借着工作需要用到Numpy的机会重新学习一遍Numpy。 Numpy是一个运行速度非常快的数学库&#xff0c;主要用于数组计算&#xff0c;包含如下&#xff1a; 一个强大的N维数组对象ndarray【Nd&#xff08;Dimension维度&#xff09;array】 广播功能函数 整…

找不到msvcr100.dll怎么办,多种解决方法快速修复msvcr100.dll问题

当计算机系统中关键文件msvcr100.dll丢失时&#xff0c;可能会引发一系列运行问题和故障现象。msvcr100.dll是Microsoft Visual C Redistributable Package的一部分&#xff0c;对于许多基于Windows的应用程序正常运行至关重要。由于msvcr100.dll是许多应用程序运行所必需的动态…

22.基于springboot + vue实现的前后端分离-汽车票网上预定系统(项目 + 论文PPT)

项目介绍 系统是一个B/S模式系统&#xff0c;采用Spring Boot框架&#xff0c;MySQL 数据库设计开发&#xff0c;充分保证系统的稳定性。系统具有界面清晰、操作简单&#xff0c;功能齐全的特点&#xff0c;使得汽车票网上预订系统管理工作系统化、规范化。本系统的使用使管理人…

外包干了3个月,技术倒退明显

先说情况&#xff0c;大专毕业&#xff0c;18年通过校招进入湖南某软件公司&#xff0c;干了接近6年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试&#xf…

第1题:两数之和

题目内容&#xff1a; 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。…

Vue 3的Composition API和vue2的不同之处

Vue 3的Composition API是Vue.js框架的一个重要更新&#xff0c;它提供了一种新的组件逻辑组织和复用方式。在Vue 2中&#xff0c;我们通常使用Options API&#xff08;data、methods、computed等&#xff09;来组织组件的逻辑&#xff0c;但这种组织方式在处理复杂组件时可能会…

如何搭建Nacos集群

1.搭建Nacos集群 众所周知&#xff0c;在实际的工作中&#xff0c;Nacos的生成环境下一定要部署为集群状态 其中包含3个nacos节点&#xff0c;然后一个负载均衡器代理3个Nacos。这里负载均衡器可以使用nginx。 我们计划的集群结构&#xff1a; 我就直接在本机上开三个Nacos来搭…

python基础——基础语法

文章目录 一、基础知识1、字面量2、常用值类型3、注释4、输入输出5、数据类型转换6、其他 二、字符串拓展1、字符串定义2、字符串拼接3、字符串格式化4、格式化精度控制 三、条件/循环语句1、if2、while3、for循环 四、函数1、函数定义2、函数说明文档3、global关键字 五、数据…

02:HAL库---GPIO

一:GPIO 1:简历 2:模式 输入 : IO向32发送信号, 即外设发送信号 GPIO_Mode_AIN -----模拟输入 GPIO_Mode_IN_FLOATING -----浮空输入 GPIO_Mode_IPD -----下拉输入 GPIO_Mode_IPU ------上拉输入 GPIO_MODE_INPUT----输入模式 输出 : 32向IO发送信号, 即外设接收信号 …