说明

基于上篇文章做,数据data顺序要一一对应。关键部分的代码判断比较麻烦,如哪位大神有更好的办法,请指教,谢谢!

示例图

QQ截图20190415164825.png

css代码

  1. .boder {
  2. border: solid 1px #c5c5c5;
  3. }
  4. .eDiv {
  5. width: calc(50% - 2px);
  6. height: 350px;
  7. float: left;
  8. }

HTML代码

  1. <div class="eDiv boder" id="Q1"></div>

JS代码

  1. <script src="js/jquery-1.6.2.min.js"></script>
  2. <script src="js/echarts.min.js"></script>
  3. $(function () {
  4. //三折线图标注文字上下自动排序
  5. var Q9data={
  6. title:"三折线图标注文字上下自动排序",
  7. tip:"累计同比:+1.0%",
  8. color:["B1","B2","B3"],
  9. x:['1月','2月','3月','4月','5月','6月','7月','8月','9月','10月','11月','12月'],
  10. y:[{min:null,max:null,name:"(单位:亿元)",unit:"圆"}],
  11. data:[
  12. {
  13. name:"本年累计",yAxisIndex:0,type:"line",
  14. data:["21","3","38","9","3","5","35","25","14","11","9","25"]
  15. },
  16. {
  17. name:"去年累计",yAxisIndex:0,type:"line",
  18. data:["13","9.3","9","17","8.5","11.5","9.3","9","17","8.5","27.5","23.666"]
  19. },
  20. {
  21. name:"本年预测值",yAxisIndex:0,type:"line",
  22. data:["25","25","25","25","25","25","25","25","25","25","25","25"]
  23. }
  24. ]
  25. };
  26. /**
  27. * @var {object}
  28. * @desc 前端重定义echar画图细节和区别
  29. * @property {number} left - 图形备注上离左边多少距离(单位为%)
  30. * @property {number} top - 图形备注上离顶部多少距离(单位为%)
  31. * @property {string} unit - Y轴刻度上的单位
  32. * @property {number} tofiexd - Y轴刻度上保留多少位小数
  33. * @property {boolean} tipUnit - true|强制使用tip的unit;false|不使用tip的unit
  34. *
  35. */
  36. var tip={
  37. left:11,
  38. top:20,
  39. tofiexd:1,
  40. unit:"%",
  41. tipUnit:true,
  42. }
  43. drawThreeLine("Q9","line_auto_up_down",Q9data,tip);
  44. var t = setInterval(function(){
  45. var d1=[],d2=[],d3=[];
  46. for(let i = 0 ; i<10;i++){
  47. var val1 = fRandomBy(10,40).toString();
  48. d1.push(val1);
  49. }
  50. for(let i = 0 ; i<12;i++){
  51. var val2 = fRandomBy(20,40).toString();
  52. var val3 = "25";
  53. d2.push(val2);
  54. d3.push(val3);
  55. tip.left=fRandomBy(10,20);
  56. tip.top=fRandomBy(20,70);
  57. }
  58. Q9data.data[0].data=d1;
  59. Q9data.data[1].data=d2;
  60. Q9data.data[2].data=d3;
  61. drawThreeLine("Q9","line_auto_up_down",Q9data,tip)
  62. },3000);
  63. });
  64. /**
  65. * @func
  66. * @desc 三折线标注文字位置自动排序
  67. * @param {string} id - string |目标id
  68. * @param {string} type - string | line_auto_up_down(三条折线,并且排列标记字的位置
  69. * @param {object} data - 后端数据 @returns {...}
  70. * @param {object} tip - 前端重定义echar画图细节和区别 @returns {...}
  71. *
  72. */
  73. function drawThreeLine(id,type,data,tip){
  74. var myChart = echarts.init(document.getElementById(id));
  75. var option = {
  76. title: {
  77. text: "默认标题",
  78. x: 'center',
  79. top: '5'
  80. },
  81. tooltip: {
  82. trigger:'axis',
  83. confine: true,
  84. axisPointer:{
  85. type:"line"
  86. }
  87. },
  88. legend:{
  89. show:true,
  90. bottom: 15,
  91. },
  92. xAxis: {
  93. type: 'category',
  94. data: ['周一','周二','周三','周四','周五','周六','周日']
  95. },
  96. yAxis: [
  97. {
  98. type: 'value',
  99. show: true,
  100. min: null,
  101. max: null,
  102. name:"(单位:xx)",
  103. splitLine:{show:false}
  104. },
  105. {
  106. type: 'value',
  107. show: false,
  108. min: null,
  109. max: null,
  110. name:"(单位:xx)",
  111. splitLine:{show:false}
  112. },
  113. ],
  114. grid: {
  115. left: '4%',
  116. right: '4%',
  117. bottom: '15%',
  118. top:"20%",
  119. containLabel: true
  120. },
  121. series: []
  122. }
  123. //全局处理
  124. var sunit = "",stofixed = 0;
  125. //前端控制设置
  126. if(tip){
  127. if(tip.tofiexd){
  128. stofixed = tip.tofiexd
  129. }
  130. if(tip.unit){
  131. sunit = tip.unit
  132. }
  133. }
  134. //后端传数据源
  135. if(data){
  136. if(data.title){
  137. option.title.text = data.title;
  138. }
  139. if(data.color){
  140. var arrColor=["blue","red","green"];
  141. option.color = arrColor;
  142. }
  143. if(data.x){
  144. option.xAxis.data = data.x;
  145. }
  146. for(var mm=0;mm<data.y.length;mm++){
  147. if( data.y[mm].name){
  148. option.yAxis[mm].name = data.y[mm].name;
  149. }
  150. if( data.y[mm].min){
  151. option.yAxis[mm].min = data.y[mm].min;
  152. }
  153. if( data.y[mm].max){
  154. option.yAxis[mm].max = data.y[mm].max;
  155. }
  156. if(tip){
  157. if(tip.tipUnit){
  158. sunit=tip.unit
  159. }else{
  160. if( data.y[mm].unit){
  161. sunit=data.y[mm].unit
  162. }
  163. }
  164. }
  165. option.yAxis[mm].axisLabel={
  166. formatter: function(val){
  167. if(stofixed == 0){
  168. return val + sunit;
  169. }else{
  170. return val.toFixed(stofixed) + sunit;
  171. }
  172. }
  173. }
  174. }
  175. if(data.y.length > 1){
  176. option.yAxis[1].show = true;
  177. var _sunit=[];
  178. for(var kk=0;kk<data.y.length;kk++){
  179. if( data.y[kk].unit){
  180. var uit={unit:data.y[kk].unit}
  181. _sunit.push(uit);
  182. }
  183. }
  184. if(_sunit.length>1){
  185. option.yAxis[0].axisLabel={
  186. formatter: function(val){
  187. if(stofixed == 0){
  188. return val + _sunit[0].unit;
  189. }else{
  190. return val.toFixed(stofixed) + _sunit[0].unit;
  191. }
  192. }
  193. }
  194. option.yAxis[1].axisLabel={
  195. formatter: function(val){
  196. if(stofixed == 0){
  197. return val + _sunit[1].unit;
  198. }else{
  199. return val.toFixed(stofixed) + _sunit[1].unit;
  200. }
  201. }
  202. }
  203. }
  204. }
  205. }
  206. //line_auto_up_down类型处理
  207. if(type=="line_auto_up_down"){
  208. var arrVal1=[],arrVal2=[];
  209. for(var i=0;i<data.data.length;i++){
  210. var val=data.data[i];
  211. var tmp={
  212. name:val.name,
  213. type:val.type,
  214. yAxisIndex:val.yAxisIndex,
  215. data:[]
  216. }
  217. for(var j=0;j<val.data.length;j++){
  218. var vval={value:val.data[j]};
  219. tmp.data.push(vval)
  220. }
  221. option.series.push(tmp)
  222. }
  223. for(var j=0;j<data.data[0].data.length;j++){
  224. arrVal1.push(data.data[0].data[j])
  225. arrVal2.push(data.data[1].data[j])
  226. }
  227. //预测数据长度
  228. var lastLength = data.data[2].data.length;
  229. //本年最后月数据(长度以本年为基准)
  230. var val0 = option.series[0].data[arrVal2.length-1].value;
  231. //去年最后月数据(长度以本年为基准)
  232. var val1 = option.series[1].data[arrVal2.length-1].value;
  233. //去年最后月数据(长度以预测为基准)
  234. var val2 = option.series[1].data[lastLength-1].value;
  235. //预测最后月数据(长度以预测为基准)
  236. var val3 = option.series[2].data[lastLength-1].value;
  237. /* 2组数组长度相同,即本年全年每个月数据都齐了,要和去年每个月数据比较,但是只显示最后的数据处理方法 */
  238. if(arrVal1.length == arrVal2.length && arrVal2.length == lastLength){
  239. option.series[2].data[arrVal2.length-1].label={show:true,position:"right"};
  240. if(Number(val0)>Number(val1)){
  241. option.series[0].data[arrVal2.length-1].label={show:true,position:"top"};
  242. option.series[1].data[arrVal2.length-1].label={show:true,position:"bottom"};
  243. }else if(Number(val0) == Number(val1)){
  244. option.series[0].data[arrVal2.length-1].label={show:true,position:"top"};
  245. option.series[1].data[arrVal2.length-1].label={show:true,position:"bottom"};
  246. }else{
  247. option.series[0].data[arrVal2.length-1].label={show:true,position:"bottom"};
  248. option.series[1].data[arrVal2.length-1].label={show:true,position:"top"};
  249. }
  250. if(Number(val0) < Number(val3) && Number(val1)<Number(val3)){
  251. option.series[2].data[arrVal2.length-1].label={show:true,position:"top"};
  252. option.series[0].data[arrVal2.length-1].label={show:true,position:"right"};
  253. option.series[1].data[arrVal2.length-1].label={show:true,position:"right"};
  254. }
  255. if(Number(val0) == Number(val3) && Number(val1)==Number(val3)){
  256. option.series[0].data[arrVal2.length-1].label={show:true,position:"top"};
  257. option.series[1].data[arrVal2.length-1].label={show:true,position:"bottom"};
  258. }
  259. if(Number(val0) > Number(val3) && Number(val1)>Number(val3)){
  260. option.series[2].data[arrVal2.length-1].label={show:true,position:"bottom"};
  261. option.series[0].data[arrVal2.length-1].label={show:true,position:"right"};
  262. option.series[1].data[arrVal2.length-1].label={show:true,position:"right"};
  263. }
  264. }else{
  265. /* 本年有不齐每个月数据,即没有12月份的数据处理方法 */
  266. if(arrVal1.length==arrVal2.length){
  267. for(var i = 0; i <arrVal2.length; i++) {
  268. //本年和去年所有月份比较
  269. if(Number(arrVal1[i]) <= Number(arrVal2[i]) ) {
  270. option.series[0].data[i].label={show:false,position:"bottom"};
  271. option.series[1].data[i].label={show:false,position:"top"};
  272. }else{
  273. option.series[0].data[i].label={show:false,position:"top"};
  274. option.series[1].data[i].label={show:false,position:"bottom"};
  275. }
  276. //本年和去年最后月比较(以本年最后月为基准)
  277. if(Number(val0)>Number(val1)){
  278. option.series[0].data[arrVal2.length-1].label={show:true,position:"top"};
  279. option.series[1].data[arrVal2.length-1].label={show:true,position:"bottom"};
  280. }else if(Number(val0) == Number(val1)){
  281. option.series[0].data[arrVal2.length-1].label={show:true,position:"top"};
  282. option.series[1].data[arrVal2.length-1].label={show:true,position:"bottom"};
  283. }else{
  284. option.series[0].data[arrVal2.length-1].label={show:true,position:"bottom"};
  285. option.series[1].data[arrVal2.length-1].label={show:true,position:"top"};
  286. }
  287. //去年和预测最后月比较(预测最后月为基准)
  288. if(Number(val2) > Number(val3)){
  289. option.series[1].data[lastLength-1].label={show:true,position:"top"};
  290. option.series[2].data[lastLength-1].label={show:true,position:"bottom"};
  291. }else if(Number(val2) == Number(val3)) {
  292. option.series[1].data[lastLength-1].label={show:true,position:"bottom"};
  293. option.series[2].data[lastLength-1].label={show:true,position:"top"};
  294. }else{
  295. option.series[1].data[lastLength-1].label={show:true,position:"bottom"};
  296. option.series[2].data[lastLength-1].label={show:true,position:"top"};
  297. }
  298. /* */
  299. if(Number(val0) < Number(val3) && Number(val1)<Number(val3)){
  300. if(Number(val0)>Number(val1)){
  301. option.series[0].data[arrVal2.length-1].label={show:true,position:"top"};
  302. option.series[1].data[arrVal2.length-1].label={show:true,position:"bottom"};
  303. }else if(Number(val0) == Number(val1)){
  304. option.series[0].data[arrVal2.length-1].label={show:true,position:"top"};
  305. option.series[1].data[arrVal2.length-1].label={show:true,position:"bottom"};
  306. }else{
  307. option.series[0].data[arrVal2.length-1].label={show:true,position:"bottom"};
  308. option.series[1].data[arrVal2.length-1].label={show:true,position:"top"};
  309. }
  310. }
  311. if(Number(val0) == Number(val3) && Number(val1)==Number(val3)){
  312. option.series[0].data[arrVal2.length-1].label={show:true,position:"top"};
  313. option.series[1].data[arrVal2.length-1].label={show:true,position:"bottom"};
  314. }
  315. if(Number(val0) > Number(val3) && Number(val1)>Number(val3)){
  316. if(Number(val0)>Number(val1)){
  317. option.series[0].data[arrVal2.length-1].label={show:true,position:"top"};
  318. option.series[1].data[arrVal2.length-1].label={show:true,position:"bottom"};
  319. }else if(Number(val0) == Number(val1)){
  320. option.series[0].data[arrVal2.length-1].label={show:true,position:"top"};
  321. option.series[1].data[arrVal2.length-1].label={show:true,position:"bottom"};
  322. }else{
  323. option.series[0].data[arrVal2.length-1].label={show:true,position:"bottom"};
  324. option.series[1].data[arrVal2.length-1].label={show:true,position:"top"};
  325. }
  326. }
  327. /* */
  328. }
  329. }
  330. }
  331. /* 控制三条数据的层级 */
  332. option.series[0].zlevel=2;
  333. option.series[1].zlevel=1;
  334. option.series[2].zlevel=0;
  335. /* 备注显示隐藏*/
  336. if (data.tip !== null) {
  337. var left = '15%',
  338. top = '50%';
  339. /* 备注位置处理*/
  340. if (tip) {
  341. if (tip.left) {
  342. left = tip.left + "%";
  343. }
  344. if (tip.top) {
  345. top = tip.top + "%";
  346. }
  347. }
  348. var _html = "<div class='Tips' style='position: absolute;left: " + left + "; top: " + top + "; color:red;'>" + data.tip + "</div>";
  349. $('#' + id + " .Tips").remove();
  350. $(myChart._dom.childNodes[0]).after(_html);
  351. }else{
  352. $('#' + id + " .Tips").remove();
  353. }
  354. /* */
  355. }
  356. // 画图
  357. myChart.setOption(option,true);
  358. $(window).resize(function() {
  359. myChart.resize();
  360. });
  361. }