var xData = ["东北师范大学", "华东师范大学", "华中师范大学"] var data = [{ name: '学校', value: ["13", "25", "84"] }] var average = parseFloat(data[0].value.reduce((current, next) => { return Number(current) + Number(next) }) / data[0].value.length).toFixed(2) console.log('average', average) var lineData = data[0].value.map((item, index) => { return { value: average, } }) var barWidth = 30 var imgurl = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAADHQAAAAyCAYAAACHgW2RAAAQvklEQVR4Xu3dXYildR0H8N//HBZ39zzncV1Y2W62bhavlroS9qrIq8L1pTLNSCo2DERoQ0HIXoRCaS8KjEXI0kAt03wPQfBCEIRCEKTwIhFKpHYl95znmR3X5swvRjA0X3Z25syZc858nqth5v//vXyeuf3ylNhCz2AwuLDT6TwSER/bQmtblQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIzILAG6WUK6qqenoWhl3vjGW9BWblftM0V0TEbyJix6zMbE4CBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQILDFBP6TmdfVdf3Led977gMdmVnatr05Im6JiLnfd97/Ye1HgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAvMvkJk/6/f7N5ZSRvO67VwHHDJze9u2d0bEV+f1BdqLAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAjMo0Ap5YnFxcWr9+zZ08zlfvO41MpOTdOcHxGPRMTBed3RXgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYM4FXux2uxfv3Lnz7/O251x+oaNt2wMR8VhmfmLeXph9CBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIDAFhP4V2ZeXtf1c/O099wFOhYWFj63vLx8f0T05+lF2YUAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECGxhgTdLKd+squq382IwV4GOtm2PZObRiOjOywuyBwECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIPC2QEbEj6uq+mEpZeXnmX7mItCRmdvatr09Iq6d6bdheAIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQOBMAvdXVfWNUsrimQ5O899nPtBx8uTJ87rd7gMRcdE0Q5uNAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQGI9AKeVPEXFpVVX/HE/FyVeZ6UDHYDDY3+l0Ho+ICyZPpyMBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECCwiQL/KKVcUlXVC5s4w5pbz2ygo2maT0fEQxGxe83bu0iAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAjMskCbmVfXdb3ysYiZemYy0DEcDg+XUo5FxLaZ0jYsAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgMG6B5cy8qa7ro+MuvJH1ZirQkZndhYWFWzPzxo1EUZsAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBCYOYE7q6q6rpTy1ixMPjOBjuPHj1c7d+68LzMPzQKsGQkQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIGJCzyzvLz8hXPPPfffE+98lg1nItBx6tSpfaPR6NGI+NRZ7uc4AQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgsLUE/rbyMYm6rl+a5rWnPtAxGAwu7HQ6K2GOvdMMaTYCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBgagTeKKVcUVXV01Mz0f8NMtWBjqZproqIX0fEjmkFNBcBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECAwlQJLEXF9v9+/Yxqnm8pAR2aWtm1vjohbImIqZ5zGl2kmAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBA4H0CP6+q6oZSymiabKYuLJGZ29u2vSsiVr7O4SFAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIrEsgM588ffr0lXv27GnWVWiMl6cq0NG27d7MfCgiDo5xR6UIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAi+ORqNLd+3a9co0UExNoKNt2wOZ+URE7JsGGDMQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECcydwPDMvq+v6uc3ebCoCHcPh8FAp5d6I6G82iP4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIDAXAu8WUr5VlVV92zmlpse6Gjb9khmHo2I7mZC6E2AAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAhsGYGMiJ9UVfWDUsrKzxN/Ni3QkZnb2rY9FhGHJ761hgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBiAerqrqmlLI4aYxNCXQMBoPdnU7n9xFx0aQX1o8AAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAg8I5AZv652+1e1uv1XpukysQDHYPBYH+n0/ljROyf5KJ6ESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQ+RODVUsqhqqpemJTQRAMdTdN8NiIeiIjdk1pQHwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIDAKgTazLymruuHV3F23UcmFugYDoeHSynHImLbuqdWgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECAwfoHlzLypruuj4y/93oobHujIzG7TND8tpXx3o5dRnwABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECCwXoFSyt29Xu/aUspb6631Yfc3NNBx4sSJ/o4dO+7NzEMbtYC6BAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIENEHgmM79U1/XrG1A7NizQcerUqX2j0eiJiDiwEYOrSYAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBDYYIGXM/Piuq5fGnefDQl0DIfDg6WUhyJi77gHVo8AAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgMEGBk6WUK6uqemqcPcce6Gia5qqIuCsito9zULUIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABApsksBQR1/f7/TvG1X9sgY7MLG3b/igivh8RY6s7rkXVIUCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAisU+AXVVV9p5QyWmed8QQvMnN727YrX+VY+TqHhwABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECAwlwKZ+eTS0tJXdu/ePVjPguv+kkbbtnsj4tHMvHA9g7hLgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEJgRgb+MRqNDu3btemWt864r0NG27Scz87GI2LfWAdwjQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECMygwPHM/GJd18+uZfY1BzqGw+GhUsp9EVGtpbE7BAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIEZFzhdSjlcVdU9Z7vHmgIdbdvekJm3RUT3bBs6T4AAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBCYI4EspdzW6/W+V0rJ1e51VoGOzNzWtu2xiDi82gbOESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgS2gMCDCwsLX9+7d+/CanZddaBjMBjs7nQ6f4iIz6ymsDMECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgS0m8Hyn07mk1+u9dqa9VxXoGA6HF5RSHo+I/Wcq6O8ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgS0s8Gqn07ms1+s9/1EGZwx0tG17UWY+EBHnbWFMqxMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEViVQSllYXl7+Wl3XD3/YhY8MdDRNc21E3B4R21bV0SECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIEVgeXMvLmu61s/iOMDAx2Z2W2a5mgp5QhDAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBtQmUUu7u9XrfLqWcfneF9wU6Tpw40T/nnHN+V0r5/NpauUWAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIPAugWcz8/K6rl9/53fvCXQsLi5+fGlp6fGIOICNAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBgbAIvR8Ql/X7/rysV/xfoGA6HB0spj0TE+WNrpRABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgMA7AoNSyperqnrq7UBH27ZXZ+avImI7IwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgQ0TWIqII/8FUR7Qhy+AhvIAAAAASUVORK5CYII=' //背景图片不接受百分比,只接受数值,获取图表的宽度实现动态背景宽度 var imgwidth = myChart.getWidth() // console.log(myChart.getWidth()) var colorsTop = { '学校': new echarts.graphic.LinearGradient(0, 0, 0, 1, [{ offset: 0, color: "rgba(128, 195, 255, 1)" }, { offset: 1, color: "rgba(128, 195, 255, 1)" } ]) } var colorsBottom = { '学校': 'rgba(10, 121, 223, 1)', } var colors = [ new echarts.graphic.LinearGradient(0, 1, 0, 0, [{ offset: 0, color: "rgba(10, 121, 223, 1)" }, { offset: 1, color: "rgba(78, 164, 243, 1)" } ]) ] var option = chuliData(data, barWidth) console.log(option, 'option') function chuliData(data, barWidth) { // console.log(data) let max = Math.max(...data[0].value); let barDataBtm = [] let barData = [] let barDataTop = [] data[0].value.map((item) => { let colorBottom = 'rgba(10, 121, 223, 1)' let colorBody = new echarts.graphic.LinearGradient(0, 1, 0, 0, [{ offset: 0, color: "rgba(10, 121, 223, 1)" }, { offset: 1, color: "rgba(78, 164, 243, 1)" } ]) let colorTop = new echarts.graphic.LinearGradient(0, 0, 0, 1, [{ offset: 0, color: "rgba(128, 195, 255, 1)" }, { offset: 1, color: "rgba(128, 195, 255, 1)" } ]) barDataTop.push({ name: data[0].name, value: item, itemStyle: { normal: { color: colorTop } } }) barData.push({ name: data[0].name, value: item, itemStyle: { normal: { color: colorBody } } }) barDataBtm.push({ name: data[0].name, value: item, itemStyle: { normal: { color: colorBottom } } }) }) // console.log(barData) // let baseWidth = data.length == 4 ? 0 : 2.25/ data.length let baseWidth = 0; if (data.length == 4) { baseWidth = 0 } else if (data.length == 2) { baseWidth = 1.5 } else { baseWidth = 2.25 / data.length } var seriesData = [] data.forEach((item, i) => { var item = { name: data[i].name, type: 'bar', barWidth: barWidth, barGap: '50%', data: barData, symbolOffset: [0, 30], itemStyle: { normal: { label: { show: true, //开启显示 position: 'top', //在上方显示 distance: 10, textStyle: { //数值样式 color: barDataBtm, fontSize: 16 } } } }, } var itemBottom = { //柱底圆片 name: data[i].name, type: "pictorialBar", symbolSize: [barWidth, barWidth * 0.5], symbolOffset: [baseWidth * barWidth + (i - 1.5) * barWidth * 1.5, barWidth * 0.25], z: 12, silent: true, // color: colorsBottom, itemStyle: { "normal": { color: colorsBottom[item.name] } }, data: barDataBtm } //柱顶圆片 var itemTop = { name: data[i].name, type: "pictorialBar", symbolSize: [barWidth, barWidth * 0.5], symbolOffset: [baseWidth * barWidth + (i - 1.5) * barWidth * 1.5, -barWidth * 0.25], z: 12, symbolPosition: "end", silent: true, itemStyle: { "normal": { color: colorsTop[item.name] } }, data: barDataTop } //平均线 var ave = { name: '平均值', type: 'line', xAxisIndex: 1, data: lineData, lineStyle: { type: 'dashed', color: 'rgba(0,0,0,0)' }, symbolSize: 0.0000001, silent: true, label: { show: false }, color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{ offset: 0, color: 'rgba(255, 163, 135, 1)' }, { offset: 1, color: 'rgba(255, 99, 136, 1)' }]), symbol: 'none', markLine: { silent: true, data: [{ type: 'average', name: '平均值' }], lineStyle: { color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{ offset: 0, color: '#ff6388' }, { offset: 1, color: '#ffa387' }]), textStyle: { color: 'red', } }, symbol: 'none', label: { show: true, position: 'top', align: 'center', lineHeight: 28, distance: [20, 20], textStyle: { //数值样式 fontSize: 16, }, formatter: item => { console.log('markLine', item) return `{circle|${item.value}}\n` }, rich: { circle: { // backgroundColor:'rgba(74, 202, 255, 0.1)', backgroundColor: 'rgba(255, 99, 136, 1)', color: '#FFFFFF', borderRadius: 3, fontSize: 14, padding: [0, 5, 2, 5] }, mb: { padding: [0, 0, 20, 0] } } } }, markArea: { data: [ [{ yAxis: 'average', itemStyle: { color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{ offset: 0, color: 'rgba(255, 99, 136, 0.05)' }, { offset: 1, color: 'rgba(255, 163, 135, 0.05)' }]) } }, { yAxis: '0' }] ], } } console.log('ave', ave) seriesData.push(itemTop) seriesData.push(item) seriesData.push(itemBottom) seriesData.push(ave) }) var option = { color: colors, tooltip: { trigger: 'item', }, grid: { top: 100, right: 0, left: 0, bottom: 0, containLabel: true }, graphic: { type: 'image', id: 'logo', left: 22, bottom: 44, z: 0, left: 'center', style: { image: imgurl, width: imgwidth, height: 50, } }, xAxis: [{ data: xData, axisLabel: { textStyle: { color: '#aaaaaa', fontSize: 14 }, margin: 30, //刻度标签与轴线之间的距离。 }, axisLine: { show: false //不显示x轴 }, axisTick: { show: false //不显示刻度 }, boundaryGap: true, splitLine: { show: false, width: 0.08, lineStyle: { type: "solid", color: "#03202E" } } }, { data: xData, boundaryGap: false, show: false }], yAxis: [{ splitLine: { // show: false, lineStyle: { color: 'rgba(216, 216, 216, 1)', type: 'solid' } }, axisTick: { show: false }, axisLine: { show: false }, axisLabel: { textStyle: { color: '#888' }, } }], series: seriesData }; return option } // console.log(seriesData) myChart.setOption(option); myChart.on('legendselectchanged', function (obj) { const selectedList = [] data.forEach((item, i) => { if (obj['selected'][item['name']]) { selectedList.push(item) } }) var option = chuliData(selectedList, 30) myChart.setOption(option); });