极致呈现系列之:Echarts旭日图的绚丽奇观

news2024/12/23 8:39:40

目录

  • 什么是旭日图
  • 旭日图的特性及应用场景
    • 旭日图的特性
    • 应用场景
  • 旭日图常用的配置项
  • 创建基本的旭日图
  • 自定义旭日图样式样式
  • 旭日图的高级应用

什么是旭日图

旭日图是一种可视化图表,用于展示层级结构和层级之间的关系。它以一个圆形为基础,由多层的环形图组成,在数据结构上,内圈是外圈的父节点。因此,它既能像饼图一样表现局部和整体的占比,又能像矩形树图一样表现层级关系。

旭日图的特性及应用场景

旭日图的特性

  • 层次结构:旭日图可以直观地展示数据的层级和关系。
  • 扇区表示数据:每个扇区根据数据大小分布,可以形成层次结构明显且有趣的图形。
  • 视觉效果:通过颜色和大小的变化,旭日图能够凸显数据的差异和重要性。

应用场景

  • 组织结构图:可以用来展示公司的组织结构,让员工更好地了解公司的层级关系。
  • 地理信息图:可以用来展示不同地区的人口分布情况,通过扇形区域的大小和颜色来反映不同地区的人口数量和密度。
  • 产品分析图:可以用来展示产品的销售情况和市场份额,通过扇形区域的大小和颜色来反映不同产品的销售额和市场占比。

