echarts学习笔记:柱状图+雷达图+双环形图+地图可视化+数据传递关系图+关键词条图+数据总览图+AntV/G2/DataV

news2024/11/27 6:41:28

GitHub - lgd8981289/imooc-visualization: https://www.bilibili.com/video/BV1yu411E7cm/?vd_source=391a8dc379e0da60c77490e3221f097a 课程源码

国内echarts镜像站:ISQQW.COM x ECharts 文档(国内同步镜像) - 配置项

echarts图表集:echarts图表集

基于vite和tailwindcss创建项目,使用js

pnpm create vite

 一、横向柱状图,竖向柱状图

echarts图表绘制分为三大步: 

 1.横向柱状图

HorizontalBar.vue

<template>
	<div>
		<div>【大区数据信息】</div>
		<div ref="target" class="w-full h-full"></div>
	</div>
</template>

<script setup>
import { onMounted, ref, watch } from 'vue'
import * as echarts from 'echarts'

const props = defineProps({
	data: {
		type: Object,
		required: true
	}
})

// 获取 dom 实例
const target = ref()

// echarts 实例变量
let mChart = null
// 在 mounted 生命周期之后,实例化 echarts
onMounted(() => {
	mChart = echarts.init(target.value)
	// 渲染 echarts
	renderChart()
})

// 渲染图表
const renderChart = () => {
	const options = {
		// X 轴展示数据
		xAxis: {
			// 数据展示
			type: 'value',
			// 不显示轴
			show: false,
			// 最大值(防止触顶)
			max: function (value) {
				// 取整
				return parseInt(value.max * 1.2)
			}
		},
		// Y 轴展示选项
		yAxis: {
			type: 'category',
			// 根据根据服务端数据筛选
			data: props.data.regions.map((item) => item.name),
			// 反向展示
			inverse: true,
			// 不展示轴线
			axisLine: {
				show: false
			},
			// 不展示刻度
			axisTick: {
				show: false // 取消 Y 轴刻度
			},
			// 文字色值
			axisLabel: {
				color: '#9EB1C8'
			}
		},
		// echarts 网格绘制的位置,对应 上、右、下、左
		grid: {
			top: 0,
			right: 0,
			bottom: 0,
			left: 0,
			// 计算边距时,包含标签
			containLabel: true
		},
		// 柱形图核心配置
		series: [
			{
				// 图表类型
				type: 'bar',
				// 数据筛选
				data: props.data.regions.map((item) => ({
					name: item.name,
					value: item.value
				})),
				// 显示背景
				showBackground: true,
				// 背景色
				backgroundStyle: {
					color: 'rgba(180, 180, 180, 0.2)'
				},
				// 每个轴的样式
				itemStyle: {
					color: '#479AD3', // 设置柱子的颜色
					barBorderRadius: 5, // 设置柱子的圆角
					shadowColor: 'rgba(0, 0, 0, 0.3)', // 设置柱子的阴影颜色
					shadowBlur: 5 // 设置柱子的阴影模糊大小
				},
				// 轴宽度
				barWidth: 12,
				// 轴上的字体
				label: {
					show: true,
					// 设置标签位置为右侧
					position: 'right',
					textStyle: {
						// 设置标签文本颜色
						color: '#fff'
					}
				}
			}
		]
	}

	mChart.setOption(options)
}

// 监听数据的变化,重新渲染图表
watch(
	() => props.data,
	() => {
		renderChart()
	}
)
</script>

<style lang="scss" scoped></style>

2.竖向柱状图

VerticalBar.vue

<template>
	<div>
		<div>【服务资源占用比】</div>
		<div ref="target" class="w-full h-full"></div>
	</div>
</template>

<script setup>
import { onMounted, ref, watch } from 'vue'
import * as echarts from 'echarts'

const props = defineProps({
	data: {
		type: Object,
		required: true
	}
})

const target = ref()
let mChart = null
onMounted(() => {
	mChart = echarts.init(target.value)
	renderChart()
})

const renderChart = () => {
	const options = {
		// X 轴展示选项
		xAxis: {
			type: 'category',
			// 根据根据服务端数据筛选
			data: props.data.servers.map((item) => item.name),
			// 文字色值
			axisLabel: {
				color: '#9EB1C8'
			}
		},
		// Y 轴展示数据
		yAxis: {
			// 数据展示
			type: 'value',
			// 不显示轴
			show: false,
			// 最大值(防止触顶)
			max: function (value) {
				// 取整
				return parseInt(value.max * 1.2)
			}
		},
		// echarts 网格绘制的位置,对应 上、右、下、左
		grid: {
			top: 16,
			right: 0,
			bottom: 26,
			left: -26,
			// 计算边距时,包含标签
			containLabel: true
		},
		// 柱形图核心配置
		series: {
			// 柱形图
			type: 'bar',
			// 数据筛选
			data: props.data.servers.map((item) => ({
				name: item.name,
				value: item.value
			})),
			// 每个轴的样式
			itemStyle: {
				color: '#479AD3', // 设置柱子的颜色
				barBorderRadius: 5, // 设置柱子的圆角
				shadowColor: 'rgba(0, 0, 0, 0.3)', // 设置柱子的阴影颜色
				shadowBlur: 5 // 设置柱子的阴影模糊大小
			},
			// 柱子宽度
			barWidth: 12,
			// 文本
			label: {
				show: true,
				// 设置标签位置为顶部
				position: 'top',
				textStyle: {
					// 设置标签文本颜色
					color: '#fff'
				},
				// 设置数字为百分比
				formatter: '{c}%'
			}
		}
	}

	mChart.setOption(options)
}

