6.1軟工日報

笠大發表於2024-06-01

今日學習vue3 + echarts-wordcloud

// ChartWordCloud.vue
 
<template>
	<div id="charts-content"></div>
</template>
 
<script setup lang="ts">
import * as echarts from 'echarts';
import 'echarts-wordcloud';
import { onMounted } from "vue";
// 引入 lodash 中的 merge、深克隆
import merge from 'lodash/merge';
 
 
const props = withDefaults(
	defineProps<{
		options: any
	}>(),
	{},
)
 
 
// 詞雲圖預設屬性
const defaultSeries = [{
	type: 'wordCloud',
	/**
	 * 繪製詞雲的形狀, 值為回撥函式 或 關鍵字, 預設 circle
	 *  關鍵字:
	 * 
	 * circle(圓形)  詞的數量不太多的時候,效果不明顯,它會趨向於畫一個橢圓
	 * cardioid(蘋果形或心形曲線)
	 * diamond(菱形 正方形)
	 * triangle-forward(三角形-向前)
	 * triangle(三角形-直立)
	 * pentagon(五邊形)
	 * star(星形)
	 */
	shape: 'circle',
	// 保持 maskImage 的縱橫比或形狀的縱橫比為 1:1
	keepAspect: false,
	/**
	 * 詞雲輪廓圖,支援為 HTMLImageElement, HTMLCanvasElement,不支援路徑字串, 不包含白色區域; 可選選項
	 * shape選項將隨著雲的形狀增長而繼續應用
	 * 有形狀限制的時候,最好用背景圖來實現,而且這個背景圖一定要放base64的,不然詞雲畫不出來
	 */
	// maskImage: maskImage,
 
	// 詞雲整個圖表放置的位置 和 尺寸大小
	left: 'center',
	top: 'center',
	width: '100%',
	height: '100%',
	right: null,
	bottom: null,
	// 詞雲文字大小範圍,  預設為最小12畫素,最大60畫素
	sizeRange: [12, 60],
	// 詞雲文字旋轉範圍和步長。 文字將透過旋轉在[-90,90]範圍內隨機旋轉步驟45
	// 如果都設定為 0 , 則是水平顯示
	rotationRange: [-90, 90],
	rotationStep: 45,
	/**
	 * 詞間距, 距離越大,單詞之間的間距越大, 單位畫素
	 * 這裡間距太小的話,會出現大詞把小詞套住的情況,比如一個大的口字,中間會有比較大的空隙,這時候他會把一些很小的字放在口字裡面,這樣的話,滑鼠就無法選中裡面的那個小字
	 */
	gridSize: 8,
	// 設定為true可以使單詞部分在畫布之外繪製, 允許繪製大於畫布大小的單詞
	drawOutOfBound: false,
	/**
	 * 佈局的時候是否有動畫
	 * 注意:禁用時,當單詞較多時,將導致UI阻塞。
	 */
	layoutAnimation: true,
	// 這是全域性的文字樣式,相對應的還可以對每個詞設定字型樣式
	textStyle: {
		fontFamily: 'sans-serif',
		fontWeight: 'bold',
		// 顏色可以用一個函式來返回字串
		color: function () {
          // 隨機顏色
          return (
            'rgb(' +
            [
              Math.round(Math.random() * 160),
              Math.round(Math.random() * 160),
              Math.round(Math.random() * 160),
            ].join(',') +
            ')'
          )
        },
	},
	// 滑鼠hover的特效樣式
	emphasis: {
		focus: 'self',
		textStyle: {
			textShadowBlur: 10,
			textShadowColor: '#999'
		}
	},
 
	/**
	 * 詞雲資料,必須是一個陣列,每個陣列項必須有name和value屬性
	 * 設定單個文字的樣式:  textStyle 
	 * 
	 * 例:{
					name: '',
					value: 40,
					textStyle: {
					}
				},
	 */
	data: []
}]
let seriesData = props.options.series;
const series = merge({}, defaultSeries[0], seriesData[0]) // {}表示合併後的新物件,可以傳入一個空物件作為初始值
 
function DrawWordCloud() {
	// 詞雲
	let mychart = echarts.init(document.getElementById("charts-content")) // 可以設定主題色'dark'
	mychart.setOption({
		series: series
	})
}
 
onMounted(() => {
	DrawWordCloud()
})
</script>
 
<style scoped lang="scss"></style>

相關文章