旭日图常用的配置项

  1. type:该属性指定了图表的类型,对于旭日图,它的值应为"sunburst"。

  2. data:数据源,包含具体的层级数据。通过data属性可以设置图表的数据。数据是一个包含层级关系的数组,每个元素代表一个节点。每个节点可以包含子节点,从而形成层级结构。每一层级都是一个对象,包含name(名称)和value(数值)属性。可以通过嵌套的方式表示多层级关系。子对象用children数组包裹。

    data数据结构如下:

    [{
    name: 'parent1',
    value: 10,          // 可以不写父元素的 value,则为子元素之和;
                        // 如果写了,并且大于子元素之和,可以用来表示还有其他子元素未显示
    children: [{
        value: 5,
        name: 'child1',
        children: [{
            value: 2,
            name: 'grandchild1',
            itemStyle: {
                // 每个数据可以有自己的样式,覆盖 series.itemStyle 和 level.itemStyle
            },
            label: {
                // 标签样式,同上
            }
        }]
    }, {
        value: 3,
        name: 'child2'
    }],
    itemStyle: {
        // parent1 的图形样式,不会被后代继承
    },
    label: {
        // parent1 的标签样式,不会被后代继承
    }
    

}, {
name: ‘parent2’,
value: 4
}]
```
3. radius:radius属性用于设置旭日图的半径范围。可以通过数组的方式设置内半径和外半径,或者使用百分比或数字的方式设置。
4. label:通过label属性可以配置节点标签的样式。可以设置color(字体颜色)、fontSize(字体大小)、fontWeight(字体粗细)、position(位置)、rotate(旋转角度)等属性。
5. itemStyle:itemStyle属性用于设置节点的样式,包括节点的color(颜色)、borderColor(边框颜色)、borderWidth(边框宽度)等。
6. levels:层级配置,该属性用于设置图表的层级结构。通过levels属性,可以设置不同层级的样式,包括颜色、标签样式、边框样式等。每个层级都是一个对象,包含itemStyle(节点样式)、label(标签配置)等属性。
7. sort:sort属性用于设置节点的排序规则。可以选择"asc"(升序)或"desc"(降序)。
8. animation:是否开启动画
9. animationDuration:初始动画的时长,支持回调函数,可以通过每个数据返回不同的时长实现更戏剧的初始动画效果
10. animationEasing:初始动画的缓动效果。

创建基本的旭日图

  1. 创建vue项目,安装ECharts库
npm install echarts --save
  1. 新建SunburstView.vue文件,使用import语句引入ECharts库
import * as echarts from 'echarts';
  1. 创建图表容器:在SunburstView组件的template中,添加一个div元素作为图表的容器。给它一个唯一的ref属性,以便在后面初始化图表对象时使用
<template>
  <div ref="chart" style="width: 100%;height: 100vh;"></div>
</template>
  1. 初始化图表对象:在SunburstView组件中定义chart,
const chart = ref(null)

mounted生命周期钩子函数中,使用echarts.init方法初始化图表对象。

<script setup>
import { ref, onMounted } from 'vue'
import * as echarts from 'echarts'
const chart = ref(null)
onMounted(() => {
  const myChart = echarts.init(chart.value) 
})
</script>
  1. 配置图表参数,在SunburstView组件的mounted生命周期钩子函数中,定义option对象,在里面配置图表数据,并使用chart.setOption方法配置图表的参数。
onMounted(() => {
  const myChart = echarts.init(chart.value)
  const option = {
   series: [
        {
          type: 'sunburst',
          data: [
            {
              name: '电子产品',
              children: [
                { name: '智能手机', value: 100 },
                { name: '电子手环', value: 80 },
              ],
            },
            {
              name: '衣服',
              children: [
                { name: '男装', value: 60 },
                { name: '女装', value: 70 },
              ],
            },
            {
              name: '家用电器',
              children: [
                { name: '冰箱', value: 40 },
                { name: '洗衣机', value: 30 },
              ],
            },
          ],
        },
      ],
  }
  myChart.setOption(option)
})

一个简单的仪表盘就创建好了,刷新浏览器,看下效果
在这里插入图片描述

自定义旭日图样式样式

  1. 通过设置data中的itemStyle属性设置每个主要类别的颜色,每个children也可以设置itemStyle属性
 data: [
            {
              name: '电子产品',
              itemStyle: {
                color: '#FF7F50',
              },
              children: [
                { name: '智能手机', value: 100 },
                { name: '电子手环', value: 80 },
              ],
            },
            {
              name: '衣服',
              itemStyle: {
                color: '#FFD700',
              },
              children: [
                { name: '男装', value: 60 },
                { name: '女装', value: 70 },
              ],
            },
            {
              name: '家用电器',
              itemStyle: {
                color: '#46BFBD',
              },
              children: [
                { name: '冰箱', value: 40 },
                { name: '洗衣机', value: 30 },
              ],
            },
 ],
  1. 通过radius调整旭日图内外圆的半径
radius: ['20%', '60%'],

在这里插入图片描述
3. 通过label属性设置标签样式

label: {
          show: true,
          color: 'white',
          fontSize: 12,
        },
  1. 通过emphasis设置鼠标悬停时的高亮效果
emphasis: {
          label: {
            show: true,
            fontSize: 16,
            fontWeight: 'bold',
          },
 },

在这里插入图片描述
5. 通过series的itemStyle设置旭日图的边框、阴影的样式,使其看起来更加立体

itemStyle: {
          borderWidth: 1,
          borderColor: 'white',
          shadowBlur: 10,
          shadowColor: 'rgba(0, 0, 0, 0.5)',
 },

在这里插入图片描述

旭日图的高级应用

  1. 层级分析:旭日图可以用于层级结构的可视化,例如组织结构、产品分类等。通过不同的圆环表示不同的层级,展示层级之间的关系和分布情况。上面我们展示的代码就是一个产品分类的层级分析,展示了家用电器、电子产品和衣服的占比情况,通过鼠标点击节点(如衣服),可以下钻到衣服节点进行展示,效果如下:
    在这里插入图片描述
  2. 时间序列分析:如果每个圆环代表一个时间段,旭日图可以展示随时间变化的数据分布情况。可以将相邻时间段的区块连接起来,形成一个动态的旭日图,以便更清晰地观察数据的时序特征。
series: {
      type: 'sunburst',
      radius: ['20%', '60%'],
      data: [
        {
          name: '2020',
          value: 100,
        },
        {
          name: '2021',
          value: 200,
        },
        {
          name: '2022',
          value: 150,
        }
      ],
      links: [
        { source: '2020', target: '2021' },
        { source: '2021', target: '2022' }
      ],
     itemStyle: {
	      borderWidth: 1,
	      borderColor: 'white',
	      shadowBlur: 10,
	      shadowColor: 'rgba(0, 0, 0, 0.5)',
    	},
    },

在这里插入图片描述
3. 多维数据可视化:旭日图可以支持多个维度的数据展示,尤其适用于展示层级结构和多层次的数据关系。可以通过嵌套不同层级的圆环来表示不同维度,从而更好地理解数据之间的复杂关系。

onMounted(() => {
  const myChart = echarts.init(chart.value)
  const colors = ['#FFAE57', '#FF7853', '#EA5151', '#CC3F57', '#9A2555'];
  const bgColor = '#2E2733';
  const itemStyle = {
    star5: {
      color: colors[0]
    },
    star4: {
      color: colors[1]
    },
    star3: {
      color: colors[2]
    },
    star2: {
      color: colors[3]
    }
  };
  const data = [{
    name: '虚构',
    itemStyle: {
      color: colors[1]
    },
    children: [{
      name: '小说',
      children: [{
        name: '5☆',
        children: [{
          name: '疼'
        }, {
          name: '慈悲'
        }, {
          name: '楼下的房客'
        }]
      }, {
        name: '4☆',
        children: [{
          name: '虚无的十字架'
        }, {
          name: '无声告白'
        }, {
          name: '童年的终结'
        }]
      }, {
        name: '3☆',
        children: [{
          name: '疯癫老人日记'
        }]
      }]
    }, {
      name: '其他',
      children: [{
        name: '5☆',
        children: [{
          name: '纳博科夫短篇小说全集'
        }]
      }, {
        name: '4☆',
        children: [{
          name: '安魂曲'
        }, {
          name: '人生拼图版'
        }]
      }, {
        name: '3☆',
        children: [{
          name: '比起爱你,我更需要你'
        }]
      }]
    }]
  }, {
    name: '非虚构',
    itemStyle: {
      color: colors[2]
    },
    children: [{
      name: '设计',
      children: [{
        name: '5☆',
        children: [{
          name: '无界面交互'
        }]
      }, {
        name: '4☆',
        children: [{
          name: '数字绘图的光照与渲染技术'
        }, {
          name: '日本建筑解剖书'
        }]
      }, {
        name: '3☆',
        children: [{
          name: '奇幻世界艺术\n&RPG地图绘制讲座'
        }]
      }]
    }, {
      name: '社科',
      children: [{
        name: '5☆',
        children: [{
          name: '痛点'
        }]
      }, {
        name: '4☆',
        children: [{
          name: '卓有成效的管理者'
        }, {
          name: '进化'
        }, {
          name: '后物欲时代的来临'
        }]
      }, {
        name: '3☆',
        children: [{
          name: '疯癫与文明'
        }]
      }]
    }, {
      name: '心理',
      children: [{
        name: '5☆',
        children: [{
          name: '我们时代的神经症人格'
        }]
      }, {
        name: '4☆',
        children: [{
          name: '皮格马利翁效应'
        }, {
          name: '受伤的人'
        }]
      }, {
        name: '3☆'
      }, {
        name: '2☆',
        children: [{
          name: '迷恋'
        }]
      }]
    }, {
      name: '居家',
      children: [{
        name: '4☆',
        children: [{
          name: '把房子住成家'
        }, {
          name: '只过必要生活'
        }, {
          name: '北欧简约风格'
        }]
      }]
    }, {
      name: '绘本',
      children: [{
        name: '5☆',
        children: [{
          name: '设计诗'
        }]
      }, {
        name: '4☆',
        children: [{
          name: '假如生活糊弄了你'
        }, {
          name: '博物学家的神秘动物图鉴'
        }]
      }, {
        name: '3☆',
        children: [{
          name: '方向'
        }]
      }]
    }, {
      name: '哲学',
      children: [{
        name: '4☆',
        children: [{
          name: '人生的智慧'
        }]
      }]
    }, {
      name: '技术',
      children: [{
        name: '5☆',
        children: [{
          name: '代码整洁之道'
        }]
      }, {
        name: '4☆',
        children: [{
          name: 'Three.js 开发指南'
        }]
      }]
    }]
  }];
  for (let j = 0; j < data.length; ++j) {
    let level1 = data[j].children;
    for (let i = 0; i < level1.length; ++i) {
      let block = level1[i].children;
      let bookScore = [];
      let bookScoreId;
      for (let star = 0; star < block.length; ++star) {
        let style = (function (name) {
          switch (name) {
            case '5☆':
              bookScoreId = 0;
              return itemStyle.star5;
            case '4☆':
              bookScoreId = 1;
              return itemStyle.star4;
            case '3☆':
              bookScoreId = 2;
              return itemStyle.star3;
            case '2☆':
              bookScoreId = 3;
              return itemStyle.star2;
          }
        })(block[star].name);

        block[star].label = {
          color: style.color,
          downplay: {
            opacity: 0.5
          }
        };

        if (block[star].children) {
          style = {
            opacity: 1,
            color: style.color
          };
          block[star].children.forEach(function (book) {
            book.value = 1;
            book.itemStyle = style;
            book.label = {
              color: style.color
            };
            var value = 1;
            if (bookScoreId === 0 || bookScoreId === 3) {
              value = 5;
            }
            if (bookScore[bookScoreId]) {
              bookScore[bookScoreId].value += value;
            }
            else {
              bookScore[bookScoreId] = {
                color: colors[bookScoreId],
                value: value
              };
            }
          });
        }
      }

      level1[i].itemStyle = {
        color: data[j].itemStyle.color
      };
    }
  }
  const option = {
    // 多维数据分析
    backgroundColor: bgColor,
    color: colors,
    series: [{
      type: 'sunburst',
      center: ['50%', '48%'],
      data: data,
      sort: function (a, b) {
        if (a.depth === 1) {
          return b.getValue() - a.getValue();
        }
        else {
          return a.dataIndex - b.dataIndex;
        }
      },
      label: {
        rotate: 'radial',
        color: bgColor
      },
      itemStyle: {
        borderColor: bgColor,
        borderWidth: 2
      },
      levels: [{}, {
        r0: 0,
        r: 40,
        label: {
          rotate: 0
        }
      }, {
        r0: 40,
        r: 105
      }, {
        r0: 115,
        r: 140,
        itemStyle: {
          shadowBlur: 2,
          shadowColor: colors[2],
          color: 'transparent'
        },
        label: {
          rotate: 'tangential',
          fontSize: 10,
          color: colors[0]
        }
      }, {
        r0: 140,
        r: 145,
        itemStyle: {
          shadowBlur: 80,
          shadowColor: colors[0]
        },
        label: {
          position: 'outside',
          textShadowBlur: 5,
          textShadowColor: '#333'
        },
        downplay: {
          label: {
            opacity: 0.5
          }
        }
      }]
    }]
  }
  myChart.setOption(option)
})

在这里插入图片描述
好了,关于旭日图的介绍就到这里吧,里面还有很多有趣的功能,有兴趣的小伙伴可以自行研究,有问题评论区留言,喜欢的小伙伴可以通过微信公众号搜索“九仞山”,关注我,了解更多内容

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

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

相关文章

【从零开始学习JAVA | 第七篇】API 简介

目录 前言 API介绍&#xff1a; 总结&#xff1a; 前言 这篇章为前导性文章&#xff0c;主要向大家介绍了什么是API&#xff0c;不要求掌握&#xff0c;感兴趣的小伙伴们可以看一看。 API介绍&#xff1a; API&#xff08;Application Programming Interface&#xff09;是指…

webpack原理之开发第一个loader

一. 搭建项目结构 整体项目结构如图&#xff1a; 1. 初始化包管理器package.json npm init -y 2. 打包入口文件src/main.js 3. 单页面入口public/index.html 4. 配置webpack.config.js const path require(path) const HtmlWebpackPlugin require("html-webpack-plu…

ChatBot聊天机器人学习1

1、Bot定义 能执行大量自动化、高速或机械式、繁琐的工作的计算机程序&#xff0c;包括但不仅限于聊天功能 2、Retrieval-based KE&#xff08;知识网络&#xff09;基于信息的提取。&#xff08;检索的过程中有延迟&#xff0c;设置比较快捷的检索方式&#xff09; 2.1 Int…

一看就懂的gulp操作指南:让前端工作变得更加轻松

文章目录 I. 简介什么是gulp为什么要使用gulp安装gulp II. Gulp入门任务&#xff08;task&#xff09;和流&#xff08;stream&#xff09;的概念使用gulp来处理文件基本的gulp任务&#xff08;拷贝文件、压缩文件、编译Sass等&#xff09; III. Gulp进阶使用插件开发面向生产的…

基于Python+tensorflow深度学习VGG-19图像风格迁移+自动去噪(MNIST数据集)机器学习+人工智能+神经网络——含全部Python工程源码

目录 前言总体设计系统整体结构图系统流程图 运行环境Python 环境TensorFlow 环境 模块实现1. 图片处理2. 模型构造 系统测试工程源代码下载其它资料下载 前言 本项目基于 MNIST 数据集&#xff0c;使用 VGG-19 网络模型&#xff0c;将图像进行风格迁移&#xff0c;实现去噪功…

数字信号处理课程设计——调制与解调

文字目录 数字信号处理课程设计 摘要&#xff1a; 1绪论 1.1通信信号的调制与解调 1.2设计题目 2卷积定理和希尔伯特公式理论推导 2.1卷积定理 ​2.2希尔伯特公式 3信号DSB调制与希尔伯特解调 3.1过程框图 3.2相关理论推导 3.2.1卷积定理在调制中的应用 3.2.2希尔…

某马 qiankun 公开课 学习记录

端午早晨阳光正好&#xff0c;起来学习一小下 客观评价一哈&#xff1a;此视频适合不了解 qiankun 的朋友入门观看&#xff0c;更详细的使用方法还是推荐 qiankun 官网哦&#xff0c;老师讲的生动活泼&#xff0c;值得萌新一听 某马 qiankun 公开课 - bilibili ovo很多公司的…

高通Camera Log Debug 知识点

和你一起终身学习&#xff0c;这里是程序员Android 经典好文推荐&#xff0c;通过阅读本文&#xff0c;您将收获以下知识点: 一、Camx UMD Log Debug二、Camx KMD log Debug三、常用缩写解释四、参考文献 一、Camx UMD Log Debug 1.1 两种方式设置camx UMD Log /vendor/etc/cam…

GPT-3.5眼中的编程语言之最:Python的卓越之处

当谈论编程语言的选择时&#xff0c;每个开发者都有自己的偏好和理由。作为GPT-3.5&#xff0c;以我的分析和学习能力&#xff0c;我也有自己心目中的编程语言之最。在众多编程语言中&#xff0c;Python在我的眼中独树一帜&#xff0c;是最令人着迷和受欢迎的编程语言之一。 首…

面试经典150题(1)

文章目录 前言除自身以外数组的乘积要求思路代码 跳跃游戏|要求题解代码 跳跃游戏||要求题解代码 前言 今天开始我将陆续为大家更新面试经典150题中较难理解的题目。今天我为大家分享的是&#xff0c;除自身以外数组的乘积、跳跃游戏| 和 跳跃游戏||。 除自身以外数组的乘积 …

【unity之UiI专题】GUI(IMGUI)详解

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;uni…

AI 绘画工具 Stable Diffusion 本地安装使用

最近要用到 AI 绘画&#xff0c;所以研究了下目前市面上的 AI 绘画工具&#xff0c;真可谓是琳琅满目&#xff0c;但主流的还是 Stable diffusion 和 Midjourney 两大阵营。 Midjourney 不多说&#xff0c;开箱即用&#xff0c;对新手非常友好&#xff0c;但不免费&#xff0c…

Linux基础(二)—— 怎么在VMware/WSL中安装Ubuntu系统

文章目录 01 | VMware安装Ubuntu02 | WSL2安装Ubuntu 虚拟机安装Linux的方式分为两种&#xff1a;APP安装、WSL安装 APP安装就是常见的VMware VirtualBox安装的方式&#xff0c;而WSL是Windows系统自带的一个虚拟机应用&#xff0c;可以更好的与Windows进行信息交互&#xff08…

判断是否为美丽数组

判断是否为美丽数组c思路和实现 这段代码的功能是对于给定的多个序列&#xff0c;判断每个序列是否是一个 beautiful 序列。没次读取当前的序列判断之后再加入下一个数字进序列。 首先&#xff0c;输入一个整数 t&#xff0c;表示测试数据组数。 对于每组测试数据&#xff0c;…

【初识C语言】字符串+转义字符+注释

文章目录 1. 字符串2. 转义字符转义字符表常见转义字符 3. 注释 1. 字符串 “hello world.\n” 上面这种由双引号引起的一串字符就被称为字符串&#xff1b; 字符串的存储 C 语言当中没有字符串类型&#xff0c;如果想要将字符串存储起来的话就需要用到字符串数组。 #include…

Excel VBA 编程入门

Visual Basic for Applications&#xff08;VBA&#xff09;是一种用于 Microsoft Office 套件中的编程语言&#xff0c;它可以帮助您自动化重复性任务、定制应用程序以及增强工作效率。本文将向您介绍 Excel VBA 编程的基础知识&#xff0c;并通过示例帮助您入门。 1、启用“开…

融云WICC2023:成为「卷王」的路上,如何更好借力 AIGC

近期&#xff0c;“融云 WICC2023 泛娱乐出海嘉年华”在广州成功举办&#xff0c;行业多方力量与数百位开发者汇聚一堂&#xff0c;共同探讨出海人布局全球的突围之道。关注【融云全球互联网通信云】了解更多 在嘉年华的圆桌会议环节&#xff0c;白鲸出海创始人&#xff06;CE…

Axure教程—计数器

本文将教大家如何用AXURE制作计数器&#xff08;商品购件数的交互设计&#xff09; 一、效果 预览地址&#xff1a;https://uf9ie1.axshare.com 二、功能 1、用户点击“”号时数值加1 2、用户点击“-”号时数值减1 三、制作 数值 拖入一个矩形组件&#xff0c;其大小设置为164…

个人一年工作情况总结报告

个人一年工作情况总结报告篇1 转眼间又到了年终岁尾&#xff0c;这一年就要在很充实忙碌的工作中过去了。在这一年里&#xff0c;我收获了很多也积累了不少的工作经验。同时在两位领导和各位主管的帮助与支持下&#xff0c;我很好的完成了本职工作。作为一名办公室文员&#xf…

云计算成本大揭秘:硬件、研发、电力等各项成本都在这里!

‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 云计算作为一种技术和商业模式&#xff0c;已经深深地影响了全球的IT行业和各种商业运营。云服务商的主要模式以订阅为基础&#xff0c;一旦应用程序和工作负载移动到云上&#xff0c;它们通常会停留在那里&#xff0c;订阅…