Echarts+D3气泡图(相邻效果,气泡之间不叠加)
< template>
< div ref= "chart" style= "width: 500px; height: 500px" > < / div>
< / template>
< script setup>
import * as echarts from 'echarts/core'
import { DatasetComponent, TooltipComponent, VisualMapComponent } from 'echarts/components'
import { CustomChart } from 'echarts/charts'
import { CanvasRenderer } from 'echarts/renderers'
echarts. use ( [ DatasetComponent, TooltipComponent, VisualMapComponent, CustomChart, CanvasRenderer] )
import * as d3 from 'd3'
import { ref, onMounted } from 'vue'
const chart = ref ( null )
const colorList = [
'#5470c6' ,
'#91cc75' ,
'#fac858' ,
'#ee6666' ,
'#73c0de' ,
'#3ba272' ,
'#fc8452' ,
'#9a60b4' ,
'#ea7ccc'
]
let option = { }
let seriesData = [
{
depth : 1 ,
id : 'city' ,
index : 0 ,
value : 2
} ,
{
depth : 1 ,
id : 'city.孝感' ,
index : 6 ,
value : 6
} ,
{
depth : 1 ,
id : 'city.武汉' ,
index : 1 ,
value : 36
} ,
{
depth : 1 ,
id : 'city.荆州' ,
index : 2 ,
value : 26
} ,
{
depth : 1 ,
id : 'city.咸宁' ,
index : 3 ,
value : 16
} ,
{
depth : 1 ,
id : 'city.仙桃' ,
index : 4 ,
value : 6
} ,
{
depth : 1 ,
id : 'city.潜江' ,
index : 5 ,
value : 10
} ,
{
depth : 1 ,
id : 'city.十堰' ,
index : 6 ,
value : 8
}
]
let displayRoot = stratify1 ( )
function stratify1 ( ) {
return d3
. stratify ( )
. parentId ( function ( d ) {
return d. id. substring ( 0 , d. id. lastIndexOf ( '.' ) )
} ) ( seriesData)
. sum ( function ( d ) {
return d. value || 0
} )
. sort ( function ( a, b ) {
return b. value - a. value
} )
}
function overallLayout ( params, api ) {
let context = params. context
d3
. pack ( )
. size ( [ api. getWidth ( ) - 2 , api. getHeight ( ) - 2 ] )
. padding ( 0 ) ( displayRoot)
context. nodes = { }
displayRoot. descendants ( ) . forEach ( function ( node ) {
context. nodes[ node. id] = node
} )
}
function renderItem ( params, api ) {
let context = params. context
let idx = params. dataIndex
if ( ! context. layout) {
context. layout = true
overallLayout ( params, api)
}
let nodePath = api. value ( 'id' )
let nodeName = nodePath
. slice ( nodePath. lastIndexOf ( '.' ) + 1 )
. split ( / (?=[A-Z][^A-Z]) / g )
. join ( '\n' )
let node = context. nodes[ nodePath]
if ( node. id === 'city' ) {
node. r = 0
}
if ( ! node) {
return
}
let colorTop = colorList[ idx % colorList. length]
let colorBottom = colorList[ ( idx + 1 ) % colorList. length]
let linearGradient = new echarts. graphic. LinearGradient ( 0 , 0 , 0 , 1 , [
{ offset : 0 , color : colorTop } ,
{ offset : 1 , color : colorBottom }
] )
let z2 = api. value ( 'depth' ) * 2
return {
type : 'circle' ,
shape : {
cx : node. x,
cy : node. y,
r : node. r
} ,
z2 : z2,
textContent : {
type : 'text' ,
style : {
text : nodeName,
fill : '#fff' ,
fontFamily : 'Arial' ,
width : node. r * 1.3 ,
overflow : 'truncate' ,
fontSize : node. r / 3
} ,
emphasis : {
style : {
overflow : null ,
fontSize : Math. max ( node. r / 3 , 12 )
}
}
} ,
textConfig : {
position : 'inside'
} ,
style : {
fill : linearGradient
} ,
emphasis : {
style : {
fontFamily : 'Arial' ,
fontSize : 12 ,
shadowBlur : 20 ,
shadowOffsetX : 3 ,
shadowOffsetY : 5 ,
shadowColor : 'rgba(0,0,0,0.3)'
}
}
}
}
option = {
dataset : {
source : seriesData
} ,
tooltip : { } ,
hoverLayerThreshold : Infinity ,
series : [
{
type : 'custom' ,
colorBy : 'data' ,
renderItem : renderItem,
progressive : 0 ,
coordinateSystem : 'none' ,
encode : {
tooltip : 'value' ,
itemName : 'id'
}
}
]
}
const initEcharts = ( ) => {
const myChart = echarts. init ( chart. value)
myChart. setOption ( option)
}
onMounted ( ( ) => {
initEcharts ( )
} )
< / script>