|
|
@@ -0,0 +1,186 @@
|
|
|
+import * as echarts from 'echarts'
|
|
|
+
|
|
|
+// 生成模拟数据 - 中图分类统计
|
|
|
+const generateZhongTuData = () => {
|
|
|
+ const categories = [
|
|
|
+ 'A 马克思主义、列宁主义、毛泽东思想、邓小平理论',
|
|
|
+ 'B 哲学、宗教',
|
|
|
+ 'C 社会科学总论',
|
|
|
+ 'D 政治、法律',
|
|
|
+ 'E 军事',
|
|
|
+ 'F 经济',
|
|
|
+ 'G 文化、科学、教育、体育',
|
|
|
+ 'H 语言、文字',
|
|
|
+ 'I 文学',
|
|
|
+ 'J 艺术',
|
|
|
+ 'K 历史、地理',
|
|
|
+ 'N 自然科学总论',
|
|
|
+ 'O 数理科学和化学',
|
|
|
+ 'P 天文学、地球科学',
|
|
|
+ 'Q 生物科学',
|
|
|
+ 'R 医药、卫生',
|
|
|
+ 'S 农业科学',
|
|
|
+ 'T 工业技术',
|
|
|
+ 'U 交通运输',
|
|
|
+ 'V 航空、航天',
|
|
|
+ 'X 环境科学、安全科学',
|
|
|
+ 'Z 综合性图书',
|
|
|
+ ]
|
|
|
+
|
|
|
+ return categories.map(name => ({
|
|
|
+ name,
|
|
|
+ value: Math.floor(Math.random() * 500) + 50
|
|
|
+ }))
|
|
|
+}
|
|
|
+
|
|
|
+// 生成模拟数据 - 四部分类统计
|
|
|
+const generateSiBuData = () => {
|
|
|
+ const categories = [
|
|
|
+ '经部·易类',
|
|
|
+ '经部·书类',
|
|
|
+ '经部·诗类',
|
|
|
+ '经部·礼类',
|
|
|
+ '经部·春秋类',
|
|
|
+ '经部·孝经类',
|
|
|
+ '经部·五经总义类',
|
|
|
+ '经部·四书类',
|
|
|
+ '经部·小学类',
|
|
|
+ '史部·正史类',
|
|
|
+ '史部·编年类',
|
|
|
+ '史部·纪事本末类',
|
|
|
+ '史部·别史类',
|
|
|
+ '史部·杂史类',
|
|
|
+ '史部·诏令奏议类',
|
|
|
+ '史部·传记类',
|
|
|
+ '史部·史抄类',
|
|
|
+ '史部·载记类',
|
|
|
+ '史部·时令类',
|
|
|
+ '史部·地理类',
|
|
|
+ '史部·职官类',
|
|
|
+ '史部·政书类',
|
|
|
+ '史部·目录类',
|
|
|
+ '史部·史评类',
|
|
|
+ '子部·儒家类',
|
|
|
+ '子部·兵家类',
|
|
|
+ '子部·法家类',
|
|
|
+ '子部·农家类',
|
|
|
+ '子部·医家类',
|
|
|
+ '子部·天文算法类',
|
|
|
+ ]
|
|
|
+
|
|
|
+ return categories.map(name => ({
|
|
|
+ name,
|
|
|
+ value: Math.floor(Math.random() * 400) + 30
|
|
|
+ }))
|
|
|
+}
|
|
|
+
|
|
|
+// 生成柱状图
|
|
|
+export const initEchZhuFu = (data: any[], dom: any, type: 'zhongTu' | 'siBu' = 'zhongTu') => {
|
|
|
+ if (!dom) return
|
|
|
+
|
|
|
+ // 销毁已存在的实例
|
|
|
+ const existingChart = echarts.getInstanceByDom(dom)
|
|
|
+ if (existingChart) {
|
|
|
+ existingChart.dispose()
|
|
|
+ }
|
|
|
+
|
|
|
+ const myChart = echarts.init(dom)
|
|
|
+
|
|
|
+ // 根据类型获取数据
|
|
|
+ const chartData = type === 'zhongTu' ? generateZhongTuData() : generateSiBuData()
|
|
|
+ const total = chartData.reduce((sum, item) => sum + item.value, 0)
|
|
|
+
|
|
|
+ const option = {
|
|
|
+ tooltip: {
|
|
|
+ trigger: 'axis',
|
|
|
+ axisPointer: {
|
|
|
+ type: 'shadow'
|
|
|
+ },
|
|
|
+ formatter: (params: any) => {
|
|
|
+ const item = params[0]
|
|
|
+ const percent = ((item.value / total) * 100).toFixed(1)
|
|
|
+ return `${item.name}<br/>数量: ${item.value}<br/>占比: ${percent}%`
|
|
|
+ }
|
|
|
+ },
|
|
|
+ grid: {
|
|
|
+ left: '3%',
|
|
|
+ right: '4%',
|
|
|
+ bottom: '15%',
|
|
|
+ top: '10%',
|
|
|
+ containLabel: true
|
|
|
+ },
|
|
|
+ xAxis: {
|
|
|
+ type: 'category',
|
|
|
+ data: chartData.map(item => item.name),
|
|
|
+ axisLabel: {
|
|
|
+ interval: 0,
|
|
|
+ rotate: 30,
|
|
|
+ fontSize: 11,
|
|
|
+ width: 100,
|
|
|
+ overflow: 'truncate',
|
|
|
+ ellipsis: '...'
|
|
|
+ },
|
|
|
+ axisTick: {
|
|
|
+ alignWithLabel: true
|
|
|
+ }
|
|
|
+ },
|
|
|
+ yAxis: {
|
|
|
+ type: 'value'
|
|
|
+ },
|
|
|
+ series: [
|
|
|
+ {
|
|
|
+ name: type === 'zhongTu' ? '中图分类' : '四部分类',
|
|
|
+ type: 'bar',
|
|
|
+ barWidth: 40,
|
|
|
+ data: chartData.map(item => item.value),
|
|
|
+ itemStyle: {
|
|
|
+ color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
|
|
|
+ { offset: 0, color: type === 'zhongTu' ? '#83bff6' : '#92cc76' },
|
|
|
+ { offset: 0.5, color: type === 'zhongTu' ? '#188df0' : '#5cb85c' },
|
|
|
+ { offset: 1, color: type === 'zhongTu' ? '#188df0' : '#4cae4c' }
|
|
|
+ ])
|
|
|
+ },
|
|
|
+ label: {
|
|
|
+ show: true,
|
|
|
+ position: 'top',
|
|
|
+ formatter: (params: any) => {
|
|
|
+ const percent = ((params.value / total) * 100).toFixed(1)
|
|
|
+ return `${params.value}\n${percent}%`
|
|
|
+ },
|
|
|
+ fontSize: 10,
|
|
|
+ color: '#333',
|
|
|
+ lineHeight: 14
|
|
|
+ },
|
|
|
+ emphasis: {
|
|
|
+ itemStyle: {
|
|
|
+ color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
|
|
|
+ { offset: 0, color: type === 'zhongTu' ? '#2378f7' : '#5cb85c' },
|
|
|
+ { offset: 0.7, color: type === 'zhongTu' ? '#2378f7' : '#4cae4c' },
|
|
|
+ { offset: 1, color: type === 'zhongTu' ? '#83bff6' : '#92cc76' }
|
|
|
+ ])
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ ]
|
|
|
+ }
|
|
|
+
|
|
|
+ myChart.setOption(option)
|
|
|
+
|
|
|
+ // 点击柱子事件
|
|
|
+ myChart.on('click', (params: any) => {
|
|
|
+ console.log('点击柱子信息:', {
|
|
|
+ 分类名称: params.name,
|
|
|
+ 数量: params.value,
|
|
|
+ 占比: ((params.value / total) * 100).toFixed(1) + '%',
|
|
|
+ 系列名称: params.seriesName,
|
|
|
+ 数据索引: params.dataIndex
|
|
|
+ })
|
|
|
+ })
|
|
|
+
|
|
|
+ // 自适应
|
|
|
+ window.addEventListener('resize', () => {
|
|
|
+ myChart.resize()
|
|
|
+ })
|
|
|
+
|
|
|
+ return myChart
|
|
|
+}
|