|
|
|
@ -19,7 +19,7 @@ |
|
|
|
'use strict'; |
|
|
|
|
|
|
|
var config = { |
|
|
|
version: 'v2.2.0-20210529', |
|
|
|
version: 'v2.3.3-20210706', |
|
|
|
yAxisWidth: 15, |
|
|
|
yAxisSplit: 5, |
|
|
|
xAxisHeight: 22, |
|
|
|
@ -471,7 +471,7 @@ function getDataRange(minData, maxData) { |
|
|
|
function measureText(text, fontSize, context) { |
|
|
|
var width = 0; |
|
|
|
text = String(text); |
|
|
|
// #ifdef MP-ALIPAY || MP-BAIDU
|
|
|
|
// #ifdef MP-ALIPAY || MP-BAIDU || APP-NVUE
|
|
|
|
context = false; |
|
|
|
// #endif
|
|
|
|
if (context !== false && context !== undefined && context.setFontSize && context.measureText) { |
|
|
|
@ -920,6 +920,9 @@ function findRoseChartCurrentIndex(currentPoints, pieData, opts) { |
|
|
|
if (pieData && pieData.center && isInExactPieChartArea(currentPoints, pieData.center, pieData.radius)) { |
|
|
|
var angle = Math.atan2(pieData.center.y - currentPoints.y, currentPoints.x - pieData.center.x); |
|
|
|
angle = -angle; |
|
|
|
if(opts.extra.rose && opts.extra.rose.offsetAngle){ |
|
|
|
angle = angle - opts.extra.rose.offsetAngle * Math.PI / 180; |
|
|
|
} |
|
|
|
for (var i = 0, len = series.length; i < len; i++) { |
|
|
|
if (isInAngleRange(angle, series[i]._start_, series[i]._start_ + series[i]._rose_proportion_ * 2 * Math.PI)) { |
|
|
|
currentIndex = i; |
|
|
|
@ -930,12 +933,18 @@ function findRoseChartCurrentIndex(currentPoints, pieData, opts) { |
|
|
|
return currentIndex; |
|
|
|
} |
|
|
|
|
|
|
|
function findPieChartCurrentIndex(currentPoints, pieData) { |
|
|
|
function findPieChartCurrentIndex(currentPoints, pieData, opts) { |
|
|
|
var currentIndex = -1; |
|
|
|
var series = getPieDataPoints(pieData.series); |
|
|
|
if (pieData && pieData.center && isInExactPieChartArea(currentPoints, pieData.center, pieData.radius)) { |
|
|
|
var angle = Math.atan2(pieData.center.y - currentPoints.y, currentPoints.x - pieData.center.x); |
|
|
|
angle = -angle; |
|
|
|
if(opts.extra.pie && opts.extra.pie.offsetAngle){ |
|
|
|
angle = angle - opts.extra.pie.offsetAngle * Math.PI / 180; |
|
|
|
} |
|
|
|
if(opts.extra.ring && opts.extra.ring.offsetAngle){ |
|
|
|
angle = angle - opts.extra.ring.offsetAngle * Math.PI / 180; |
|
|
|
} |
|
|
|
for (var i = 0, len = series.length; i < len; i++) { |
|
|
|
if (isInAngleRange(angle, series[i]._start_, series[i]._start_ + series[i]._proportion_ * 2 * Math.PI)) { |
|
|
|
currentIndex = i; |
|
|
|
@ -1269,6 +1278,7 @@ function getRadarDataPoints(angleList, center, radius, series, opts) { |
|
|
|
let tmp = {}; |
|
|
|
tmp.angle = angleList[index]; |
|
|
|
tmp.proportion = item / maxData; |
|
|
|
tmp.value = item; |
|
|
|
tmp.position = convertCoordinateOrigin(radius * tmp.proportion * process * Math.cos(tmp.angle), radius * tmp.proportion * process * Math.sin(tmp.angle), center); |
|
|
|
listItem.data.push(tmp); |
|
|
|
}); |
|
|
|
@ -1813,8 +1823,8 @@ function getYAxisTextList(series, opts, config, stack, yData) { |
|
|
|
maxData += rangeSpan; |
|
|
|
} |
|
|
|
var dataRange = getDataRange(minData, maxData); |
|
|
|
var minRange = yData.min === undefined ? dataRange.minRange : yData.min; |
|
|
|
var maxRange = yData.max === undefined ? dataRange.maxRange : yData.max; |
|
|
|
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 eachRange = (maxRange - minRange) / opts.yAxis.splitNumber; |
|
|
|
for (var i = 0; i <= opts.yAxis.splitNumber; i++) { |
|
|
|
@ -1942,7 +1952,7 @@ function calTooltipYAxisData(point, series, opts, config, eachSpacing) { |
|
|
|
let maxVal = ranges[i].shift(); |
|
|
|
let minVal = ranges[i].pop(); |
|
|
|
let item = maxVal - (maxVal - minVal) * (point - minAxis) / spacingValid; |
|
|
|
item = opts.yAxis.data[i].formatter ? opts.yAxis.data[i].formatter(Number(item)) : item.toFixed(0); |
|
|
|
item = opts.yAxis.data[i].formatter ? opts.yAxis.data[i].formatter(item) : item.toFixed(0); |
|
|
|
items.push(String(item)) |
|
|
|
} |
|
|
|
return items; |
|
|
|
@ -2350,7 +2360,7 @@ function drawMarkLine(opts, config, context) { |
|
|
|
context.stroke(); |
|
|
|
context.setLineDash([]); |
|
|
|
if (item.showLabel) { |
|
|
|
let labelText = opts.yAxis.formatter ? opts.yAxis.formatter(Number(item.value)) : item.value; |
|
|
|
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; |
|
|
|
@ -2659,18 +2669,11 @@ function drawColumnDataPoints(series, opts, config, context) { |
|
|
|
columnOption.barBorderRadius = [width / 2, width / 2, 0, 0]; |
|
|
|
} |
|
|
|
let [r0, r1, r2, r3] = columnOption.barBorderRadius; |
|
|
|
if (r0 + r2 > height) { |
|
|
|
r0 = height; |
|
|
|
r2 = 0; |
|
|
|
r1 = height; |
|
|
|
r3 = 0; |
|
|
|
} |
|
|
|
if (r0 + r2 > width / 2) { |
|
|
|
r0 = width / 2; |
|
|
|
r2 = 0; |
|
|
|
r1 = width / 2; |
|
|
|
r3 = 0; |
|
|
|
} |
|
|
|
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; |
|
|
|
@ -2733,19 +2736,43 @@ function drawColumnDataPoints(series, opts, config, context) { |
|
|
|
context.setFillStyle(columnOption.meterFillColor); |
|
|
|
var startX = item.x - item.width / 2; |
|
|
|
var height = opts.height - item.y - opts.area[2]; |
|
|
|
context.moveTo(startX, item.y); |
|
|
|
context.fillRect(startX, item.y, item.width, height); |
|
|
|
context.closePath(); |
|
|
|
context.fill(); |
|
|
|
if (columnOption.barBorderCircle) { |
|
|
|
var barBorderRadius = (item.width - columnOption.meterBorder*2) / 2; |
|
|
|
if(barBorderRadius>height){ |
|
|
|
barBorderRadius = height; |
|
|
|
} |
|
|
|
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]); |
|
|
|
context.fill(); |
|
|
|
}else{ |
|
|
|
context.moveTo(startX, item.y); |
|
|
|
context.fillRect(startX, item.y, item.width, height); |
|
|
|
context.closePath(); |
|
|
|
context.fill(); |
|
|
|
} |
|
|
|
//画边框线
|
|
|
|
if (columnOption.meterBorder > 0) { |
|
|
|
context.beginPath(); |
|
|
|
context.setStrokeStyle(eachSeries.color); |
|
|
|
context.setLineWidth(columnOption.meterBorder * opts.pix); |
|
|
|
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 (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); |
|
|
|
} |
|
|
|
context.stroke(); |
|
|
|
} |
|
|
|
} |
|
|
|
@ -2758,10 +2785,23 @@ function drawColumnDataPoints(series, opts, config, context) { |
|
|
|
context.setFillStyle(item.color || eachSeries.color); |
|
|
|
var startX = item.x - item.width / 2; |
|
|
|
var height = opts.height - item.y - opts.area[2]; |
|
|
|
context.moveTo(startX, item.y); |
|
|
|
context.fillRect(startX, item.y, item.width, height); |
|
|
|
context.closePath(); |
|
|
|
context.fill(); |
|
|
|
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(); |
|
|
|
} |
|
|
|
} |
|
|
|
}; |
|
|
|
} |
|
|
|
@ -3617,18 +3657,11 @@ function drawMixDataPoints(series, opts, config, context) { |
|
|
|
columnOption.barBorderRadius = [width / 2, width / 2, 0, 0]; |
|
|
|
} |
|
|
|
let [r0, r1, r2, r3] = columnOption.barBorderRadius; |
|
|
|
if (r0 + r2 > height) { |
|
|
|
r0 = height; |
|
|
|
r2 = 0; |
|
|
|
r1 = height; |
|
|
|
r3 = 0; |
|
|
|
} |
|
|
|
if (r0 + r2 > width / 2) { |
|
|
|
r0 = width / 2; |
|
|
|
r2 = 0; |
|
|
|
r1 = width / 2; |
|
|
|
r3 = 0; |
|
|
|
} |
|
|
|
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; |
|
|
|
@ -3935,7 +3968,7 @@ function drawXAxis(categories, opts, config, context) { |
|
|
|
}); |
|
|
|
} else { |
|
|
|
newCategories.forEach(function(item, index) { |
|
|
|
var xitem = opts.xAxis.formatter ? opts.xAxis.formatter(Number(item)) : item; |
|
|
|
var xitem = opts.xAxis.formatter ? opts.xAxis.formatter(item) : item; |
|
|
|
context.save(); |
|
|
|
context.beginPath(); |
|
|
|
context.setFontSize(xAxisFontSize); |
|
|
|
@ -4855,6 +4888,42 @@ function drawRadarDataPoints(series, opts, config, context) { |
|
|
|
}); |
|
|
|
// draw label text
|
|
|
|
drawRadarLabel(coordinateAngle, radius, centerPosition, opts, config, context); |
|
|
|
|
|
|
|
// draw dataLabel
|
|
|
|
if (opts.dataLabel !== false && process === 1) { |
|
|
|
radarDataPoints.forEach(function(eachSeries, seriesIndex) { |
|
|
|
context.beginPath(); |
|
|
|
var fontSize = eachSeries.textSize * opts.pix || config.fontSize; |
|
|
|
context.setFontSize(fontSize); |
|
|
|
context.setFillStyle(eachSeries.textColor || opts.fontColor); |
|
|
|
eachSeries.data.forEach(function(item, index) { |
|
|
|
//如果是中心点垂直的上下点位
|
|
|
|
if(Math.abs(item.position.x - centerPosition.x)<2){ |
|
|
|
//如果在上面
|
|
|
|
if(item.position.y < centerPosition.y){ |
|
|
|
context.setTextAlign('center'); |
|
|
|
context.fillText(item.value, item.position.x, item.position.y - 4); |
|
|
|
}else{ |
|
|
|
context.setTextAlign('center'); |
|
|
|
context.fillText(item.value, item.position.x, item.position.y + fontSize + 2); |
|
|
|
} |
|
|
|
}else{ |
|
|
|
//如果在左侧
|
|
|
|
if(item.position.x < centerPosition.x){ |
|
|
|
context.setTextAlign('right'); |
|
|
|
context.fillText(item.value, item.position.x - 4, item.position.y + fontSize / 2 - 2); |
|
|
|
}else{ |
|
|
|
context.setTextAlign('left'); |
|
|
|
context.fillText(item.value, item.position.x + 4, item.position.y + fontSize / 2 - 2); |
|
|
|
} |
|
|
|
} |
|
|
|
}); |
|
|
|
context.closePath(); |
|
|
|
context.stroke(); |
|
|
|
}); |
|
|
|
context.setTextAlign('left'); |
|
|
|
} |
|
|
|
|
|
|
|
return { |
|
|
|
center: centerPosition, |
|
|
|
radius: radius, |
|
|
|
@ -6259,6 +6328,10 @@ var uCharts = function uCharts(opts) { |
|
|
|
} |
|
|
|
this.context.draw = function() {} |
|
|
|
} |
|
|
|
//兼容NVUEsetLineDash
|
|
|
|
if(!this.context.setLineDash){ |
|
|
|
this.context.setLineDash = function(e) {} |
|
|
|
} |
|
|
|
opts.chartData = {}; |
|
|
|
this.uevent = new uChartsEvent(); |
|
|
|
this.scrollOption = { |
|
|
|
@ -6378,7 +6451,7 @@ uCharts.prototype.getCurrentDataIndex = function(e) { |
|
|
|
return findPieChartCurrentIndex({ |
|
|
|
x: _touches$.x, |
|
|
|
y: _touches$.y |
|
|
|
}, this.opts.chartData.pieData); |
|
|
|
}, this.opts.chartData.pieData, this.opts); |
|
|
|
} else if (this.opts.type === 'rose') { |
|
|
|
return findRoseChartCurrentIndex({ |
|
|
|
x: _touches$.x, |
|
|
|
|