// 监听数据的变化,重新渲染图表
watch(()=>props.data,renderChart)
// watch(
// 	() => props.data,
// 	() => {
// 		renderChart()
// 	}
// )
</script>

<style lang="scss" scoped></style>

 二、雷达图

RadarBar.vue

<template>
	<div>
		<div>【云端报警风险】</div>
		<div ref="target" class="w-full h-full"></div>
	</div>
</template>

<script setup>
import { onMounted, ref, watch } from 'vue'
import * as echarts from 'echarts'

const props = defineProps({
	data: {
		type: Object,
		required: true
	}
})

const target = ref()
let mChart = null
onMounted(() => {
	mChart = echarts.init(target.value)
	renderChart()
})

const renderChart = () => {
	const options = {
		// 雷达图坐标系配置
		radar: {
			// 坐标系名
			name: {
				textStyle: {
					color: '#05D5FF',
					fontSize: 14
				}
			},
			// 雷达绘制类型。polygon 多边形
			shape: 'polygon',
			// 居中
			center: ['50%', '50%'],
			// 边境
			radius: '80%',
			// 开始的角度(可以避免绘制到边框之外)
			startAngle: 120,
			// 轴线配置
			axisLine: {
				lineStyle: {
					color: 'rgba(5, 213, 255, .8)'
				}
			},
			// 网格线配置
			splitLine: {
				show: true,
				lineStyle: {
					width: 1,
					color: 'rgba(5, 213, 255, .8)' // 设置网格的颜色
				}
			},
			// 指示器文字
			indicator: props.data.risks.map((item) => ({
				name: item.name,
				max: 100
			})),
			// 不展示拆分区域
			splitArea: {
				show: false
			}
		},
		// 坐标居中
		polar: {
			center: ['50%', '50%'], // 默认全局居中
			radius: '0%'
		},
		// 坐标角度
		angleAxis: {
			// 坐标轴刻度最小值
			min: 0,
			// 坐标轴分割间隔
			interval: 5,
			// 刻度增长逆时针
			clockwise: false,
			// 不显示坐标轴刻度
			axisTick: {
				show: false
			},
			// 不显示坐标轴文字
			axisLabel: {
				show: false
			},
			// 不显示坐标轴线
			axisLine: {
				show: false
			},
			// 不显示分割线
			splitLine: {
				show: false
			}
		},
		// 径向轴
		radiusAxis: {
			// 最小值
			min: 0,
			// 间隔
			interval: 20,
			// 不显示分割线
			splitLine: {
				show: true
			}
		},
		// 图表核心配置
		series: [
			{
				// 雷达图
				type: 'radar',
				// 拐点的样式,还可以取值'rect','angle'等
				symbol: 'circle',
				// 拐点的大小
				symbolSize: 10,
				// 折线拐点标志的样式
				itemStyle: {
					normal: {
						color: '#05D5FF'
					}
				},
				// 区域填充样式
				areaStyle: {
					normal: {
						color: '#05D5FF',
						opacity: 0.5
					}
				},
				// 线条样式
				lineStyle: {
					width: 2,
					color: '#05D5FF'
				},
				// 图形上的文本标签
				label: {
					normal: {
						show: true,
						formatter: (params) => {
							return params.value
						},
						color: '#fff'
					}
				},
				// 数据
				data: [
					{
						value: props.data.risks.map((item) => item.value)
					}
				]
			}
		]
	}

	mChart.setOption(options)
}

// 监听数据的变化,重新渲染图表
watch(
	() => props.data,
	() => {
		renderChart()
	}
)
</script>

三、 异常处理双环形图

双环形图绘制原理:

 * 1. 环形图通过饼图绘制。内外边距的距离减小,即为环形。环形中心点需要不断改变,否则会重叠

 * 2. 环形图绘制分为 上层和底层 两部分。上层作为绘制进度,底层作为背景图

 * 3. 依据 getSeriesData 生成对应的 上层和底层 series 数据,进行渲染

<template>
	<div>
		<div>【大区异常处理】</div>
		<div ref="target" class="w-full h-full"></div>
	</div>
</template>

<script setup>
import { onMounted, ref, watch } from 'vue'
import * as echarts from 'echarts'

