echarts-wordcloud:打造个性化词云库

news2024/10/7 10:25:17

前言

在当今信息爆炸的时代,如何从海量的文本数据中提取有用的信息成为了一项重要的任务。词云作为一种直观、易于理解的数据可视化方式,被广泛应用于文本分析和可视化领域。本文将介绍一种基于 echarts-wordcloud 实现的词云库,通过其丰富的功能和灵活的定制性,帮助用户更好地探索和展示文本数据中的关键信息。


echarts-wordcloud 介绍

echarts-wordcloud 是一种基于 echarts 库实现的词云插件,用于生成和展示词云图。echarts 是一款由百度开发的优秀的数据可视化库,而 echarts-wordcloud 则是在 echarts 的基础上扩展而来的,专门用于处理和展示文本数据中的关键词。词云图是一种以词语频率为基础的可视化方式,通过将词语按照频率大小排列并以不同的字体大小、颜色等方式展示,直观地呈现出文本数据中的关键信息。echarts-wordcloud 提供了丰富的配置选项,可以根据用户的需求进行个性化定制,如调整词语的字体大小、颜色、布局方式等,以及添加交互功能,使用户能够更好地探索和分析文本数据。

一、安装

一共需要安装两个包,一个 echarts 基础包,另一个是 echarts-wordcloud

npm install echarts
npm install echarts-wordcloud

二、基础使用

  • 创建一个容器:在 html 中,创建一个 <div> 元素作为词云图的容器。给该元素指定一个唯一的 id,以便后续操作;
  • 准备数据:准备一个包含词语和对应频率的数据集。你可以使用 javaScript 对象或从后端获取的数据,确保数据格式正确;
  • 初始化 echarts 实例:在 javaScript 代码中,使用 echarts.init() 方法初始化一个 echarts 实例,并将其绑定到词云图容器的 id 上;
  • 配置词云图选项:通过配置 echartsoption 对象,设置词云图的样式、布局和数据。在 option 对象中,使用 series 属性来定义词云图的系列类型为 wordCloud,并设置相关的配置选项,如 shape(词云形状)、sizeRange(词语字体大小范围)、rotationRange(词语旋转角度范围)等。
  • 绑定数据:将准备好的词语和频率数据绑定到词云图的 series 属性中;
  • 渲染词云图:调用 echarts 实例的 setOption() 方法,将配置好的 option 对象传入,以渲染词云图;
  • 显示词云图:在页面中显示生成的词云图,你可以将词云图容器的样式进行调整,以适应你的需求。

完整代码

<template>
  <div class="chartBox">
    <div id="wordChart" :style="{ width: '100%', height: '100%' }"></div>
  </div>
