diff --git a/app/data/bar.js b/app/data/bar.js index 061f10c..848a089 100644 --- a/app/data/bar.js +++ b/app/data/bar.js @@ -179,6 +179,22 @@ export default { direction: 'row' } }, + { + title: '设置坐标轴刻度标签和轴线显隐', + data: groupData, + settings: { + direction: 'row', + label: { + show: true, + fontSize: '12', + fontWeight: 'bold' + }, + xAxisLabelShow: false, + xAxisLineShow: false, + yAxisLabelShow: true, + yAxisLineShow: false + } + }, { title: '堆叠条形图', data: groupData, @@ -194,7 +210,9 @@ export default { data: mixinData, settings: { secondMeaAxis: 'Vue', - yAxisLabelType: ['en', 'zh'] + yAxisLabelType: ['en', 'zh'], + yAxisLabelColor: ['rgba(209, 10, 220, 1)', 'rgba(247, 14, 6, 1)'], + xAxisLabelColor: 'rgba(14, 33, 237, 1)' } }, { diff --git a/app/data/line.js b/app/data/line.js index b5f4f0f..2514163 100644 --- a/app/data/line.js +++ b/app/data/line.js @@ -160,7 +160,32 @@ export default { fontSize: '12', fontWeight: 'bold' }, - smooth: true + smooth: true, + yAxisLabelColor: 'rgba(209, 10, 220, 1)', + xAxisLabelColor: 'rgba(14, 33, 237, 1)' + } + }, + { + title: '折线图设置 - 刻度标签、轴线显隐', + data: baseData, + settings: { + label: { + show: true, + fontSize: '12', + fontWeight: 'bold' + }, + smooth: true, + yAxisLabelShow: false, + yAxisLineShow: false + } + }, + { + title: '折线图设置 - 坐标轴翻转', + data: simpleData, + settings: { + smooth: true, + xAxisInverse: true, + yAxisInverse: false } }, { diff --git a/app/data/radar.js b/app/data/radar.js index 8f4c40a..eeca946 100644 --- a/app/data/radar.js +++ b/app/data/radar.js @@ -13,6 +13,21 @@ const baseData = { ] } +const polarData = { + dimensions: [ + { name: '销售(sales)', max: 52000 }, + { name: '管理(Administration)', max: 52000 }, + { name: '信息技术(Information Techology)', max: 52000 }, + { name: '客服(Customer Support)', max: 52000 }, + { name: '研发(Development)', max: 52000 }, + { name: '市场(Marketing)', max: 52000 } + ], + measures: [ + { name: '预算分配(Allocated Budget)', data: [37000, 30000, 28000, 35000, 35000, 19000] }, + { name: '实际开销(Actual Spending)', data: [23000, 24000, 28000, 31000, 42000, 21000] } + ] +} + export default { name: '雷达图', type: 'radar', @@ -35,6 +50,39 @@ export default { } } }, + { + title: '雷达图设置 - 数据标签', + data: baseData, + settings: { + radius: 120, + splitNumber: 4, + shape: 'circle', + label: { + show: true, + color: 'auto', + fontFamily: 'MicroSoft YaHei', + fontSize: '12', + fontWeight: 'bold', + formatDigits: 0, + formatType: 'currency', + position: 'top' + } + } + }, + { + title: '雷达图(带刻度)', + data: polarData, + xprops: { + tickMarkVisible: true + }, + settings: { + radius: 120, + splitNumber: 4, + fontSize: 14, + color: 'rgba(64, 177, 126, 1)', + shape: 'circle' + } + }, { title: '自定义雷达图', data: baseData, diff --git a/docs/chart-bar.md b/docs/chart-bar.md index 293f441..e1fc093 100644 --- a/docs/chart-bar.md +++ b/docs/chart-bar.md @@ -214,6 +214,47 @@ } +## 设置坐标轴刻度标签和轴线显隐 + + + + + ## 对比条形图 @@ -409,7 +450,9 @@ }] } this.chartSettings = { - secondMeaAxis: 'Vue' + secondMeaAxis: 'Vue', + yAxisLabelColor: ['rgba(209, 10, 220, 1)', 'rgba(247, 14, 6, 1)'], + xAxisLabelColor: 'rgba(14, 33, 237, 1)' } } } @@ -658,6 +701,14 @@ | yAxisMin | 坐标轴刻度最小值 | Array | - | 参见[文档](https://www.echartsjs.com/option.html#yAxis.min) | | yAxisScale | 是否是脱离 0 值比例。设置成 true 后坐标刻度不会强制包含零刻度 | Boolean | - | 参见[文档](https://www.echartsjs.com/option.html#yAxis.scale) | | yAxisName | 坐标轴名称 | Array | - | 参见[文档](https://www.echartsjs.com/option.html#yAxis.name) | +| xAxisName | 坐标轴名称 | String | - | 参见[文档](https://echarts.apache.org/zh/option.html#xAxis.name) | | percentage | 是否是百分比堆叠柱状图,通常结合 `yAxisLabelType` 一起使用 | Boolean | `true`/`false` | 默认 `false` | | xAxisInverse | X轴方向反向| Boolean | `true`/`false` | 默认 `false` 参见[文档](https://www.echartsjs.com/zh/option.html#xAxis.inverse) | -| yAxisInverse | Y轴方向反向| Boolean | `true`/`false` | 默认 `false` 参见[文档](https://www.echartsjs.com/zh/option.html#yAxis.inverse) | +| yAxisInverse | Y轴方向反向| Boolean/Array | `true`/`false` | 默认 `false` 参见[文档](https://www.echartsjs.com/zh/option.html#yAxis.inverse) | +| yAxisLabelShow | 纵坐标轴刻度标签显隐| Boolean/Array | `true`/`false`| 默认 `true` | +| yAxisLabelColor | 横坐标轴刻度标签文字颜色| String | - | 默认 null | +| yAxisLineShow | 纵坐标轴轴线显隐| Boolean/Array | `true`/`false`| 默认 `true` | +| xAxisLabelShow | 横坐标轴刻度标签显隐| Boolean | `true`/`false`| 默认 `true` | +| xAxisLabelColor | 横坐标轴刻度标签文字颜色| String | - | 默认 null | +| xAxisLineShow | 横坐标轴轴线显隐| Boolean | `true`/`false`| 默认 `true` | +| xAxisSplitLine | 坐标轴分隔线| Object | - | 默认不显示 | https://echarts.apache.org/zh/option.html#xAxis.splitLine | \ No newline at end of file diff --git a/docs/chart-line.md b/docs/chart-line.md index 5514d2b..2286f00 100644 --- a/docs/chart-line.md +++ b/docs/chart-line.md @@ -268,7 +268,54 @@ fontSize: '12', fontWeight: 'bold' }, - smooth: true + smooth: true, + yAxisLabelColor: 'rgba(209, 10, 220, 1)', + xAxisLabelColor: 'rgba(14, 33, 237, 1)' + } + } + } + + +## 折线图设置 - 刻度标签、轴线显隐 + + + + +## 雷达图 - 指示器 + + + + + +## 雷达图 - 数据标签 + + + + + +## 雷达图 - 刻度线 + + + + + ## 多雷达图 > 覆盖 `radar`及`series` 属性。 @@ -312,6 +446,7 @@ ## settings 配置项 +axisLabel | 配置项 | 简介 | 类型 | 用法 | | --- | --- | --- | --- | @@ -321,3 +456,7 @@ | shape | 雷达图绘制类型。支持 'polygon' 和 'circle' | String | 参见圆形雷达图 | | splitArea | 坐标轴在 grid 区域中的分隔区域,默认不显示 | Object | 参见圆形雷达图。具体配置项参考[文档](https://echarts.apache.org/zh/option.html#radar.splitArea) | | itemStyle | 图形样式 | Object | 参见基础雷达图(面积)。具体配置项参考[文档](https://echarts.apache.org/zh/option.html#series-radar.itemStyle) | +| name | 指示器样式 | Object | 参见配置雷达图。具体配置项参考[文档](https://echarts.apache.org/zh/option.html#radar.name) | +| label | 数据标签| Object | 参见配置雷达图。具体配置项参考[文档](https://echarts.apache.org/zh/option.html#series-radar.label) | +| axisLabel | 坐标轴刻度标签 | Object | 参见配置雷达图。具体配置项参考[文档](https://echarts.apache.org/zh/option.html#radiusAxis.axisLabel) | +| axisLine | 坐标轴轴线相关设置 | Object | 参见配置雷达图。具体配置项参考[文档](https://echarts.apache.org/zh/option.html#radiusAxis.axisLine) | diff --git a/src/mixins/core.js b/src/mixins/core.js index ad10d24..1bb2ead 100644 --- a/src/mixins/core.js +++ b/src/mixins/core.js @@ -57,6 +57,7 @@ export default { // ve-charts custom props tooltipVisible: { type: Boolean, default: true }, legendVisible: { type: Boolean, default: true }, + tickMarkVisible: { type: Boolean, default: false }, // 雷达图是否显示刻度 legendPosition: String, theme: [String, Object], loading: { type: Boolean, default: false }, @@ -128,6 +129,7 @@ export default { legendVisible: this.legendVisible, isEmptyData: this.isEmptyData, isEmptySeries: this.isEmptySeries, + tickMarkVisible: this.tickMarkVisible, _once: this._once } if (this.beforeConfig) data = this.beforeConfig(data) diff --git a/src/packages/bar/chart.js b/src/packages/bar/chart.js index b9042d5..7fb84af 100644 --- a/src/packages/bar/chart.js +++ b/src/packages/bar/chart.js @@ -48,18 +48,31 @@ class BarChart extends BaseChart { // build dimension Axis static getBarDimAxis (settings) { - const { dimAxisType } = settings + const { dimAxisType, dimAxisLineShow, dimAxisLabelShow, dimAxisLabelColor, xAxisName, xAxisSplitLine } = settings const axisItem = { type: dimAxisType, + axisLine: { + show: Array.isArray(dimAxisLineShow) ? dimAxisLineShow[0] : dimAxisLineShow + }, axisTick: { show: false }, axisLabel: { + show: Array.isArray(dimAxisLabelShow) ? dimAxisLabelShow[0] : dimAxisLabelShow, margin: 10, - fontWeight: 400 + fontWeight: 400, + color: Array.isArray(dimAxisLabelColor) ? dimAxisLabelColor[0] : dimAxisLabelColor } } + if (xAxisName) { + axisItem.name = xAxisName + } + + if (xAxisSplitLine) { + axisItem.splitLine = xAxisSplitLine + } + const disAxis = [] disAxis.push(axisItem) return disAxis @@ -70,6 +83,9 @@ class BarChart extends BaseChart { const { meaAxisType, meaAxisDigits, + meaAxisLineShow, + meaAxisLabelShow, + meaAxisLabelColor, yAxisScale = false, percentage = false, yAxisName, @@ -91,8 +107,10 @@ class BarChart extends BaseChart { const meaAxis = [] meaAxisType.forEach((type, i) => { const axisLabel = { + show: Array.isArray(meaAxisLabelShow) ? meaAxisLabelShow[i] : meaAxisLabelShow, margin: 10, - fontWeight: 400 + fontWeight: 400, + color: Array.isArray(meaAxisLabelColor) ? meaAxisLabelColor[i] : meaAxisLabelColor } if (type !== 'normal') { // Y轴标签格式化后保留几位小数兼容之前版本类型 @@ -103,9 +121,14 @@ class BarChart extends BaseChart { axisLabel.formatter = value => formatMeasure(type, value, meaAxisDigits) } } + const axisLine = { + show: Array.isArray(meaAxisLineShow) ? meaAxisLineShow[i] : meaAxisLineShow + } + const axisItem = { ...meaAxisBase, - axisLabel + axisLabel, + axisLine } if (yAxisName && yAxisName.length) { axisItem['name'] = yAxisName[i] @@ -204,9 +227,15 @@ class BarChart extends BaseChart { yAxisLabelType, yAxisLabelDigits = 0, yAxisName, + yAxisLabelShow = [true, true], + yAxisLineShow = [true, true], + yAxisLabelColor = [null, null], xAxisLabelType, xAxisLabelDigits = 0, - xAxisName + xAxisName, + xAxisLabelShow = true, + xAxisLineShow = true, + xAxisLabelColor = null } = settings // 默认柱状图 @@ -218,9 +247,15 @@ class BarChart extends BaseChart { settings.meaAxisType = (isBar ? xAxisLabelType : yAxisLabelType) || defaultMeaAxisType settings.meaAxisDigits = isBar ? xAxisLabelDigits : yAxisLabelDigits settings.meaAxisName = (isBar ? xAxisName : yAxisName) || [] + settings.meaAxisLabelShow = (isBar ? xAxisLabelShow : yAxisLabelShow) + settings.meaAxisLineShow = (isBar ? xAxisLineShow : yAxisLineShow) + settings.meaAxisLabelColor = (isBar ? xAxisLabelColor : yAxisLabelColor) settings.dimAxisType = (isBar ? yAxisLabelType : xAxisLabelType) || 'category' settings.dimAxisDigits = isBar ? yAxisLabelDigits : xAxisLabelDigits settings.dimAxisName = (isBar ? yAxisName : xAxisName) || '' + settings.dimAxisLabelShow = (isBar ? yAxisLabelShow : xAxisLabelShow) + settings.dimAxisLineShow = (isBar ? yAxisLineShow : xAxisLineShow) + settings.dimAxisLabelColor = (isBar ? yAxisLabelColor : xAxisLabelColor) // 如果设置了双Y轴,将双Y轴统一设置 meaAxisType if (defaultMeaAxisType.length > settings.meaAxisType.length) { @@ -244,7 +279,7 @@ class BarChart extends BaseChart { // 处理X轴和Y轴翻转 const { yAxisInverse, xAxisInverse } = settings - if (yAxisInverse !== undefined) yAxis.forEach(i => { i.inverse = yAxisInverse }) + if (yAxisInverse !== undefined) yAxis.forEach((i, index) => { i.inverse = Array.isArray(yAxisInverse) ? yAxisInverse[index] : yAxisInverse }) if (xAxisInverse !== undefined) xAxis.forEach(i => { i.inverse = xAxisInverse }) // build echarts options diff --git a/src/packages/line/chart.js b/src/packages/line/chart.js index af33ad8..a471697 100644 --- a/src/packages/line/chart.js +++ b/src/packages/line/chart.js @@ -24,19 +24,27 @@ class LineChart extends BaseChart { } } - static getLineDimAxis (args) { - const { settings } = args - const type = settings.yAxisType || 'category' + static getLineDimAxis ({ settings }) { + const { yAxisType, xAxisLabelShow = true, xAxisLineShow = true, xAxisLabelColor, xAxisInverse = false, xAxisName, xAxisSplitLine } = settings + const type = yAxisType || 'category' return { type, boundaryGap: false, + axisLine: { + show: xAxisLineShow + }, axisTick: { show: false }, axisLabel: { + show: xAxisLabelShow, margin: 10, - fontWeight: 400 - } + fontWeight: 400, + color: xAxisLabelColor || null + }, + inverse: xAxisInverse, + name: xAxisName !== undefined ? xAxisName : null, + splitLine: xAxisSplitLine !== undefined ? xAxisSplitLine : null } } @@ -50,18 +58,27 @@ class LineChart extends BaseChart { yAxisInterval, yAxisMax, yAxisMin, - percentage = false + yAxisInverse, + percentage = false, + yAxisLabelShow = true, + yAxisLineShow = true, + yAxisLabelColor } = settings let axisValue = { type: 'value', scale: yAxisScale, + axisLine: { + show: yAxisLineShow + }, axisTick: { show: false }, axisLabel: { + show: yAxisLabelShow, margin: 10, fontWeight: 400, + color: yAxisLabelColor || null, formatter: value => formatMeasure(yAxisLabelType, value, yAxisLabelDigits) }, min: percentage ? 0 : null, @@ -71,6 +88,7 @@ class LineChart extends BaseChart { if (yAxisInterval) axisValue['interval'] = Number(yAxisInterval) if (yAxisMax) axisValue['max'] = yAxisMax if (yAxisMin) axisValue['min'] = yAxisMin + if (yAxisInverse !== undefined) axisValue['inverse'] = yAxisInverse return axisValue } diff --git a/src/packages/radar/chart.js b/src/packages/radar/chart.js index c724d31..fcd0563 100644 --- a/src/packages/radar/chart.js +++ b/src/packages/radar/chart.js @@ -1,3 +1,4 @@ +import { formatMeasure } from '../../utils' import BaseChart from '../../BaseChart' class RadarChart extends BaseChart { @@ -20,13 +21,12 @@ class RadarChart extends BaseChart { static getRadarRadar (args) { const { data, settings } = args - const { offsetY = '50%', radius = '75%', splitNumber = 5, shape = 'polygon', splitArea = {} } = settings + const { offsetY = '50%', radius = '75%', splitNumber = 5, shape = 'polygon', splitArea = {}, name = {} } = settings return { name: { - textStyle: { - padding: [3, 5] - } + padding: [3, 5], + ...name }, center: ['50%', offsetY], radius, @@ -37,9 +37,28 @@ class RadarChart extends BaseChart { } } - static getRadarSeries (args) { - const { itemStyle } = args - const { measures } = args.data + static getRadarLabel (args) { + const { + formatType = 'currency', + formatDigits = 0, + ...others + } = args + const formatter = params => { + const { value } = params + // dataset formatter need shift the value + return formatMeasure(formatType, value, formatDigits) + } + return { + normal: { + formatter, + ...others + } + } + } + + static getRadarSeries ({ data, settings }) { + const { measures } = data + const { label, itemStyle } = settings const series = [] measures.forEach((data, idx) => { @@ -49,15 +68,53 @@ class RadarChart extends BaseChart { name: data.name, value: data.data }], + label: label && RadarChart.getRadarLabel(label), itemStyle: Object.assign({}, itemStyle) }) }) return series } + static getRadiusPolar ({ data, settings }) { + const { splitNumber = 5, offsetY = '50%', radius = '75%', axisLabel = {}, axisLine = {} } = settings + const max = data.dimensions[0].max + const min = 0 + const interval = (max - min) / splitNumber + + return { + polar: { + radius, + center: ['50%', offsetY] + }, + radiusAxis: { + min, + max, + interval: Math.round(interval * 100) / 100, + splitLine: { + show: false + }, + axisLabel, + axisLine + }, + angleAxis: { + axisTick: { + show: false + }, + axisLabel: { + show: false + }, + axisLine: { + show: false + }, + splitLine: { + show: false + } + } + } + } + radar (data, settings, extra) { - const { tooltipVisible, legendVisible, isEmptyData } = extra - const { itemStyle } = settings + const { tooltipVisible, legendVisible, isEmptyData, tickMarkVisible } = extra if (isEmptyData) return {} @@ -67,18 +124,19 @@ class RadarChart extends BaseChart { const radar = RadarChart.getRadarRadar({ data, settings }) - const series = RadarChart.getRadarSeries({ data, itemStyle }) + const series = RadarChart.getRadarSeries({ data, settings }) + + const polarOptions = tickMarkVisible ? RadarChart.getRadiusPolar({ data, settings }) : {} // build echarts options const options = { tooltip, legend, radar, - series + series, + ...polarOptions } - // console.log(options) - return options } }