const props = defineProps({
	data: {
		type: Object,
		required: true
	}
})

const target = ref()
let mChart = null
onMounted(() => {
	mChart = echarts.init(target.value)
	renderChart()
})

/**
 * 双环形图绘制原理:
 * 1. 环形图通过饼图绘制。内外边距的距离减小,即为环形。环形中心点需要不断改变,否则会重叠
 * 2. 环形图绘制分为 上层和底层 两部分。上层作为绘制进度,底层作为背景图
 * 3. 依据 getSeriesData 生成对应的 上层和底层 series 数据,进行渲染
 */
const getSeriesData = () => {
	const series = []

	props.data.abnormals.forEach((item, index) => {
		// 上层环形绘制
		series.push({
			name: item.name,
			// 使用饼图绘制,减少饼图宽度即为环形图
			type: 'pie',
			// 逆时针排布
			clockWise: false,
			// 不展示鼠标移入动画
			hoverAnimation: false,
			// 半径位置,需要依次递减,否则会重复在一处进行展示
			radius: [73 - index * 15 + '%', 68 - index * 15 + '%'],
			// 中心点
			center: ['55%', '55%'],
			// 不展示 label
			label: { show: false },
			// 数据配置
			data: [
				// 设置数据与名称
				{ value: item.value, name: item.name },
				// 最大数据,展示比例
				{
					value: 1000,
					name: '',
					itemStyle: { color: 'rgba(0,0,0,0)', borderWidth: 0 },
					tooltip: { show: false },
					hoverAnimation: false
				}
			]
		})

		// 底层图
		series.push({
			name: item.name,
			type: 'pie',
			// 图形不响应事件
			silent: true,
			// z-index: 置于底层
			z: 1,
			// 逆时针排布
			clockWise: false,
			// 不展示鼠标移入动画
			hoverAnimation: false,
			// 半径位置,需要依次递减,否则会重复在一处进行展示
			radius: [73 - index * 15 + '%', 68 - index * 15 + '%'],
			// 中心点
			center: ['55%', '55%'],
			// 不展示 label
			label: { show: false },
			// 数据
			data: [
				// 绘制底线 75%
				{
					value: 7.5,
					itemStyle: { color: 'rgb(3, 31, 62)', borderWidth: 0 },
					tooltip: { show: false },
					hoverAnimation: false
				},
				// 绘制底线 25% 透明区域
				{
					value: 2.5,
					name: '',
					itemStyle: { color: 'rgba(0,0,0,0)', borderWidth: 0 },
					tooltip: { show: false },
					hoverAnimation: false
				}
			]
		})
	})

	return series
}

const renderChart = () => {
	const options = {
		// 图例配置
		legend: {
			show: true,
			// 图例色块
			icon: 'circle',
			// 位置
			top: '14%',
			left: '60%',
			// 展示数据
			data: props.data.abnormals.map((item) => item.name),
			// 总宽度(一列)
			width: -5,
			// 每个色块的宽
			itemWidth: 10,
			// 每个色块的高度
			itemHeight: 10,
			// item 间距
			itemGap: 6,
			// 展示内容
			formatter: function (name) {
				return '{title|' + name + '}'
			},
			// 字体配置
			textStyle: {
				rich: {
					title: {
						fontSize: 12,
						lineHeight: 5,
						color: 'rgba(255,255,255,0.8)'
					}
				}
			}
		},
		// 提示层
		tooltip: {
			show: true,
			trigger: 'item',
			formatter: '{a}<br>{b}:{c}({d}%)'
		},
		// Y 轴展示选项
		yAxis: [
			{
				type: 'category',
				// 反向展示
				inverse: true,
				// 不展示轴线
				axisLine: {
					show: false
				},
				// 不展示刻度
				axisTick: {
					show: false
				}
			}
		],
		// X 轴不展示
		xAxis: [
			{
				show: false
			}
		],
		// 每两个标记一条线
		series: getSeriesData()
	}

	mChart.setOption(options)
}

// 监听数据的变化,重新渲染图表
watch(
	() => props.data,
	() => {
		renderChart()
	}
)
</script>

<style lang="scss" scoped></style>

 四、数据传递关系图

Relation.vue

<template>
	<div>
		<div>【数据传递信息】</div>
		<div ref="target" class="w-full h-full"></div>
	</div>
</template>

<script setup>
import { onMounted, ref, watch } from 'vue'
import * as echarts from 'echarts'

const props = defineProps({
	data: {
		type: Object,
		required: true
	}
})

// 获取 dom 实例
const target = ref()

// echarts 实例变量
let mChart = null
// 在 mounted 生命周期之后,实例化 echarts
onMounted(() => {
	mChart = echarts.init(target.value)
	// 渲染 echarts
	renderChart()
})

