133 lines
3.5 KiB
Vue
133 lines
3.5 KiB
Vue
![]() |
<template>
|
||
|
<div
|
||
|
ref="chart"
|
||
|
class="word-cloud-chart"
|
||
|
:style="{ width: $attrs.width, height: $attrs.height }"
|
||
|
></div>
|
||
|
</template>
|
||
|
|
||
|
<script lang="ts">
|
||
|
import { defineComponent, onMounted, onBeforeUnmount, ref } from "vue";
|
||
|
import * as echarts from "echarts/core";
|
||
|
import { TooltipComponent, TitleComponent } from "echarts/components";
|
||
|
import { CanvasRenderer } from "echarts/renderers";
|
||
|
|
||
|
// Import the word cloud extension dynamically to avoid issues
|
||
|
// await import('echarts-wordcloud'); // Ensure this import works correctly
|
||
|
|
||
|
export default defineComponent({
|
||
|
props: {
|
||
|
data: {
|
||
|
type: Array,
|
||
|
required: true,
|
||
|
},
|
||
|
gridSize: {
|
||
|
type: Number,
|
||
|
default: 8,
|
||
|
},
|
||
|
},
|
||
|
ssr: false,
|
||
|
name: "WordCloudChart",
|
||
|
setup(props) {
|
||
|
console.log(props.data);
|
||
|
console.log(props.gridSize);
|
||
|
|
||
|
const chart = ref(null);
|
||
|
let myChart: echarts.ECharts | null = null;
|
||
|
|
||
|
onMounted(async () => {
|
||
|
// Dynamically import the word cloud extension
|
||
|
await import("echarts-wordcloud");
|
||
|
|
||
|
// Register the necessary components
|
||
|
echarts.use([TooltipComponent, TitleComponent, CanvasRenderer]);
|
||
|
|
||
|
if (chart.value) {
|
||
|
myChart = echarts.init(chart.value);
|
||
|
|
||
|
myChart.setOption({
|
||
|
tooltip: {
|
||
|
show: true,
|
||
|
formatter: function (params) {
|
||
|
return (
|
||
|
'<div style="font-weight: bold;;">' +
|
||
|
params.data.name +
|
||
|
'</div><div style="text-align:center;">دفعات تکرار: ' +
|
||
|
params.data.value +
|
||
|
" " +
|
||
|
"بار" +
|
||
|
"</div>"
|
||
|
);
|
||
|
},
|
||
|
textStyle: {
|
||
|
fontFamily: "sahel",
|
||
|
fontSize: 14, // اندازه فونت
|
||
|
},
|
||
|
},
|
||
|
series: [
|
||
|
{
|
||
|
type: "wordCloud",
|
||
|
shape: "square",
|
||
|
keepAspect: false,
|
||
|
shrinkToFit: true,
|
||
|
drawOutOfBound: false,
|
||
|
left: "center",
|
||
|
top: "center",
|
||
|
width: "100%",
|
||
|
height: "100%",
|
||
|
right: null,
|
||
|
bottom: null,
|
||
|
sizeRange: [12, 60],
|
||
|
rotationRange: [-90, 90],
|
||
|
rotationStep: 45,
|
||
|
layoutAnimation: true,
|
||
|
gridSize: props.gridSize ? props.gridSize : 25,
|
||
|
// animationDurationUpdate: 1000, // مدت زمان انیمیشن به میلیثانیه
|
||
|
// animationEasingUpdate: "cubicInOut", // نوع انیمیشن
|
||
|
textStyle: {
|
||
|
fontFamily: "sahel",
|
||
|
fontWeight: "bold",
|
||
|
color: function () {
|
||
|
return (
|
||
|
"rgb(" +
|
||
|
[
|
||
|
Math.round(Math.random() * 160),
|
||
|
Math.round(Math.random() * 160),
|
||
|
Math.round(Math.random() * 160),
|
||
|
].join(",") +
|
||
|
")"
|
||
|
);
|
||
|
},
|
||
|
},
|
||
|
emphasis: {
|
||
|
focus: "self",
|
||
|
textStyle: {
|
||
|
textShadowBlur: 10,
|
||
|
textShadowColor: "#333",
|
||
|
},
|
||
|
},
|
||
|
data: props.data,
|
||
|
},
|
||
|
],
|
||
|
});
|
||
|
}
|
||
|
});
|
||
|
|
||
|
onBeforeUnmount(() => {
|
||
|
if (myChart) {
|
||
|
myChart.dispose();
|
||
|
}
|
||
|
});
|
||
|
|
||
|
return { chart };
|
||
|
},
|
||
|
});
|
||
|
</script>
|
||
|
|
||
|
<style scoped>
|
||
|
.word-cloud-chart {
|
||
|
width: 100%;
|
||
|
height: 500px;
|
||
|
}
|
||
|
</style>
|