115 lines
2.7 KiB
JavaScript
115 lines
2.7 KiB
JavaScript
|
|
/** 雷达图 */
|
|||
|
|
import React, { Component } from 'react'
|
|||
|
|
import PropTypes from 'prop-types'
|
|||
|
|
import TableChart from './TableChart'
|
|||
|
|
|
|||
|
|
class RadarChart extends Component {
|
|||
|
|
// 初始化 option
|
|||
|
|
initOption = () => {
|
|||
|
|
const { data, radar, titleText, saveImgName } = this.props
|
|||
|
|
|
|||
|
|
// 设置图例的默认选中,如果没有 Selected 属性,则默认为 true,即默认选中
|
|||
|
|
const legendData = []
|
|||
|
|
const selectedData = {}
|
|||
|
|
data.forEach(item => {
|
|||
|
|
legendData.push({ name: item.Name, icon: 'roundRect' })
|
|||
|
|
selectedData[item.Name] = item.LegendSelected !== undefined ? item.LegendSelected : true
|
|||
|
|
})
|
|||
|
|
|
|||
|
|
return {
|
|||
|
|
title: {
|
|||
|
|
text: titleText,
|
|||
|
|
textStyle: {
|
|||
|
|
fontWeight: 'normal',
|
|||
|
|
fontSize: 16
|
|||
|
|
},
|
|||
|
|
left: 'center',
|
|||
|
|
top: 0
|
|||
|
|
},
|
|||
|
|
legend: {
|
|||
|
|
top: '6%',
|
|||
|
|
left: 'center',
|
|||
|
|
textStyle: {
|
|||
|
|
color: '#333333'
|
|||
|
|
},
|
|||
|
|
data: legendData,
|
|||
|
|
selected: selectedData
|
|||
|
|
},
|
|||
|
|
radar: radar.map(item => ({
|
|||
|
|
name: { color: '#000000' },
|
|||
|
|
nameGap: 8,
|
|||
|
|
center: ['50%', '60%'],
|
|||
|
|
radius: '60%',
|
|||
|
|
indicator: item.IndiCator.map(({ Text: text, Max: max }) => ({ text, max }))
|
|||
|
|
})),
|
|||
|
|
tooltip: {
|
|||
|
|
trigger: 'item'
|
|||
|
|
},
|
|||
|
|
toolbox: {
|
|||
|
|
show: true,
|
|||
|
|
orient: 'vertical',
|
|||
|
|
right: 0,
|
|||
|
|
top: 'center',
|
|||
|
|
itemSize: 12,
|
|||
|
|
feature: {
|
|||
|
|
restore: { show: true },
|
|||
|
|
saveAsImage: { show: true, name: saveImgName || titleText }
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
series: []
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 生成 echarts 所需要 option
|
|||
|
|
getOption = () => {
|
|||
|
|
const option = this.initOption()
|
|||
|
|
|
|||
|
|
// 组装 option.series 数据
|
|||
|
|
const { data } = this.props
|
|||
|
|
data.forEach(item => {
|
|||
|
|
const dataseries = {
|
|||
|
|
name: item.Name,
|
|||
|
|
type: 'radar',
|
|||
|
|
// itemStyle 会同时设置 lineStyle 的 color 配置
|
|||
|
|
itemStyle: {
|
|||
|
|
color: item.Color || ''
|
|||
|
|
},
|
|||
|
|
data: [{
|
|||
|
|
areaStyle: { opacity: 0.2 },
|
|||
|
|
value: item.Data.map(element => element.Value)
|
|||
|
|
}]
|
|||
|
|
}
|
|||
|
|
option.series.push(dataseries)
|
|||
|
|
})
|
|||
|
|
|
|||
|
|
return option
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
render () {
|
|||
|
|
const { loading, style } = this.props
|
|||
|
|
return (
|
|||
|
|
<TableChart
|
|||
|
|
type={3}
|
|||
|
|
option={this.getOption()}
|
|||
|
|
loading={loading}
|
|||
|
|
style={style}
|
|||
|
|
/>
|
|||
|
|
)
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
RadarChart.propTypes = {
|
|||
|
|
data: PropTypes.array,
|
|||
|
|
radar: PropTypes.array,
|
|||
|
|
titleText: PropTypes.string,
|
|||
|
|
saveImgName: PropTypes.string
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
RadarChart.defaultProps = {
|
|||
|
|
data: [], // 图表数据
|
|||
|
|
radar: [], // 雷达配置数据
|
|||
|
|
titleText: '', // 图表 top center 位置的标题
|
|||
|
|
saveImgName: '' // 导出为图片的图片文件名称
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
export default RadarChart
|