// 渲染图表
const renderChart = () => {
	const options = {
		// X 轴不需要展示
		xAxis: {
			show: false,
			type: 'value'
		},
		// X 轴不需要展示
		yAxis: {
			show: false,
			type: 'value'
		},
		// 核心数据配置
		series: [
			{
				// 用于展现节点以及节点之间的关系数据
				type: 'graph',
				// 不采用任何布局
				layout: 'none',
				// 使用二维的直角坐标系
				coordinateSystem: 'cartesian2d',
				// 节点标记的大小
				symbolSize: 26,
				// z-index
				z: 3,
				// 边界标签(线条文字)
				edgeLabel: {
					normal: {
						show: true,
						color: '#fff',
						textStyle: {
							fontSize: 14
						},
						formatter: function (params) {
							let txt = ''
							if (params.data.speed !== undefined) {
								txt = params.data.speed
							}
							return txt
						}
					}
				},
				// 圆饼下文字
				label: {
					normal: {
						show: true,
						position: 'bottom',
						color: '#5e5e5e'
					}
				},
				// 边两端的标记类型
				edgeSymbol: ['none', 'arrow'],
				// 边两端的标记大小
				edgeSymbolSize: 8,
				// 圆数据
				data: props.data.relations.map((item) => {
					// id 为 0 ,表示数据中心,数据中心单独设置
					if (item.id !== 0) {
						return {
							name: item.name,
							category: 0,
							active: true,
							speed: `${item.speed}kb/s`,
							// 位置
							value: item.value
						}
					} else {
						return {
							name: item.name,
							// 位置
							value: item.value,
							// 数据中心圆的大小
							symbolSize: 100,
							// 圆的样式
							itemStyle: {
								normal: {
									// 渐变色
									color: {
										colorStops: [
											{ offset: 0, color: '#157eff' },
											{ offset: 1, color: '#35c2ff' }
										]
									}
								}
							},
							// 字体
							label: { normal: { fontSize: '14' } }
						}
					}
				}),
				// 线
				links: props.data.relations.map((item, index) => ({
					// 方向
					source: item.source,
					target: item.target,
					// 线上的文字
					speed: `${item.speed}kb/s`,
					// 线的样式
					lineStyle: { normal: { color: '#12b5d0', curveness: 0.2 } },
					// 文字位置
					label: {
						show: true,
						position: 'middle',
						offset: [10, 0]
					}
				}))
			},
			{
				// 用于带有起点和终点信息的线数据的绘制
				type: 'lines',
				// 使用二维的直角坐标系
				coordinateSystem: 'cartesian2d',
				// z-index
				z: 1,
				// 线特效的配置
				effect: {
					show: true,
					smooth: false,
					trailLength: 0,
					symbol: 'arrow',
					color: 'rgba(55,155,255,0.5)',
					symbolSize: 12
				},
				// 线的样式
				lineStyle: {
					normal: {
						curveness: 0.2
					}
				},
				// 线的数据级,前后线需要重合。数据固定
				data: [
					[{ coord: [0, 300] }, { coord: [50, 200] }],
					[{ coord: [0, 100] }, { coord: [50, 200] }],
					[{ coord: [50, 200] }, { coord: [100, 100] }],
					[{ coord: [50, 200] }, { coord: [100, 300] }]
				]
			}
		]
	}

	mChart.setOption(options)
}

// 监听数据的变化,重新渲染图表
watch(
	() => props.data,
	() => {
		renderChart()
	}
)
</script>

<style lang="scss" scoped></style>

五、关键词条云文档图

pnpm i --save echarts-wordcloud@2.1.0

WordCloud.vue 

<template>
	<div>
		<div>【数据传递信息】</div>
		<div ref="target" class="w-full h-full"></div>
	</div>
</template>

<script setup>
import { onMounted, ref, watch } from 'vue'
import * as echarts from 'echarts'

const props = defineProps({
	data: {
		type: Object,
		required: true
	}
})

// 获取 dom 实例
const target = ref()

// echarts 实例变量
let mChart = null
// 在 mounted 生命周期之后,实例化 echarts
onMounted(() => {
	mChart = echarts.init(target.value)
	// 渲染 echarts
	renderChart()
})

