16.在Vue3中使用Echarts实现词云图

前言

在数据可视化领域,词云图(Word Cloud)是一种非常直观的展示方式,能够通过字体大小和颜色来突出关键词的重要性。本文将详细介绍如何在 Vue 3 项目中使用 ECharts 实现一个词云图,并附上完整的代码示例。

实现效果

环境准备

在开始之前,请确保你已经完成以下准备工作:

  1. Node.js 环境:确保你的开发环境中已经安装了 Node.js。

  2. Vue 3 项目:如果你还没有 Vue 3 项目,可以通过以下命令创建一个:

    javascript 复制代码
    npm init vue@latest
  3. 安装 ECharts:在项目中安装 ECharts 及其词云图扩展:

    javascript 复制代码
    npm install echarts echarts-wordcloud

实现步骤

1. 完整代码

javascript 复制代码
<!--  
 * @Author: 彭麒  
 * @Date: 2025/1/22  
 * @Email: 1062470959@qq.com  
 * @Description: 此源码版权归吉檀迦俐所有,可供学习和借鉴或商用。  
 -->  
<template>
  <div class="w-full justify-start flex h-[180px] items-center pl-10">
    <BackButton @click="goBack"/>
  </div>
  <div class="font-bold text-[24px]">在Vue3中使用Echarts实现词云图</div>
  <div class="chart-container">
    <div ref="chartRef" class="word-cloud"></div>
  </div>
</template>

<script setup lang="ts">
import { ref, onMounted, onUnmounted } from 'vue'
import * as echarts from 'echarts'
import 'echarts-wordcloud'
import BackButton from "@/views/components/BackButton.vue"; // Import the wordCloud extension
import router from "@/router";
const goBack = () => {
  setTimeout(() => {
    router.push('/Echarts')
  }, 1000)
}
const chartRef = ref<HTMLElement | null>(null)
let chart: echarts.ECharts | null = null

const jsonList = [
  {
    name: "生活资源",
    value: "999"
  }, {
    name: "供热管理",
    value: "888"
  }, {
    name: "供气质量",
    value: "777"
  }, {
    name: "生活用水管理",
    value: "688"
  }, {
    name: "一次供水问题",
    value: "588"
  }, {
    name: "交通运输",
    value: "516"
  }, {
    name: "城市交通",
    value: "515"
  }, {
    name: "环境保护",
    value: "483"
  }, {
    name: "房地产管理",
    value: "462"
  }, {
    name: "城乡建设",
    value: "449"
  }, {
    name: "社会保障与福利",
    value: "429"
  }, {
    name: "社会保障",
    value: "407"
  }, {
    name: "文体与教育管理",
    value: "406"
  }, {
    name: "公共安全",
    value: "406"
  }, {
    name: "公交运输管理",
    value: "386"
  }, {
    name: "出租车运营管理",
    value: "385"
  }, {
    name: "供热管理",
    value: "375"
  }, {
    name: "市容环卫",
    value: "355"
  }, {
    name: "自然资源管理",
    value: "355"
  }, {
    name: "粉尘污染",
    value: "335"
  }, {
    name: "噪声污染",
    value: "324"
  }, {
    name: "土地资源管理",
    value: "304"
  }, {
    name: "物业服务与管理",
    value: "304"
  }, {
    name: "医疗卫生",
    value: "284"
  }, {
    name: "粉煤灰污染",
    value: "284"
  }, {
    name: "占道",
    value: "284"
  }, {
    name: "供热发展",
    value: "254"
  }, {
    name: "农村土地规划管理",
    value: "254"
  }, {
    name: "生活噪音",
    value: "253"
  }, {
    name: "供热单位影响",
    value: "253"
  }, {
    name: "城市供电",
    value: "223"
  }, {
    name: "房屋质量与安全",
    value: "223"
  }, {
    name: "大气污染",
    value: "223"
  }, {
    name: "房屋安全",
    value: "223"
  }, {
    name: "文化活动",
    value: "223"
  }, {
    name: "拆迁管理",
    value: "223"
  }, {
    name: "公共设施",
    value: "223"
  }, {
    name: "供气质量",
    value: "223"
  }, {
    name: "供电管理",
    value: "223"
  }, {
    name: "燃气管理",
    value: "152"
  }, {
    name: "教育管理",
    value: "152"
  }, {
    name: "医疗纠纷",
    value: "152"
  }, {
    name: "执法监督",
    value: "152"
  }, {
    name: "设备安全",
    value: "152"
  }, {
    name: "政务建设",
    value: "152"
  },
]