</template>
<script>
import "echarts-wordcloud";
export default {
  mounted() {
    this.initEchart();
  },
  methods: {
    initEchart() {
      var myChart = this.$echarts.init(document.getElementById("wordChart"));
      let option = {
        series: [
          {
            type: "wordCloud", //类型是词云图
            shape: "circle", //词云图的形状为圆形
            keepAspect: false, //不保持词云图的纵横比
            //词云图的位置和大小
            left: "center",
            top: "center",
            width: "100%",
            height: "100%",
            right: null,
            bottom: null,
            sizeRange: [12, 50], //词云图中词语的字体大小范围,最小12px,最大60px
            rotationRange: [-90, 90], //词云图中词语的旋转角度范围
            rotationStep: 45, //词云图中词语的旋转步长
            gridSize: 10, //词云图中词语的间距
            drawOutOfBound: false, //不绘制超出词云图范围的词语
            layoutAnimation: true, //开启布局动画
            //词云图中词语的样式
            textStyle: {
              fontWeight: "bold",
              color: function () {
                return (
                  "rgb(" +
                  [
                    Math.round(Math.random() * 160),
                    Math.round(Math.random() * 160),
                    Math.round(Math.random() * 160),
                  ].join(",") +
                  ")"
                );
              },
            },
            // 词云图中词语的高亮样式
            emphasis: {
              textStyle: {
                textShadowBlur: 2,
                textShadowColor: "orange",
              },
            },
            // 词云图中的数据,必须有name和value属性
            data: [
              { name: "无人驾驶", value: 352 },
              { name: "区块链", value: 214 },
              { name: "云计算", value: 534 },
              { name: "物联网", value: 134 },
              { name: "虚拟现实", value: 534 },
              { name: "增强现实", value: 542 },
              { name: "人工智能", value: 242 },
              { name: "机器学习", value: 42 },
              { name: "深度学习", value: 435 },
              { name: "自然语言处理", value: 124 },
              { name: "计算机视觉", value: 654 },
              { name: "神经网络", value: 232 },
              { name: "数据挖掘", value: 324 },
              { name: "语音识别", value: 453 },
              { name: "图像识别", value: 124 },
              { name: "聊天机器人", value: 453 },
              { name: "智能家居", value: 233 },
              { name: "人脸识别", value: 123 },
              { name: "量子计算", value: 212 },
              { name: "智能制造", value: 241 },
              { name: "语义分割", value: 414 },
              { name: "知识图谱", value: 564 },
              { name: "增量学习", value: 755 },
              { name: "多模态学习", value: 229 },
              { name: "迁移学习", value: 233 },
              { name: "生成对抗网络", value: 124 },
              { name: "强化学习", value: 65 },
              { name: "人机交互", value: 199 },
              { name: "机器人技术", value: 299 },
              { name: "智能音箱", value: 454 },
              { name: "智能医疗", value: 365 },
              { name: "异常检测", value: 360 },
              { name: "时间序列预测", value: 187 },
              { name: "推荐系统", value: 360 },
              { name: "情感分析", value: 460 },
              { name: "机器翻译", value: 480 },
              { name: "语音合成", value: 488 },
              { name: "人脸生成", value: 51 },
              { name: "图像风格转换", value: 99 },
              { name: "实例分割", value: 120 },
              { name: "目标检测", value: 150 },
            ],
          },
        ],
      };
      myChart.setOption(option);
      window.addEventListener("resize", function () {
        myChart.resize();
      });
    },
  },
};
</script>
<style scoped>
.chartBox {
  width: 50%;
  height: 50vh;
}
</style>

实现效果

在这里插入图片描述


三、进阶使用

3.1 shape

特殊情况下,shape 属性也可以是一个函数,用于自定义词云图的形状。当我们需要创建一个非常特殊的形状时,可以使用这个函数来实现。

实例代码

shape: function shapeSquare(theta) {
  return Math.min(
    1 / Math.abs(Math.cos(theta)),
    1 / Math.abs(Math.sin(theta))
  );
},

在上面的示例代码中,shape 参数被定义为一个函数,函数名为 shapeSquare。这个函数接受一个参数 theta,表示角度。在函数内部,我们使用三角函数(余弦和正弦)来计算正方形的形状。具体来说,我们计算了余弦和正弦的绝对值的倒数,并使用 Math.min 方法来取其中较小的值。这样做的目的是确保正方形的边长不会超过 1。通过这个函数,我们可以根据给定的角度 theta 来计算正方形的形状。当 theta 的值接近 0180 度时,余弦的绝对值会接近 1,而正弦的绝对值会接近 0,因此正方形的形状会更接近于宽度大于高度的长方形。当 theta 的值接近 90270 度时,余弦的绝对值会接近 0,而正弦的绝对值会接近 1,因此正方形的形状会更接近于高度大于宽度的长方形。

实现效果
在这里插入图片描述


3.2 color

echarts-wordcloud 中,color 是用于配置词云图中词语的颜色的参数。它可以接受不同的取值,包括字符串和函数。

  • 字符串:你可以直接指定一个颜色字符串,如 red#ff0000 等,来设置所有词语的颜色为同一个固定值;
  • 函数:你可以定义一个函数来动态地设置每个词语的颜色。

字符串

textStyle: {
  color: "red",
},

实现效果
在这里插入图片描述


函数

color: function () {
  return (
    "rgb(" +
    [
      Math.round(Math.random() * 255),
      Math.round(Math.random() * 255),
      Math.round(Math.random() * 255),
    ].join(",") +
    ")"
  );
},

实现效果
在这里插入图片描述


3.2 自定义背景图

echarts-wordcloud 中,maskImage 参数用于设置词云图的背景图。通过指定一个图片的 url 地址,你可以使用自定义的背景图来呈现词云图。以下是一个示例代码,展示如何使用 maskImage 参数来设置词云图的背景图:

initEchart() {
  var myChart = this.$echarts.init(document.getElementById("wordChart"));
  var maskImage = new Image();
  maskImage.src = "data:image/png;base64,";
  let option = {
    series: [
      {
        type: "wordCloud",
        shape: "circle",
        maskImage: maskImage,
      },
    ],
  };
  myChart.setOption(option);
  window.addEventListener("resize", function () {
    myChart.resize();
  });
},

核心代码

在这里插入图片描述

实现效果

在这里插入图片描述

相关推荐

⭐ 玩转数据可视化,从入门到精通 Echarts

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

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

相关文章

嵌入式C语言中指针与链表的关系详解

假定给你一块非常小的内存,这块内存只有8字节,这里也没有高级语言,没有操作系统,你操作的数据单位是单个字节,你该怎样读写这块内存呢? 注意这里的限定,再读一遍,没有高级语言,没有操作系统,在这样的限制之下,你必须直面内存读写的本质。 这个本质是什么呢? 本质…

Java同步包装器

通过 Collections.synchronizedList() 方法将一个普通的 ArrayList 包装成了线程安全的 List&#xff1a; import java.util.*;public class SynchronizedWrapperExample {public static void main(String[] args) {// 创建一个非线程安全的 ArrayListList<String> list…

Redis理解【精细】【快速上手】

目录 1. 了解3V和3高 2.什么是redis 3. redis可以做什么 4. Windows安装 5. 使用redis客户端操作redis 5.1 redis基本命令 5.1.1 切换数据库 5.1.2 查看当前数据库的大小 5.1.3 查看当前数据库所有的key ​​​​​​​ 5.1.4 清空当前数据库所有key 5.1.5 清空所…

在Linux操作环境下搭建内网源

在修改配置文件之前都应该有备份。 比如在/目录下专门创建一个目录用来储存文件的备份。 1.安装vsftpd软件 首先使用命令yum search ftpd 来查看当前Linux操作系统下是否有ftpd软件。 随后使用yum install vsftpd&#xff0c;来安装vsftpd软件 2.修改vsftpd的配置文件&…

免费最好用的证件照制作软件,一键换底+老照片修复+图片动漫化,吊打付费!

这款软件真的是阿星用过的&#xff0c;最好用的证件照制作软件&#xff0c;没有之一&#xff01; 我是阿星&#xff0c;今天要给大家安利一款超实用的证件照工具&#xff0c;一键换底&#xff0c;自动排版&#xff0c;免费无广告&#xff0c;让你在家就能轻松搞定证件照&#…

CXL-GPU: 全球首款实现百ns以内的低延迟CXL解决方案

数据中心在追求更高性能和更低总拥有成本&#xff08;TCO&#xff09;的过程中面临三大主要内存挑战。首先&#xff0c;当前服务器内存层次结构存在局限性。直接连接的DRAM与固态硬盘&#xff08;SSD&#xff09;存储之间存在三个数量级的延迟差异。当处理器直接连接的内存容量…

HbuilderX:安卓打包证书.keystore生成与使用

前置条件 已安装jdk或配置好jre环境。 .keystore生成 打开cmd,切换到目标路径,输入以下命令, keytool -genkey -alias testalias -keyalg RSA -keysize 2048 -validity 36500 -keystore test.keystore 输入密钥库口令(要记住), 然后输入一系列信息, …

七大排序算法的深入浅出(java篇)

&#x1f341; 个人主页&#xff1a;爱编程的Tom&#x1f4ab; 本篇博文收录专栏&#xff1a;Java专栏&#x1f449; 目前其它专栏&#xff1a;c系列小游戏 c语言系列--万物的开始_ 等等 &#x1f389; 欢迎 &#x1f44d;点赞✍评论⭐收藏&#x1f496;三连支…

面试题 4:阐述以下方法 @classmethod, @staticmethod, @property?

欢迎莅临我的博客 &#x1f49d;&#x1f49d;&#x1f49d;&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

CesiumJS【Basic】- #058 绘制网格填充多边形(Entity方式)-使用shader

文章目录 绘制网格填充多边形(Entity方式)-使用shader1 目标2 代码2.1 main.ts绘制网格填充多边形(Entity方式)-使用shader 1 目标 使用Entity方式绘制绘制网格填充多边形 - 使用shader 2 代码 2.1 main.ts import * as Cesium from cesium;// 创建 Cesium Viewer 实例…