// 渲染图表
const renderChart = () => {
	const options = {
		// X 轴不需要展示
		xAxis: {
			show: false,
			type: 'value'
		},
		// X 轴不需要展示
		yAxis: {
			show: false,
			type: 'value'
		},
		// 核心数据配置
		series: [
			{
				// 用于展现节点以及节点之间的关系数据
				type: 'graph',
				// 不采用任何布局
				layout: 'none',
				// 使用二维的直角坐标系
				coordinateSystem: 'cartesian2d',
				// 节点标记的大小
				symbolSize: 26,
				// z-index
				z: 3,
				// 边界标签(线条文字)
				edgeLabel: {
					normal: {
						show: true,
						color: '#fff',
						textStyle: {
							fontSize: 14
						},
						formatter: function (params) {
							let txt = ''
							if (params.data.speed !== undefined) {
								txt = params.data.speed
							}
							return txt
						}
					}
				},
				// 圆饼下文字
				label: {
					normal: {
						show: true,
						position: 'bottom',
						color: '#5e5e5e'
					}
				},
				// 边两端的标记类型
				edgeSymbol: ['none', 'arrow'],
				// 边两端的标记大小
				edgeSymbolSize: 8,
				// 圆数据
				data: props.data.relations.map((item) => {
					// id 为 0 ,表示数据中心,数据中心单独设置
					if (item.id !== 0) {
						return {
							name: item.name,
							category: 0,
							active: true,
							speed: `${item.speed}kb/s`,
							// 位置
							value: item.value
						}
					} else {
						return {
							name: item.name,
							// 位置
							value: item.value,
							// 数据中心圆的大小
							symbolSize: 100,
							// 圆的样式
							itemStyle: {
								normal: {
									// 渐变色
									color: {
										colorStops: [
											{ offset: 0, color: '#157eff' },
											{ offset: 1, color: '#35c2ff' }
										]
									}
								}
							},
							// 字体
							label: { normal: { fontSize: '14' } }
						}
					}
				}),
				// 线
				links: props.data.relations.map((item, index) => ({
					// 方向
					source: item.source,
					target: item.target,
					// 线上的文字
					speed: `${item.speed}kb/s`,
					// 线的样式
					lineStyle: { normal: { color: '#12b5d0', curveness: 0.2 } },
					// 文字位置
					label: {
						show: true,
						position: 'middle',
						offset: [10, 0]
					}
				}))
			},
			{
				// 用于带有起点和终点信息的线数据的绘制
				type: 'lines',
				// 使用二维的直角坐标系
				coordinateSystem: 'cartesian2d',
				// z-index
				z: 1,
				// 线特效的配置
				effect: {
					show: true,
					smooth: false,
					trailLength: 0,
					symbol: 'arrow',
					color: 'rgba(55,155,255,0.5)',
					symbolSize: 12
				},
				// 线的样式
				lineStyle: {
					normal: {
						curveness: 0.2
					}
				},
				// 线的数据级,前后线需要重合。数据固定
				data: [
					[{ coord: [0, 300] }, { coord: [50, 200] }],
					[{ coord: [0, 100] }, { coord: [50, 200] }],
					[{ coord: [50, 200] }, { coord: [100, 100] }],
					[{ coord: [50, 200] }, { coord: [100, 300] }]
				]
			}
		]
	}

	mChart.setOption(options)
}

// 监听数据的变化,重新渲染图表
watch(
	() => props.data,
	() => {
		renderChart()
	}
)
</script>

<style lang="scss" scoped></style>

六、 数据总览图

实现自增效果:pnpm i --save countup.js@2.6.2

TotalData.vue

<template>
	<div class="p-6">
		<div class="text-slate-300 text-center">
			数据总量:
			<span
				ref="totalCountTarget"
				class="text-7xl ml-2 mr-2 font-bold font-[Electronic] text-gradient"
			>
				679,473,929
			</span>
			条记录
		</div>
		<div class="mt-3 flex flex-wrap">
			<div class="w-1/3 text-center text-slate-400 text-sm">
				华北:
				<span ref="city1" class="text-[#5DC5EF] text-3xl font-[Electronic]">
					8,778,988
				</span>
			</div>
			<div class="w-1/3 text-center text-slate-400 text-sm">
				东北:<span
					ref="city2"
					class="text-[#5DC5EF] text-3xl font-[Electronic]"
					>8,778,988</span
				>
			</div>
			<div class="w-1/3 text-center text-slate-400 text-sm">
				华东:<span
					ref="city3"
					class="text-[#5DC5EF] text-3xl font-[Electronic]"
					>8,778,988</span
				>
			</div>
			<div class="w-1/3 text-center text-slate-400 text-sm">
				中南:<span
					ref="city4"
					class="text-[#5DC5EF] text-3xl font-[Electronic]"
					>8,778,988</span
				>
			</div>
			<div class="w-1/3 text-center text-slate-400 text-sm">
				西南:<span
					ref="city5"
					class="text-[#5DC5EF] text-3xl font-[Electronic]"
					>8,778,988</span
				>
			</div>
			<div class="w-1/3 text-center text-slate-400 text-sm">
				西北:<span
					ref="city6"
					class="text-[#5DC5EF] text-3xl font-[Electronic]"
					>8,778,988</span
				>
			</div>
		</div>
	</div>
</template>

<script setup>
import { onMounted, ref } from 'vue'
// @ts-ignore
import { CountUp } from 'countup.js'

const props = defineProps({
	data: {
		type: Object,
		required: true
	}
})

const totalCountTarget = ref(null)
const city1 = ref(null)
const city2 = ref(null)
const city3 = ref(null)
const city4 = ref(null)
const city5 = ref(null)
const city6 = ref(null)

