配置项如下
let demo = [
{
"z": "买房人数",
"xz": 1000,
"x":7086,
"y": 10,
"q":1556
},
{
"z": "买房人数",
"xz": 2000,
"x":7686,
"y": 52,
"q":1956
},
{
"z": "租房人数",
"xz": 2000,
"x":1986,
"y": 102,
"q":3556
},
{
"z": "租房人数",
"xz": 4000,
"x":6786,
"y": 384,
"q":5556
},
{
"z": "买房人数",
"xz": 3000,
"x":1586,
"y": 200,
"q":4556
},
{
"z": "租房人数",
"xz": 3000,
"x":2886,
"y": 250,
"q":4856
},
{
"z": "买房人数",
"xz": 4000,
"x":3686,
"y": 334,
"q":5056
},
{
"z": "买房人数",
"xz": 5000,
"x":2186,
"y": 390,
"q":4056
},
{
"z": "租房人数",
"xz": 5000,
"x":2956,
"y": 540,
"q":5156
},
{
"z": "买房人数",
"xz": 6000,
"x":5486,
"y": 330,
"q":4056
},
{
"z": "租房人数",
"xz": 1000,
"x":1686,
"y": 60,
"q":2556
},
{
"z": "租房人数",
"xz": 6000,
"x":7586,
"y": 380,
"q":4756
},
{
"z": "买房人数",
"xz": 7000,
"x":3486,
"y": 220,
"q":3256
},
{
"z": "租房人数",
"xz": 7000,
"x":3816,
"y": 270,
"q":3856
},
{
"z": "买房人数",
"xz": 8000,
"x":1486,
"y": 110,
"q":1056
},
{
"z": "租房人数",
"xz": 8000,
"x":5656,
"y": 160,
"q":1956
}
];
let colors = ['#63bef8'];
option = {
backgroundColor:"#071435",
legend:{
right: '4%',
show:true,
itemWidth: 10,
itemHeight: 10,
data: _ledgend(),
textStyle:{
color: '#fff',
fontSize:14,
}
},
grid:{
right:'5%'
},
xAxis: [{
type : 'value',
//data : this._xAxisData(),
min: _xDataMin(),
axisTick: {
show: false,
alignWithLabel: true, //对齐数据
},
axisLabel: {
color: 'rgba(255,255,255,0.8)',
fontSize: 12,
formatter:function(val){
return val
},
margin: 15,
interval:0
},
splitLine:{
show: true,
alignWithLabel: true, //对齐数据
lineStyle:{
color: 'rgba(255, 255, 255, 0.1)'
}
},
axisLine: _axisLine()
}
],
yAxis: [{
type : 'value',
position:'left',
max:_allDataMax(),
//scale:true,
axisLabel: {
color: 'rgba(255,255,255,0.8)',
fontSize: 12,
formatter:function(val){
return val
},
margin: 15,
},
splitLine: {
show: true,
lineStyle:{
color: 'rgba(255, 255, 255, 0.1)'
}
},
axisTick:{
lineStyle:{
color:'#63bef8',
width:1
}
},
axisLine: _axisLine()
},{
type : 'value',
position:"right",
max:_allDataMax(),
//scale:true,
axisLabel: {
show:false,
},
splitLine: {
show: false,
lineStyle:{
color: 'rgba(255, 255, 255, 0.1)'
}
},
axisTick:{
lineStyle:{
color:'#63bef8',
width:1
}
},
axisLine: _axisLine()
}
],
series : _seriesData()
};
function _ledgend(){
let legendDt = new Set(demo && demo.map(item=>item.z));
let _data = [];
if(legendDt){
for (let x of legendDt) {
_data.push(x)
}
}
return _data;
}
//x轴最小值
function _xDataMin(){
let xData = _xAxisData(),
tempArr = xData.concat();
min = tempArr.sort(_sortNumber).slice(0,1);
return min[0]
}
//数据最大值
function _allDataMax(){
let arr = [];
let dataKinds = _ledgend(),
kinds = dataKinds.length; //数据种类数n
demo && demo.map((item)=>{
for(var n=0;n<kinds;n++){
let v = n+1;
arr.push(item.y);
}
})
let max = arr.sort(_sortNumberMax).splice(0,1),
lg = parseInt(max[0]).toString().length,
lev = (parseInt(max[0]).toString()).split("")[0],
x = parseInt(lev)+2;
let _maxFinal = x*Math.pow(10, lg-1); //按照数量级计算出合适的最大值
return _maxFinal;
}
//排序不去重
function _sortNumber(a,b){
return a-b
}
function _sortNumberMax(a,b){
return b-a
}
function _seriesData(){
let colorsArr = _colors(),
colorSys = _colorSys();
let dataKinds = _ledgend(),
dataLg =demo.length,
kinds = dataKinds.length;
let _xData = _xAxisData();
let result = [];
let obj = {};
demo.forEach((item, i) => {
!obj[item.z] ? obj[item.z] = [item] : obj[item.z].push(item);
})
//气泡item
for(var i=0;i<kinds;i++){
let _data = obj[dataKinds[i]],
tempArr = [];
for(var k=0;k<dataLg;k++){
let _dt = _xData[k];
_data.map((item)=>{
if(item.xz === _dt){
tempArr.push([item.x,item.y,item.q])
}
})
}
result.push(tempArr)
}
//插入最大值数组,画T
let _max = _allDataMax(),lineData = [];
_xData && _xData.forEach((v)=>{
lineData.push([v,_max]);
})
result.push(lineData);
//计算气泡大小
let lg = parseInt(_max).toString().length,
itemRatio = Math.pow(10, lg-1);
//创建series
let seriesArr = [];
let _svg = _svgIcon();
result && result.map((item,ind)=>{
if(ind === result.length-1){
seriesArr.push({
name: '固定T',
type: 'scatter',
yAxisIndex:1,
symbol:_svg,
symbolSize: 10,
itemStyle:{
normal:{
color:"#63bef8"
}
},
symbolOffset:[0,'40%'],
data:item
})
}else{
seriesArr.push({
name: dataKinds[ind],
type: 'scatter',
symbolSize: function(data){
//return Math.sqrt(data[2])/5e2;
return data[2]/itemRatio
},
itemStyle:{
normal:{
shadowBlur: 20,
shadowColor: colorSys[ind],
opacity:0.6,
shadowOffsetY: 4,
color:colorsArr[ind]
}
},
data: item
})
}
})
return seriesArr;
}
function _xAxisData() {
let dt = new Set(demo && demo.map(item => item.xz));
let _data = [];
if(dt){
for (let x of dt) {
_data.push(x)
}
}
let tempArr = _data.concat();
min = tempArr.sort(_sortNumber);
//scatter横轴是value,需要排序,避免返回数据顺序错乱的bug
return min
}
function _axisLine() {
return {
show: false, //不显示
lineStyle: {
color: '#3398DB', //坐标轴线颜色
width: 2
}
}
}
function _svgIcon(){
let src = "path://M851.968 167.936l0 109.568-281.6 0 0 587.776-116.736 0 0-587.776-281.6 0 0-109.568 679.936 0z";
return src;
}
function _colorSys(){
return ['#0ab484','#1355c7','#F5A559','#D62E56'];
}
function _colors(){
return [
new this.echarts.graphic.LinearGradient(0.4, 0.3,0, 1,
[
{offset: 0,color: '#8ffdde' }, // 0% 处的颜色
{offset: 1, color: '#0ab484' } // 100% 处的颜色
], false),
new this.echarts.graphic.LinearGradient(0.4, 0.3,0, 1,
[
{offset: 0,color: '#5790f4' }, // 0% 处的颜色
{offset: 1, color: '#1355c7' } // 100% 处的颜色
], false),
new this.echarts.graphic.LinearGradient(0.4, 0.3,0, 1,
[
{offset: 0,color: '#f6973d' }, // 0% 处的颜色
{offset: 1, color: '#F5A559' } // 100% 处的颜色
], false),
new this.echarts.graphic.LinearGradient(0.4, 0.3,0, 1,
[
{offset: 0,color: '#e40036' }, // 0% 处的颜色
{offset: 1, color: '#D62E56' } // 100% 处的颜色
], false),
]
}