echartsUtils.js 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. import $ from 'jquery'
  2. /**
  3. * 显示图形的 tooltip
  4. * @param params
  5. * @param fmt
  6. * @param unit
  7. * @param fmt2
  8. * @param unit2
  9. * @param y2ser 在曲线图,柱状图的多指标图形中,在第二纵轴显示的指标
  10. * @returns {string}
  11. */
  12. export const toolTips = (params, fmt, unit, ydesc, fmt2, unit2, y2desc, thb, chartId, y2ser) => {
  13. if(params.length){ //数组
  14. //o = params[0];
  15. var s = '<b>' + params[0].name + "</b><br/>";
  16. $(params).each(function(a, b){
  17. s += b.seriesName === "" ?"": b.seriesName +": ";
  18. if(y2ser){
  19. if(y2ser.indexOf(b.seriesName) >= 0){
  20. s += formatNumber(b.data, fmt2) + unit2;
  21. }else{
  22. s += formatNumber(b.data, fmt) + unit;
  23. }
  24. }else if(thb === true) { //具体同环比计算等衍生指标
  25. if (b.seriesName.indexOf("同比") >= 0 || b.seriesName.indexOf("环比") >= 0) {
  26. s += formatNumber(b.data, "0.00%");
  27. } else {
  28. s += formatNumber(b.data, fmt) + unit;
  29. }
  30. }else{
  31. if (fmt2) { //双指标
  32. var chart = echarts.getInstanceByDom(document.getElementById(chartId));
  33. var opts = chart.getOption();
  34. $(opts.series).each(function(c, d){
  35. if(d.name === b.seriesName){
  36. if(d.yAxisIndex === 1 || d.xAxisIndex === 1) {
  37. s += formatNumber(b.data, fmt2) + unit2; //y2轴
  38. }else{
  39. s += formatNumber(b.data, fmt) + unit; // y轴
  40. }
  41. return false;
  42. }
  43. });
  44. } else {
  45. s += formatNumber(b.data, fmt) + unit;
  46. }
  47. }
  48. if(!(a === params.length - 1)){
  49. s += "<br/>";
  50. }
  51. });
  52. return s;
  53. }else{
  54. var o = params;
  55. return o.name + ': '+ formatNumber(o.value, fmt)+unit;
  56. }
  57. }
  58. //数字格式化
  59. export const formatNumber = (num,pattern, shortname)=>{
  60. if(!pattern || pattern.length == 0){
  61. return num;
  62. }
  63. var negative = false; //负数
  64. if(num < 0 ){
  65. num = Math.abs(num);
  66. negative = true;
  67. }
  68. var shortdw;
  69. if(shortname && num > 100000000){
  70. num = num / 100000000;
  71. shortdw = "亿";
  72. }else if(shortname && num > 10000000){
  73. num = num / 10000000;
  74. shortdw = "千万";
  75. }else if(shortname && num > 1000000){
  76. num = num / 1000000;
  77. shortdw = "百万";
  78. }else if(shortname && num > 10000){
  79. num = num / 10000;
  80. shortdw = "万";
  81. }else if(shortname && num > 1000){
  82. num = num / 1000;
  83. shortdw = "千";
  84. }
  85. if(pattern.indexOf("%") <= 0 && shortname){
  86. return (negative?"-":"") + (Math.round(num * 10) / 10) + (shortdw?shortdw:"");
  87. }
  88. if(pattern.indexOf("%") > 0){
  89. num = num * 100;
  90. }
  91. var fmtarr = pattern?pattern.split('.'):[''];
  92. var retstr='';
  93. //先对数据做四舍五入
  94. var xsw = 0;
  95. if(fmtarr.length > 1){
  96. xsw = fmtarr[1].length;
  97. }
  98. var bl = 1;
  99. for(i=0; i<xsw; i++){
  100. bl = bl * 10;
  101. }
  102. num = num * bl;
  103. num = Math.round(num);
  104. num = num / bl;
  105. var strarr = num?num.toString().split('.'):['0'];
  106. // 整数部分
  107. var str = strarr[0];
  108. var fmt = fmtarr[0];
  109. var i = str.length-1;
  110. var comma = false;
  111. for(var f=fmt.length-1;f>=0;f--){
  112. switch(fmt.substr(f,1)){
  113. case '#':
  114. if(i>=0 ) retstr = str.substr(i--,1) + retstr;
  115. break;
  116. case '0':
  117. if(i>=0) retstr = str.substr(i--,1) + retstr;
  118. else retstr = '0' + retstr;
  119. break;
  120. case ',':
  121. comma = true;
  122. retstr=','+retstr;
  123. break;
  124. }
  125. }
  126. if(i>=0){
  127. if(comma){
  128. var l = str.length;
  129. for(;i>=0;i--){
  130. retstr = str.substr(i,1) + retstr;
  131. if(i>0 && ((l-i)%3)==0) retstr = ',' + retstr;
  132. }
  133. }
  134. else retstr = str.substr(0,i+1) + retstr;
  135. }
  136. retstr = retstr+'.';
  137. // 处理小数部分
  138. str=strarr.length>1?strarr[1]:'';
  139. fmt=fmtarr.length>1?fmtarr[1]:'';
  140. i=0;
  141. for(var f=0;f<fmt.length;f++){
  142. switch(fmt.substr(f,1)){
  143. case '#':
  144. if(i<str.length) retstr+=str.substr(i++,1);
  145. break;
  146. case '0':
  147. if(i<str.length) retstr+= str.substr(i++,1);
  148. else retstr+='0';
  149. break;
  150. }
  151. }
  152. var r = retstr.replace(/^,+/,'').replace(/\.$/,'');
  153. if(pattern.indexOf("%") > 0){
  154. r = r + "%";
  155. }
  156. if(shortdw){
  157. r = r + shortdw;
  158. }
  159. if(negative){
  160. r = "-" + r;
  161. }
  162. return r;
  163. }
  164. /**
  165. * 对于散点图的ToolTip,如果值相同,会覆盖后面的点,现在通过第一个点抓出值相同的所有点,显示再 tooltip中
  166. * @returns
  167. */
  168. export const scatterTooltip = (option, params)=>{
  169. var target = {x:params.data[0], y:params.data[1], name:params.data[2]};
  170. var dts = option.series[params.seriesIndex].data;
  171. var r = [];
  172. for(let k=0; k<dts.length; k++){
  173. var t = dts[k];
  174. if(t[0] == target.x && t[1] == target.y){
  175. r.push(t[2]);
  176. }
  177. }
  178. return r.join(",");
  179. }
  180. /**
  181. 配置气泡大小
  182. 转换到 10 到 50
  183. **/
  184. export const bubbleSize = (maxval, minval, val, targetMax)=>{
  185. if(maxval == minval){
  186. return 40;
  187. }
  188. if(!targetMax){
  189. targetMax = 50;
  190. }
  191. var r = (targetMax-10)/(maxval-minval)*(val-minval)+10;
  192. return r;
  193. }