onMounted(() => {
	new CountUp(totalCountTarget.value, props.data.total).start()
	new CountUp(city1.value, props.data.hb).start()
	new CountUp(city2.value, props.data.db).start()
	new CountUp(city3.value, props.data.hd).start()
	new CountUp(city4.value, props.data.zn).start()
	new CountUp(city5.value, props.data.xn).start()
	new CountUp(city6.value, props.data.xb).start()
})
</script>

<style lang="scss" scoped></style>

 七、地图可视化分析

时间线+右侧柱形图+中国地图+散点图绘制

全文忽略ts语法错误:

// @ts-nocheck

<template>
	<div>
		<div ref="target" class="w-full h-full"></div>
	</div>
</template>

<script setup>
// @ts-nocheck
import { onMounted, ref } from 'vue'
import * as echarts from 'echarts'
import mapJson from '../assets/MapData/china.json'

const props = defineProps({
	data: {
		type: Object,
		required: true
	}
})

const target = ref()
let mChart = null
onMounted(() => {
	mChart = echarts.init(target.value)
	renderChart()
})

const renderChart = () => {
	// echarts 渲染
	echarts.registerMap('china', mapJson)

	let options = {
		// 时间线,提供了在多个 ECharts option 间进行切换
		timeline: {
			// 数据
			data: props.data.voltageLevel,
			// 类目轴
			axisType: 'category',
			// 自动切换
			autoPlay: true,
			// 间隔时间
			playInterval: 3000,
			// 位置
			left: '10%',
			right: '10%',
			bottom: '0%',
			width: '80%',
			// 轴的文本标签
			label: {
				// 默认状态
				normal: {
					textStyle: {
						color: '#ddd'
					}
				},
				// 高亮状态
				emphasis: {
					textStyle: {
						color: '#fff'
					}
				}
			},
			// 文字大小
			symbolSize: 10,
			// 线的样式
			lineStyle: {
				color: '#555'
			},
			// 选中点的样式
			checkpointStyle: {
				borderColor: '#888',
				borderWidth: 2
			},
			// 控件样式
			controlStyle: {
				// 上一步按钮
				showNextBtn: true,
				// 下一步按钮
				showPrevBtn: true,
				// 默认样式
				normal: {
					color: '#666',
					borderColor: '#666'
				},
				// 高亮样式
				emphasis: {
					color: '#aaa',
					borderColor: '#aaa'
				}
			}
		},
		// 柱形图右侧展示
		baseOption: {
			grid: {
				right: '2%',
				top: '15%',
				bottom: '10%',
				width: '20%'
			},

			// 中国地图
			geo: {
				// 展示
				show: true,
				// 中国地图
				map: 'china',
				// 开启缩放
				roam: true,
				// 初始缩放
				zoom: 0.8,
				// 中心点
				center: [113.83531246, 34.0267395887],
				// 默认状态的省份样式
				itemStyle: {
					normal: {
						// 边框色值
						borderColor: 'rgba(147, 235, 248, 1)',
						// 边框宽度
						borderWidth: 1,
						// 区域颜色
						areaColor: {
							// 经向色值
							type: 'radial',
							x: 0.5,
							y: 0.5,
							r: 0.5,
							colorStops: [
								// 0% 处的颜色
								{
									offset: 0,
									color: 'rgba(147, 235, 248, 0)'
								},
								// 100% 处的颜色
								{
									offset: 1,
									color: 'rgba(147, 235, 248, .2)'
								}
							],
							// 缺省为 false
							globalCoord: false
						}
					},
					// 鼠标移入的色值
					emphasis: {
						areaColor: '#389BB7',
						borderWidth: 0
					}
				}
			}
		},
		// 绑定时间轴的多个图表
		options: []
	}

	// 为每一年度的图表添加数据
	props.data.voltageLevel.forEach((item, index) => {
		options.options.push({
			// 背景色
			backgroundColor: '#142037',
			title: [
				// 主标题,对应地图
				{
					// @ts-ignore
					text: '2019-2023 年度数据统计',
					left: '0%',
					top: '0',
					textStyle: {
						color: '#ccc',
						fontSize: 30
					}
				},
				// 副标题,对应柱形图
				{
					id: 'statistic',
					text: item + '年数据统计情况',
					right: '0%',
					top: '4%',
					textStyle: {
						color: '#ccc',
						fontSize: 20
					}
				}
			],
			// X 轴配置
			xAxis: {
				// 数据轴
				type: 'value',
				// 脱离 0 值比例
				scale: true,
				// 位置
				position: 'top',
				// 不显示分割线
				splitLine: {
					show: false
				},
				// 不显示轴线
				axisLine: {
					show: false
				},
				// 不显示刻度尺
				axisTick: {
					show: false
				},
				// 类别文字
				axisLabel: {
					margin: 2,
					textStyle: {
						color: '#aaa'
					}
				}
			},
			// Y 轴
			yAxis: {
				// 选项轴
				type: 'category',
				// 轴线
				axisLine: {
					show: true,
					lineStyle: {
						color: '#ddd'
					}
				},
				// 轴刻度
				axisTick: {
					show: false,
					lineStyle: {
						color: '#ddd'
					}
				},
				// 轴标签
				axisLabel: {
					interval: 0,
					textStyle: {
						color: '#ddd'
					}
				},
				// 根据年份,获取对应数据
				data: props.data.categoryData[item].map((item) => item.name)
			},
			// 核心配置
			series: [
				// 柱形图
				{
					zlevel: 1.5,
					// 柱形图
					type: 'bar',
					// 每个柱子的色值
					itemStyle: {
						normal: {
							color: props.data.colors[index]
						}
					},
					// 根据年份,获取对应数据
					data: props.data.categoryData[item].map((item) => item.value)
				},
				// 散点图
				{
					// 散点(气泡)图
					type: 'effectScatter',
					// 使用地理坐标系
					coordinateSystem: 'geo',
					// 数据
					data: props.data.topData[item],
					// 标记大小
					symbolSize: function (val) {
						return val[2] / 4
					},
					// 绘制完成后显示特效
					showEffectOn: 'render',
					// 展示涟漪特效
					rippleEffect: {
						brushType: 'stroke'
					},
					// 文字
					label: {
						normal: {
							formatter: '{b}',
							position: 'right',
							show: true
						}
					},
					// 每一项的配置
					itemStyle: {
						normal: {
							color: props.data.colors[index],
							// 阴影配置
							shadowBlur: 5,
							shadowColor: props.data.colors[index]
						}
					},
					zlevel: 1
				}
			]
		})
	})

	mChart.setOption(options)
}
</script>

