import { isArray } from 'utils-lite' import { itemPoint } from '../../constants' import { getFormated } from '../../utils' import { line } from '../line/main' function getScatterLegend (dataLabels, legendName) { return { data: dataLabels, formatter (name) { return legendName[name] != null ? legendName[name] : name } } } function getScatterTooltip (args) { const { tooltipTrigger } = args return { trigger: tooltipTrigger, formatter (item) { if (isArray(item)) { return item.map(i => getTooltipContent(i, args)).join('') } else { return getTooltipContent(item, args) } } } } function getTooltipContent (item, args) { const { labelMap, columns, dataType, digit } = args const tpl = [] const { color, seriesName, data: { value } } = item tpl.push(`${itemPoint(color)} ${seriesName}
`) value.forEach((d, i) => { const name = labelMap[columns[i]] || columns[i] const num = isNaN(d) ? d : getFormated(d, dataType[columns[i]], digit) tpl.push(`${name}: ${num}
`) }) return tpl.join('') } function getScatterXAxis (args) { const { xAxisName, axisVisible, xAxisType, rows, dataLabels, dimension } = args const data = [] dataLabels.forEach(dataLabel => { const itemData = rows[dataLabel] itemData.forEach(item => { const name = item[dimension] if (name && !~data.indexOf(name)) data.push(name) }) }) return [{ type: xAxisType, show: axisVisible, name: xAxisName, data }] } function getScatterYAxis (args) { const { min, max, scale, yAxisName, dataType, metrics, digit, axisVisible } = args return { type: 'value', show: axisVisible, scale, min, max, axisTick: { show: false }, name: yAxisName, axisLabel: { formatter (val) { return getFormated(val, dataType[metrics[0]], digit) } } } } function getScatterSeries (args) { const { rows, dataLabels, columns, metrics, dimension, label, itemStyle, symbol, symbolSizeMax, symbolSize, symbolRotate, symbolOffset, cursor } = args const extraMetrics = columns.filter(column => { return !~metrics.indexOf(column) && column !== dimension }) const numbers = [] dataLabels.forEach(dataLabel => { rows[dataLabel].forEach(row => { numbers.push(row[metrics[1]]) }) }) const maxNum = Math.max.apply(null, numbers) const series = [] dataLabels.forEach(dataLabel => { const result = [] const itemData = rows[dataLabel] itemData.forEach(item => { const itemResult = { value: [] } itemResult.value.push(item[dimension], item[metrics[0]], item[metrics[1]]) extraMetrics.forEach(ext => { itemResult.value.push(item[ext]) }) itemResult.symbolSize = symbolSize || (item[metrics[1]] / maxNum) * symbolSizeMax result.push(itemResult) }) series.push({ type: 'scatter', data: result, name: dataLabel, label, itemStyle, symbol, symbolRotate, symbolOffset, cursor }) }) return series } const scatter = (columns, rows, settings, extra) => { const { dimension = columns[0], metrics = [columns[1], columns[2]], dataType = {}, xAxisType = 'category', xAxisName, yAxisName, digit = 2, legendName = {}, labelMap = {}, tooltipTrigger = 'item', axisVisible = true, symbolSizeMax = 50, symbol, symbolSize, symbolRotate, symbolOffset, cursor, min, max, scale, label, itemStyle } = settings if (isArray(rows)) { const lineSettings = Object.assign({}, settings, { xAxisName: xAxisName ? [xAxisName] : undefined, yAxisName: yAxisName ? [yAxisName] : undefined, scale: scale ? [scale] : undefined, min: min ? [min] : undefined, max: max ? [max] : undefined, dimension: dimension ? [dimension] : undefined }) const options = line(columns, rows, lineSettings, extra) if (!options || !options.series) return {} options.series.forEach(item => { Object.assign(item, { type: 'scatter', symbol, symbolSize: symbolSize || 10, symbolRotate, symbolOffset, cursor, label, itemStyle }) }) return options } const { tooltipVisible, legendVisible } = extra const dataLabels = Object.keys(rows) const legend = legendVisible && getScatterLegend(dataLabels, legendName) const tooltip = tooltipVisible && getScatterTooltip({ tooltipTrigger, labelMap, columns, dataType, digit }) const xAxis = getScatterXAxis({ xAxisName, axisVisible, xAxisType, dataLabels, dimension, rows }) const yAxis = getScatterYAxis({ min, max, scale, yAxisName, dataType, metrics, digit, axisVisible }) const series = getScatterSeries({ rows, dataLabels, columns, metrics, dimension, label, itemStyle, symbol, symbolSizeMax, symbolSize, symbolRotate, symbolOffset, cursor }) return { legend, tooltip, xAxis, yAxis, series } } export { scatter }