MyBatis踩坑记录-多表关联字段相同,字段数据覆盖问题

MyBatis踩坑记录-多表关联字段相同&#xff0c;字段数据覆盖问题 1. 背景描述2. 实体记录3. 错误映射3.1 造成的影响 4. 解决办法4.1 修改映射文件 5. 修复后的效果5.1 返回的数据5.2 正确展示 7. end ~ 1. 背景描述 现有一下业务&#xff0c;单个任务下可能会有多个子任务&am…

【日记】在街上跳舞被同事看见了(470 字)

正文 昨晚跳舞&#xff0c;照例在街上表演&#xff0c;被单位里的保洁阿姨撞见了…… 我以为这就完了&#xff0c;结果她还拍了视频发给做饭阿姨。晚上吃饭无意间聊起才知道有这回事。我竟一时间不知该哭还是该笑……. 今天非常非常闲。虽然不是没工作&#xff0c;只是我懒得去…

客户端渗透

1.一键可执行程序 2.给程序加壳 3.宏病毒感染文档 4.Android apk 利用 1.一键可执行程序 介绍&#xff1a;我们要进行客户端渗透&#xff0c;我们生成一个可执行程序&#xff0c;也是简单粗暴&#xff0c;MSF建立监听&#xff0c;把它发给受害者&#xff0c;只要受害者点击…

CAN学习笔记

学习链接&#xff1a;CAN学习笔记&#xff08;1&#xff09;_can sjw-CSDN博客 内容全部取自链接&#xff0c;非原创。用于自己学习和记录&#xff0c;如有错误请指正。如果侵权了&#xff0c;请联系我删掉。 CAN主要有两种物理层&#xff0c;1.闭环的ISO11898 2.开环的ISO1…

Django学习第三天

python manage.py runserver 使用以上的命令启动项目 实现新建用户数据功能 views.py文件代码 from django.shortcuts import render, redirect from app01 import models# Create your views here. def depart_list(request):""" 部门列表 ""&qu…

【JVM-05】Java内存区域(运行时数据区)、对象创建过程、内存布局

【JVM-05】Java内存区域即运行时数据区、对象创建过程、内存布局 1. 介绍下Java内存区域(运行时数据区)1.1 程序计数器(线程私有)1.2 虚拟机栈(线程私有)1.3 本地方法栈(线程私有)1.4 Java堆(线程共享)1.5 方法区(线程共享)1.5.1 方法区和永久代的关系1.5.2 常用参数1.5.3 为什…

2024年上半年典型网络攻击事件汇总

文章目录 前言一、Ivanti VPN 的0 Day攻击(2024年1月)二、微软公司高管账户泄露攻击(2024年1月)三、Change Healthcare网络攻击(2024年2月)四、ConnectWise ScreenConnect漏洞利用攻击(2024年2月)五、XZ Utils软件供应链攻击(2024年3月)六、AT&T数据泄露攻击(20…

软件系统测试的内容和流程大揭秘,如何获取系统测试报告?

软件系统测试是指对软件系统的功能、性能、安全等方面进行验证和确认的过程。它是软件开发过程中至关重要的一环&#xff0c;通过测试可以发现并修复软件中存在的缺陷和问题&#xff0c;确保软件的质量和可靠性。在当前日益竞争激烈的市场环境下&#xff0c;软件系统测试显得尤…

你想活出怎样的人生?

hi~好久不见&#xff0c;距离上次发文隔了有段时间了&#xff0c;这段时间&#xff0c;我是裸辞去感受了一下前端市场的水深火热&#xff0c;那么这次咱们不聊技术&#xff0c;就说一说最近这段时间的经历和一些感触吧。 先说一下自己的个人情况&#xff0c;目前做前端四年&am…

朋友圈运营必备!一键转发和自动转发轻松搞定!

你还在手动发布多个微信号的朋友圈吗&#xff1f; 现在&#xff0c;就教你一招&#xff0c;让你轻松实现一键转发和自动转发朋友圈&#xff01; 首先&#xff0c;我们需要在个微管理系统上登录自己的微信号&#xff0c;以便进行统一管理。这个系统可以多个微信号同时登录&…