<style lang="scss" scoped></style>

 八、AntV、G2、DataV

 G2:G2

antv: https://antv.antgroup.com/

datav: DataV

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1650653.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

栈(使用顺序表构建)

P. S.&#xff1a;以下代码均在VS2019环境下测试&#xff0c;不代表所有编译器均可通过。 P. S.&#xff1a;测试代码均未展示头文件stdio.h的声明&#xff0c;使用时请自行添加。 目录 1、栈的概念2、栈的数组构建方法2.1 前言2.2 正文2.2.1 栈的初始化2.2.2 栈的销毁2.2.3 压…

Leetcode—289. 生命游戏【中等】

2024每日刷题&#xff08;126&#xff09; Leetcode—289. 生命游戏 算法思想 实现代码 class Solution { public:void gameOfLife(vector<vector<int>>& board) {int rows board.size();int cols board[0].size();int neighbors[3] {0, 1, -1};vector<…

微搭低代码入门06分页查询

目录 1 创建自定义代码2 编写分页代码3 创建页面4 创建变量5 配置数据列表总结 我们在数据模型章节介绍了微搭后端服务编写的三种方式&#xff0c;包括Http请求、自定义代码、云函数。本篇我们详细讲解一下利用自定义代码开发分页查询的功能。 1 创建自定义代码 打开控制台&am…

Python 全栈体系【四阶】(四十一)

第五章 深度学习 九、图像分割 1. 基本介绍 1.1 什么是图像分割 图像分割&#xff08;Segmentation&#xff09;是图像处理和机器视觉一个重要分支&#xff0c;其目标是精确理解图像场景与内容。图像分割是在像素级别上的分类&#xff0c;属于同一类的像素都要被归为一类&a…

微软“叛变”了!本月或将推出5000亿新AI模型MAI-1,对抗谷歌和OpenAI | 最新快讯

&#xff08;图片来源&#xff1a;钛媒体 App 编辑拍摄&#xff09; 钛媒体 App 5 月 6 日消息&#xff0c;据 The information 报道&#xff0c;美国科技巨头微软公司&#xff08;Microsoft&#xff09;将推出一款参数达 5000 亿的全新 AI 模型产品&#xff0c;内部称为 MAI-1…

【LAMMPS学习】八、基础知识(5.9)LAMMPS 近场动力学

8. 基础知识 此部分描述了如何使用 LAMMPS 为用户和开发人员执行各种任务。术语表页面还列出了 MD 术语,以及相应 LAMMPS 手册页的链接。 LAMMPS 源代码分发的 examples 目录中包含的示例输入脚本以及示例脚本页面上突出显示的示例输入脚本还展示了如何设置和运行各种模拟。 …

『 Linux 』基础IO/文件IO (万字)

文章目录 &#x1f984; 什么是IO&#x1f984; 文件IO(库级别)&#x1f47e; 文件的打开与关闭&#x1f47e; 当前路径&#x1f47e; 文件的读写 &#x1f984; 标准输入输出流&#x1f984; 文件IO(系统级别)&#x1f47e; 文件的打开&#x1f47e; 文件的关闭&#x1f47e; …

加州大学欧文分校英语中级语法专项课程03:Tricky English Grammar 学习笔记

