配置项如下
const dataSource = [
{
value: '8',
unit: '个',
name: '千金',
},
{
value: '1',
unit: '个',
name: '南浔',
},
{
value: '2',
unit: '个',
name: '双林',
},
{
value: '3',
unit: '个',
name: '和孚',
},
{
value: '3',
unit: '个',
name: '善琏',
},
{
value: '1',
unit: '个',
name: '开发区',
},
{
value: '6',
unit: '个',
name: '石淙',
},
{
value: '3',
unit: '个',
name: '练市',
},
{
value: '5',
unit: '个',
name: '菱湖',
},
];
const img =
'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAVCAYAAACzK0UYAAACyUlEQVRIiY2VzWoUQRDHf9U7+cIsahIj0ajgwaNi1JNHSRQ3ePMk+AyKd30BQfQFFDzrRWOMJBdBEEUEPQVMiHgQjWA2Jtns7E63dM/MTs/MJqSgpqq7q/9V1VU9LSzNHwPuAdPACPANeAI8AJp4NHbk0r6K4VwkHAcGgPWKYTESvgKRtayY2D6SWLdSWJpbdeACWANxHzt4B1LDUHe7BKpjUzd7NP2U6Rcw21KEgzqLrKViGSCtkRSkI+NoLgLzCJPAmp3fiOjvNRBK3omBwwI1ImY2IOwsRLFQSBvHtPIy5vNIewHVHrJjY6M0OOkzsX7IaKaNpq+4rpCQmFuebJLNhxMQzkM4TALoMvVlxiNoamj6/HmVATYL4Ln5s0hzgfZ61W2MEoCo5MR31O85CQvg210cOT5D4+Vtonp1RydRd0dxJqpZyCTRlcd2TP0ozee3MGGvAzQJcMr+WDNMxFUiApUBbntyOwbG404wa+O0Zy97YN0ySXWb0enAgZpCCztdg6hOj+banJULaF7k+rjQ1p09cDJAGomBJBexCxUBaB1wkXYucAnY3zMYxIVODSTJVfxLmSgqkfaiVNec2d5oI0A1ysdlCtFL4cjapz6kt7l0ZMVsDMvxcaWRlzYZEMl0S/rgd7ZuvNlTJobfCF+8mqSkssI7w7RWCvT+H6zfeUQ0EHZOcedM/gCvbd5xTXax9AL4zN/7T2mNbnbNOk/WwUz6VATIVmFdZVlk9AmYpDl6vVschfFq4iBM15Ka7EofgSn3u9f5BizdH1sDeOUceA0UBDknpSzeA1faUA/s4SYdXKpFTLbIsQO/OzUE49Kw3keVgZ5kVrubHr1VpnJNS1RvUXErKxob0UAHJJM/EeYwiYN8LQmGZHNCGbmLUNNi7Cu5rI08VmIe2l+0fc5sFomTZ8AEcALjnuF/wCLGvfE6l2GqA/8Bnpdx0cUesngAAAAASUVORK5CYII=';
const obliqueRectangle = echarts.graphic.extendShape({
shape: {
x: 0,
y: 0,
width: 0,
height: 0,
offset: 10,
},
buildPath: (ctx, shape) => {
ctx.moveTo(shape.x + shape.offset, shape.y);
ctx.lineTo(shape.x + shape.width + shape.offset, shape.y);
ctx.lineTo(shape.x + shape.width, shape.y + shape.height);
ctx.lineTo(shape.x, shape.y + shape.height);
ctx.closePath();
},
});
echarts.graphic.registerShape('obliqueRectangle', obliqueRectangle);
option = {
backgroundColor: '#000',
grid: [
{
left: 50,
top: 0,
right: 20,
bottom: 20,
containLabel: true,
},
],
xAxis: [
{
gridIndex: 0,
type: 'value',
axisLabel: { show: false },
axisLine: { show: false },
splitLine: { show: false },
axisTick: { show: false },
},
{
gridIndex: 0,
type: 'value',
max: 100,
axisLabel: { show: false },
axisLine: { show: false },
splitLine: { show: false },
axisTick: { show: false },
},
],
yAxis: [
{
gridIndex: 0,
type: 'category',
inverse: true,
data: dataSource.map((item) => item.name),
axisTick: { show: false },
axisLine: { show: false },
splitLine: { show: false },
axisLabel: {
width: 80,
padding: [0, 0, 0, -80],
align: 'left',
formatter: (name, index) => {
const _index = index + 1;
const id = _index > 9 ? _index : `0${_index}`;
return `{icon|}{num|${id}}{value|${name}}`;
},
rich: {
icon: {
width: 14,
height: 11,
backgroundColor: {
image: img,
},
},
num: {
padding: [0, 0, 0, 5],
width: 25,
color: '#7FE5FF',
align: 'left',
fontSize: 15,
fontFamily: 'Oswald',
fontWeight: 400,
fontStyle: 'italic',
},
value: {
// width:
fontSize: 15,
color: '#fff',
fontFamily: 'SourceHanSerifSC-Bold',
fontWeight: 500,
},
},
},
},
{
gridIndex: 0,
type: 'category',
inverse: true,
margin: 20,
data: dataSource.map((item) => item.name),
axisTick: { show: false },
axisLine: { show: false },
splitLine: { show: false },
axisLabel: {
padding: [0, 0, 0, 10],
formatter: (_, index) => {
return `{value|${dataSource[index].value}}{unit|个}`;
},
rich: {
unit: {
color: '#fff',
fontSize: 8,
verticalAlign: 'bottom',
},
value: {
color: '#fff',
fontSize: 15,
fontWeight: 500,
},
},
},
},
],
series: [
{
type: 'custom',
xAxisIndex: 1,
yAxisIndex: 0,
data: dataSource.map(() => 100),
renderItem: (params, api) => {
const barLayout = api.barLayout({
count: 1,
barWidth: 8,
});
const { bandWidth, offsetCenter, width } = barLayout[0];
const x = params.coordSys.x;
const y = bandWidth * (params.dataIndex + 1 / 2) + offsetCenter + params.coordSys.y - width / 2;
return {
type: 'obliqueRectangle',
shape: {
x: x,
y: y + 2,
width: api.size([api.value()])[0],
height: width,
offset: width * 0.5,
},
style: api.style(),
};
},
itemStyle: {
color: {
type: 'linear',
x: 0,
y: 0,
x2: 1,
y2: 0,
colorStops: [
{
offset: 0,
color: '#22324A', // 0% 处的颜色
},
{
offset: 1,
color: '#1C3D57', // 100% 处的颜色
},
],
global: false, // 缺省为 false
},
},
silent: true,
},
{
type: 'custom',
xAxisIndex: 0,
yAxisIndex: 0,
data: dataSource.map((item) => item.value),
silent: true,
itemStyle: {
color: {
type: 'linear',
x: 0,
y: 0,
x2: 1,
y2: 0,
colorStops: [
{
offset: 0,
color: '#2FC7FF', // 0% 处的颜色
},
{
offset: 1,
color: '#73F3FF', // 100% 处的颜色
},
],
global: false, // 缺省为 false
},
},
renderItem: (params, api) => {
const barLayout = api.barLayout({
barWidth: 11,
count: 1,
});
const { bandWidth, offsetCenter, width } = barLayout[0];
const x = params.coordSys.x;
const y = bandWidth * (params.dataIndex + 1 / 2) + offsetCenter + params.coordSys.y - width / 2;
return {
type: 'obliqueRectangle',
shape: {
x: x,
y: y,
width: api.size([api.value()])[0],
height: width,
offset: width * 0.5,
},
style: api.style(),
};
},
},
{
type: 'pictorialBar',
data: dataSource.map((item) => item.value),
xAxisIndex: 0,
yAxisIndex: 0,
symbol: 'path://M15,0L5,20L0,20L10,0Z',
symbolRotate: null,
symbolSize: [13, 12],
symbolPosition: 'end',
symbolOffset: [10, 0],
itemStyle: {
color: 'white',
shadowColor: 'rgba(115, 243, 255, 0.2)',
shadowBlur: 10,
},
},
],
};