From edf40d6e40435775ecaccf04032816d5d99eb58a Mon Sep 17 00:00:00 2001
From: whycq <913841844@qq.com>
Date: 星期一, 18 十二月 2023 08:27:49 +0800
Subject: [PATCH] #

---
 Monitor-APP/uni_modules/qiun-data-charts/js_sdk/u-charts/u-charts.js | 1966 +++++++++++++++++++++++++++++++++++++++++++----------------
 1 files changed, 1,434 insertions(+), 532 deletions(-)

diff --git a/Monitor-APP/uni_modules/qiun-data-charts/js_sdk/u-charts/u-charts.js b/Monitor-APP/uni_modules/qiun-data-charts/js_sdk/u-charts/u-charts.js
index b3858c4..f78bde5 100644
--- a/Monitor-APP/uni_modules/qiun-data-charts/js_sdk/u-charts/u-charts.js
+++ b/Monitor-APP/uni_modules/qiun-data-charts/js_sdk/u-charts/u-charts.js
@@ -1,11 +1,11 @@
 /*
- * uCharts庐
- * 楂樻�ц兘璺ㄥ钩鍙板浘琛ㄥ簱锛屾敮鎸丠5銆丄PP銆佸皬绋嬪簭锛堝井淇�/鏀粯瀹�/鐧惧害/澶存潯/QQ/360锛夈�乂ue銆乀aro绛夋敮鎸乧anvas鐨勬鏋跺钩鍙�
- * Copyright (c) 2021 QIUN庐绉嬩簯 https://www.ucharts.cn All rights reserved.
+ * uCharts (R)
+ * 楂樻�ц兘璺ㄥ钩鍙板浘琛ㄥ簱锛屾敮鎸丠5銆丄PP銆佸皬绋嬪簭锛堝井淇�/鏀粯瀹�/鐧惧害/澶存潯/QQ/360/蹇墜锛夈�乂ue銆乀aro绛夋敮鎸乧anvas鐨勬鏋跺钩鍙�
+ * Copyright (C) 2018-2022 QIUN (R) 绉嬩簯 https://www.ucharts.cn All rights reserved.
  * Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
  * 澶嶅埗浣跨敤璇蜂繚鐣欐湰娈垫敞閲婏紝鎰熻阿鏀寔寮�婧愶紒
  * 
- * uCharts庐瀹樻柟缃戠珯
+ * uCharts (R) 瀹樻柟缃戠珯
  * https://www.uCharts.cn
  * 
  * 寮�婧愬湴鍧�:
@@ -19,17 +19,11 @@
 'use strict';
 
 var config = {
-  version: 'v2.3.7-20220122',
+  version: 'v2.5.0-20230101',
   yAxisWidth: 15,
-  yAxisSplit: 5,
   xAxisHeight: 22,
-  xAxisLineHeight: 22,
-  legendHeight: 15,
-  yAxisTitleWidth: 15,
   padding: [10, 10, 10, 10],
-  pixelRatio: 1,
   rotate: false,
-  columePadding: 3,
   fontSize: 13,
   fontColor: '#666666',
   dataPointShape: ['circle', 'circle', 'circle', 'circle'],
@@ -37,17 +31,9 @@
   linearColor: ['#0EE2F8', '#2BDCA8', '#FA7D8D', '#EB88E2', '#2AE3A0', '#0EE2F8', '#EB88E2', '#6773E3', '#F78A85'],
   pieChartLinePadding: 15,
   pieChartTextPadding: 5,
-  xAxisTextPadding: 3,
-  titleColor: '#333333',
   titleFontSize: 20,
-  subtitleColor: '#999999',
   subtitleFontSize: 15,
-  toolTipPadding: 3,
-  toolTipBackground: '#000000',
-  toolTipOpacity: 0.7,
-  toolTipLineHeight: 20,
   radarLabelTextMargin: 13,
-  gaugeLabelTextMargin: 13
 };
 
 var assign = function(target, ...varArgs) {
@@ -115,28 +101,6 @@
   return e;
 }
 
-// 缁忕含搴﹁浆澧ㄥ崱鎵�
-function lonlat2mercator(longitude, latitude) {
-  var mercator = Array(2);
-  var x = longitude * 20037508.34 / 180;
-  var y = Math.log(Math.tan((90 + latitude) * Math.PI / 360)) / (Math.PI / 180);
-  y = y * 20037508.34 / 180;
-  mercator[0] = x;
-  mercator[1] = y;
-  return mercator;
-}
-
-// 澧ㄥ崱鎵樿浆缁忕含搴�
-function mercator2lonlat(longitude, latitude) {
-  var lonlat = Array(2)
-  var x = longitude / 20037508.34 * 180;
-  var y = latitude / 20037508.34 * 180;
-  y = 180 / Math.PI * (2 * Math.atan(Math.exp(y * Math.PI / 180)) - Math.PI / 2);
-  lonlat[0] = x;
-  lonlat[1] = y;
-  return lonlat;
-}
-
 // hex 杞� rgba
 function hexToRgb(hexValue, opc) {
   var rgx = /^#?([a-f\d])([a-f\d])([a-f\d])$/i;
@@ -168,6 +132,9 @@
   }
   while (num % limit !== 0) {
     if (type === 'upper') {
+      if (num == num + 1) { //淇鏁版嵁鍊艰繃澶um++鏃犳晥鐨刡ug by 鍚戞棩钁� @xrk_jy
+        break;
+      }
       num++;
     } else {
       num--;
@@ -203,6 +170,10 @@
 function calValidDistance(self, distance, chartData, config, opts) {
   var dataChartAreaWidth = opts.width - opts.area[1] - opts.area[3];
   var dataChartWidth = chartData.eachSpacing * (opts.chartData.xAxisData.xAxisPoints.length - 1);
+  if(opts.type == 'mount' && opts.extra && opts.extra.mount && opts.extra.mount.widthRatio && opts.extra.mount.widthRatio > 1){
+    if(opts.extra.mount.widthRatio>2) opts.extra.mount.widthRatio = 2
+    dataChartWidth += (opts.extra.mount.widthRatio - 1)*chartData.eachSpacing;
+  }
   var validDistance = distance;
   if (distance >= 0) {
     validDistance = 0;
@@ -241,18 +212,6 @@
     }
   }
   return angle >= startAngle && angle <= endAngle;
-}
-
-function calRotateTranslate(x, y, h) {
-  var xv = x;
-  var yv = h - y;
-  var transX = xv + (h - yv - xv) / Math.sqrt(2);
-  transX *= -1;
-  var transY = (h - yv) * (Math.sqrt(2) - 1) - (h - yv - xv) / Math.sqrt(2);
-  return {
-    transX: transX,
-    transY: transY
-  };
 }
 
 function createCurveControlPoints(points, i) {
@@ -330,6 +289,7 @@
   };
 }
 
+
 function convertCoordinateOrigin(x, y, center) {
   return {
     x: center.x + x,
@@ -406,13 +366,12 @@
           item.legendShape = "line";
           break;
         case 'column':
+        case 'bar':
           item.legendShape = "rect";
           break;
         case 'area':
+        case 'mount':
           item.legendShape = "triangle";
-          break;
-        case 'bar':
-          item.legendShape = "rect";
           break;
         default:
           item.legendShape = "circle";
@@ -435,7 +394,7 @@
   }
   return newcolor;
 }
-  
+
 function getDataRange(minData, maxData) {
   var limit = 0;
   var range = maxData - minData;
@@ -580,6 +539,7 @@
       seriesItem.style = item.style;
       seriesItem.pointShape = item.pointShape;
       seriesItem.disableLegend = item.disableLegend;
+      seriesItem.legendShape = item.legendShape;
       seriesItem.name = item.name;
       seriesItem.show = item.show;
       seriesItem.data = item.formatter ? item.formatter(item.data[tmpindex]) : item.data[tmpindex];
@@ -618,7 +578,12 @@
     }
     points = filterPoints[0][index[0]];
   }else{
-    points = calPoints[0][index];
+    for (let i = 0; i < calPoints.length; i++) {
+      if(calPoints[i][index]){
+        points = calPoints[i][index];
+        break;
+      }
+    }
   };
   var textList = seriesData.map(function(item) {
     let titleText = null;
@@ -627,7 +592,8 @@
     };
     return {
       text: option.formatter ? option.formatter(item, titleText, index, opts) : item.name + ': ' + item.data,
-      color: item.color
+      color: item.color,
+      legendShape: opts.extra.tooltip.legendShape == 'auto'? item.legendShape : opts.extra.tooltip.legendShape
     };
   });
   var offset = {
@@ -647,7 +613,8 @@
     return {
       text: option.formatter ? option.formatter(item, categories[index], index, opts) : item.name + ': ' + item.data,
       color: item.color,
-      disableLegend: item.disableLegend ? true : false
+      disableLegend: item.disableLegend ? true : false,
+      legendShape: opts.extra.tooltip.legendShape == 'auto'? item.legendShape : opts.extra.tooltip.legendShape
     };
   });
   textList = textList.filter(function(item) {
@@ -696,19 +663,23 @@
     }
     let text1 = {
       text: '寮�鐩橈細' + item.data[0],
-      color: color[0]
+      color: color[0],
+      legendShape: opts.extra.tooltip.legendShape == 'auto'? item.legendShape : opts.extra.tooltip.legendShape
     };
     let text2 = {
       text: '鏀剁洏锛�' + item.data[1],
-      color: color[1]
+      color: color[1],
+      legendShape: opts.extra.tooltip.legendShape == 'auto'? item.legendShape : opts.extra.tooltip.legendShape
     };
     let text3 = {
       text: '鏈�浣庯細' + item.data[2],
-      color: color[2]
+      color: color[2],
+      legendShape: opts.extra.tooltip.legendShape == 'auto'? item.legendShape : opts.extra.tooltip.legendShape
     };
     let text4 = {
       text: '鏈�楂橈細' + item.data[3],
-      color: color[3]
+      color: color[3],
+      legendShape: opts.extra.tooltip.legendShape == 'auto'? item.legendShape : opts.extra.tooltip.legendShape
     };
     textList.push(text1, text2, text3, text4);
   });
@@ -959,6 +930,7 @@
   return Math.pow(currentPoints.x - center.x, 2) + Math.pow(currentPoints.y - center.y, 2) <= Math.pow(radius, 2);
 }
 
+
 function splitPoints(points,eachSeries) {
   var newPoints = [];
   var items = [];
@@ -984,6 +956,7 @@
   }
   return newPoints;
 }
+
 
 function calLegendData(series, opts, config, chartData, context) {
   let legendData = {
@@ -1022,7 +995,8 @@
     let currentRow = [];
     for (let i = 0; i < series.length; i++) {
       let item = series[i];
-      let itemWidth = shapeWidth + shapeRight + measureText(item.name || 'undefined', fontSize, context) + opts.legend.itemGap * opts.pix;
+      const legendText = item.legendText ? item.legendText : item.name;
+      let itemWidth = shapeWidth + shapeRight + measureText(legendText || 'undefined', fontSize, context) + opts.legend.itemGap * opts.pix;
       if (widthCount + itemWidth > opts.width - opts.area[1] - opts.area[3]) {
         legendList.push(currentRow);
         widthCountArr.push(widthCount - opts.legend.itemGap * opts.pix);
@@ -1129,16 +1103,25 @@
 function calCategoriesData(categories, opts, config, eachSpacing, context) {
   var result = {
     angle: 0,
-    xAxisHeight: config.xAxisHeight
+    xAxisHeight: opts.xAxis.lineHeight * opts.pix + opts.xAxis.marginTop * opts.pix
   };
-  var categoriesTextLenth = categories.map(function(item) {
-    return measureText(item, opts.xAxis.fontSize * opts.pix || config.fontSize, context);
+  var fontSize = opts.xAxis.fontSize * opts.pix;
+  var categoriesTextLenth = categories.map(function(item,index) {
+    var xitem = opts.xAxis.formatter ? opts.xAxis.formatter(item,index,opts) : item;
+    return measureText(String(xitem), fontSize, context);
   });
   var maxTextLength = Math.max.apply(this, categoriesTextLenth);
-
-  if (opts.xAxis.rotateLabel == true && maxTextLength + 2 * config.xAxisTextPadding > eachSpacing) {
-    result.angle = 45 * Math.PI / 180;
-    result.xAxisHeight = 2 * config.xAxisTextPadding + maxTextLength * Math.sin(result.angle);
+  if (opts.xAxis.rotateLabel == true) {
+    result.angle = opts.xAxis.rotateAngle * Math.PI / 180;
+    let tempHeight = opts.xAxis.marginTop * opts.pix * 2 +  Math.abs(maxTextLength * Math.sin(result.angle))
+    tempHeight = tempHeight < fontSize + opts.xAxis.marginTop * opts.pix * 2 ? tempHeight + opts.xAxis.marginTop * opts.pix * 2 : tempHeight;
+    result.xAxisHeight = tempHeight;
+  }
+  if (opts.enableScroll && opts.xAxis.scrollShow) {
+    result.xAxisHeight += 6 * opts.pix;
+  }
+  if (opts.xAxis.disabled){
+    result.xAxisHeight = 0;
   }
   return result;
 }
@@ -1227,7 +1210,7 @@
   }, opts.extra.bar);
   var result = {
     angle: 0,
-    xAxisHeight: config.xAxisHeight
+    xAxisHeight: opts.xAxis.lineHeight * opts.pix + opts.xAxis.marginTop * opts.pix
   };
   result.ranges = getXAxisTextList(series, opts, config, columnstyle.type);
   result.rangesFormat = result.ranges.map(function(item) {
@@ -1246,15 +1229,8 @@
   // 璁$畻X杞村埢搴︾殑灞炴�ц濡傛瘡涓埢搴︾殑闂撮殧,鍒诲害鐨勮捣濮嬬偣\缁撴潫鐐逛互鍙婃�婚暱
   var eachSpacing = result.eachSpacing;
   var textLength = xAxisScaleValues.map(function(item) {
-    return measureText(item, opts.xAxis.fontSize * opts.pix || config.fontSize, context);
+    return measureText(item, opts.xAxis.fontSize * opts.pix, context);
   });
-  // get max length of categories text
-  var maxTextLength = Math.max.apply(this, textLength);
-  // 濡傛灉鍒诲害鍊兼枃鏈唴瀹硅繃闀�,鍒欏皢鍏堕�嗘椂閽堟棆杞�45掳
-  if (maxTextLength + 2 * config.xAxisTextPadding > eachSpacing) {
-    result.angle = 45 * Math.PI / 180;
-    result.xAxisHeight = 2 * config.xAxisTextPadding + maxTextLength * Math.sin(result.angle);
-  }
   if (opts.xAxis.disabled === true) {
     result.xAxisHeight = 0;
   }
@@ -1314,22 +1290,19 @@
   return series;
 }
 
-function getFunnelDataPoints(series, radius, type, eachSpacing) {
+function getFunnelDataPoints(series, radius, option, eachSpacing) {
   var process = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1;
-  series = series.sort(function(a, b) {
-    return parseInt(b.data) - parseInt(a.data);
-  });
   for (let i = 0; i < series.length; i++) {
-    if(type == 'funnel'){
+    if(option.type == 'funnel'){
       series[i].radius = series[i].data / series[0].data * radius * process;
     }else{
       series[i].radius =  (eachSpacing * (series.length - i)) / (eachSpacing * series.length) * radius * process;
     }
     series[i]._proportion_ = series[i].data / series[0].data;
   }
-  if(type !== 'pyramid'){
-    series.reverse();
-  }
+  // if(option.type !== 'pyramid'){
+  //   series.reverse();
+  // }
   return series;
 }
 
@@ -1383,6 +1356,43 @@
     if (arcbarOption.type == 'circle') {
       totalAngle = 2;
     } else {
+      if(arcbarOption.direction == 'ccw'){
+        if (arcbarOption.startAngle < arcbarOption.endAngle) {
+          totalAngle = 2 + arcbarOption.startAngle - arcbarOption.endAngle;
+        } else {
+          totalAngle = arcbarOption.startAngle - arcbarOption.endAngle;
+        }
+      }else{
+        if (arcbarOption.endAngle < arcbarOption.startAngle) {
+          totalAngle = 2 + arcbarOption.endAngle - arcbarOption.startAngle;
+        } else {
+          totalAngle = arcbarOption.startAngle - arcbarOption.endAngle;
+        }
+      }
+    }
+    item._proportion_ = totalAngle * item.data * process + arcbarOption.startAngle;
+    if(arcbarOption.direction == 'ccw'){
+      item._proportion_ = arcbarOption.startAngle - totalAngle * item.data * process ;
+    }
+    if (item._proportion_ >= 2) {
+      item._proportion_ = item._proportion_ % 2;
+    }
+  }
+  return series;
+}
+
+function getGaugeArcbarDataPoints(series, arcbarOption) {
+  var process = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;
+  if (process == 1) {
+    process = 0.999999;
+  }
+  for (let i = 0; i < series.length; i++) {
+    let item = series[i];
+    item.data = item.data === null ? 0 : item.data;
+    let totalAngle;
+    if (arcbarOption.type == 'circle') {
+      totalAngle = 2;
+    } else {
       if (arcbarOption.endAngle < arcbarOption.startAngle) {
         totalAngle = 2 + arcbarOption.endAngle - arcbarOption.startAngle;
       } else {
@@ -1398,7 +1408,12 @@
 }
 
 function getGaugeAxisPoints(categories, startAngle, endAngle) {
-  let totalAngle = startAngle - endAngle + 1;
+  let totalAngle;
+  if (endAngle < startAngle) {
+    totalAngle = 2 + endAngle - startAngle;
+  } else {
+    totalAngle = startAngle - endAngle;
+  }
   let tempStartAngle = startAngle;
   for (let i = 0; i < categories.length; i++) {
     categories[i].value = categories[i].value === null ? 0 : categories[i].value;
@@ -1427,7 +1442,12 @@
     } else {
       item.color = gaugeOption.pointer.color;
     }
-    let totalAngle = gaugeOption.startAngle - gaugeOption.endAngle + 1;
+    let totalAngle;
+    if (gaugeOption.endAngle < gaugeOption.startAngle) {
+      totalAngle = 2 + gaugeOption.endAngle - gaugeOption.startAngle;
+    } else {
+      totalAngle = gaugeOption.startAngle - gaugeOption.endAngle;
+    }
     item._endAngle_ = totalAngle * item.data + gaugeOption.startAngle;
     item._oldAngle_ = gaugeOption.oldAngle;
     if (gaugeOption.oldAngle < gaugeOption.endAngle) {
@@ -1516,12 +1536,12 @@
     if (item === null) {
       return null;
     }
-    item.width = Math.ceil(eachSpacing - 2 * categoryGap);
+    item.width = eachSpacing - 2 * categoryGap;
     if (opts.extra.column && opts.extra.column.width && +opts.extra.column.width > 0) {
       item.width = Math.min(item.width, +opts.extra.column.width * opts.pix);
     }
     if (index > 0) {
-      item.width -= 2 * border;
+      item.width -= border;
     }
     return item;
   });
@@ -1567,16 +1587,22 @@
   if ((opts.type == 'line' || opts.type == 'area' || opts.type == 'scatter' || opts.type == 'bubble' || opts.type == 'bar') && dataCount > 1 && opts.xAxis.boundaryGap == 'justify') {
     dataCount -= 1;
   }
+  var widthRatio = 0;
+  if(opts.type == 'mount' && opts.extra && opts.extra.mount && opts.extra.mount.widthRatio && opts.extra.mount.widthRatio > 1){
+    if(opts.extra.mount.widthRatio>2) opts.extra.mount.widthRatio = 2
+    widthRatio = opts.extra.mount.widthRatio - 1;
+    dataCount += widthRatio;
+  }
   var eachSpacing = spacingValid / dataCount;
   var xAxisPoints = [];
   var startX = opts.area[3];
   var endX = opts.width - opts.area[1];
   categories.forEach(function(item, index) {
-    xAxisPoints.push(startX + index * eachSpacing);
+    xAxisPoints.push(startX + widthRatio / 2 * eachSpacing + index * eachSpacing);
   });
   if (opts.xAxis.boundaryGap !== 'justify') {
     if (opts.enableScroll === true) {
-      xAxisPoints.push(startX + categories.length * eachSpacing);
+      xAxisPoints.push(startX + widthRatio * eachSpacing + categories.length * eachSpacing);
     } else {
       xAxisPoints.push(endX);
     }
@@ -1658,6 +1684,114 @@
   return points;
 }
 
+function getLineDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, lineOption, process){
+  var process = arguments.length > 8 && arguments[8] !== undefined ? arguments[8] : 1;
+  var boundaryGap = opts.xAxis.boundaryGap;
+  var points = [];
+  var validHeight = opts.height - opts.area[0] - opts.area[2];
+  var validWidth = opts.width - opts.area[1] - opts.area[3];
+  data.forEach(function(item, index) {
+    if (item === null) {
+      points.push(null);
+    } else {
+      var point = {};
+      point.color = item.color;
+      if(lineOption.animation == 'vertical'){
+        point.x = xAxisPoints[index];
+        var value = item;
+        if (typeof item === 'object' && item !== null) {
+          if (item.constructor.toString().indexOf('Array') > -1) {
+            let xranges, xminRange, xmaxRange;
+            xranges = [].concat(opts.chartData.xAxisData.ranges);
+            xminRange = xranges.shift();
+            xmaxRange = xranges.pop();
+            value = item[1];
+            point.x = opts.area[3] + validWidth * (item[0] - xminRange) / (xmaxRange - xminRange);
+          } else {
+            value = item.value;
+          }
+        }
+        if (boundaryGap == 'center') {
+          point.x += eachSpacing / 2;
+        }
+        var height = validHeight * (value - minRange) / (maxRange - minRange);
+        height *= process;
+        point.y = opts.height - height - opts.area[2];
+        points.push(point);
+      }else{
+        point.x = xAxisPoints[0] + eachSpacing * index * process;
+        var value = item;
+        if (boundaryGap == 'center') {
+          point.x += eachSpacing / 2;
+        }
+        var height = validHeight * (value - minRange) / (maxRange - minRange);
+        point.y = opts.height - height - opts.area[2];
+        points.push(point);
+      }
+    }
+  });
+  return points;
+}
+
+function getColumnDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, zeroPoints, process){
+  var process = arguments.length > 8 && arguments[8] !== undefined ? arguments[8] : 1;
+  var points = [];
+  var validHeight = opts.height - opts.area[0] - opts.area[2];
+  var validWidth = opts.width - opts.area[1] - opts.area[3];
+  data.forEach(function(item, index) {
+    if (item === null) {
+      points.push(null);
+    } else {
+      var point = {};
+      point.color = item.color;
+      point.x = xAxisPoints[index];
+      var value = item;
+      if (typeof item === 'object' && item !== null) {
+        if (item.constructor.toString().indexOf('Array') > -1) {
+          let xranges, xminRange, xmaxRange;
+          xranges = [].concat(opts.chartData.xAxisData.ranges);
+          xminRange = xranges.shift();
+          xmaxRange = xranges.pop();
+          value = item[1];
+          point.x = opts.area[3] + validWidth * (item[0] - xminRange) / (xmaxRange - xminRange);
+        } else {
+          value = item.value;
+        }
+      }
+      point.x += eachSpacing / 2;
+      var height = validHeight * (value * process - minRange) / (maxRange - minRange);
+      point.y = opts.height - height - opts.area[2];
+      points.push(point);
+    }
+  });
+  return points;
+}
+
+function getMountDataPoints(series, minRange, maxRange, xAxisPoints, eachSpacing, opts, mountOption, zeroPoints) {
+  var process = arguments.length > 8 && arguments[8] !== undefined ? arguments[8] : 1;
+  var points = [];
+  var validHeight = opts.height - opts.area[0] - opts.area[2];
+  var validWidth = opts.width - opts.area[1] - opts.area[3];
+  var mountWidth = eachSpacing * mountOption.widthRatio;
+  series.forEach(function(item, index) {
+    if (item === null) {
+      points.push(null);
+    } else {
+      var point = {};
+      point.color = item.color;
+      point.x = xAxisPoints[index];
+      point.x += eachSpacing / 2;
+      var value = item.data;
+      var height = validHeight * (value * process - minRange) / (maxRange - minRange);
+      point.y = opts.height - height - opts.area[2];
+      point.value = value;
+      point.width = mountWidth;
+      points.push(point);
+    }
+  });
+  return points;
+}
+
 function getBarDataPoints(data, minRange, maxRange, yAxisPoints, eachSpacing, opts, config) {
   var process = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : 1;
   var points = [];
@@ -1707,6 +1841,9 @@
         var height0 = validHeight * (value0 - minRange) / (maxRange - minRange);
       } else {
         var value = item;
+        if (typeof item === 'object' && item !== null) {
+          value = item.value;
+        }
         var height = validHeight * (value - minRange) / (maxRange - minRange);
         var height0 = 0;
       }
@@ -1742,6 +1879,9 @@
         var height0 = validHeight * (value0 - minRange) / (maxRange - minRange);
       } else {
         var value = item;
+        if (typeof item === 'object' && item !== null) {
+          value = item.value;
+        }
         var height = validHeight * (value - minRange) / (maxRange - minRange);
         var height0 = 0;
       }
@@ -1802,31 +1942,18 @@
     minData = Math.min.apply(this, sorted);
     maxData = Math.max.apply(this, sorted);
   }
-  //涓轰簡鍏煎v1.9.0涔嬪墠鐨勯」鐩�
-  // if (index > -1) {
-  //   if (typeof opts.yAxis.data[index].min === 'number') {
-  //     minData = Math.min(opts.yAxis.data[index].min, minData);
-  //   }
-  //   if (typeof opts.yAxis.data[index].max === 'number') {
-  //     maxData = Math.max(opts.yAxis.data[index].max, maxData);
-  //   }
-  // } else {
-  //   if (typeof opts.yAxis.min === 'number') {
-  //     minData = Math.min(opts.yAxis.min, minData);
-  //   }
-  //   if (typeof opts.yAxis.max === 'number') {
-  //     maxData = Math.max(opts.yAxis.max, maxData);
-  //   }
-  // }
   if (minData === maxData) {
-    var rangeSpan = maxData || 10;
-    maxData += rangeSpan;
+    if(maxData == 0){
+      maxData = 10;
+    }else{
+      minData = 0;
+    }
   }
   var dataRange = getDataRange(minData, maxData);
-  var minRange = yData.min === undefined || yData.min === null ? dataRange.minRange : yData.min;
-  var maxRange = yData.max === undefined || yData.min === null ? dataRange.maxRange : yData.max;
-  var range = [];
+  var minRange = (yData.min === undefined || yData.min === null) ? dataRange.minRange : yData.min;
+  var maxRange = (yData.max === undefined || yData.max === null) ? dataRange.maxRange : yData.max;
   var eachRange = (maxRange - minRange) / opts.yAxis.splitNumber;
+  var range = [];
   for (var i = 0; i <= opts.yAxis.splitNumber; i++) {
     range.push(minRange + eachRange * i);
   }
@@ -1862,13 +1989,13 @@
       }
       if(yData.type === 'categories'){
         if(!yData.formatter){
-          yData.formatter = (val) => {return val + (yData.unit || '')};
+          yData.formatter = (val,index,opts) => {return val + (yData.unit || '')};
         }
         yData.categories = yData.categories || opts.categories;
         rangesArr[i] = yData.categories;
       }else{
         if(!yData.formatter){
-          yData.formatter = (val) => {return val.toFixed(yData.tofix) + (yData.unit || '')};
+          yData.formatter = (val,index,opts) => {return util.toFixed(val, yData.tofix || 0) + (yData.unit || '')};
         }
         rangesArr[i] = getYAxisTextList(newSeries[i], opts, config, columnstyle.type, yData, i);
       }
@@ -1877,8 +2004,8 @@
         position: yData.position ? yData.position : 'left',
         width: 0
       };
-      rangesFormatArr[i] = rangesArr[i].map(function(items) {
-        items = yData.formatter(items);
+      rangesFormatArr[i] = rangesArr[i].map(function(items,index) {
+        items = yData.formatter(items,index,opts);
         yAxisWidthArr[i].width = Math.max(yAxisWidthArr[i].width, measureText(items, yAxisFontSizes, context) + 5);
         return items;
       });
@@ -1895,11 +2022,11 @@
     if(opts.type === 'bar'){
       rangesArr[0] = opts.categories;
       if(!opts.yAxis.formatter){
-        opts.yAxis.formatter = (val) => {return val + (opts.yAxis.unit || '')}
+        opts.yAxis.formatter = (val,index,opts) => {return val + (opts.yAxis.unit || '')}
       }
     }else{
       if(!opts.yAxis.formatter){
-        opts.yAxis.formatter = (val) => {return val.toFixed(opts.yAxis.tofix ) + (opts.yAxis.unit || '')}
+        opts.yAxis.formatter = (val,index,opts) => {return val.toFixed(opts.yAxis.tofix ) + (opts.yAxis.unit || '')}
       }
       rangesArr[0] = getYAxisTextList(series, opts, config, columnstyle.type, {});
     }
@@ -1908,8 +2035,8 @@
       width: 0
     };
     var yAxisFontSize = opts.yAxis.fontSize * opts.pix || config.fontSize;
-    rangesFormatArr[0] = rangesArr[0].map(function(item) {
-      item = opts.yAxis.formatter(item);
+    rangesFormatArr[0] = rangesArr[0].map(function(item,index) {
+      item = opts.yAxis.formatter(item,index,opts);
       yAxisWidthArr[0].width = Math.max(yAxisWidthArr[0].width, measureText(item, yAxisFontSize, context) + 5);
       return item;
     });
@@ -1949,10 +2076,10 @@
   let minAxis = opts.area[0];
   let items = [];
   for (let i = 0; i < ranges.length; i++) {
-    let maxVal = ranges[i].shift();
-    let minVal = ranges[i].pop();
+    let maxVal = Math.max.apply(this, ranges[i]);
+    let minVal = Math.min.apply(this, ranges[i]);
     let item = maxVal - (maxVal - minVal) * (point - minAxis) / spacingValid;
-    item = opts.yAxis.data[i].formatter ? opts.yAxis.data[i].formatter(item) : item.toFixed(0);
+    item = opts.yAxis.data && opts.yAxis.data[i].formatter ? opts.yAxis.data[i].formatter(item, i, opts) : item.toFixed(0);
     items.push(String(item))
   }
   return items;
@@ -2027,7 +2154,66 @@
         context.lineTo(item.x, item.y - 4.5);
       }
     });
+  } else if (shape === 'none') {
+    return;
+  }
+  context.closePath();
+  context.fill();
+  context.stroke();
+}
+
+function drawActivePoint(points, color, shape, context, opts, option, seriesIndex) {
+  if(!opts.tooltip){
+    return
+  }
+  if(opts.tooltip.group.length>0 && opts.tooltip.group.includes(seriesIndex) == false){
+    return
+  }
+  var pointIndex = typeof opts.tooltip.index === 'number' ? opts.tooltip.index : opts.tooltip.index[opts.tooltip.group.indexOf(seriesIndex)];
+  context.beginPath();
+  if (option.activeType == 'hollow') {
+    context.setStrokeStyle(color);
+    context.setFillStyle(opts.background);
+    context.setLineWidth(2 * opts.pix);
+  } else {
+    context.setStrokeStyle("#ffffff");
+    context.setFillStyle(color);
+    context.setLineWidth(1 * opts.pix);
+  }
+  if (shape === 'diamond') {
+    points.forEach(function(item, index) {
+      if (item !== null && pointIndex == index ) {
+        context.moveTo(item.x, item.y - 4.5);
+        context.lineTo(item.x - 4.5, item.y);
+        context.lineTo(item.x, item.y + 4.5);
+        context.lineTo(item.x + 4.5, item.y);
+        context.lineTo(item.x, item.y - 4.5);
+      }
+    });
+  } else if (shape === 'circle') {
+    points.forEach(function(item, index) {
+      if (item !== null && pointIndex == index) {
+        context.moveTo(item.x + 2.5 * opts.pix, item.y);
+        context.arc(item.x, item.y, 3 * opts.pix, 0, 2 * Math.PI, false);
+      }
+    });
+  } else if (shape === 'square') {
+    points.forEach(function(item, index) {
+      if (item !== null && pointIndex == index) {
+        context.moveTo(item.x - 3.5, item.y - 3.5);
+        context.rect(item.x - 3.5, item.y - 3.5, 7, 7);
+      }
+    });
   } else if (shape === 'triangle') {
+    points.forEach(function(item, index) {
+      if (item !== null && pointIndex == index) {
+        context.moveTo(item.x, item.y - 4.5);
+        context.lineTo(item.x - 4.5, item.y + 4.5);
+        context.lineTo(item.x + 4.5, item.y + 4.5);
+        context.lineTo(item.x, item.y - 4.5);
+      }
+    });
+  } else if (shape === 'none') {
     return;
   }
   context.closePath();
@@ -2093,9 +2279,98 @@
           value = data[index].value
         }
       }
-      var formatVal = series.formatter ? series.formatter(value,index) : value;
+      var formatVal = series.formatter ? series.formatter(value,index,series,opts) : value;
       context.setTextAlign('center');
       context.fillText(String(formatVal), item.x, item.y - 4 + textOffset * opts.pix);
+      context.closePath();
+      context.stroke();
+      context.setTextAlign('left');
+    }
+  });
+}
+
+function drawColumePointText(points, series, config, context, opts) {
+  // 缁樺埗鏁版嵁鏂囨
+  var data = series.data;
+  var textOffset = series.textOffset ? series.textOffset : 0;
+  var Position = opts.extra.column.labelPosition;
+  points.forEach(function(item, index) {
+    if (item !== null) {
+      context.beginPath();
+      var fontSize = series.textSize ? series.textSize * opts.pix : config.fontSize;
+      context.setFontSize(fontSize);
+      context.setFillStyle(series.textColor || opts.fontColor);
+      var value = data[index]
+      if (typeof data[index] === 'object' && data[index] !== null) {
+        if (data[index].constructor.toString().indexOf('Array')>-1) {
+          value = data[index][1];
+        } else {
+          value = data[index].value
+        }
+      }
+      var formatVal = series.formatter ? series.formatter(value,index,series,opts) : value;
+      context.setTextAlign('center');
+      var startY = item.y - 4 * opts.pix + textOffset * opts.pix;
+      if(item.y > series.zeroPoints){
+        startY = item.y + textOffset * opts.pix + fontSize;
+      }
+      if(Position == 'insideTop'){
+        startY = item.y + fontSize + textOffset * opts.pix;
+        if(item.y > series.zeroPoints){
+          startY = item.y - textOffset * opts.pix - 4 * opts.pix;
+        }
+      }
+      if(Position == 'center'){
+        startY = item.y + textOffset * opts.pix + (opts.height - opts.area[2] - item.y + fontSize)/2;
+        if(series.zeroPoints < opts.height - opts.area[2]){
+          startY = item.y + textOffset * opts.pix + (series.zeroPoints - item.y + fontSize)/2;
+        }
+        if(item.y > series.zeroPoints){
+          startY = item.y - textOffset * opts.pix - (item.y - series.zeroPoints - fontSize)/2;
+        }
+        if(opts.extra.column.type == 'stack'){
+          startY = item.y + textOffset * opts.pix + (item.y0 - item.y + fontSize)/2;
+        }
+      }
+      if(Position == 'bottom'){
+        startY = opts.height - opts.area[2] + textOffset * opts.pix - 4 * opts.pix;
+        if(series.zeroPoints < opts.height - opts.area[2]){
+          startY = series.zeroPoints + textOffset * opts.pix - 4 * opts.pix;
+        }
+        if(item.y > series.zeroPoints){
+          startY = series.zeroPoints - textOffset * opts.pix + fontSize + 2 * opts.pix;
+        }
+        if(opts.extra.column.type == 'stack'){
+          startY = item.y0 + textOffset * opts.pix - 4 * opts.pix;
+        }
+      }
+      context.fillText(String(formatVal), item.x, startY);
+      context.closePath();
+      context.stroke();
+      context.setTextAlign('left');
+    }
+  });
+}
+
+function drawMountPointText(points, series, config, context, opts, zeroPoints) {
+  // 缁樺埗鏁版嵁鏂囨
+  var data = series.data;
+  var textOffset = series.textOffset ? series.textOffset : 0;
+  var Position = opts.extra.mount.labelPosition;
+  points.forEach(function(item, index) {
+    if (item !== null) {
+      context.beginPath();
+      var fontSize = series[index].textSize ? series[index].textSize * opts.pix : config.fontSize;
+      context.setFontSize(fontSize);
+      context.setFillStyle(series[index].textColor || opts.fontColor);
+      var value = item.value
+      var formatVal = series[index].formatter ? series[index].formatter(value,index,series,opts) : value;
+      context.setTextAlign('center');
+      var startY = item.y - 4 * opts.pix + textOffset * opts.pix;
+      if(item.y > zeroPoints){
+        startY = item.y + textOffset * opts.pix + fontSize;
+      }
+      context.fillText(String(formatVal), item.x, startY);
       context.closePath();
       context.stroke();
       context.setTextAlign('left');
@@ -2117,7 +2392,7 @@
       if (typeof data[index] === 'object' && data[index] !== null) {
         value = data[index].value ;
       }
-      var formatVal = series.formatter ? series.formatter(value,index) : value;
+      var formatVal = series.formatter ? series.formatter(value,index,series,opts) : value;
       context.setTextAlign('left');
       context.fillText(String(formatVal), item.x + 4 * opts.pix , item.y + fontSize / 2 - 3 );
       context.closePath();
@@ -2128,7 +2403,13 @@
 
 function drawGaugeLabel(gaugeOption, radius, centerPosition, opts, config, context) {
   radius -= gaugeOption.width / 2 + gaugeOption.labelOffset * opts.pix;
-  let totalAngle = gaugeOption.startAngle - gaugeOption.endAngle + 1;
+  radius = radius < 10 ? 10 : radius;
+  let totalAngle;
+  if (gaugeOption.endAngle < gaugeOption.startAngle) {
+    totalAngle = 2 + gaugeOption.endAngle - gaugeOption.startAngle;
+  } else {
+    totalAngle = gaugeOption.startAngle - gaugeOption.endAngle;
+  }
   let splitAngle = totalAngle / gaugeOption.splitLine.splitNumber;
   let totalNumber = gaugeOption.endNumber - gaugeOption.startNumber;
   let splitNumber = totalNumber / gaugeOption.splitLine.splitNumber;
@@ -2139,7 +2420,7 @@
       x: radius * Math.cos(nowAngle * Math.PI),
       y: radius * Math.sin(nowAngle * Math.PI)
     };
-    var labelText = gaugeOption.formatter ? gaugeOption.formatter(nowNumber) : nowNumber;
+    var labelText = gaugeOption.formatter ? gaugeOption.formatter(nowNumber,i,opts) : nowNumber;
     pos.x += centerPosition.x - measureText(labelText, config.fontSize, context) / 2;
     pos.y += centerPosition.y;
     var startX = pos.x;
@@ -2156,31 +2437,43 @@
     }
     nowNumber += splitNumber;
   }
-
 }
 
 function drawRadarLabel(angleList, radius, centerPosition, opts, config, context) {
   var radarOption = opts.extra.radar || {};
-  radius += config.radarLabelTextMargin * opts.pix;
   angleList.forEach(function(angle, index) {
-    var pos = {
-      x: radius * Math.cos(angle),
-      y: radius * Math.sin(angle)
-    };
-    var posRelativeCanvas = convertCoordinateOrigin(pos.x, pos.y, centerPosition);
-    var startX = posRelativeCanvas.x;
-    var startY = posRelativeCanvas.y;
-    if (util.approximatelyEqual(pos.x, 0)) {
-      startX -= measureText(opts.categories[index] || '', config.fontSize, context) / 2;
-    } else if (pos.x < 0) {
-      startX -= measureText(opts.categories[index] || '', config.fontSize, context);
+    if(radarOption.labelPointShow === true && opts.categories[index] !== ''){
+      var posPoint = {
+        x: radius * Math.cos(angle),
+        y: radius * Math.sin(angle)
+      };
+      var posPointAxis = convertCoordinateOrigin(posPoint.x, posPoint.y, centerPosition);
+      context.setFillStyle(radarOption.labelPointColor);
+      context.beginPath();
+      context.arc(posPointAxis.x, posPointAxis.y, radarOption.labelPointRadius * opts.pix, 0, 2 * Math.PI, false);
+      context.closePath();
+      context.fill();
     }
-    context.beginPath();
-    context.setFontSize(config.fontSize);
-    context.setFillStyle(radarOption.labelColor || opts.fontColor);
-    context.fillText(opts.categories[index] || '', startX, startY + config.fontSize / 2);
-    context.closePath();
-    context.stroke();
+    if(radarOption.labelShow === true){
+      var pos = {
+        x: (radius + config.radarLabelTextMargin * opts.pix) * Math.cos(angle),
+        y: (radius + config.radarLabelTextMargin * opts.pix) * Math.sin(angle)
+      };
+      var posRelativeCanvas = convertCoordinateOrigin(pos.x, pos.y, centerPosition);
+      var startX = posRelativeCanvas.x;
+      var startY = posRelativeCanvas.y;
+      if (util.approximatelyEqual(pos.x, 0)) {
+        startX -= measureText(opts.categories[index] || '', config.fontSize, context) / 2;
+      } else if (pos.x < 0) {
+        startX -= measureText(opts.categories[index] || '', config.fontSize, context);
+      }
+      context.beginPath();
+      context.setFontSize(config.fontSize);
+      context.setFillStyle(radarOption.labelColor || opts.fontColor);
+      context.fillText(opts.categories[index] || '', startX, startY + config.fontSize / 2);
+      context.closePath();
+      context.stroke();
+    }
   });
 
 }
@@ -2189,8 +2482,9 @@
   var lineRadius = config.pieChartLinePadding;
   var textObjectCollection = [];
   var lastTextObject = null;
-  var seriesConvert = series.map(function(item,index,series) {
-    var text = item.formatter ? item.formatter(item,index,series) : util.toFixed(item._proportion_.toFixed(4) * 100) + '%';
+  var seriesConvert = series.map(function(item,index) {
+    var text = item.formatter ? item.formatter(item,index,series,opts) : util.toFixed(item._proportion_.toFixed(4) * 100) + '%';
+    text = item.labelText ? item.labelText : text;
     var arc = 2 * Math.PI - (item._start_ + 2 * Math.PI * item._proportion_ / 2);
     if (item._rose_proportion_) {
       arc = 2 * Math.PI - (item._start_ + 2 * Math.PI * item._rose_proportion_ / 2);
@@ -2204,6 +2498,7 @@
       radius: radius,
       textColor: item.textColor,
       textSize: item.textSize,
+      labelShow: item.labelShow
     };
   });
   for (let i = 0; i < seriesConvert.length; i++) {
@@ -2261,6 +2556,9 @@
     textObjectCollection.push(lastTextObject);
   }
   for (let i = 0; i < textObjectCollection.length; i++) {
+    if(seriesConvert[i].labelShow === false){
+      continue;
+    }
     let item = textObjectCollection[i];
     let lineStartPoistion = convertCoordinateOrigin(item.lineStart.x, item.lineStart.y, center);
     let lineEndPoistion = convertCoordinateOrigin(item.lineEnd.x, item.lineEnd.y, center);
@@ -2279,7 +2577,7 @@
     context.closePath();
     context.beginPath();
     context.moveTo(textPosition.x + item.width, textPosition.y);
-    context.arc(curveStartX, textPosition.y, 2, 0, 2 * Math.PI);
+    context.arc(curveStartX, textPosition.y, 2 * opts.pix, 0, 2 * Math.PI);
     context.closePath();
     context.fill();
     context.beginPath();
@@ -2313,19 +2611,19 @@
     context.setFontSize(config.fontSize);
     let textWidth = measureText(labelText, config.fontSize, context);
     let textX = offsetX - 0.5 * textWidth;
-    let textY = endY;
+    let textY = endY + 2 * opts.pix;
     context.beginPath();
     context.setFillStyle(hexToRgb(toolTipOption.labelBgColor || config.toolTipBackground, toolTipOption.labelBgOpacity || config.toolTipOpacity));
     context.setStrokeStyle(toolTipOption.labelBgColor || config.toolTipBackground);
     context.setLineWidth(1 * opts.pix);
-    context.rect(textX - config.toolTipPadding, textY, textWidth + 2 * config.toolTipPadding, config.fontSize + 2 * config.toolTipPadding);
+    context.rect(textX - toolTipOption.boxPadding * opts.pix, textY, textWidth + 2 * toolTipOption.boxPadding * opts.pix, config.fontSize + 2 * toolTipOption.boxPadding * opts.pix);
     context.closePath();
     context.stroke();
     context.fill();
     context.beginPath();
     context.setFontSize(config.fontSize);
     context.setFillStyle(toolTipOption.labelFontColor || opts.fontColor);
-    context.fillText(String(labelText), textX, textY + config.toolTipPadding + config.fontSize);
+    context.fillText(String(labelText), textX, textY + toolTipOption.boxPadding * opts.pix + config.fontSize);
     context.closePath();
     context.stroke();
   }
@@ -2344,10 +2642,14 @@
     let item = assign({}, {
       lineColor: '#DE4A42',
       showLabel: false,
+      labelFontSize: 13,
+      labelPadding: 6,
       labelFontColor: '#666666',
       labelBgColor: '#DFE8FF',
       labelBgOpacity: 0.8,
-      yAxisIndex: 0
+      labelAlign: 'left',
+      labelOffsetX: 0,
+      labelOffsetY: 0,
     }, points[i]);
     if (markLineOption.type == 'dash') {
       context.setLineDash([markLineOption.dashLength, markLineOption.dashLength]);
@@ -2360,27 +2662,29 @@
     context.stroke();
     context.setLineDash([]);
     if (item.showLabel) {
-      let labelText = opts.yAxis.formatter ? opts.yAxis.formatter(item.value) : item.value;
-      context.setFontSize(config.fontSize);
-      let textWidth = measureText(labelText, config.fontSize, context);
-      let yAxisWidth = opts.chartData.yAxisData.yAxisWidth[0].width;
-      let bgStartX = opts.area[3] - textWidth - config.toolTipPadding * 2;
-      let bgEndX = opts.area[3];
-      let bgWidth = bgEndX - bgStartX;
-      let textX = bgEndX - config.toolTipPadding;
+      let fontSize = item.labelFontSize * opts.pix;
+      let labelText = item.labelText ? item.labelText : item.value;
+      context.setFontSize(fontSize);
+      let textWidth = measureText(labelText, fontSize, context);
+      let bgWidth = textWidth + item.labelPadding * opts.pix * 2;
+      let bgStartX = item.labelAlign == 'left' ? opts.area[3] - bgWidth : opts.width - opts.area[1];
+      bgStartX += item.labelOffsetX;
+      let bgStartY = item.y - 0.5 * fontSize - item.labelPadding * opts.pix;
+      bgStartY += item.labelOffsetY;
+      let textX = bgStartX + item.labelPadding * opts.pix;
       let textY = item.y;
       context.setFillStyle(hexToRgb(item.labelBgColor, item.labelBgOpacity));
       context.setStrokeStyle(item.labelBgColor);
       context.setLineWidth(1 * opts.pix);
       context.beginPath();
-      context.rect(bgStartX, textY - 0.5 * config.fontSize - config.toolTipPadding, bgWidth, config.fontSize + 2 * config.toolTipPadding);
+      context.rect(bgStartX, bgStartY, bgWidth, fontSize + 2 * item.labelPadding * opts.pix);
       context.closePath();
       context.stroke();
       context.fill();
-      context.setFontSize(config.fontSize);
-      context.setTextAlign('right');
+      context.setFontSize(fontSize);
+      context.setTextAlign('left');
       context.setFillStyle(item.labelFontColor);
-      context.fillText(String(labelText), textX, textY + 0.5 * config.fontSize);
+      context.fillText(String(labelText), textX, bgStartY + fontSize + item.labelPadding * opts.pix/2);
       context.stroke();
       context.setTextAlign('left');
     }
@@ -2405,20 +2709,21 @@
   context.stroke();
   context.setLineDash([]);
   if (toolTipOption.yAxisLabel) {
+    let boxPadding = toolTipOption.boxPadding * opts.pix;
     let labelText = calTooltipYAxisData(opts.tooltip.offset.y, opts.series, opts, config, eachSpacing);
     let widthArr = opts.chartData.yAxisData.yAxisWidth;
     let tStartLeft = opts.area[3];
     let tStartRight = opts.width - opts.area[1];
     for (let i = 0; i < labelText.length; i++) {
-      context.setFontSize(config.fontSize);
-      let textWidth = measureText(labelText[i], config.fontSize, context);
+      context.setFontSize(toolTipOption.fontSize * opts.pix);
+      let textWidth = measureText(labelText[i], toolTipOption.fontSize * opts.pix, context);
       let bgStartX, bgEndX, bgWidth;
       if (widthArr[i].position == 'left') {
-        bgStartX = tStartLeft - widthArr[i].width;
-        bgEndX = Math.max(bgStartX, bgStartX + textWidth + config.toolTipPadding * 2);
+        bgStartX = tStartLeft - (textWidth + boxPadding * 2) - 2 * opts.pix;
+        bgEndX = Math.max(bgStartX, bgStartX + textWidth + boxPadding * 2);
       } else {
-        bgStartX = tStartRight;
-        bgEndX = Math.max(bgStartX + widthArr[i].width, bgStartX + textWidth + config.toolTipPadding * 2);
+        bgStartX = tStartRight + 2 * opts.pix;
+        bgEndX = Math.max(bgStartX + widthArr[i].width, bgStartX + textWidth + boxPadding * 2);
       }
       bgWidth = bgEndX - bgStartX;
       let textX = bgStartX + (bgWidth - textWidth) / 2;
@@ -2427,8 +2732,7 @@
       context.setFillStyle(hexToRgb(toolTipOption.labelBgColor || config.toolTipBackground, toolTipOption.labelBgOpacity || config.toolTipOpacity));
       context.setStrokeStyle(toolTipOption.labelBgColor || config.toolTipBackground);
       context.setLineWidth(1 * opts.pix);
-      context.rect(bgStartX, textY - 0.5 * config.fontSize - config.toolTipPadding, bgWidth, config.fontSize + 2 *
-        config.toolTipPadding);
+      context.rect(bgStartX, textY - 0.5 * config.fontSize - boxPadding, bgWidth, config.fontSize + 2 * boxPadding);
       context.closePath();
       context.stroke();
       context.fill();
@@ -2450,13 +2754,15 @@
 function drawToolTipSplitArea(offsetX, opts, config, context, eachSpacing) {
   var toolTipOption = assign({}, {
     activeBgColor: '#000000',
-    activeBgOpacity: 0.08
+    activeBgOpacity: 0.08,
+    activeWidth: eachSpacing
   }, opts.extra.column);
+  toolTipOption.activeWidth = toolTipOption.activeWidth > eachSpacing ? eachSpacing : toolTipOption.activeWidth;
   var startY = opts.area[0];
   var endY = opts.height - opts.area[2];
   context.beginPath();
   context.setFillStyle(hexToRgb(toolTipOption.activeBgColor, toolTipOption.activeBgOpacity));
-  context.rect(offsetX - eachSpacing / 2, startY, eachSpacing, endY - startY);
+  context.rect(offsetX - toolTipOption.activeWidth / 2, startY, toolTipOption.activeWidth, endY - startY);
   context.closePath();
   context.fill();
   context.setFillStyle("#FFFFFF");
@@ -2477,6 +2783,7 @@
   context.setFillStyle("#FFFFFF");
 }
 
+
 function drawToolTip(textList, offset, opts, config, context, eachSpacing, xAxisPoints) {
   var toolTipOption = assign({}, {
     showBox: true,
@@ -2488,17 +2795,29 @@
     borderWidth: 0,
     borderRadius: 0,
     borderOpacity: 0.7,
+    boxPadding: 3,
     fontColor: '#FFFFFF',
+    fontSize: 13,
+    lineHeight: 20,
+    legendShow: true,
+    legendShape: 'auto',
     splitLine: true,
   }, opts.extra.tooltip);
   if(toolTipOption.showCategory==true && opts.categories){
     textList.unshift({text:opts.categories[opts.tooltip.index],color:null})
   }
-  var legendWidth = 4 * opts.pix;
+  var fontSize = toolTipOption.fontSize * opts.pix;
+  var lineHeight = toolTipOption.lineHeight * opts.pix;
+  var boxPadding = toolTipOption.boxPadding * opts.pix;
+  var legendWidth = fontSize;
   var legendMarginRight = 5 * opts.pix;
+  if(toolTipOption.legendShow == false){
+    legendWidth = 0;
+    legendMarginRight = 0;
+  }
   var arrowWidth = toolTipOption.showArrow ? 8 * opts.pix : 0;
   var isOverRightBorder = false;
-  if (opts.type == 'line' || opts.type == 'area' || opts.type == 'candle' || opts.type == 'mix') {
+  if (opts.type == 'line' || opts.type == 'mount' || opts.type == 'area' || opts.type == 'candle' || opts.type == 'mix') {
     if (toolTipOption.splitLine == true) {
       drawToolTipSplitLine(opts.tooltip.offset.x, opts, config, context);
     }
@@ -2509,10 +2828,10 @@
   }, offset);
   offset.y -= 8 * opts.pix;
   var textWidth = textList.map(function(item) {
-    return measureText(item.text, config.fontSize, context);
+    return measureText(item.text, fontSize, context);
   });
-  var toolTipWidth = legendWidth + legendMarginRight + 4 * config.toolTipPadding + Math.max.apply(null, textWidth);
-  var toolTipHeight = 2 * config.toolTipPadding + textList.length * config.toolTipLineHeight;
+  var toolTipWidth = legendWidth + legendMarginRight + 4 * boxPadding + Math.max.apply(null, textWidth);
+  var toolTipHeight = 2 * boxPadding + textList.length * lineHeight;
   if (toolTipOption.showBox == false) {
     return
   }
@@ -2525,11 +2844,18 @@
   }
   // draw background rect
   context.beginPath();
-  context.setFillStyle(hexToRgb(toolTipOption.bgColor || config.toolTipBackground, toolTipOption.bgOpacity || config.toolTipOpacity));
+  context.setFillStyle(hexToRgb(toolTipOption.bgColor, toolTipOption.bgOpacity));
   context.setLineWidth(toolTipOption.borderWidth * opts.pix);
   context.setStrokeStyle(hexToRgb(toolTipOption.borderColor, toolTipOption.borderOpacity));
   var radius = toolTipOption.borderRadius;
   if (isOverRightBorder) {
+    // 澧炲姞宸︿晶浠嶇劧瓒呭嚭鐨勫垽鏂�
+    if(toolTipWidth + arrowWidth > opts.width){
+      offset.x = opts.width + Math.abs(opts._scrollDistance_ || 0) + arrowWidth + (toolTipWidth - opts.width)
+    }
+    if(toolTipWidth > offset.x){
+      offset.x = opts.width + Math.abs(opts._scrollDistance_ || 0) + arrowWidth + (toolTipWidth - opts.width)
+    }
     if (toolTipOption.showArrow) {
       context.moveTo(offset.x, offset.y + 10 * opts.pix);
       context.lineTo(offset.x - arrowWidth, offset.y + 10 * opts.pix + 5 * opts.pix);
@@ -2565,30 +2891,68 @@
     context.stroke();
   }
   // draw legend
-  textList.forEach(function(item, index) {
-    if (item.color !== null) {
-      context.beginPath();
-      context.setFillStyle(item.color);
-      var startX = offset.x + arrowWidth + 2 * config.toolTipPadding;
-      var startY = offset.y + (config.toolTipLineHeight - config.fontSize) / 2 + config.toolTipLineHeight * index + config.toolTipPadding + 1;
-      if (isOverRightBorder) {
-        startX = offset.x - toolTipWidth - arrowWidth + 2 * config.toolTipPadding;
+  if(toolTipOption.legendShow){
+    textList.forEach(function(item, index) {
+      if (item.color !== null) {
+        context.beginPath();
+        context.setFillStyle(item.color);
+        var startX = offset.x + arrowWidth + 2 * boxPadding;
+        var startY = offset.y + (lineHeight - fontSize) / 2 + lineHeight * index + boxPadding + 1;
+        if (isOverRightBorder) {
+          startX = offset.x - toolTipWidth - arrowWidth + 2 * boxPadding;
+        }
+        switch (item.legendShape) {
+          case 'line':
+            context.moveTo(startX, startY + 0.5 * legendWidth - 2 * opts.pix);
+            context.fillRect(startX, startY + 0.5 * legendWidth - 2 * opts.pix, legendWidth, 4 * opts.pix);
+            break;
+          case 'triangle':
+            context.moveTo(startX + 7.5 * opts.pix, startY + 0.5 * legendWidth - 5 * opts.pix);
+            context.lineTo(startX + 2.5 * opts.pix, startY + 0.5 * legendWidth + 5 * opts.pix);
+            context.lineTo(startX + 12.5 * opts.pix, startY + 0.5 * legendWidth + 5 * opts.pix);
+            context.lineTo(startX + 7.5 * opts.pix, startY + 0.5 * legendWidth - 5 * opts.pix);
+            break;
+          case 'diamond':
+            context.moveTo(startX + 7.5 * opts.pix, startY + 0.5 * legendWidth - 5 * opts.pix);
+            context.lineTo(startX + 2.5 * opts.pix, startY + 0.5 * legendWidth);
+            context.lineTo(startX + 7.5 * opts.pix, startY + 0.5 * legendWidth + 5 * opts.pix);
+            context.lineTo(startX + 12.5 * opts.pix, startY + 0.5 * legendWidth);
+            context.lineTo(startX + 7.5 * opts.pix, startY + 0.5 * legendWidth - 5 * opts.pix);
+            break;
+          case 'circle':
+            context.moveTo(startX + 7.5 * opts.pix, startY + 0.5 * legendWidth);
+            context.arc(startX + 7.5 * opts.pix, startY + 0.5 * legendWidth, 5 * opts.pix, 0, 2 * Math.PI);
+            break;
+          case 'rect':
+            context.moveTo(startX, startY + 0.5 * legendWidth - 5 * opts.pix);
+            context.fillRect(startX, startY + 0.5 * legendWidth - 5 * opts.pix, 15 * opts.pix, 10 * opts.pix);
+            break;
+          case 'square':
+            context.moveTo(startX + 2 * opts.pix, startY + 0.5 * legendWidth - 5 * opts.pix);
+            context.fillRect(startX + 2 * opts.pix, startY + 0.5 * legendWidth - 5 * opts.pix, 10 * opts.pix, 10 * opts.pix);
+            break;
+          default:
+            context.moveTo(startX, startY + 0.5 * legendWidth - 5 * opts.pix);
+            context.fillRect(startX, startY + 0.5 * legendWidth - 5 * opts.pix, 15 * opts.pix, 10 * opts.pix);
+        }
+        context.closePath();
+        context.fill();
       }
-      context.fillRect(startX, startY, legendWidth, config.fontSize);
-      context.closePath();
-    }
-  });
+    });
+  }
+  
   // draw text list
   textList.forEach(function(item, index) {
-    var startX = offset.x + arrowWidth + 2 * config.toolTipPadding + legendWidth + legendMarginRight;
+    var startX = offset.x + arrowWidth + 2 * boxPadding + legendWidth + legendMarginRight;
     if (isOverRightBorder) {
-      startX = offset.x - toolTipWidth - arrowWidth + 2 * config.toolTipPadding + +legendWidth + legendMarginRight;
+      startX = offset.x - toolTipWidth - arrowWidth + 2 * boxPadding + legendWidth + legendMarginRight;
     }
-    var startY = offset.y + (config.toolTipLineHeight - config.fontSize) / 2 + config.toolTipLineHeight * index + config.toolTipPadding;
+    var startY = offset.y + lineHeight * index + (lineHeight - fontSize)/2 - 1 + boxPadding + fontSize;
     context.beginPath();
-    context.setFontSize(config.fontSize);
+    context.setFontSize(fontSize);
+    context.setTextBaseline('normal');
     context.setFillStyle(toolTipOption.fontColor);
-    context.fillText(item.text, startX, startY + config.fontSize);
+    context.fillText(item.text, startX, startY);
     context.closePath();
     context.stroke();
   });
@@ -2611,6 +2975,7 @@
     linearOpacity: 1,
     customColor: [],
     colorStop: 0,
+    labelPosition: 'outside'
   }, opts.extra.column);
   let calPoints = [];
   context.save();
@@ -2630,10 +2995,16 @@
     ranges = [].concat(opts.chartData.yAxisData.ranges[eachSeries.index]);
     minRange = ranges.pop();
     maxRange = ranges.shift();
+    
+    // 璁$畻0杞村潗鏍�
+    let spacingValid = opts.height - opts.area[0] - opts.area[2];
+    let zeroHeight = spacingValid * (0 - minRange) / (maxRange - minRange);
+    let zeroPoints = opts.height - Math.round(zeroHeight) - opts.area[2];
+    eachSeries.zeroPoints = zeroPoints;
     var data = eachSeries.data;
     switch (columnOption.type) {
       case 'group':
-        var points = getDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, process);
+        var points = getColumnDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, zeroPoints, process);
         var tooltipPoints = getStackDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, seriesIndex, series, process);
         calPoints.push(tooltipPoints);
         points = fixColumeData(points, eachSpacing, series.length, seriesIndex, config, opts);
@@ -2647,7 +3018,7 @@
             var fillColor = item.color || eachSeries.color
             var strokeColor = item.color || eachSeries.color
             if (columnOption.linearType !== 'none') {
-              var grd = context.createLinearGradient(startX, item.y, startX, opts.height - opts.area[2]);
+              var grd = context.createLinearGradient(startX, item.y, startX, zeroPoints);
               //閫忔槑娓愬彉
               if (columnOption.linearType == 'opacity') {
                 grd.addColorStop(0, hexToRgb(fillColor, columnOption.linearOpacity));
@@ -2662,11 +3033,14 @@
             // 鍦嗚杈规
             if ((columnOption.barBorderRadius && columnOption.barBorderRadius.length === 4) || columnOption.barBorderCircle === true) {
               const left = startX;
-              const top = item.y;
+              const top = item.y > zeroPoints ? zeroPoints : item.y;
               const width = item.width;
-              const height = opts.height - opts.area[2] - item.y;
+              const height = Math.abs(zeroPoints - item.y);
               if (columnOption.barBorderCircle) {
                 columnOption.barBorderRadius = [width / 2, width / 2, 0, 0];
+              }
+              if(item.y > zeroPoints){
+                columnOption.barBorderRadius = [0, 0,width / 2, width / 2];
               }
               let [r0, r1, r2, r3] = columnOption.barBorderRadius;
               let minRadius = Math.min(width/2,height/2);
@@ -2684,9 +3058,9 @@
               context.arc(left + r3, top + height - r3, r3, Math.PI / 2, Math.PI);
             } else {
               context.moveTo(startX, item.y);
-              context.lineTo(startX + item.width - 2, item.y);
-              context.lineTo(startX + item.width - 2, opts.height - opts.area[2]);
-              context.lineTo(startX, opts.height - opts.area[2]);
+              context.lineTo(startX + item.width, item.y);
+              context.lineTo(startX + item.width, zeroPoints);
+              context.lineTo(startX, zeroPoints);
               context.lineTo(startX, item.y);
               context.setLineWidth(1)
               context.setStrokeStyle(strokeColor);
@@ -2716,7 +3090,7 @@
             }
             context.setFillStyle(fillColor);
             context.moveTo(startX, item.y);
-            context.fillRect(startX, item.y, item.width - 2, height);
+            context.fillRect(startX, item.y, item.width, height);
             context.closePath();
             context.fill();
           }
@@ -2727,84 +3101,59 @@
         var points = getDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, process);
         calPoints.push(points);
         points = fixColumeMeterData(points, eachSpacing, series.length, seriesIndex, config, opts, columnOption.meterBorder);
-        if (seriesIndex == 0) {
           for (let i = 0; i < points.length; i++) {
             let item = points[i];
             if (item !== null && i > leftNum && i < rightNum) {
               //鐢昏儗鏅鑹�
               context.beginPath();
-              context.setFillStyle(columnOption.meterFillColor);
+              if (seriesIndex == 0 && columnOption.meterBorder > 0) {
+                context.setStrokeStyle(eachSeries.color);
+                context.setLineWidth(columnOption.meterBorder * opts.pix);
+              }
+              if(seriesIndex == 0){
+                context.setFillStyle(columnOption.meterFillColor);
+              }else{
+                context.setFillStyle(item.color || eachSeries.color);
+              }
               var startX = item.x - item.width / 2;
               var height = opts.height - item.y - opts.area[2];
-              if (columnOption.barBorderCircle) {
-                var barBorderRadius = (item.width - columnOption.meterBorder*2) / 2;
-                if(barBorderRadius>height){
-                  barBorderRadius = height;
+              if ((columnOption.barBorderRadius && columnOption.barBorderRadius.length === 4) || columnOption.barBorderCircle === true) {
+                const left = startX;
+                const top = item.y;
+                const width = item.width;
+                const height = zeroPoints - item.y;
+                if (columnOption.barBorderCircle) {
+                  columnOption.barBorderRadius = [width / 2, width / 2, 0, 0];
                 }
-                context.moveTo(startX + columnOption.meterBorder, opts.height - opts.area[2]);
-                context.lineTo(startX + columnOption.meterBorder, item.y + barBorderRadius);
-                context.arc(startX + item.width/2, item.y + barBorderRadius, barBorderRadius, -Math.PI, 0);
-                context.lineTo(startX + item.width - columnOption.meterBorder , opts.height - opts.area[2]);
-                context.lineTo(startX, opts.height - opts.area[2]);
+                let [r0, r1, r2, r3] = columnOption.barBorderRadius;
+                let minRadius = Math.min(width/2,height/2);
+                r0 = r0 > minRadius ? minRadius : r0;
+                r1 = r1 > minRadius ? minRadius : r1;
+                r2 = r2 > minRadius ? minRadius : r2;
+                r3 = r3 > minRadius ? minRadius : r3;
+                r0 = r0 < 0 ? 0 : r0;
+                r1 = r1 < 0 ? 0 : r1;
+                r2 = r2 < 0 ? 0 : r2;
+                r3 = r3 < 0 ? 0 : r3;
+                context.arc(left + r0, top + r0, r0, -Math.PI, -Math.PI / 2);
+                context.arc(left + width - r1, top + r1, r1, -Math.PI / 2, 0);
+                context.arc(left + width - r2, top + height - r2, r2, 0, Math.PI / 2);
+                context.arc(left + r3, top + height - r3, r3, Math.PI / 2, Math.PI);
                 context.fill();
               }else{
                 context.moveTo(startX, item.y);
-                context.fillRect(startX, item.y, item.width, height);
-                context.closePath();
+                context.lineTo(startX + item.width, item.y);
+                context.lineTo(startX + item.width, zeroPoints);
+                context.lineTo(startX, zeroPoints);
+                context.lineTo(startX, item.y);
                 context.fill();
               }
-              //鐢昏竟妗嗙嚎
-              if (columnOption.meterBorder > 0) {
-                context.beginPath();
-                context.setStrokeStyle(eachSeries.color);
-                context.setLineWidth(columnOption.meterBorder * opts.pix);
-                if (columnOption.barBorderCircle) {
-                  var barBorderRadius = (item.width - columnOption.meterBorder)/ 2;
-                  if(barBorderRadius>height){
-                    barBorderRadius = height;
-                  }
-                  context.moveTo(startX  + columnOption.meterBorder * 0.5, opts.height - opts.area[2]);
-                  context.lineTo(startX + columnOption.meterBorder * 0.5, item.y + barBorderRadius);
-                  context.arc(startX + item.width/2, item.y + barBorderRadius - columnOption.meterBorder * 0.5, barBorderRadius, -Math.PI, 0);
-                  context.lineTo(startX + item.width - columnOption.meterBorder * 0.5, opts.height - opts.area[2]);
-                }else{
-                  context.moveTo(startX + columnOption.meterBorder * 0.5, item.y + height);
-                  context.lineTo(startX + columnOption.meterBorder * 0.5, item.y + columnOption.meterBorder * 0.5);
-                  context.lineTo(startX + item.width - columnOption.meterBorder * 0.5, item.y + columnOption.meterBorder * 0.5);
-                  context.lineTo(startX + item.width - columnOption.meterBorder * 0.5, item.y + height);
-                }
+              if (seriesIndex == 0 && columnOption.meterBorder > 0) {
+                context.closePath();
                 context.stroke();
               }
             }
-          };
-        } else {
-          for (let i = 0; i < points.length; i++) {
-            let item = points[i];
-            if (item !== null && i > leftNum && i < rightNum) {
-              context.beginPath();
-              context.setFillStyle(item.color || eachSeries.color);
-              var startX = item.x - item.width / 2;
-              var height = opts.height - item.y - opts.area[2];
-              if (columnOption.barBorderCircle) {
-                var barBorderRadius = item.width / 2;
-                if(barBorderRadius>height){
-                  barBorderRadius = height;
-                }
-                context.moveTo(startX, opts.height - opts.area[2]);
-                context.arc(startX + barBorderRadius, item.y + barBorderRadius, barBorderRadius, -Math.PI, -Math.PI / 2);
-                context.arc(startX + item.width - barBorderRadius, item.y + barBorderRadius, barBorderRadius, -Math.PI / 2, 0);
-                context.lineTo(startX + item.width, opts.height - opts.area[2]);
-                context.lineTo(startX, opts.height - opts.area[2]);
-                context.fill();
-              }else{
-                context.moveTo(startX, item.y);
-                context.fillRect(startX, item.y, item.width, height);
-                context.closePath();
-                context.fill();
-              }
-            }
-          };
-        }
+          }
         break;
     }
   });
@@ -2818,17 +3167,17 @@
       var data = eachSeries.data;
       switch (columnOption.type) {
         case 'group':
-          var points = getDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, process);
+          var points = getColumnDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, process);
           points = fixColumeData(points, eachSpacing, series.length, seriesIndex, config, opts);
-          drawPointText(points, eachSeries, config, context, opts);
+          drawColumePointText(points, eachSeries, config, context, opts);
           break;
         case 'stack':
           var points = getStackDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, seriesIndex, series, process);
-          drawPointText(points, eachSeries, config, context, opts);
+          drawColumePointText(points, eachSeries, config, context, opts);
           break;
         case 'meter':
           var points = getDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, process);
-          drawPointText(points, eachSeries, config, context, opts);
+          drawColumePointText(points, eachSeries, config, context, opts);
           break;
       }
     });
@@ -2837,6 +3186,235 @@
   return {
     xAxisPoints: xAxisPoints,
     calPoints: calPoints,
+    eachSpacing: eachSpacing
+  };
+}
+
+function drawMountDataPoints(series, opts, config, context) {
+  let process = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1;
+  let xAxisData = opts.chartData.xAxisData,
+    xAxisPoints = xAxisData.xAxisPoints,
+    eachSpacing = xAxisData.eachSpacing;
+  let mountOption = assign({}, {
+    type: 'mount',
+    widthRatio: 1,
+    borderWidth: 1,
+    barBorderCircle: false,
+    barBorderRadius: [],
+    linearType: 'none',
+    linearOpacity: 1,
+    customColor: [],
+    colorStop: 0,
+  }, opts.extra.mount);
+  mountOption.widthRatio = mountOption.widthRatio <= 0 ? 0 : mountOption.widthRatio;
+  mountOption.widthRatio = mountOption.widthRatio >= 2 ? 2 : mountOption.widthRatio;
+  let calPoints = [];
+  context.save();
+  let leftNum = -2;
+  let rightNum = xAxisPoints.length + 2;
+  if (opts._scrollDistance_ && opts._scrollDistance_ !== 0 && opts.enableScroll === true) {
+    context.translate(opts._scrollDistance_, 0);
+    leftNum = Math.floor(-opts._scrollDistance_ / eachSpacing) - 2;
+    rightNum = leftNum + opts.xAxis.itemCount + 4;
+  }
+  mountOption.customColor = fillCustomColor(mountOption.linearType, mountOption.customColor, series, config);
+    let ranges, minRange, maxRange;
+    ranges = [].concat(opts.chartData.yAxisData.ranges[0]);
+    minRange = ranges.pop();
+    maxRange = ranges.shift();
+    
+    // 璁$畻0杞村潗鏍�
+    let spacingValid = opts.height - opts.area[0] - opts.area[2];
+    let zeroHeight = spacingValid * (0 - minRange) / (maxRange - minRange);
+    let zeroPoints = opts.height - Math.round(zeroHeight) - opts.area[2];
+    
+    var points = getMountDataPoints(series, minRange, maxRange, xAxisPoints, eachSpacing, opts, mountOption, zeroPoints, process);
+    switch (mountOption.type) {
+      case 'bar':
+        for (let i = 0; i < points.length; i++) {
+          let item = points[i];
+          if (item !== null && i > leftNum && i < rightNum) {
+            var startX = item.x - eachSpacing*mountOption.widthRatio/2;
+            var height = opts.height - item.y - opts.area[2];
+            context.beginPath();
+            var fillColor = item.color || series[i].color
+            var strokeColor = item.color || series[i].color
+            if (mountOption.linearType !== 'none') {
+              var grd = context.createLinearGradient(startX, item.y, startX, zeroPoints);
+              //閫忔槑娓愬彉
+              if (mountOption.linearType == 'opacity') {
+                grd.addColorStop(0, hexToRgb(fillColor, mountOption.linearOpacity));
+                grd.addColorStop(1, hexToRgb(fillColor, 1));
+              } else {
+                grd.addColorStop(0, hexToRgb(mountOption.customColor[series[i].linearIndex], mountOption.linearOpacity));
+                grd.addColorStop(mountOption.colorStop, hexToRgb(mountOption.customColor[series[i].linearIndex],mountOption.linearOpacity));
+                grd.addColorStop(1, hexToRgb(fillColor, 1));
+              }
+              fillColor = grd
+            }
+            // 鍦嗚杈规
+            if ((mountOption.barBorderRadius && mountOption.barBorderRadius.length === 4) || mountOption.barBorderCircle === true) {
+              const left = startX;
+              const top = item.y > zeroPoints ? zeroPoints : item.y;
+              const width = item.width;
+              const height = Math.abs(zeroPoints - item.y);
+              if (mountOption.barBorderCircle) {
+                mountOption.barBorderRadius = [width / 2, width / 2, 0, 0];
+              }
+              if(item.y > zeroPoints){
+                mountOption.barBorderRadius = [0, 0,width / 2, width / 2];
+              }
+              let [r0, r1, r2, r3] = mountOption.barBorderRadius;
+              let minRadius = Math.min(width/2,height/2);
+              r0 = r0 > minRadius ? minRadius : r0;
+              r1 = r1 > minRadius ? minRadius : r1;
+              r2 = r2 > minRadius ? minRadius : r2;
+              r3 = r3 > minRadius ? minRadius : r3;
+              r0 = r0 < 0 ? 0 : r0;
+              r1 = r1 < 0 ? 0 : r1;
+              r2 = r2 < 0 ? 0 : r2;
+              r3 = r3 < 0 ? 0 : r3;
+              context.arc(left + r0, top + r0, r0, -Math.PI, -Math.PI / 2);
+              context.arc(left + width - r1, top + r1, r1, -Math.PI / 2, 0);
+              context.arc(left + width - r2, top + height - r2, r2, 0, Math.PI / 2);
+              context.arc(left + r3, top + height - r3, r3, Math.PI / 2, Math.PI);
+            } else {
+              context.moveTo(startX, item.y);
+              context.lineTo(startX + item.width, item.y);
+              context.lineTo(startX + item.width, zeroPoints);
+              context.lineTo(startX, zeroPoints);
+              context.lineTo(startX, item.y);
+            }
+            context.setStrokeStyle(strokeColor);
+            context.setFillStyle(fillColor);
+            if(mountOption.borderWidth > 0){
+              context.setLineWidth(mountOption.borderWidth * opts.pix);
+              context.closePath();
+              context.stroke();
+            }
+            context.fill();
+          }
+        };
+        break;
+      case 'triangle':
+        for (let i = 0; i < points.length; i++) {
+          let item = points[i];
+          if (item !== null && i > leftNum && i < rightNum) {
+            var startX = item.x - eachSpacing*mountOption.widthRatio/2;
+            var height = opts.height - item.y - opts.area[2];
+            context.beginPath();
+            var fillColor = item.color || series[i].color
+            var strokeColor = item.color || series[i].color
+            if (mountOption.linearType !== 'none') {
+              var grd = context.createLinearGradient(startX, item.y, startX, zeroPoints);
+              //閫忔槑娓愬彉
+              if (mountOption.linearType == 'opacity') {
+                grd.addColorStop(0, hexToRgb(fillColor, mountOption.linearOpacity));
+                grd.addColorStop(1, hexToRgb(fillColor, 1));
+              } else {
+                grd.addColorStop(0, hexToRgb(mountOption.customColor[series[i].linearIndex], mountOption.linearOpacity));
+                grd.addColorStop(mountOption.colorStop, hexToRgb(mountOption.customColor[series[i].linearIndex],mountOption.linearOpacity));
+                grd.addColorStop(1, hexToRgb(fillColor, 1));
+              }
+              fillColor = grd
+            }
+            context.moveTo(startX, zeroPoints);
+            context.lineTo(item.x, item.y);
+            context.lineTo(startX + item.width, zeroPoints);
+            context.setStrokeStyle(strokeColor);
+            context.setFillStyle(fillColor);
+            if(mountOption.borderWidth > 0){
+              context.setLineWidth(mountOption.borderWidth * opts.pix);
+              context.stroke();
+            }
+            context.fill();
+          }
+        };
+        break;
+      case 'mount':
+        for (let i = 0; i < points.length; i++) {
+          let item = points[i];
+          if (item !== null && i > leftNum && i < rightNum) {
+            var startX = item.x - eachSpacing*mountOption.widthRatio/2;
+            var height = opts.height - item.y - opts.area[2];
+            context.beginPath();
+            var fillColor = item.color || series[i].color
+            var strokeColor = item.color || series[i].color
+            if (mountOption.linearType !== 'none') {
+              var grd = context.createLinearGradient(startX, item.y, startX, zeroPoints);
+              //閫忔槑娓愬彉
+              if (mountOption.linearType == 'opacity') {
+                grd.addColorStop(0, hexToRgb(fillColor, mountOption.linearOpacity));
+                grd.addColorStop(1, hexToRgb(fillColor, 1));
+              } else {
+                grd.addColorStop(0, hexToRgb(mountOption.customColor[series[i].linearIndex], mountOption.linearOpacity));
+                grd.addColorStop(mountOption.colorStop, hexToRgb(mountOption.customColor[series[i].linearIndex],mountOption.linearOpacity));
+                grd.addColorStop(1, hexToRgb(fillColor, 1));
+              }
+              fillColor = grd
+            }
+            context.moveTo(startX, zeroPoints);
+            context.bezierCurveTo(item.x - item.width/4, zeroPoints, item.x - item.width/4, item.y, item.x, item.y);
+            context.bezierCurveTo(item.x + item.width/4, item.y, item.x + item.width/4, zeroPoints, startX + item.width, zeroPoints);
+            context.setStrokeStyle(strokeColor);
+            context.setFillStyle(fillColor);
+            if(mountOption.borderWidth > 0){
+              context.setLineWidth(mountOption.borderWidth * opts.pix);
+              context.stroke();
+            }
+            context.fill();
+          }
+        };
+        break;
+      case 'sharp':
+        for (let i = 0; i < points.length; i++) {
+          let item = points[i];
+          if (item !== null && i > leftNum && i < rightNum) {
+            var startX = item.x - eachSpacing*mountOption.widthRatio/2;
+            var height = opts.height - item.y - opts.area[2];
+            context.beginPath();
+            var fillColor = item.color || series[i].color
+            var strokeColor = item.color || series[i].color
+            if (mountOption.linearType !== 'none') {
+              var grd = context.createLinearGradient(startX, item.y, startX, zeroPoints);
+              //閫忔槑娓愬彉
+              if (mountOption.linearType == 'opacity') {
+                grd.addColorStop(0, hexToRgb(fillColor, mountOption.linearOpacity));
+                grd.addColorStop(1, hexToRgb(fillColor, 1));
+              } else {
+                grd.addColorStop(0, hexToRgb(mountOption.customColor[series[i].linearIndex], mountOption.linearOpacity));
+                grd.addColorStop(mountOption.colorStop, hexToRgb(mountOption.customColor[series[i].linearIndex],mountOption.linearOpacity));
+                grd.addColorStop(1, hexToRgb(fillColor, 1));
+              }
+              fillColor = grd
+            }
+            context.moveTo(startX, zeroPoints);
+            context.quadraticCurveTo(item.x - 0, zeroPoints - height/4, item.x, item.y);
+            context.quadraticCurveTo(item.x + 0, zeroPoints - height/4, startX + item.width, zeroPoints)
+            context.setStrokeStyle(strokeColor);
+            context.setFillStyle(fillColor);
+            if(mountOption.borderWidth > 0){
+              context.setLineWidth(mountOption.borderWidth * opts.pix);
+              context.stroke();
+            }
+            context.fill();
+          }
+        };
+        break;
+    }
+
+  if (opts.dataLabel !== false && process === 1) {
+    let ranges, minRange, maxRange;
+    ranges = [].concat(opts.chartData.yAxisData.ranges[0]);
+    minRange = ranges.pop();
+    maxRange = ranges.shift();
+    var points = getMountDataPoints(series, minRange, maxRange, xAxisPoints, eachSpacing, opts, mountOption, zeroPoints, process);
+    drawMountPointText(points, series, config, context, opts, zeroPoints);
+  }
+  context.restore();
+  return {
+    xAxisPoints: xAxisPoints,
+    calPoints: points,
     eachSpacing: eachSpacing
   };
 }
@@ -2910,7 +3488,7 @@
               const left = startX;
               const width = item.width;
               const top = item.y - item.width / 2;
-              const height = item.heigh;
+              const height = item.height;
               if (columnOption.barBorderCircle) {
                 columnOption.barBorderRadius = [width / 2, width / 2, 0, 0];
               }
@@ -2932,8 +3510,8 @@
             } else {
               context.moveTo(startX, startY);
               context.lineTo(item.x, startY);
-              context.lineTo(item.x, startY + item.width - 2);
-              context.lineTo(startX, startY + item.width - 2);
+              context.lineTo(item.x, startY + item.width);
+              context.lineTo(startX, startY + item.width);
               context.lineTo(startX, startY);
               context.setLineWidth(1)
               context.setStrokeStyle(strokeColor);
@@ -2958,7 +3536,7 @@
             var startX = item.x0;
             context.setFillStyle(fillColor);
             context.moveTo(startX, item.y - item.width/2);
-            context.fillRect(startX, item.y - item.width/2, item.height , item.width - 2);
+            context.fillRect(startX, item.y - item.width/2, item.height , item.width);
             context.closePath();
             context.fill();
           }
@@ -3136,7 +3714,8 @@
     opacity: 0.2,
     addLine: false,
     width: 2,
-    gradient: false
+    gradient: false,
+    activeType: 'none'
   }, opts.extra.area);
   let xAxisData = opts.chartData.xAxisData,
     xAxisPoints = xAxisData.xAxisPoints,
@@ -3223,10 +3802,10 @@
       } else {
         let item = points[0];
         context.moveTo(item.x - eachSpacing / 2, item.y);
-        context.lineTo(item.x + eachSpacing / 2, item.y);
-        context.lineTo(item.x + eachSpacing / 2, endY);
-        context.lineTo(item.x - eachSpacing / 2, endY);
-        context.moveTo(item.x - eachSpacing / 2, item.y);
+        // context.lineTo(item.x + eachSpacing / 2, item.y);
+        // context.lineTo(item.x + eachSpacing / 2, endY);
+        // context.lineTo(item.x - eachSpacing / 2, endY);
+        // context.moveTo(item.x - eachSpacing / 2, item.y);
       }
       context.closePath();
       context.fill();
@@ -3242,7 +3821,7 @@
         context.setLineWidth(areaOption.width * opts.pix);
         if (points.length === 1) {
           context.moveTo(points[0].x, points[0].y);
-          context.arc(points[0].x, points[0].y, 1, 0, 2 * Math.PI);
+          // context.arc(points[0].x, points[0].y, 1, 0, 2 * Math.PI);
         } else {
           context.moveTo(points[0].x, points[0].y);
           let startPoint = 0;
@@ -3294,6 +3873,7 @@
     if (opts.dataPointShape !== false) {
       drawPointShape(points, eachSeries.color, eachSeries.pointShape, context, opts);
     }
+    drawActivePoint(points, eachSeries.color, eachSeries.pointShape, context, opts, areaOption,seriesIndex);
   });
 
   if (opts.dataLabel !== false && process === 1) {
@@ -3443,9 +4023,9 @@
     if (opts.dataLabel !== false && process === 1) {
       points.forEach(function(item, index) {
         context.beginPath();
-        var fontSize = series.textSize * opts.pix || config.fontSize;
+        var fontSize = eachSeries.textSize * opts.pix || config.fontSize;
         context.setFontSize(fontSize);
-        context.setFillStyle(series.textColor || "#FFFFFF");
+        context.setFillStyle(eachSeries.textColor || "#FFFFFF");
         context.setTextAlign('center');
         context.fillText(String(item.t), item.x, item.y + fontSize/2);
         context.closePath();
@@ -3462,12 +4042,15 @@
   };
 }
 
-
 function drawLineDataPoints(series, opts, config, context) {
   var process = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1;
   var lineOption = assign({}, {
     type: 'straight',
-    width: 2
+    width: 2,
+    activeType: 'none',
+    linearType: 'none',
+    onShadow: false,
+    animation: 'vertical',
   }, opts.extra.line);
   lineOption.width *= opts.pix;
   let xAxisData = opts.chartData.xAxisData,
@@ -3483,12 +4066,18 @@
     rightSpace = leftSpace + (opts.xAxis.itemCount + 4) * eachSpacing;
   }
   series.forEach(function(eachSeries, seriesIndex) {
+    // 杩欐寰堢濂囩殑浠g爜鐢ㄤ簬瑙e喅ios16鐨剆etStrokeStyle澶辨晥鐨刡ug
+    context.beginPath();
+    context.setStrokeStyle(eachSeries.color);
+    context.moveTo(-10000, -10000);
+    context.lineTo(-10001, -10001);
+    context.stroke();
     let ranges, minRange, maxRange;
     ranges = [].concat(opts.chartData.yAxisData.ranges[eachSeries.index]);
     minRange = ranges.pop();
     maxRange = ranges.shift();
     var data = eachSeries.data;
-    var points = getDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, process);
+    var points = getLineDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, lineOption, process);
     calPoints.push(points);
     var splitPointList = splitPoints(points,eachSeries);
     if (eachSeries.lineType == 'dash') {
@@ -3497,12 +4086,25 @@
       context.setLineDash([dashLength, dashLength]);
     }
     context.beginPath();
-    context.setStrokeStyle(eachSeries.color);
+    var strokeColor = eachSeries.color;
+    if (lineOption.linearType !== 'none' && eachSeries.linearColor && eachSeries.linearColor.length > 0) {
+      var grd = context.createLinearGradient(opts.chartData.xAxisData.startX, opts.height/2, opts.chartData.xAxisData.endX, opts.height/2);
+      for (var i = 0; i < eachSeries.linearColor.length; i++) {
+        grd.addColorStop(eachSeries.linearColor[i][0], hexToRgb(eachSeries.linearColor[i][1], 1));
+      }
+      strokeColor = grd
+    }
+    context.setStrokeStyle(strokeColor);
+    if (lineOption.onShadow == true && eachSeries.setShadow && eachSeries.setShadow.length > 0) {
+      context.setShadow(eachSeries.setShadow[0], eachSeries.setShadow[1], eachSeries.setShadow[2], eachSeries.setShadow[3]);
+    }else{
+      context.setShadow(0, 0, 0, 'rgba(0,0,0,0)');
+    }
     context.setLineWidth(lineOption.width);
     splitPointList.forEach(function(points, index) {
       if (points.length === 1) {
         context.moveTo(points[0].x, points[0].y);
-        context.arc(points[0].x, points[0].y, 1, 0, 2 * Math.PI);
+        // context.arc(points[0].x, points[0].y, 1, 0, 2 * Math.PI);
       } else {
         context.moveTo(points[0].x, points[0].y);
         let startPoint = 0;
@@ -3552,6 +4154,7 @@
     if (opts.dataPointShape !== false) {
       drawPointShape(points, eachSeries.color, eachSeries.pointShape, context, opts);
     }
+    drawActivePoint(points, eachSeries.color, eachSeries.pointShape, context, opts, lineOption);
   });
   if (opts.dataLabel !== false && process === 1) {
     series.forEach(function(eachSeries, seriesIndex) {
@@ -3574,6 +4177,9 @@
 
 function drawMixDataPoints(series, opts, config, context) {
   let process = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1;
+  let xAxisData = opts.chartData.xAxisData,
+    xAxisPoints = xAxisData.xAxisPoints,
+    eachSpacing = xAxisData.eachSpacing;
   let columnOption = assign({}, {
     width: eachSpacing / 2,
     barBorderCircle: false,
@@ -3584,9 +4190,13 @@
     customColor: [],
     colorStop: 0,
   }, opts.extra.mix.column);
-  let xAxisData = opts.chartData.xAxisData,
-    xAxisPoints = xAxisData.xAxisPoints,
-    eachSpacing = xAxisData.eachSpacing;
+  let areaOption = assign({}, {
+    opacity: 0.2,
+    gradient: false
+  }, opts.extra.mix.area);
+  let lineOption = assign({}, {
+    width: 2
+  }, opts.extra.mix.line);
   let endY = opts.height - opts.area[2];
   let calPoints = [];
   var columnIndex = 0;
@@ -3666,8 +4276,8 @@
             context.arc(left + r3, top + height - r3, r3, Math.PI / 2, Math.PI);
           } else {
             context.moveTo(startX, item.y);
-            context.lineTo(startX + item.width - 2, item.y);
-            context.lineTo(startX + item.width - 2, opts.height - opts.area[2]);
+            context.lineTo(startX + item.width, item.y);
+            context.lineTo(startX + item.width, opts.height - opts.area[2]);
             context.lineTo(startX, opts.height - opts.area[2]);
             context.lineTo(startX, item.y);
             context.setLineWidth(1)
@@ -3688,7 +4298,15 @@
         // 缁樺埗鍖哄煙鏁版嵁
         context.beginPath();
         context.setStrokeStyle(eachSeries.color);
-        context.setFillStyle(hexToRgb(eachSeries.color, 0.2));
+        context.setStrokeStyle(hexToRgb(eachSeries.color, areaOption.opacity));
+        if (areaOption.gradient) {
+          let gradient = context.createLinearGradient(0, opts.area[0], 0, opts.height - opts.area[2]);
+          gradient.addColorStop('0', hexToRgb(eachSeries.color, areaOption.opacity));
+          gradient.addColorStop('1.0', hexToRgb("#FFFFFF", 0.1));
+          context.setFillStyle(gradient);
+        } else {
+          context.setFillStyle(hexToRgb(eachSeries.color, areaOption.opacity));
+        }
         context.setLineWidth(2 * opts.pix);
         if (points.length > 1) {
           var firstPoint = points[0];
@@ -3725,10 +4343,10 @@
         } else {
           let item = points[0];
           context.moveTo(item.x - eachSpacing / 2, item.y);
-          context.lineTo(item.x + eachSpacing / 2, item.y);
-          context.lineTo(item.x + eachSpacing / 2, endY);
-          context.lineTo(item.x - eachSpacing / 2, endY);
-          context.moveTo(item.x - eachSpacing / 2, item.y);
+          // context.lineTo(item.x + eachSpacing / 2, item.y);
+          // context.lineTo(item.x + eachSpacing / 2, endY);
+          // context.lineTo(item.x - eachSpacing / 2, endY);
+          // context.moveTo(item.x - eachSpacing / 2, item.y);
         }
         context.closePath();
         context.fill();
@@ -3745,10 +4363,10 @@
         }
         context.beginPath();
         context.setStrokeStyle(eachSeries.color);
-        context.setLineWidth(2 * opts.pix);
+        context.setLineWidth(lineOption.width * opts.pix);
         if (points.length === 1) {
           context.moveTo(points[0].x, points[0].y);
-          context.arc(points[0].x, points[0].y, 1, 0, 2 * Math.PI);
+          // context.arc(points[0].x, points[0].y, 1, 0, 2 * Math.PI);
         } else {
           context.moveTo(points[0].x, points[0].y);
           let startPoint = 0;
@@ -3817,9 +4435,10 @@
   }
 }
 
+
 function drawToolTipBridge(opts, config, context, process, eachSpacing, xAxisPoints) {
   var toolTipOption = opts.extra.tooltip || {};
-  if (toolTipOption.horizentalLine && opts.tooltip && process === 1 && (opts.type == 'line' || opts.type == 'area' || opts.type == 'column' || opts.type == 'candle' || opts.type == 'mix')) {
+  if (toolTipOption.horizentalLine && opts.tooltip && process === 1 && (opts.type == 'line' || opts.type == 'area' || opts.type == 'column' || opts.type == 'mount' || opts.type == 'candle' || opts.type == 'mix')) {
     drawToolTipHorizentalLine(opts, config, context, eachSpacing, xAxisPoints)
   }
   context.save();
@@ -3852,6 +4471,10 @@
     var scrollY = opts.height - opts.area[2] + config.xAxisHeight;
     var scrollScreenWidth = endX - startX;
     var scrollTotalWidth = eachSpacing * (xAxisPoints.length - 1);
+    if(opts.type == 'mount' && opts.extra && opts.extra.mount && opts.extra.mount.widthRatio && opts.extra.mount.widthRatio > 1){
+      if(opts.extra.mount.widthRatio>2) opts.extra.mount.widthRatio = 2
+      scrollTotalWidth += (opts.extra.mount.widthRatio - 1)*eachSpacing;
+    }
     var scrollWidth = scrollScreenWidth * scrollScreenWidth / scrollTotalWidth;
     var scrollLeft = 0;
     if (opts._scrollDistance_) {
@@ -3944,7 +4567,7 @@
     var xAxisFontSize = opts.xAxis.fontSize * opts.pix || config.fontSize;
     if (config._xAxisTextAngle_ === 0) {
       newCategories.forEach(function(item, index) {
-        var xitem = opts.xAxis.formatter ? opts.xAxis.formatter(item) : item;
+        var xitem = opts.xAxis.formatter ? opts.xAxis.formatter(item,index,opts) : item;
         var offset = -measureText(String(xitem), xAxisFontSize, context) / 2;
         if (boundaryGap == 'center') {
           offset += eachSpacing / 2;
@@ -3953,39 +4576,68 @@
         if (opts.xAxis.scrollShow) {
           scrollHeight = 6 * opts.pix;
         }
-        context.beginPath();
-        context.setFontSize(xAxisFontSize);
-        context.setFillStyle(opts.xAxis.fontColor || opts.fontColor);
-        context.fillText(String(xitem), xAxisPoints[index] + offset, startY + xAxisFontSize + (config.xAxisHeight - scrollHeight - xAxisFontSize) / 2);
-        context.closePath();
-        context.stroke();
+        // 濡傛灉鍦ㄤ富瑙嗗浘鍖哄煙鍐�
+        var _scrollDistance_ = opts._scrollDistance_ || 0;
+        var truePoints = boundaryGap == 'center' ? xAxisPoints[index] + eachSpacing / 2 : xAxisPoints[index];
+        if((truePoints - Math.abs(_scrollDistance_)) >= (opts.area[3] - 1) && (truePoints - Math.abs(_scrollDistance_)) <= (opts.width - opts.area[1] + 1)){
+          context.beginPath();
+          context.setFontSize(xAxisFontSize);
+          context.setFillStyle(opts.xAxis.fontColor || opts.fontColor);
+          context.fillText(String(xitem), xAxisPoints[index] + offset, startY + opts.xAxis.marginTop * opts.pix + (opts.xAxis.lineHeight - opts.xAxis.fontSize) * opts.pix / 2 + opts.xAxis.fontSize * opts.pix);
+          context.closePath();
+          context.stroke();
+        }
       });
     } else {
       newCategories.forEach(function(item, index) {
         var xitem = opts.xAxis.formatter ? opts.xAxis.formatter(item) : item;
-        context.save();
-        context.beginPath();
-        context.setFontSize(xAxisFontSize);
-        context.setFillStyle(opts.xAxis.fontColor || opts.fontColor);
-        var textWidth = measureText(String(xitem), xAxisFontSize, context);
-        var offset = -textWidth;
-        if (boundaryGap == 'center') {
-          offset += eachSpacing / 2;
+        // 濡傛灉鍦ㄤ富瑙嗗浘鍖哄煙鍐�
+        var _scrollDistance_ = opts._scrollDistance_ || 0;
+        var truePoints = boundaryGap == 'center' ? xAxisPoints[index] + eachSpacing / 2 : xAxisPoints[index];
+        if((truePoints - Math.abs(_scrollDistance_)) >= (opts.area[3] - 1) && (truePoints - Math.abs(_scrollDistance_)) <= (opts.width - opts.area[1] + 1)){
+          context.save();
+          context.beginPath();
+          context.setFontSize(xAxisFontSize);
+          context.setFillStyle(opts.xAxis.fontColor || opts.fontColor);
+          var textWidth = measureText(String(xitem), xAxisFontSize, context);
+          var offsetX = xAxisPoints[index];
+          if (boundaryGap == 'center') {
+            offsetX = xAxisPoints[index] + eachSpacing / 2;
+          }
+          var scrollHeight = 0;
+          if (opts.xAxis.scrollShow) {
+            scrollHeight = 6 * opts.pix;
+          }
+          var offsetY = startY + opts.xAxis.marginTop * opts.pix + xAxisFontSize - xAxisFontSize * Math.abs(Math.sin(config._xAxisTextAngle_));
+          if(opts.xAxis.rotateAngle < 0){
+            offsetX -= xAxisFontSize / 2;
+            textWidth = 0;
+          }else{
+            offsetX += xAxisFontSize / 2;
+            textWidth = -textWidth;
+          }
+          context.translate(offsetX, offsetY);
+          context.rotate(-1 * config._xAxisTextAngle_);
+          context.fillText(String(xitem), textWidth , 0 );
+          context.closePath();
+          context.stroke();
+          context.restore();
         }
-        var _calRotateTranslate = calRotateTranslate(xAxisPoints[index] + eachSpacing / 2, startY + xAxisFontSize / 2 + 5, opts.height),
-          transX = _calRotateTranslate.transX,
-          transY = _calRotateTranslate.transY;
-
-        context.rotate(-1 * config._xAxisTextAngle_);
-        context.translate(transX, transY);
-        context.fillText(String(xitem), xAxisPoints[index] + offset, startY + xAxisFontSize + 5);
-        context.closePath();
-        context.stroke();
-        context.restore();
       });
     }
   }
   context.restore();
+  
+  //鐢籜杞存爣棰�
+  if (opts.xAxis.title) {
+    context.beginPath();
+    context.setFontSize(opts.xAxis.titleFontSize * opts.pix);
+    context.setFillStyle(opts.xAxis.titleFontColor);
+    context.fillText(String(opts.xAxis.title), opts.width - opts.area[1] + opts.xAxis.titleOffsetX * opts.pix,opts.height - opts.area[2] + opts.xAxis.marginTop * opts.pix + (opts.xAxis.lineHeight - opts.xAxis.titleFontSize) * opts.pix / 2 + (opts.xAxis.titleFontSize + opts.xAxis.titleOffsetY) * opts.pix);
+    context.closePath();
+    context.stroke();
+  }
+  
   //缁樺埗X杞磋酱绾�
   if (opts.xAxis.axisLine) {
     context.beginPath();
@@ -4007,6 +4659,10 @@
   let xAxisPoints = opts.chartData.xAxisData.xAxisPoints,
     xAxiseachSpacing = opts.chartData.xAxisData.eachSpacing;
   let TotalWidth = xAxiseachSpacing * (xAxisPoints.length - 1);
+  if(opts.type == 'mount' && opts.extra && opts.extra.mount && opts.extra.mount.widthRatio && opts.extra.mount.widthRatio > 1 ){
+    if(opts.extra.mount.widthRatio>2) opts.extra.mount.widthRatio = 2
+    TotalWidth += (opts.extra.mount.widthRatio - 1) * xAxiseachSpacing;
+  }
   let endX = startX + TotalWidth;
   let points = [];
   let startY = 1
@@ -4044,21 +4700,14 @@
   var startX = opts.area[3];
   var endX = opts.width - opts.area[1];
   var endY = opts.height - opts.area[2];
-  var fillEndY = endY + config.xAxisHeight;
-  if (opts.xAxis.scrollShow) {
-    fillEndY -= 3 * opts.pix;
-  }
-  if (opts.xAxis.rotateLabel) {
-    fillEndY = opts.height - opts.area[2] + opts.fontSize * opts.pix / 2;
-  }
   // set YAxis background
   context.beginPath();
   context.setFillStyle(opts.background);
   if (opts.enableScroll == true && opts.xAxis.scrollPosition && opts.xAxis.scrollPosition !== 'left') {
-    context.fillRect(0, 0, startX, fillEndY);
+    context.fillRect(0, 0, startX, endY + 2 * opts.pix);
   }
   if (opts.enableScroll == true && opts.xAxis.scrollPosition && opts.xAxis.scrollPosition !== 'right') {
-    context.fillRect(endX, 0, opts.width, fillEndY);
+    context.fillRect(endX, 0, opts.width, endY + 2 * opts.pix);
   }
   context.closePath();
   context.stroke();
@@ -4086,7 +4735,7 @@
         let textAlign = yData.textAlign || "right";
         //鐢籝杞村埢搴﹀強鏂囨
         rangesFormat.forEach(function(item, index) {
-          var pos = points[index] ? points[index] : endY;
+          var pos = points[index];
           context.beginPath();
           context.setFontSize(yAxisFontSize);
           context.setLineWidth(1 * opts.pix);
@@ -4313,17 +4962,18 @@
       context.stroke();
       startX += shapeWidth + shapeRight;
       let fontTrans = 0.5 * lineHeight + 0.5 * fontSize - 2;
+      const legendText = item.legendText ? item.legendText : item.name;
       context.beginPath();
       context.setFontSize(fontSize);
       context.setFillStyle(item.show ? opts.legend.fontColor : opts.legend.hiddenColor);
-      context.fillText(item.name, startX, startY + fontTrans);
+      context.fillText(legendText, startX, startY + fontTrans);
       context.closePath();
       context.stroke();
       if (opts.legend.position == 'top' || opts.legend.position == 'bottom') {
-        startX += measureText(item.name, fontSize, context) + itemGap;
+        startX += measureText(legendText, fontSize, context) + itemGap;
         item.area[2] = startX;
       } else {
-        item.area[2] = startX + measureText(item.name, fontSize, context) + itemGap;;
+        item.area[2] = startX + measureText(legendText, fontSize, context) + itemGap;;
         startX -= shapeWidth + shapeRight;
         startY += lineHeight;
       }
@@ -4356,6 +5006,7 @@
   }
 
   var radius = Math.min((opts.width - opts.area[1] - opts.area[3]) / 2 - config.pieChartLinePadding - config.pieChartTextPadding - config._pieTextMaxLength_, (opts.height - opts.area[0] - opts.area[2]) / 2 - config.pieChartLinePadding - config.pieChartTextPadding);
+  radius = radius < 10 ? 10 : radius;
   if (pieOption.customRadius > 0) {
     radius = pieOption.customRadius * opts.pix;
   }
@@ -4415,16 +5066,7 @@
     context.fill();
   }
   if (opts.dataLabel !== false && process === 1) {
-    var valid = false;
-    for (var i = 0, len = series.length; i < len; i++) {
-      if (series[i].data > 0) {
-        valid = true;
-        break;
-      }
-    }
-    if (valid) {
-      drawPieText(series, opts, config, context, radius, centerPosition);
-    }
+    drawPieText(series, opts, config, context, radius, centerPosition);
   }
   if (process === 1 && opts.type === 'ring') {
     drawRingTitle(opts, config, context, centerPosition);
@@ -4458,7 +5100,11 @@
     y: opts.area[0] + (opts.height - opts.area[0] - opts.area[2]) / 2
   };
   var radius = Math.min((opts.width - opts.area[1] - opts.area[3]) / 2 - config.pieChartLinePadding - config.pieChartTextPadding - config._pieTextMaxLength_, (opts.height - opts.area[0] - opts.area[2]) / 2 - config.pieChartLinePadding - config.pieChartTextPadding);
+  radius = radius < 10 ? 10 : radius;
   var minRadius = roseOption.minRadius || radius * 0.5;
+  if(radius < minRadius){
+    radius = minRadius + 10;
+  }
   series = getRoseDataPoints(series, roseOption.type, minRadius, radius, process);
   var activeRadius = roseOption.activeRadius * opts.pix;
   roseOption.customColor = fillCustomColor(roseOption.linearType, roseOption.customColor, series, config);
@@ -4504,16 +5150,7 @@
   });
 
   if (opts.dataLabel !== false && process === 1) {
-    var valid = false;
-    for (var i = 0, len = series.length; i < len; i++) {
-      if (series[i].data > 0) {
-        valid = true;
-        break;
-      }
-    }
-    if (valid) {
-      drawPieText(series, opts, config, context, radius, centerPosition);
-    }
+    drawPieText(series, opts, config, context, radius, centerPosition);
   }
   return {
     center: centerPosition,
@@ -4528,6 +5165,8 @@
     startAngle: 0.75,
     endAngle: 0.25,
     type: 'default',
+    direction: 'cw',
+    lineCap: 'round',
     width: 12 ,
     gap: 2 ,
     linearType: 'none',
@@ -4554,6 +5193,7 @@
     radius -= 5 * opts.pix;
     radius -= arcbarOption.width / 2;
   }
+  radius = radius < 10 ? 10 : radius;
   arcbarOption.customColor = fillCustomColor(arcbarOption.linearType, arcbarOption.customColor, series, config);
   
   for (let i = 0; i < series.length; i++) {
@@ -4561,12 +5201,12 @@
     //鑳屾櫙棰滆壊
     context.setLineWidth(arcbarOption.width * opts.pix);
     context.setStrokeStyle(arcbarOption.backgroundColor || '#E9E9E9');
-    context.setLineCap('round');
+    context.setLineCap(arcbarOption.lineCap);
     context.beginPath();
     if (arcbarOption.type == 'default') {
-      context.arc(centerPosition.x, centerPosition.y, radius - (arcbarOption.width * opts.pix + arcbarOption.gap * opts.pix) * i, arcbarOption.startAngle * Math.PI, arcbarOption.endAngle * Math.PI, false);
+      context.arc(centerPosition.x, centerPosition.y, radius - (arcbarOption.width * opts.pix + arcbarOption.gap * opts.pix) * i, arcbarOption.startAngle * Math.PI, arcbarOption.endAngle * Math.PI, arcbarOption.direction == 'ccw');
     } else {
-      context.arc(centerPosition.x, centerPosition.y, radius - (arcbarOption.width * opts.pix + arcbarOption.gap * opts.pix) * i, 0, 2 * Math.PI, false);
+      context.arc(centerPosition.x, centerPosition.y, radius - (arcbarOption.width * opts.pix + arcbarOption.gap * opts.pix) * i, 0, 2 * Math.PI, arcbarOption.direction == 'ccw');
     }
     context.stroke();
     //杩涘害鏉�
@@ -4579,9 +5219,9 @@
     }
     context.setLineWidth(arcbarOption.width * opts.pix);
     context.setStrokeStyle(fillColor);
-    context.setLineCap('round');
+    context.setLineCap(arcbarOption.lineCap);
     context.beginPath();
-    context.arc(centerPosition.x, centerPosition.y, radius - (arcbarOption.width * opts.pix + arcbarOption.gap * opts.pix) * i, arcbarOption.startAngle * Math.PI, eachSeries._proportion_ * Math.PI, false);
+    context.arc(centerPosition.x, centerPosition.y, radius - (arcbarOption.width * opts.pix + arcbarOption.gap * opts.pix) * i, arcbarOption.startAngle * Math.PI, eachSeries._proportion_ * Math.PI, arcbarOption.direction == 'ccw');
     context.stroke();
   }
   drawRingTitle(opts, config, context, centerPosition);
@@ -4627,6 +5267,7 @@
   var radius = Math.min(centerPosition.x, centerPosition.y);
   radius -= 5 * opts.pix;
   radius -= gaugeOption.width / 2;
+  radius = radius < 10 ? 10 : radius;
   var innerRadius = radius - gaugeOption.width;
   var totalAngle = 0;
   //鍒ゆ柇浠〃鐩樼殑鏍峰紡锛歞efault鐧惧害鏍峰紡锛宲rogress鏂版牱寮�
@@ -4650,7 +5291,11 @@
     context.arc(centerPosition.x, centerPosition.y, innerRadius, gaugeOption.startAngle * Math.PI, gaugeOption.endAngle * Math.PI, false);
     context.stroke();
     //## 绗簩姝ョ敾鍒诲害绾�
-    totalAngle = gaugeOption.startAngle - gaugeOption.endAngle + 1;
+    if (gaugeOption.endAngle < gaugeOption.startAngle) {
+      totalAngle = 2 + gaugeOption.endAngle - gaugeOption.startAngle;
+    } else {
+      totalAngle = gaugeOption.startAngle - gaugeOption.endAngle;
+    }
     let splitAngle = totalAngle / gaugeOption.splitLine.splitNumber;
     let childAngle = totalAngle / gaugeOption.splitLine.splitNumber / gaugeOption.splitLine.childNumber;
     let startX = -radius - gaugeOption.width * 0.5 - gaugeOption.splitLine.fixRadius;
@@ -4676,7 +5321,7 @@
     }
     context.restore();
     //## 绗笁姝ョ敾杩涘害鏉�
-    series = getArcbarDataPoints(series, gaugeOption, process);
+    series = getGaugeArcbarDataPoints(series, gaugeOption, process);
     context.setLineWidth(gaugeOption.width);
     context.setStrokeStyle(series[0].color);
     context.setLineCap('round');
@@ -4722,7 +5367,11 @@
     }
     context.save();
     //鐢诲埢搴︾嚎
-    totalAngle = gaugeOption.startAngle - gaugeOption.endAngle + 1;
+    if (gaugeOption.endAngle < gaugeOption.startAngle) {
+      totalAngle = 2 + gaugeOption.endAngle - gaugeOption.startAngle;
+    } else {
+      totalAngle = gaugeOption.startAngle - gaugeOption.endAngle;
+    }
     let splitAngle = totalAngle / gaugeOption.splitLine.splitNumber;
     let childAngle = totalAngle / gaugeOption.splitLine.splitNumber / gaugeOption.splitLine.childNumber;
     let startX = -radius - gaugeOption.width * 0.5 - gaugeOption.splitLine.fixRadius;
@@ -4799,10 +5448,20 @@
   var radarOption = assign({}, {
     gridColor: '#cccccc',
     gridType: 'radar',
+    gridEval:1,
+    axisLabel:false,
+    axisLabelTofix:0,
+    labelShow:true,
+    labelColor:'#666666',
+    labelPointShow:false,
+    labelPointRadius:3,
+    labelPointColor:'#cccccc',
     opacity: 0.2,
     gridCount: 3,
     border:false,
-    borderWidth:2
+    borderWidth:2,
+    linearType: 'none',
+    customColor: [],
   }, opts.extra.radar);
   var coordinateAngle = getRadarCoordinateSeries(opts.categories.length);
   var centerPosition = {
@@ -4813,14 +5472,18 @@
   var yr = (opts.height - opts.area[0] - opts.area[2]) / 2
   var radius = Math.min(xr - (getMaxTextListLength(opts.categories, config.fontSize, context) + config.radarLabelTextMargin), yr - config.radarLabelTextMargin);
   radius -= config.radarLabelTextMargin * opts.pix;
+  radius = radius < 10 ? 10 : radius;
+  radius = radarOption.radius ? radarOption.radius : radius;
   // 鐢诲垎鍓茬嚎
   context.beginPath();
   context.setLineWidth(1 * opts.pix);
   context.setStrokeStyle(radarOption.gridColor);
-  coordinateAngle.forEach(function(angle) {
+  coordinateAngle.forEach(function(angle,index) {
     var pos = convertCoordinateOrigin(radius * Math.cos(angle), radius * Math.sin(angle), centerPosition);
     context.moveTo(centerPosition.x, centerPosition.y);
-    context.lineTo(pos.x, pos.y);
+    if (index % radarOption.gridEval == 0) {
+      context.lineTo(pos.x, pos.y);
+    }
   });
   context.stroke();
   context.closePath();
@@ -4853,13 +5516,28 @@
   for (var i = 1; i <= radarOption.gridCount; i++) {
     _loop(i);
   }
+  radarOption.customColor = fillCustomColor(radarOption.linearType, radarOption.customColor, series, config);
   var radarDataPoints = getRadarDataPoints(coordinateAngle, centerPosition, radius, series, opts, process);
   radarDataPoints.forEach(function(eachSeries, seriesIndex) {
     // 缁樺埗鍖哄煙鏁版嵁
     context.beginPath();
     context.setLineWidth(radarOption.borderWidth * opts.pix);
     context.setStrokeStyle(eachSeries.color);
-    context.setFillStyle(hexToRgb(eachSeries.color, radarOption.opacity));
+    
+    var fillcolor = hexToRgb(eachSeries.color, radarOption.opacity);
+    if (radarOption.linearType == 'custom') {
+      var grd;
+      if(context.createCircularGradient){
+        grd = context.createCircularGradient(centerPosition.x, centerPosition.y, radius)
+      }else{
+        grd = context.createRadialGradient(centerPosition.x, centerPosition.y, 0,centerPosition.x, centerPosition.y, radius)
+      }
+      grd.addColorStop(0, hexToRgb(radarOption.customColor[series[seriesIndex].linearIndex], radarOption.opacity))
+      grd.addColorStop(1, hexToRgb(eachSeries.color, radarOption.opacity))
+      fillcolor = grd
+    }
+    
+    context.setFillStyle(fillcolor);
     eachSeries.data.forEach(function(item, index) {
       if (index === 0) {
         context.moveTo(item.position.x, item.position.y);
@@ -4880,6 +5558,21 @@
       drawPointShape(points, eachSeries.color, eachSeries.pointShape, context, opts);
     }
   });
+  // 鐢诲埢搴﹀��
+  if(radarOption.axisLabel === true){
+    const maxData = Math.max(radarOption.max, Math.max.apply(null, dataCombine(series)));
+    const stepLength = radius / radarOption.gridCount;
+    const fontSize = opts.fontSize * opts.pix;
+    context.setFontSize(fontSize);
+    context.setFillStyle(opts.fontColor);
+    context.setTextAlign('left');
+    for (var i = 0; i < radarOption.gridCount + 1; i++) {
+      let label = i * maxData / radarOption.gridCount;
+      label = label.toFixed(radarOption.axisLabelTofix);
+      context.fillText(String(label), centerPosition.x + 3 * opts.pix, centerPosition.y - i * stepLength + fontSize / 2);
+    }
+  }
+  
   // draw label text
   drawRadarLabel(coordinateAngle, radius, centerPosition, opts, config, context);
   
@@ -4925,36 +5618,27 @@
   };
 }
 
-function normalInt(min, max, iter) {
-  iter = iter == 0 ? 1 : iter;
-  var arr = [];
-  for (var i = 0; i < iter; i++) {
-    arr[i] = Math.random();
-  };
-  return Math.floor(arr.reduce(function(i, j) {
-    return i + j
-  }) / iter * (max - min)) + min;
-};
+// 缁忕含搴﹁浆澧ㄥ崱鎵�
+function lonlat2mercator(longitude, latitude) {
+  var mercator = Array(2);
+  var x = longitude * 20037508.34 / 180;
+  var y = Math.log(Math.tan((90 + latitude) * Math.PI / 360)) / (Math.PI / 180);
+  y = y * 20037508.34 / 180;
+  mercator[0] = x;
+  mercator[1] = y;
+  return mercator;
+}
 
-function collisionNew(area, points, width, height) {
-  var isIn = false;
-  for (let i = 0; i < points.length; i++) {
-    if (points[i].area) {
-      if (area[3] < points[i].area[1] || area[0] > points[i].area[2] || area[1] > points[i].area[3] || area[2] < points[i].area[0]) {
-        if (area[0] < 0 || area[1] < 0 || area[2] > width || area[3] > height) {
-          isIn = true;
-          break;
-        } else {
-          isIn = false;
-        }
-      } else {
-        isIn = true;
-        break;
-      }
-    }
-  }
-  return isIn;
-};
+// 澧ㄥ崱鎵樿浆缁忕含搴�
+function mercator2lonlat(longitude, latitude) {
+  var lonlat = Array(2)
+  var x = longitude / 20037508.34 * 180;
+  var y = latitude / 20037508.34 * 180;
+  y = 180 / Math.PI * (2 * Math.atan(Math.exp(y * Math.PI / 180)) - Math.PI / 2);
+  lonlat[0] = x;
+  lonlat[1] = y;
+  return lonlat;
+}
 
 function getBoundingBox(data) {
   var bounds = {},coords;
@@ -5053,12 +5737,12 @@
   }
 }
 
-
 function drawMapDataPoints(series, opts, config, context) {
   var mapOption = assign({}, {
     border: true,
     mercator: false,
     borderWidth: 1,
+    active:true,
     borderColor: '#666666',
     fillOpacity: 0.6,
     activeBorderColor: '#f04864',
@@ -5085,8 +5769,8 @@
     context.beginPath();
     context.setLineWidth(mapOption.borderWidth * opts.pix);
     context.setStrokeStyle(mapOption.borderColor);
-    context.setFillStyle(hexToRgb(series[i].color, mapOption.fillOpacity));
-    if (opts.tooltip) {
+    context.setFillStyle(hexToRgb(series[i].color, series[i].fillOpacity||mapOption.fillOpacity));
+    if (mapOption.active == true && opts.tooltip) {
       if (opts.tooltip.index == i) {
         context.setStrokeStyle(mapOption.activeBorderColor);
         context.setFillStyle(hexToRgb(mapOption.activeFillColor, mapOption.activeFillOpacity));
@@ -5118,7 +5802,9 @@
         context.stroke();
       }
     }
-    if (opts.dataLabel == true) {
+  }
+  if (opts.dataLabel == true) {
+    for (var i = 0; i < data.length; i++) {
       var centerPoint = data[i].properties.centroid;
       if (centerPoint) {
         if (mapOption.mercator) {
@@ -5126,10 +5812,14 @@
         }
         point = coordinateToPoint(centerPoint[1], centerPoint[0], bounds, scale, xoffset, yoffset);
         let fontSize = data[i].textSize * opts.pix || config.fontSize;
+        let fontColor = data[i].textColor || opts.fontColor;
+        if(mapOption.active && mapOption.activeTextColor && opts.tooltip && opts.tooltip.index == i){
+          fontColor = mapOption.activeTextColor;
+        }
         let text = data[i].properties.name;
         context.beginPath();
         context.setFontSize(fontSize)
-        context.setFillStyle(data[i].textColor || opts.fontColor)
+        context.setFillStyle(fontColor)
         context.fillText(text, point.x - measureText(text, fontSize, context) / 2, point.y + fontSize / 2);
         context.closePath();
         context.stroke();
@@ -5146,6 +5836,37 @@
   drawToolTipBridge(opts, config, context, 1);
   context.draw();
 }
+
+function normalInt(min, max, iter) {
+  iter = iter == 0 ? 1 : iter;
+  var arr = [];
+  for (var i = 0; i < iter; i++) {
+    arr[i] = Math.random();
+  };
+  return Math.floor(arr.reduce(function(i, j) {
+    return i + j
+  }) / iter * (max - min)) + min;
+};
+
+function collisionNew(area, points, width, height) {
+  var isIn = false;
+  for (let i = 0; i < points.length; i++) {
+    if (points[i].area) {
+      if (area[3] < points[i].area[1] || area[0] > points[i].area[2] || area[1] > points[i].area[3] || area[2] < points[i].area[0]) {
+        if (area[0] < 0 || area[1] < 0 || area[2] > width || area[3] > height) {
+          isIn = true;
+          break;
+        } else {
+          isIn = false;
+        }
+      } else {
+        isIn = true;
+        break;
+      }
+    }
+  }
+  return isIn;
+};
 
 function getWordCloudPoint(opts, type, context) {
   let points = opts.series;
@@ -5225,7 +5946,6 @@
   return points;
 }
 
-
 function drawWordCloudDataPoints(series, opts, config, context) {
   let process = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1;
   let wordOption = assign({}, {
@@ -5295,6 +6015,7 @@
     borderWidth: 2,
     borderColor: '#FFFFFF',
     fillOpacity: 1,
+    minSize: 0,
     labelAlign: 'right',
     linearType: 'none',
     customColor: [],
@@ -5306,42 +6027,42 @@
   };
   let activeWidth = funnelOption.activeWidth * opts.pix;
   let radius = Math.min((opts.width - opts.area[1] - opts.area[3]) / 2 - activeWidth, (opts.height - opts.area[0] - opts.area[2]) / 2 - activeWidth);
-  series = getFunnelDataPoints(series, radius, funnelOption.type, eachSpacing, process);
+  let seriesNew = getFunnelDataPoints(series, radius, funnelOption, eachSpacing, process);
   context.save();
   context.translate(centerPosition.x, centerPosition.y);
   funnelOption.customColor = fillCustomColor(funnelOption.linearType, funnelOption.customColor, series, config);
   if(funnelOption.type == 'pyramid'){
-    for (let i = 0; i < series.length; i++) {
-      if (i == series.length -1) {
+    for (let i = 0; i < seriesNew.length; i++) {
+      if (i == seriesNew.length -1) {
         if (opts.tooltip) {
           if (opts.tooltip.index == i) {
             context.beginPath();
-            context.setFillStyle(hexToRgb(series[i].color, funnelOption.activeOpacity));
+            context.setFillStyle(hexToRgb(seriesNew[i].color, funnelOption.activeOpacity));
             context.moveTo(-activeWidth, -eachSpacing);
-            context.lineTo(-series[i].radius - activeWidth, 0);
-            context.lineTo(series[i].radius + activeWidth, 0);
+            context.lineTo(-seriesNew[i].radius - activeWidth, 0);
+            context.lineTo(seriesNew[i].radius + activeWidth, 0);
             context.lineTo(activeWidth, -eachSpacing);
             context.lineTo(-activeWidth, -eachSpacing);
             context.closePath();
             context.fill();
           }
         }
-        series[i].funnelArea = [centerPosition.x - series[i].radius, centerPosition.y - eachSpacing * (i + 1), centerPosition.x + series[i].radius, centerPosition.y - eachSpacing * i];
+        seriesNew[i].funnelArea = [centerPosition.x - seriesNew[i].radius, centerPosition.y - eachSpacing * (i + 1), centerPosition.x + seriesNew[i].radius, centerPosition.y - eachSpacing * i];
         context.beginPath();
         context.setLineWidth(funnelOption.borderWidth * opts.pix);
         context.setStrokeStyle(funnelOption.borderColor);
-        var fillColor = hexToRgb(series[i].color, funnelOption.fillOpacity);
+        var fillColor = hexToRgb(seriesNew[i].color, funnelOption.fillOpacity);
         if (funnelOption.linearType == 'custom') {
-          var grd = context.createLinearGradient(series[i].radius, -eachSpacing, -series[i].radius, -eachSpacing);
-          grd.addColorStop(0, hexToRgb(series[i].color, funnelOption.fillOpacity));
-          grd.addColorStop(0.5, hexToRgb(funnelOption.customColor[series[i].linearIndex], funnelOption.fillOpacity));
-          grd.addColorStop(1, hexToRgb(series[i].color, funnelOption.fillOpacity));
+          var grd = context.createLinearGradient(seriesNew[i].radius, -eachSpacing, -seriesNew[i].radius, -eachSpacing);
+          grd.addColorStop(0, hexToRgb(seriesNew[i].color, funnelOption.fillOpacity));
+          grd.addColorStop(0.5, hexToRgb(funnelOption.customColor[seriesNew[i].linearIndex], funnelOption.fillOpacity));
+          grd.addColorStop(1, hexToRgb(seriesNew[i].color, funnelOption.fillOpacity));
           fillColor = grd
         }
         context.setFillStyle(fillColor);
         context.moveTo(0, -eachSpacing);
-        context.lineTo(-series[i].radius, 0);
-        context.lineTo(series[i].radius, 0);
+        context.lineTo(-seriesNew[i].radius, 0);
+        context.lineTo(seriesNew[i].radius, 0);
         context.lineTo(0, -eachSpacing);
         context.closePath();
         context.fill();
@@ -5352,35 +6073,35 @@
         if (opts.tooltip) {
           if (opts.tooltip.index == i) {
             context.beginPath();
-            context.setFillStyle(hexToRgb(series[i].color, funnelOption.activeOpacity));
+            context.setFillStyle(hexToRgb(seriesNew[i].color, funnelOption.activeOpacity));
             context.moveTo(0, 0);
-            context.lineTo(-series[i].radius - activeWidth, 0);
-            context.lineTo(-series[i + 1].radius - activeWidth, -eachSpacing);
-            context.lineTo(series[i + 1].radius + activeWidth, -eachSpacing);
-            context.lineTo(series[i].radius + activeWidth, 0);
+            context.lineTo(-seriesNew[i].radius - activeWidth, 0);
+            context.lineTo(-seriesNew[i + 1].radius - activeWidth, -eachSpacing);
+            context.lineTo(seriesNew[i + 1].radius + activeWidth, -eachSpacing);
+            context.lineTo(seriesNew[i].radius + activeWidth, 0);
             context.lineTo(0, 0);
             context.closePath();
             context.fill();
           }
         }
-        series[i].funnelArea = [centerPosition.x - series[i].radius, centerPosition.y - eachSpacing * (i + 1), centerPosition.x + series[i].radius, centerPosition.y - eachSpacing * i];
+        seriesNew[i].funnelArea = [centerPosition.x - seriesNew[i].radius, centerPosition.y - eachSpacing * (i + 1), centerPosition.x + seriesNew[i].radius, centerPosition.y - eachSpacing * i];
         context.beginPath();
         context.setLineWidth(funnelOption.borderWidth * opts.pix);
         context.setStrokeStyle(funnelOption.borderColor);
-        var fillColor = hexToRgb(series[i].color, funnelOption.fillOpacity);
+        var fillColor = hexToRgb(seriesNew[i].color, funnelOption.fillOpacity);
         if (funnelOption.linearType == 'custom') {
-          var grd = context.createLinearGradient(series[i].radius, -eachSpacing, -series[i].radius, -eachSpacing);
-          grd.addColorStop(0, hexToRgb(series[i].color, funnelOption.fillOpacity));
-          grd.addColorStop(0.5, hexToRgb(funnelOption.customColor[series[i].linearIndex], funnelOption.fillOpacity));
-          grd.addColorStop(1, hexToRgb(series[i].color, funnelOption.fillOpacity));
+          var grd = context.createLinearGradient(seriesNew[i].radius, -eachSpacing, -seriesNew[i].radius, -eachSpacing);
+          grd.addColorStop(0, hexToRgb(seriesNew[i].color, funnelOption.fillOpacity));
+          grd.addColorStop(0.5, hexToRgb(funnelOption.customColor[seriesNew[i].linearIndex], funnelOption.fillOpacity));
+          grd.addColorStop(1, hexToRgb(seriesNew[i].color, funnelOption.fillOpacity));
           fillColor = grd
         }
         context.setFillStyle(fillColor);
         context.moveTo(0, 0);
-        context.lineTo(-series[i].radius, 0);
-        context.lineTo(-series[i + 1].radius, -eachSpacing);
-        context.lineTo(series[i + 1].radius, -eachSpacing);
-        context.lineTo(series[i].radius, 0);
+        context.lineTo(-seriesNew[i].radius, 0);
+        context.lineTo(-seriesNew[i + 1].radius, -eachSpacing);
+        context.lineTo(seriesNew[i + 1].radius, -eachSpacing);
+        context.lineTo(seriesNew[i].radius, 0);
         context.lineTo(0, 0);
         context.closePath();
         context.fill();
@@ -5391,37 +6112,40 @@
       context.translate(0, -eachSpacing)
     }
   }else{
-    for (let i = 0; i < series.length; i++) {
-      if (i == 0) {
+    context.translate(0, - (seriesNew.length - 1) * eachSpacing);
+    for (let i = 0; i < seriesNew.length; i++) {
+      if (i == seriesNew.length - 1) {
         if (opts.tooltip) {
           if (opts.tooltip.index == i) {
             context.beginPath();
-            context.setFillStyle(hexToRgb(series[i].color, funnelOption.activeOpacity));
-            context.moveTo(-activeWidth, 0);
-            context.lineTo(-series[i].radius - activeWidth, -eachSpacing);
-            context.lineTo(series[i].radius + activeWidth, -eachSpacing);
-            context.lineTo(activeWidth, 0);
-            context.lineTo(-activeWidth, 0);
+            context.setFillStyle(hexToRgb(seriesNew[i].color, funnelOption.activeOpacity));
+            context.moveTo(-activeWidth - funnelOption.minSize/2, 0);
+            context.lineTo(-seriesNew[i].radius - activeWidth, -eachSpacing);
+            context.lineTo(seriesNew[i].radius + activeWidth, -eachSpacing);
+            context.lineTo(activeWidth + funnelOption.minSize/2, 0);
+            context.lineTo(-activeWidth - funnelOption.minSize/2, 0);
             context.closePath();
             context.fill();
           }
         }
-        series[i].funnelArea = [centerPosition.x - series[i].radius, centerPosition.y - eachSpacing, centerPosition.x + series[i].radius, centerPosition.y];
+        seriesNew[i].funnelArea = [centerPosition.x - seriesNew[i].radius, centerPosition.y - eachSpacing, centerPosition.x + seriesNew[i].radius, centerPosition.y ];
         context.beginPath();
         context.setLineWidth(funnelOption.borderWidth * opts.pix);
         context.setStrokeStyle(funnelOption.borderColor);
-        var fillColor = hexToRgb(series[i].color, funnelOption.fillOpacity);
+        var fillColor = hexToRgb(seriesNew[i].color, funnelOption.fillOpacity);
         if (funnelOption.linearType == 'custom') {
-          var grd = context.createLinearGradient(series[i].radius, -eachSpacing, -series[i].radius, -eachSpacing);
-          grd.addColorStop(0, hexToRgb(series[i].color, funnelOption.fillOpacity));
-          grd.addColorStop(0.5, hexToRgb(funnelOption.customColor[series[i].linearIndex], funnelOption.fillOpacity));
-          grd.addColorStop(1, hexToRgb(series[i].color, funnelOption.fillOpacity));
+          var grd = context.createLinearGradient(seriesNew[i].radius, -eachSpacing, -seriesNew[i].radius, -eachSpacing);
+          grd.addColorStop(0, hexToRgb(seriesNew[i].color, funnelOption.fillOpacity));
+          grd.addColorStop(0.5, hexToRgb(funnelOption.customColor[seriesNew[i].linearIndex], funnelOption.fillOpacity));
+          grd.addColorStop(1, hexToRgb(seriesNew[i].color, funnelOption.fillOpacity));
           fillColor = grd
         }
         context.setFillStyle(fillColor);
         context.moveTo(0, 0);
-        context.lineTo(-series[i].radius, -eachSpacing);
-        context.lineTo(series[i].radius, -eachSpacing);
+        context.lineTo(-funnelOption.minSize/2, 0);
+        context.lineTo(-seriesNew[i].radius, -eachSpacing);
+        context.lineTo(seriesNew[i].radius, -eachSpacing);
+        context.lineTo(funnelOption.minSize/2, 0);
         context.lineTo(0, 0);
         context.closePath();
         context.fill();
@@ -5432,35 +6156,35 @@
         if (opts.tooltip) {
           if (opts.tooltip.index == i) {
             context.beginPath();
-            context.setFillStyle(hexToRgb(series[i].color, funnelOption.activeOpacity));
+            context.setFillStyle(hexToRgb(seriesNew[i].color, funnelOption.activeOpacity));
             context.moveTo(0, 0);
-            context.lineTo(-series[i - 1].radius - activeWidth, 0);
-            context.lineTo(-series[i].radius - activeWidth, -eachSpacing);
-            context.lineTo(series[i].radius + activeWidth, -eachSpacing);
-            context.lineTo(series[i - 1].radius + activeWidth, 0);
+            context.lineTo(-seriesNew[i + 1].radius - activeWidth, 0);
+            context.lineTo(-seriesNew[i].radius - activeWidth, -eachSpacing);
+            context.lineTo(seriesNew[i].radius + activeWidth, -eachSpacing);
+            context.lineTo(seriesNew[i + 1].radius + activeWidth, 0);
             context.lineTo(0, 0);
             context.closePath();
             context.fill();
           }
         }
-        series[i].funnelArea = [centerPosition.x - series[i].radius, centerPosition.y - eachSpacing * (i + 1), centerPosition.x + series[i].radius, centerPosition.y - eachSpacing * i];
+        seriesNew[i].funnelArea = [centerPosition.x - seriesNew[i].radius, centerPosition.y - eachSpacing * (seriesNew.length - i), centerPosition.x + seriesNew[i].radius, centerPosition.y - eachSpacing * (seriesNew.length - i - 1)];
         context.beginPath();
         context.setLineWidth(funnelOption.borderWidth * opts.pix);
         context.setStrokeStyle(funnelOption.borderColor);
-        var fillColor = hexToRgb(series[i].color, funnelOption.fillOpacity);
+        var fillColor = hexToRgb(seriesNew[i].color, funnelOption.fillOpacity);
         if (funnelOption.linearType == 'custom') {
-          var grd = context.createLinearGradient(series[i].radius, -eachSpacing, -series[i].radius, -eachSpacing);
-          grd.addColorStop(0, hexToRgb(series[i].color, funnelOption.fillOpacity));
-          grd.addColorStop(0.5, hexToRgb(funnelOption.customColor[series[i].linearIndex], funnelOption.fillOpacity));
-          grd.addColorStop(1, hexToRgb(series[i].color, funnelOption.fillOpacity));
+          var grd = context.createLinearGradient(seriesNew[i].radius, -eachSpacing, -seriesNew[i].radius, -eachSpacing);
+          grd.addColorStop(0, hexToRgb(seriesNew[i].color, funnelOption.fillOpacity));
+          grd.addColorStop(0.5, hexToRgb(funnelOption.customColor[seriesNew[i].linearIndex], funnelOption.fillOpacity));
+          grd.addColorStop(1, hexToRgb(seriesNew[i].color, funnelOption.fillOpacity));
           fillColor = grd
         }
         context.setFillStyle(fillColor);
         context.moveTo(0, 0);
-        context.lineTo(-series[i - 1].radius, 0);
-        context.lineTo(-series[i].radius, -eachSpacing);
-        context.lineTo(series[i].radius, -eachSpacing);
-        context.lineTo(series[i - 1].radius, 0);
+        context.lineTo(-seriesNew[i + 1].radius, 0);
+        context.lineTo(-seriesNew[i].radius, -eachSpacing);
+        context.lineTo(seriesNew[i].radius, -eachSpacing);
+        context.lineTo(seriesNew[i + 1].radius, 0);
         context.lineTo(0, 0);
         context.closePath();
         context.fill();
@@ -5468,39 +6192,38 @@
           context.stroke();
         }
       }
-      context.translate(0, -eachSpacing)
+      context.translate(0, eachSpacing)
     }
   }
   
   context.restore();
   if (opts.dataLabel !== false && process === 1) {
-    drawFunnelText(series, opts, context, eachSpacing, funnelOption.labelAlign, activeWidth, centerPosition);
+    drawFunnelText(seriesNew, opts, context, eachSpacing, funnelOption.labelAlign, activeWidth, centerPosition);
+  }
+  if (process === 1) {
+    drawFunnelCenterText(seriesNew, opts, context, eachSpacing, funnelOption.labelAlign, activeWidth, centerPosition);
   }
   return {
     center: centerPosition,
     radius: radius,
-    series: series
+    series: seriesNew
   };
 }
 
 function drawFunnelText(series, opts, context, eachSpacing, labelAlign, activeWidth, centerPosition) {
   for (let i = 0; i < series.length; i++) {
     let item = series[i];
+    if(item.labelShow === false){
+      continue;
+    }
     let startX, endX, startY, fontSize;
-    let text = item.formatter ? item.formatter(item,i,series) : util.toFixed(item._proportion_ * 100) + '%';
+    let text = item.formatter ? item.formatter(item,i,series,opts) : util.toFixed(item._proportion_ * 100) + '%';
+    text = item.labelText ? item.labelText : text;
     if (labelAlign == 'right') {
-      if(opts.extra.funnel.type === 'pyramid'){
-        if (i == series.length -1) {
-          startX = (item.funnelArea[2] + centerPosition.x) / 2;
-        } else {
-          startX = (item.funnelArea[2] + series[i + 1].funnelArea[2]) / 2;
-        }
-      }else{
-        if (i == 0) {
-          startX = (item.funnelArea[2] + centerPosition.x) / 2;
-        } else {
-          startX = (item.funnelArea[2] + series[i - 1].funnelArea[2]) / 2;
-        }
+      if (i == series.length -1) {
+        startX = (item.funnelArea[2] + centerPosition.x) / 2;
+      } else {
+        startX = (item.funnelArea[2] + series[i + 1].funnelArea[2]) / 2;
       }
       endX = startX + activeWidth * 2;
       startY = item.funnelArea[1] + eachSpacing / 2;
@@ -5515,7 +6238,7 @@
       context.closePath();
       context.beginPath();
       context.moveTo(endX, startY);
-      context.arc(endX, startY, 2, 0, 2 * Math.PI);
+      context.arc(endX, startY, 2 * opts.pix, 0, 2 * Math.PI);
       context.closePath();
       context.fill();
       context.beginPath();
@@ -5525,19 +6248,12 @@
       context.closePath();
       context.stroke();
       context.closePath();
-    } else {
-      if(opts.extra.funnel.type === 'pyramid'){
-        if (i == series.length -1) {
-          startX = (item.funnelArea[0] + centerPosition.x) / 2;
-        } else {
-          startX = (item.funnelArea[0] + series[i + 1].funnelArea[0]) / 2;
-        }
-      }else{
-        if (i == 0) {
-          startX = (item.funnelArea[0] + centerPosition.x) / 2;
-        } else {
-          startX = (item.funnelArea[0] + series[i - 1].funnelArea[0]) / 2;
-        }
+    }
+    if (labelAlign == 'left') {
+      if (i == series.length -1) {
+        startX = (item.funnelArea[0] + centerPosition.x) / 2;
+      } else {
+        startX = (item.funnelArea[0] + series[i + 1].funnelArea[0]) / 2;
       }
       endX = startX - activeWidth * 2;
       startY = item.funnelArea[1] + eachSpacing / 2;
@@ -5563,11 +6279,32 @@
       context.stroke();
       context.closePath();
     }
-
   }
 }
 
+function drawFunnelCenterText(series, opts, context, eachSpacing, labelAlign, activeWidth, centerPosition) {
+  for (let i = 0; i < series.length; i++) {
+    let item = series[i];
+    let startY, fontSize;
+    if (item.centerText) {
+      startY = item.funnelArea[1] + eachSpacing / 2;
+      fontSize = item.centerTextSize * opts.pix || opts.fontSize * opts.pix;
+      context.beginPath();
+      context.setFontSize(fontSize);
+      context.setFillStyle(item.centerTextColor || "#FFFFFF");
+      context.fillText(item.centerText, centerPosition.x - measureText(item.centerText, fontSize, context) / 2, startY + fontSize / 2 - 2);
+      context.closePath();
+      context.stroke();
+      context.closePath();
+    }
+  }
+}
+
+
 function drawCanvas(opts, context) {
+  context.save();
+  context.translate(0, 0.5);
+  context.restore();
   context.draw();
 }
 
@@ -5645,10 +6382,17 @@
   var _this = this;
   var series = opts.series;
   //鍏煎ECharts楗煎浘绫绘暟鎹牸寮�
-  if (type === 'pie' || type === 'ring' || type === 'rose' || type === 'funnel') {
+  if (type === 'pie' || type === 'ring' || type === 'mount' || type === 'rose' || type === 'funnel') {
     series = fixPieSeries(series, opts, config);
   }
   var categories = opts.categories;
+  if (type === 'mount') {
+    categories = [];
+    for (let j = 0; j < series.length; j++) {
+      if(series[j].show !== false) categories.push(series[j].name)
+    }
+    opts.categories = categories;
+  }
   series = fillSeries(series, opts, config);
   var duration = opts.animation ? opts.duration : 0;
   _this.animationInstance && _this.animationInstance.stop();
@@ -5697,7 +6441,7 @@
 
   let _calYAxisData = {},
     yAxisWidth = 0;
-  if (opts.type === 'line' || opts.type === 'column' || opts.type === 'area' || opts.type === 'mix' || opts.type === 'candle' || opts.type === 'scatter'  || opts.type === 'bubble' || opts.type === 'bar') {
+  if (opts.type === 'line' || opts.type === 'column'|| opts.type === 'mount' || opts.type === 'area' || opts.type === 'mix' || opts.type === 'candle' || opts.type === 'scatter'  || opts.type === 'bubble' || opts.type === 'bar') {
       _calYAxisData = calYAxisData(series, opts, config, context);
       yAxisWidth = _calYAxisData.yAxisWidth;
     //濡傛灉鏄剧ずY杞存爣棰�
@@ -5759,6 +6503,7 @@
       };
     }
   }
+
   //璁$畻鍙冲榻愬亸绉昏窛绂�
   if (opts.enableScroll && opts.xAxis.scrollAlign == 'right' && opts._scrollDistance_ === undefined) {
     let offsetLeft = 0,
@@ -5769,18 +6514,17 @@
     let totalWidth = eachSpacing * (xAxisPoints.length - 1);
     let screenWidth = endX - startX;
     offsetLeft = screenWidth - totalWidth;
-    _this.scrollOption = {
-      currentOffset: offsetLeft,
-      startTouchX: offsetLeft,
-      distance: 0,
-      lastMoveTime: 0
-    };
+    _this.scrollOption.currentOffset = offsetLeft;
+    _this.scrollOption.startTouchX = offsetLeft;
+    _this.scrollOption.distance = 0;
+    _this.scrollOption.lastMoveTime = 0;
     opts._scrollDistance_ = offsetLeft;
   }
 
   if (type === 'pie' || type === 'ring' || type === 'rose') {
     config._pieTextMaxLength_ = opts.dataLabel === false ? 0 : getPieTextMaxLength(seriesMA, config, context, opts);
   }
+  
   switch (type) {
     case 'word':
       this.animationInstance = new Animation({
@@ -5802,6 +6546,9 @@
     case 'map':
       context.clearRect(0, 0, opts.width, opts.height);
       drawMapDataPoints(series, opts, config, context);
+      setTimeout(()=>{
+        this.uevent.trigger('renderComplete');
+      },50)
       break;
     case 'funnel':
       this.animationInstance = new Animation({
@@ -5977,6 +6724,37 @@
         }
       });
       break;
+    case 'mount':
+      this.animationInstance = new Animation({
+        timing: opts.timing,
+        duration: duration,
+        onProcess: function onProcess(process) {
+          context.clearRect(0, 0, opts.width, opts.height);
+          if (opts.rotate) {
+            contextRotate(context, opts);
+          }
+          drawYAxisGrid(categories, opts, config, context);
+          drawXAxis(categories, opts, config, context);
+          var _drawMountDataPoints = drawMountDataPoints(series, opts, config, context, process),
+            xAxisPoints = _drawMountDataPoints.xAxisPoints,
+            calPoints = _drawMountDataPoints.calPoints,
+            eachSpacing = _drawMountDataPoints.eachSpacing;
+          opts.chartData.xAxisPoints = xAxisPoints;
+          opts.chartData.calPoints = calPoints;
+          opts.chartData.eachSpacing = eachSpacing;
+          drawYAxis(series, opts, config, context);
+          if (opts.enableMarkLine !== false && process === 1) {
+            drawMarkLine(opts, config, context);
+          }
+          drawLegend(opts.series, opts, config, context, opts.chartData);
+          drawToolTipBridge(opts, config, context, process, eachSpacing, xAxisPoints);
+          drawCanvas(opts, context);
+        },
+        onAnimationFinish: function onAnimationFinish() {
+          _this.uevent.trigger('renderComplete');
+        }
+      });
+      break;
     case 'bar':
       this.animationInstance = new Animation({
         timing: opts.timing,
@@ -6040,6 +6818,24 @@
       });
       break;
     case 'ring':
+      this.animationInstance = new Animation({
+        timing: opts.timing,
+        duration: duration,
+        onProcess: function onProcess(process) {
+          context.clearRect(0, 0, opts.width, opts.height);
+          if (opts.rotate) {
+            contextRotate(context, opts);
+          }
+          opts.chartData.pieData = drawPieDataPoints(series, opts, config, context, process);
+          drawLegend(opts.series, opts, config, context, opts.chartData);
+          drawToolTipBridge(opts, config, context, process);
+          drawCanvas(opts, context);
+        },
+        onAnimationFinish: function onAnimationFinish() {
+          _this.uevent.trigger('renderComplete');
+        }
+      });
+      break;
     case 'pie':
       this.animationInstance = new Animation({
         timing: opts.timing,
@@ -6214,6 +7010,7 @@
     showTitle: false,
     disabled: false,
     disableGrid: false,
+    gridSet: 'number',
     splitNumber: 5,
     gridType: 'solid',
     dashLength: 4 * opts.pix,
@@ -6223,16 +7020,25 @@
   }, opts.yAxis);
   opts.xAxis = assign({}, {
     rotateLabel: false,
+    rotateAngle:45,
     disabled: false,
     disableGrid: false,
     splitNumber: 5,
     calibration:false,
+    fontColor: '#666666',
+    fontSize: 13,
+    lineHeight: 20,
+    marginTop: 0,
     gridType: 'solid',
     dashLength: 4,
     scrollAlign: 'left',
     boundaryGap: 'center',
     axisLine: true,
-    axisLineColor: '#cccccc'
+    axisLineColor: '#cccccc',
+    titleFontSize: 13,
+    titleOffsetY: 0,
+    titleOffsetX: 0,
+    titleFontColor: '#666666'
   }, opts.xAxis);
   opts.xAxis.scrollPosition = opts.xAxis.scrollAlign;
   opts.legend = assign({}, {
@@ -6251,15 +7057,18 @@
     formatter: {},
     hiddenColor: '#CECECE'
   }, opts.legend);
-  opts.extra = assign({}, opts.extra);
+  opts.extra = assign({
+    tooltip:{
+      legendShape: 'auto'
+    }
+  }, opts.extra);
   opts.rotate = opts.rotate ? true : false;
   opts.animation = opts.animation ? true : false;
   opts.rotate = opts.rotate ? true : false;
   opts.canvas2d = opts.canvas2d ? true : false;
   
-  let config$$1 = JSON.parse(JSON.stringify(config));
+  let config$$1 = assign({}, config);
   config$$1.color = opts.color ? opts.color : config$$1.color;
-  config$$1.yAxisTitleWidth = opts.yAxis.disabled !== true && opts.yAxis.title ? config$$1.yAxisTitleWidth : 0;
   if (opts.type == 'pie') {
     config$$1.pieChartLinePadding = opts.dataLabel === false ? 0 : opts.extra.pie.labelWidth * opts.pix || config$$1.pieChartLinePadding * opts.pix;
   }
@@ -6270,7 +7079,6 @@
     config$$1.pieChartLinePadding = opts.dataLabel === false ? 0 : opts.extra.rose.labelWidth * opts.pix || config$$1.pieChartLinePadding * opts.pix;
   }
   config$$1.pieChartTextPadding = opts.dataLabel === false ? 0 : config$$1.pieChartTextPadding * opts.pix;
-  config$$1.yAxisSplit = opts.yAxis.splitNumber ? opts.yAxis.splitNumber : config.yAxisSplit;
 
   //灞忓箷鏃嬭浆
   config$$1.rotate = opts.rotate;
@@ -6284,19 +7092,9 @@
   //閫傞厤楂樺垎灞�
   opts.padding = opts.padding ? opts.padding : config$$1.padding;
   config$$1.yAxisWidth = config.yAxisWidth * opts.pix;
-  config$$1.xAxisHeight = config.xAxisHeight * opts.pix;
-  if (opts.enableScroll && opts.xAxis.scrollShow) {
-    config$$1.xAxisHeight += 6 * opts.pix;
-  }
-  config$$1.xAxisLineHeight = config.xAxisLineHeight * opts.pix;
   config$$1.fontSize = opts.fontSize * opts.pix;
   config$$1.titleFontSize = config.titleFontSize * opts.pix;
   config$$1.subtitleFontSize = config.subtitleFontSize * opts.pix;
-  config$$1.toolTipPadding = config.toolTipPadding * opts.pix;
-  config$$1.toolTipLineHeight = config.toolTipLineHeight * opts.pix;
-  config$$1.columePadding = config.columePadding * opts.pix;
-  //this.context = opts.context ? opts.context : uni.createCanvasContext(opts.canvasId, opts.$this);
-  //v2.0鐗堟湰鍚庨渶瑕佽嚜琛岃幏鍙朿ontext骞朵紶鍏pts杩涜鍒濆鍖栵紝杩欎箞鍋氭槸涓轰簡纭繚uCharts鍙互璺ㄦ洿澶氱浣跨敤锛屽苟淇濊瘉浜嗚嚜瀹氫箟缁勪欢this瀹炰緥涓嶈寰幆宓屽銆傚鏋滄偍瑙夊緱涓嶄究璇峰彇娑堜笂闈㈡敞閲婏紝閲囩敤v1.0鐗堟湰鐨勬柟寮忎娇鐢紝瀵规缁欐偍甯︽潵鐨勪笉渚挎暚璇疯皡瑙o紒
   if(!opts.context){
     throw new Error('[uCharts] 鏈幏鍙栧埌context锛佹敞鎰忥細v2.0鐗堟湰鍚庯紝闇�瑕佽嚜琛岃幏鍙朿anvas鐨勭粯鍥句笂涓嬫枃骞朵紶鍏pts.context锛�');
   }
@@ -6319,6 +7117,15 @@
     }
     this.context.setTextAlign = function(e) {
       return this.textAlign = e;
+    }
+    this.context.setTextBaseline = function(e) {
+      return this.textBaseline = e;
+    }
+    this.context.setShadow = function(offsetX,offsetY,blur,color) {
+      this.shadowColor = color;
+      this.shadowOffsetX = offsetX;
+      this.shadowOffsetY = offsetY;
+      this.shadowBlur = blur;
     }
     this.context.draw = function() {}
   }
@@ -6346,7 +7153,7 @@
   let scrollPosition = data.scrollPosition || 'current';
   switch (scrollPosition) {
     case 'current':
-      //this.opts._scrollDistance_ = this.scrollOption.currentOffset;
+      this.opts._scrollDistance_ = this.scrollOption.currentOffset;
       break;
     case 'left':
       this.opts._scrollDistance_ = 0;
@@ -6412,13 +7219,77 @@
   }
   this.scrollOption = {
     currentOffset: offsetLeft,
-    startTouchX: offsetLeft,
+    startTouchX: 0,
     distance: 0,
     lastMoveTime: 0
   };
+  calValidDistance(this, offsetLeft, this.opts.chartData, this.config, this.opts);
   this.opts._scrollDistance_ = offsetLeft;
   drawCharts.call(this, this.opts.type, this.opts, this.config, this.context);
 };
+
+uCharts.prototype.dobuleZoom = function(e) {
+  if (this.opts.enableScroll !== true) {
+    console.log('[uCharts] 璇峰惎鐢ㄦ粴鍔ㄦ潯鍚庝娇鐢�')
+    return;
+  }
+  const tcs = e.changedTouches;
+  if (tcs.length < 2) {
+    return;
+  }
+  for (var i = 0; i < tcs.length; i++) {
+    tcs[i].x = tcs[i].x ? tcs[i].x : tcs[i].clientX;
+    tcs[i].y = tcs[i].y ? tcs[i].y : tcs[i].clientY;
+  }
+  const ntcs = [getTouches(tcs[0], this.opts, e),getTouches(tcs[1], this.opts, e)]; 
+  const xlength = Math.abs(ntcs[0].x - ntcs[1].x);
+  // 璁板綍鍒濆鐨勪袱鎸囦箣闂寸殑鏁版嵁
+  if(!this.scrollOption.moveCount){
+    let cts0 = {changedTouches:[{x:tcs[0].x,y:this.opts.area[0] / this.opts.pix + 2}]};
+    let cts1 = {changedTouches:[{x:tcs[1].x,y:this.opts.area[0] / this.opts.pix + 2}]};
+    if(this.opts.rotate){
+      cts0 = {changedTouches:[{x:this.opts.height / this.opts.pix - this.opts.area[0] / this.opts.pix - 2,y:tcs[0].y}]};
+      cts1 = {changedTouches:[{x:this.opts.height / this.opts.pix - this.opts.area[0] / this.opts.pix - 2,y:tcs[1].y}]};
+    }
+    const moveCurrent1 = this.getCurrentDataIndex(cts0).index;
+    const moveCurrent2 = this.getCurrentDataIndex(cts1).index;
+    const moveCount = Math.abs(moveCurrent1 - moveCurrent2);
+    this.scrollOption.moveCount = moveCount;
+    this.scrollOption.moveCurrent1 = Math.min(moveCurrent1, moveCurrent2);
+    this.scrollOption.moveCurrent2 = Math.max(moveCurrent1, moveCurrent2);
+    return;
+  }
+  
+  let currentEachSpacing = xlength / this.scrollOption.moveCount;
+  let itemCount = (this.opts.width - this.opts.area[1] - this.opts.area[3]) / currentEachSpacing;
+  itemCount = itemCount <= 2 ? 2 : itemCount;
+  itemCount = itemCount >= this.opts.categories.length ? this.opts.categories.length : itemCount;
+  this.opts.animation = false;
+  this.opts.xAxis.itemCount = itemCount;
+  // 閲嶆柊璁$畻婊氬姩鏉″亸绉昏窛绂�
+  let offsetLeft = 0;
+  let _getXAxisPoints0 = getXAxisPoints(this.opts.categories, this.opts, this.config),
+    xAxisPoints = _getXAxisPoints0.xAxisPoints,
+    startX = _getXAxisPoints0.startX,
+    endX = _getXAxisPoints0.endX,
+    eachSpacing = _getXAxisPoints0.eachSpacing;
+  let currentLeft = eachSpacing * this.scrollOption.moveCurrent1;
+  let screenWidth = endX - startX;
+  let MaxLeft = screenWidth - eachSpacing * (xAxisPoints.length - 1);
+  offsetLeft = -currentLeft+Math.min(ntcs[0].x,ntcs[1].x)-this.opts.area[3]-eachSpacing;
+  if (offsetLeft > 0) {
+    offsetLeft = 0;
+  }
+  if (offsetLeft < MaxLeft) {
+    offsetLeft = MaxLeft;
+  }
+  this.scrollOption.currentOffset= offsetLeft;
+  this.scrollOption.startTouchX= 0;
+  this.scrollOption.distance=0;
+  calValidDistance(this, offsetLeft, this.opts.chartData, this.config, this.opts);
+  this.opts._scrollDistance_ = offsetLeft;
+  drawCharts.call(this, this.opts.type, this.opts, this.config, this.context);
+}
 
 uCharts.prototype.stopAnimation = function() {
   this.animationInstance && this.animationInstance.stop();
@@ -6559,10 +7430,35 @@
           textList: option.textList !== undefined ? option.textList : textList,
           offset: option.offset !== undefined ? option.offset : offset,
           option: option,
-          index: index
+          index: index,
+          group: current.group
         };
       }
     }
+    drawCharts.call(this, opts.type, opts, this.config, this.context);
+  }
+  if (this.opts.type === 'mount') {
+    var index = option.index == undefined ? this.getCurrentDataIndex(e).index : option.index;
+    if (index > -1) {
+      var opts = assign({}, this.opts, {animation: false});
+      var seriesData = assign({}, opts._series_[index]);
+      var textList = [{
+        text: option.formatter ? option.formatter(seriesData, undefined, index, opts) : seriesData.name + ': ' + seriesData.data,
+        color: seriesData.color,
+        legendShape: this.opts.extra.tooltip.legendShape == 'auto' ? seriesData.legendShape : this.opts.extra.tooltip.legendShape
+      }];
+      var offset = {
+        x: opts.chartData.calPoints[index].x,
+        y: _touches$.y
+      };
+      opts.tooltip = {
+        textList: option.textList ? option.textList : textList,
+        offset: option.offset !== undefined ? option.offset : offset,
+        option: option,
+        index: index
+      };
+    }
+    
     drawCharts.call(this, opts.type, opts, this.config, this.context);
   }
   if (this.opts.type === 'bar') {
@@ -6642,7 +7538,8 @@
       var seriesData = assign({}, opts._series_[index]);
       var textList = [{
         text: option.formatter ? option.formatter(seriesData, undefined, index, opts) : seriesData.name + ': ' + seriesData.data,
-        color: seriesData.color
+        color: seriesData.color,
+        legendShape: this.opts.extra.tooltip.legendShape == 'auto' ? seriesData.legendShape : this.opts.extra.tooltip.legendShape
       }];
       var offset = {
         x: _touches$.x,
@@ -6665,7 +7562,8 @@
       seriesData.name = seriesData.properties.name
       var textList = [{
         text: option.formatter ? option.formatter(seriesData, undefined, index, this.opts) : seriesData.name,
-        color: seriesData.color
+        color: seriesData.color,
+        legendShape: this.opts.extra.tooltip.legendShape == 'auto' ? seriesData.legendShape : this.opts.extra.tooltip.legendShape
       }];
       var offset = {
         x: _touches$.x,
@@ -6688,7 +7586,8 @@
       var seriesData = assign({}, this.opts.series[index]);
       var textList = [{
         text: option.formatter ? option.formatter(seriesData, undefined, index, this.opts) : seriesData.name,
-        color: seriesData.color
+        color: seriesData.color,
+        legendShape: this.opts.extra.tooltip.legendShape == 'auto' ? seriesData.legendShape : this.opts.extra.tooltip.legendShape
       }];
       var offset = {
         x: _touches$.x,
@@ -6713,7 +7612,8 @@
         var textList = seriesData.map((item) => {
           return {
             text: option.formatter ? option.formatter(item, this.opts.categories[index], index, this.opts) : item.name + ': ' + item.data,
-            color: item.color
+            color: item.color,
+            legendShape: this.opts.extra.tooltip.legendShape == 'auto' ? item.legendShape : this.opts.extra.tooltip.legendShape
           };
         });
         var offset = {
@@ -6767,6 +7667,7 @@
   let currMoveTime = Date.now();
   let duration = currMoveTime - this.scrollOption.lastMoveTime;
   if (duration < Math.floor(1000 / Limit)) return;
+  if (this.scrollOption.startTouchX == 0) return;
   this.scrollOption.lastMoveTime = currMoveTime;
   var touches = null;
   if (e.changedTouches) {
@@ -6798,6 +7699,7 @@
       distance = _scrollOption.distance;
     this.scrollOption.currentOffset = currentOffset + distance;
     this.scrollOption.distance = 0;
+    this.scrollOption.moveCount = 0;
   }
 };
 

--
Gitblit v1.9.1