Tricky English Grammar Course Certificate Course Intro 本文是学习 https://www.coursera.org/learn/tricky-english-grammar?specializationintermediate-grammar 这门课的学习笔记 文章目录 Tricky English GrammarWeek 01: Nouns, Articles, and QuantifiersLearning …

latex参考文献引用网址,不显示网址问题

以引用UCI数据集为例 1、加入宏包 \usepackage{url} 2、在参考文献bib文件中加入网址文献 misc{UCI, author {{D. Dua, E. Karra Taniskidou}}, year {2024}, title {UCI Machine Learning Repository}, howpublished {\url{http://archive.ics.uci.edu/ml}} } 完成&#x…

C++细节,可能存在的隐患,面试题03

文章目录 11. C编译过程12. const vs #define12.1. 全局const vs 局部const 13. C内存分区14. C变量作用域14.1. 常量 vs 全局变量 vs 静态变量 15. C类型转换16. 函数指针17. 悬空指针 vs 野指针18. 为什么使用空指针&#xff0c;建议使用nullptr而不是NULL&#xff1f; 11. C…

CLion 写 Rust 报Project directory `/Users/.../rsheets` does not exist.

每次打开CLion都会看到像下面这样的报错&#xff0c;Project directory /Users/.../rsheets does not exist.&#xff0c;虽然不会影响你写代码&#xff0c;但每次看到还是不舒服&#xff0c;所以研究一下怎么解决。 原因是这样的&#xff0c;每当我们创建一个 Cargo 项目&…

CRC校验原理及步骤

文章目录 CRC定义&#xff1a;CRC校验原理&#xff1a;CRC校验步骤&#xff1a; CRC定义&#xff1a; CRC即循环冗余校验码&#xff0c;是数据通信领域中最常用的一种查错校验码&#xff0c;其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查&#xff08;CRC&#…

VMware与CentOS的安装

VMware与CentOS的安装 第一章 VMware安装第二章 CentOS上网虚拟机网络IP修改地址配置修改主机名和hosts文件修改主机名称配置Linux克隆机主机名称映射hosts文件&#xff0c;打开/etc/hosts 安装Xshell7和Xftp7 第一章 VMware安装 VMware Workstation Pro 安装包 …

Go语言fmt包深度探索:格式化输入输出的利器

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 &#x1f3ad; 引言一、基础输出函数fmt.Print与fmt.Println&#x1f4cc; fmt.Print&#xff1a;纯粹输出&#xff0c;不带换行&#x1f4cc; fmt.Println&#xff1a;输出后自动添加换行符 二、格式化输出fmt.Printf&…

Python实验代码定时调起

Python代码实验调参需要等待1小时运行完成&#xff0c;自动将提前设置的5组参数&#xff08;每组参数有8个&#xff09;间隔1小时之后让Python代码再次自动依次调起运行其中的一组参数&#xff0c;每次跑完将实验结果写一个文件在本地存储通过邮件发送运行结果到指定QQ邮箱 im…

《QT实用小工具·五十三》会跑走的按钮

1、概述 源码放在文章末尾 该项目实现了会逃跑的按钮&#xff1a; 两个按钮&#xff0c;一个为普通按钮&#xff0c;另一个为会跑走的按钮 鼠标移到上面时&#xff0c;立刻跑掉 针对鼠标、键盘、触屏进行优化 随机交换两个按钮的文字、偶尔钻到另一个按钮下面、鼠标移开自…

cmake进阶:目录属性说明一

一. 简介 接下来简单学习一下 cmake 中的属性相关的概念。 属性大概可以分为多种&#xff1a;全局属性、目录属性&#xff08;源码属性&#xff09;、目标属性以及其它一些分类。 二. cmake进阶&#xff1a;目录属性 cmake中的属性可以 在如下网址查询到&#xff1a; http…

Jsoncpp介绍

1.简介 Jsoncpp 是一个 C 库&#xff0c;用于解析和生成 JSON 数据。它提供了一个易于使用的 DOM&#xff08;Document Object Model&#xff09;风格的 API&#xff0c;允许开发者以树形结构的方式操作 JSON 数据。 Jsoncpp 是一个C库&#xff0c;允许操作JSON值&#xff0c;…

PG WAL日志理解

类似于oracle的redo log&#xff0c;用于数据库恢复&#xff0c;当一条SQL语句执行&#xff0c;PG会把对应的块放到缓冲区执行&#xff0c;&#xff0c;会写进WAL缓冲区会进行写操作&#xff0c;commit后&#xff0c;WAL writer进程进行写操作&#xff0c;把日志缓冲区WAL buff…

【linux】初步认识文件系统

初步认识文件系统 前置知识的简单了解简单回顾C语言的文件操作stdin&stdout&stderr 系统文件IOopen函数的返回值文件描述符fd打开文件背后的操作文件描述符的分配规则 前置知识的简单了解 文件包括了文件内容和文件属性两个部分(文件内容顾名思义就是文件里面的数据等…