function obtainEchartDataSource() { var source = { "beans": [{ "avgIncome": "3158.00", "subTitle": "较前一年变化 --", "year": "2014" }, { "avgIncome": "2450.00", "subTitle": "较前一年减少 22.42%", "year": "2015" }, { "avgIncome": "6450.00", "subTitle": "较前一年增加 163.27%", "year": "2016" }, { "avgIncome": "8222.00", "subTitle": "较前一年增加 21.27%", "year": "2017" }, { "avgIncome": "0", "subTitle": "较前一年减少 100.00%", "year": "2018" }, { "avgIncome": "0", "subTitle": "较前一年变化 --", "year": "2019" } ] }; var beans = source.beans; var xAxisData = []; var seriesLineData = []; var tooltipsData = []; var scatterData = []; for (var i in beans) { var y = beans[i].year; var avgIncome = beans[i].avgIncome; var subTitle = beans[i].subTitle; // x轴刻度 xAxisData.push({ value: y }); // 折线数据 seriesLineData.push({ value: avgIncome }); // 提示框次级数据 tooltipsData.push(subTitle); // x轴坐标点数据 scatterData.push({ value: [y, 0] }) } var last = (Number)(beans[beans.length - 1].year); // 限制到2020年 无限制放开 tailRecursion(xAxisData, last); return { xAxisData: xAxisData, scatterData: scatterData, seriesLineData: seriesLineData, tooltipsData: tooltipsData } } /** * 处理x轴年份扩展 * @param xData * @param value */ function tailRecursion(xData, value) { if (value < 2020) { value++; xData.push({ value: value }); tailRecursion(xData, value); } } var dataSource = obtainEchartDataSource(); var option = { tooltip: { show: true }, grid: { top: '30%', left: '1%', right: '1%', bottom: '0%', containLabel: true }, xAxis: [{ type: 'category', // boundaryGap: false, axisTick: { show: false }, // x轴 点击触发事件 triggerEvent: true, data: dataSource.xAxisData }], yAxis: [{ type: 'value', name: '单位(元)', splitLine: { show: false }, axisLine: { show: false }, axisLabel: { show: true }, axisTick: { show: false } }], series: [{ name: '人均纯收入', type: 'line', //是否平滑曲线显示 smooth: true, // 默认是空心圆(中间是白色的),改成实心圆 symbol: 'circle', // 屏蔽标记鼠标事件 silent: true, symbolSize: 1, lineStyle: { normal: { width: 4, // 线条颜色 color: "#4C84FF" } }, label: { show: true, position: 'top', formatter: '{c} 元', textStyle: { color: '#4f4a51', fontSize: 14, fontWeight: 'bold' } }, areaStyle: { //区域填充样式 normal: { color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{ offset: 0, color: 'rgba(0, 136, 212, 0.2)' }, { offset: 1, color: 'rgba(0, 136, 212, 0)' }], false), shadowColor: 'rgba(0, 0, 0, 0.1)', shadowBlur: 10 } }, data: dataSource.seriesLineData }, { type: 'pictorialBar', data: deepClone(dataSource.seriesLineData), barGap: "10%", symbolRepeat: true, symbolMargin: 2, // 点状线 鼠标不触发事件 silent: true, symbol: "rect", symbolSize: 2, color: '#c8c5d1', symbolClip: true }, { type: 'scatter', name: '年份', symbolSize: 10, data: dataSource.scatterData, tooltip: { show: true, backgroundColor: 'white', textStyle: { color: '#000' }, formatter: function(param) { var index = param.dataIndex; var lineData = option.series[0].data[index].value; var tooltipsData = dataSource.tooltipsData; return '<div style="border: medium #0094ff;"><span style="font-size:15px;color: #0a080b"><strong>人均纯收入:</span><span style="color: #F84040">' + lineData + '</style></span>元</strong></br>' + '<span style="font-size:13px; color: #9D9D9D">' + tooltipsData[index] + '</span></div>'; }, extraCssText: 'box-shadow: 0 0 3px #A0C5C8;' }, itemStyle: { borderWidth: 1, borderColor: '#00a7db', color: { type: 'radial', x: 0.5, y: 0.5, r: 0.5, colorStops: [{ offset: 0.4, color: '#ffffff' }, { offset: 1, color: '#4C84FF' // 100% 处的颜色 }], globalCoord: false } } } ] }; myChart.setOption(option); /** * * 对象深拷贝 * * @param json */ function deepClone(json) { var s = JSON.stringify(json); return JSON.parse(s); } /** * 注册x 轴 点击事件 */ myChart.on('click', function(e) { var componentType = e.componentType; var year = ''; switch (componentType) { case 'series': year = e.name; break; case 'xAxis': year = e.value; break; } selectAction(year) }); // 加载后默认选中当前年 selectCurrent(); /** * 选中操作 * @param year * @param callback 自定义事件函数钩子 参数为 x轴刻度值 * @see selectedStyle */ function selectAction(year, callback) { selectedStyle(year, callback); if ('[object Function]' === Object.prototype.toString.call(callback)) { callback(year); } myChart.setOption(option); } /** * 点击x 轴 事件 触发选中高亮 同时触发 callback 事件 * @param year */ function selectedStyle(year) { var scatterData = option.series[2].data; var length = scatterData.length; for (var i = 0; i < length; i++) { var lineData = option.series[0].data[i]; // 移除坐标轴点样式 delete scatterData[i].itemStyle; // 移除折线样式 delete lineData.label; //匹配到就增加样式 if (year === scatterData[i].value[0]) { var scatterColor = '#4C84FF'; // 折线选中变大 变色 lineData.label = { show: true, fontSize: 16, color: scatterColor }; // x轴圆点变色 scatterData[i].itemStyle = { color: scatterColor }; } } } /** * 默认选中当前年 * @param callback 回调钩子 */ function selectCurrent(callback) { var currentYear = new Date().getFullYear().toString(); selectAction(currentYear, callback) }