配置项如下
var jigouPrice1 = [[2600, 3500, ],[3000, 4000, ],[3500, 4000,],[3300, 3600,]];
var jigouPrice2 = [[2600, 3500, ],[3000, 4000, ],[3500, 5000,],[3300, 3600,]];
var jigouPrice3 = [[2600, 3500, ],[3000, 4000, ],[3500, 4000,],[3300, 3600,]];
var option = setOption();
function setOption() {
let option;
const category = ['1', '2', '3', '4'];
const name = ['一级', '二级', '三级'];
const data = [jigouPrice1, jigouPrice2, jigouPrice3];
let series = [];
data.forEach((item, i) => {
series = [...series, ...createSeries(item, name[i], true)];
});
let yAxis = {
type: 'value',
axisLine: {
lineStyle: {
color: '#fff',
},
},
};
let xAxis = {
type: 'category',
splitLine: {
show: false,
},
axisLine: {
lineStyle: {
color: '#fff',
},
},
data: category,
};
if (false) {
[xAxis, yAxis] = [yAxis, xAxis];
}
option = {
backgroundColor: '#0e1c47',
title: {
text: '价格区间(元)',
top: '19',
textStyle: {
color: '#fff',
fontSize: '14',
},
// subtext: 'From ExcelHome',
// sublink: 'http://e.weibo.com/1341556070/AjQH99che'
},
color: ['#c63c26', '#65AC3A', '#36cfc9'],
legend: {
data: name,
top: '33',
textStyle: {
color: '#fff',
},
},
tooltip: {
trigger: 'axis',
axisPointer: {
// 坐标轴指示器,坐标轴触发有效
type: 'shadow', // 默认为直线,可选为:'line' | 'shadow'
},
formatter: function (params) {
var html = '';
var axisValue = '';
params.forEach((item) => {
axisValue = item.axisValue;
const range = item.data.range;
html += item.marker + item.name + range[0] + ' - ' + range[1] + '<br/>';
});
const {
name,
data: { range },
} = params[0];
return axisValue + '<br/>' + html;
},
},
grid: {
left: '3%',
right: '4%',
bottom: '3%',
containLabel: true,
},
xAxis: xAxis,
yAxis: yAxis,
series: series,
};
return option;
}
// 轴数据处理
function dataFormat(data, name, isReverse) {
let min = []; // 区间的最小值
let max = []; // 区间的最大值
let minLabel = []; // 显示区间的最小值的 label 数据,在 max 上通过 markpoint 实现,以控制 label 颜色值和显示的柱子颜色值一致,并且显示隐藏有效
data.forEach((item, i) => {
min.push(item[0]);
// 横向:coord: [offsetx,y],等同于 xAxis: offsetx, yAxis: y。其中,offsetx 表示偏移值,y 表示bar的索引。
// 竖向:[x, offsety]
const coord = isReverse ? [item[0], i] : [i, item[0]];
minLabel.push({
value: item[0], // 对值进行格式化
coord: item[0] ? coord : [],
});
max.push({
value: item[1] - item[0], // 差值作为叠加值
range: item, // tooltip 显示
name, // legend 显示
label: {
formatter: '' + item[1], // 最终值作为显示值
},
itemStyle: {
color: item[2],
},
});
});
return {
min,
max,
minLabel,
};
}
// 生成序列数据
function createSeries(arr, name, showLabel, isReverse) {
let newSeries = [];
const { min, max, minLabel } = dataFormat(arr, name, isReverse);
const maxPosition = isReverse ? 'right' : 'top';
const minPosition = isReverse ? 'left' : 'bottom';
newSeries = [
{
type: 'bar',
stack: name,
tooltip: {
show: false,
},
// 透明
itemStyle: {
barBorderColor: 'rgba(0,0,0,0)',
color: 'rgba(0,0,0,0)',
},
emphasis: {
itemStyle: {
barBorderColor: 'rgba(0,0,0,0)',
color: 'rgba(0,0,0,0)',
},
},
label: {
show: false,
},
data: min,
},
{
type: 'bar',
stack: name,
name: name,
tooltip: {
show: true,
},
label: {
show: showLabel,
position: maxPosition,
},
markPoint: {
symbol: 'rect',
// 图形上面的小头隐藏
symbolSize: 0.000000000000001,
label: {
show: showLabel,
position: minPosition,
},
data: minLabel,
},
data: max,
},
];
return newSeries;
}