const initChart = () => {
  if (!chartRef.value) return

  chart = echarts.init(chartRef.value)

  const option = {
    tooltip: {
      show: true
    },
    toolbox: {
      feature: {
        saveAsImage: {
          iconStyle: {
            normal: {
              color: '#FFFFFF'
            }
          }
        }
      }
    },
    series: [{
      name: '热点分析',
      type: 'wordCloud',
      sizeRange: [6, 66],
      rotationRange: [-45, 90],
      textPadding: 0,
      autoSize: {
        enable: true,
        minSize: 6
      },
      textStyle: {
        normal: {
          color: function() {
            return 'rgb(' + [
              Math.round(Math.random() * 160),
              Math.round(Math.random() * 160),
              Math.round(Math.random() * 160)
            ].join(',') + ')';
          }
        },
        emphasis: {
          shadowBlur: 10,
          shadowColor: '#333'
        }
      },
      data: jsonList
    }]
  };

  chart.setOption(option)

  // Add click event handler
  chart.on('click', (params) => {
    window.open('https://www.baidu.com/s?wd=' + encodeURIComponent(params.name))
  })
}

const handleResize = () => {
  chart?.resize()
}

onMounted(() => {
  initChart()
  window.addEventListener('resize', handleResize)
})

onUnmounted(() => {
  chart?.dispose()
  window.removeEventListener('resize', handleResize)
})
</script>

<style scoped>
.chart-container {
  width: 100%;
  height: 80%;
  min-height: 600px;
}

.word-cloud {
  width: 100%;
  height: 100%;
}

@media screen and (max-width: 768px) {
  .chart-container {
    min-height: 400px;
  }
}

@media screen and (max-width: 480px) {
  .chart-container {
    min-height: 300px;
  }
}
</style>

2. 运行项目

完成以上步骤后,运行你的 Vue 3 项目:

javascript 复制代码
npm run dev

打开浏览器,访问相应的页面,你应该可以看到一个动态的词云图。

代码解析

  1. 数据绑定

    • 使用 ref 绑定 DOM 元素,用于初始化 ECharts 实例。

    • 词云图的数据通过 jsonList 提供,每个对象包含 namevalue 属性。

  2. ECharts 配置

    • sizeRange 控制词云图中字体的大小范围。

    • rotationRange 控制词语的旋转角度范围。

    • textStyle 定义了词语的样式,包括颜色和阴影效果。

  3. 事件处理

    • 使用 chart.on('click', ...) 监听词云图的点击事件,点击词语时会跳转到百度搜索页面。
  4. 响应式布局

    • 使用媒体查询实现词云图在不同屏幕尺寸下的自适应布局。

总结

通过本文的介绍,你已经学会了如何在 Vue 3 项目中使用 ECharts 实现一个词云图。词云图不仅能够直观地展示数据,还能通过交互增强用户体验。希望这篇文章对你有所帮助,欢迎在评论区分享你的想法和建议!


参考链接


希望这篇博文能够帮助你在 CSDN 上获得更多的阅读和关注!如果有任何问题,欢迎在评论区讨论。

相关推荐
Python大数据分析@7 分钟前
通俗的讲,网络爬虫到底是什么?
前端·爬虫·网络爬虫
不爱学英文的码字机器25 分钟前
[操作系统] 环境变量详解
开发语言·javascript·ecmascript
Lysun00129 分钟前
vue2的$el.querySelector在vue3中怎么写
前端·javascript·vue.js
毛毛三由29 分钟前
【组件分享】商品列表组件-最佳实践
vue.js
jerry-891 小时前
Centos类型服务器等保测评整/etc/pam.d/system-auth
java·前端·github
工业甲酰苯胺1 小时前
深入解析 Spring AI 系列:解析返回参数处理
javascript·windows·spring
小爬菜1 小时前
Django学习笔记(启动项目)-03
前端·笔记·python·学习·django
想要打 Acm 的小周同学呀1 小时前
前端Vue2项目使用md编辑器
前端·编辑器·vue2·markdown 语法
计算机-秋大田1 小时前
基于SSM的家庭记账本小程序设计与实现(LW+源码+讲解)
java·前端·后端·微信小程序·小程序·课程设计
海的预约2 小时前
VUE之路由Props、replace、编程式路由导航、重定向
前端·vue.js·智能路由器