Vue 之 echarts 图表数据可视化的基础使用(简单绘制各种图表、地图)

news2025/7/8 16:55:44

Vue 之 echarts 图表数据可视化的基础使用(简单绘制各种图表、地图)

目录

Vue 之 echarts 图表数据可视化的基础使用(简单绘制各种图表、地图)

一、简单介绍

二、环境搭建

三、使用 echarts

四、自动缩放 echarts

五、数据更新,自动刷新 echart 图表

六、绘制折线图

七、绘制饼图

八、绘制全国地图

九、绘制省地图(北京为例)

 十、绘制世界地图


一、简单介绍

Vue 开发的一些知识整理,方便后期遇到类似的问题,能够及时查阅使用。

本节介绍,vue 中添加 echarts ,然后在 vue 中简单使用 ,如果有不足之处,欢迎指出,或者你有更好的方法,欢迎留言。

ECharts,一个使用 JavaScript 实现的开源可视化库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(IE9/10/11,Chrome,Firefox,Safari等),底层依赖矢量图形库 ZRender,提供直观,交互丰富,可高度个性化定制的数据可视化图表。

ECharts 提供了常规的折线图、柱状图、散点图、饼图、K线图,用于统计的盒形图,用于地理数据可视化的地图、热力图、线图,用于关系数据可视化的关系图、treemap、旭日图,多维数据可视化的平行坐标,还有用于 BI 的漏斗图,仪表盘,并且支持图与图之间的混搭。

ECharts 针对移动端交互做了细致的优化,例如移动端小屏上适于用手指在坐标系中进行缩放、平移。 PC 端也可以用鼠标在图中进行缩放(用鼠标滚轮)、平移等。

Echarts 官网文档:Handbook - Apache ECharts

Echarts 函数简介

1、echarts. init

Documentation - Apache EChartsECharts, a powerful, interactive charting and visualization library for browserhttps://echarts.apache.org/zh/api.html#echarts.init

echarts. init(dom?: HTMLDivElement|HTMLCanvasElement, theme?: Object|string, opts?: {
    devicePixelRatio?: number,
    renderer?: string,
    useDirtyRect?: boolean, // 从 `5.0.0` 开始支持
    ssr?: boolean,          // 从 `5.3.0` 开始支持
    width?: number|string,
    height?: number|string,
    locale?: string         // 从 `5.0.0` 开始支持
}) => ECharts

创建一个 ECharts 实例,返回 echartsInstance,不能在单个容器上初始化多个 ECharts 实例。

参数解释

  • dom

    实例容器,一般是一个具有高宽的 DIV 元素。只有在设置opts.ssr开启了服务端渲染后该参数才是可选。

    也支持直接使用canvas元素作为容器,这样绘制完图表可以直接将 canvas 作为图片应用到其它地方,例如在 WebGL 中作为贴图,这跟使用 getDataURL 生成图片链接相比可以支持图表的实时刷新。

  • theme

    应用的主题。可以是一个主题的配置对象,也可以是使用已经通过 echarts.registerTheme 注册的主题名称。参见 ECharts 中的样式简介。

  • opts

    附加参数。有下面几个可选项:

    • devicePixelRatio设备像素比,默认取浏览器的值window.devicePixelRatio
    • renderer 渲染模式,支持'canvas'或者'svg'。参见 使用 Canvas 或者 SVG 渲染。
    • ssr 是否使用服务端渲染,只有在 SVG 渲染模式有效。开启后不再会每帧自动渲染,必须要调用 renderToSVGString 方法才能得到渲染后 SVG 字符串。
    • useDirtyRect是否开启脏矩形渲染,只有在 Canvas 渲染模式有效,默认为false。参见 ECharts 5 新特性。
    • width 可显式指定实例宽度,单位为像素。如果传入值为null/undefined/'auto',则表示自动取 dom(实例容器)的宽度。
    • height 可显式指定实例高度,单位为像素。如果传入值为null/undefined/'auto',则表示自动取 dom(实例容器)的高度。
    • locale 使用的语言,内置 'ZH''EN' 两个语言,也可以使用 echarts.registerLocale 方法注册新的语言包。目前支持的语言见 src/i18n。

2、echartsInstance. setOption

Documentation - Apache EChartsECharts, a powerful, interactive charting and visualization library for browserhttps://echarts.apache.org/zh/api.html#echartsInstance.setOption

echartsInstance. setOption(option: Object, notMerge?: boolean, lazyUpdate?: boolean)
or
(option: Object, opts?: {
    notMerge?: boolean;
    replaceMerge?: string | string[];
    lazyUpdate?: boolean;
})

设置图表实例的配置项以及数据,万能接口,所有参数和数据的修改都可以通过 setOption 完成,ECharts 会合并新的参数和数据,然后刷新图表。如果开启动画的话,ECharts 找到两组数据之间的差异然后通过合适的动画去表现数据的变化。

  • option: ECOption

    图表的配置项和数据,具体见配置项手册。

  • opts

    • notMerge 可选。是否不跟之前设置的 option 进行合并。默认为 false。即表示合并。合并的规则,详见 组件合并模式。如果为 true,表示所有组件都会被删除,然后根据新 option 创建所有新组件。
    • replaceMerge 可选。用户可以在这里指定一个或多个组件,如:xAxis, series,这些指定的组件会进行 "replaceMerge"。如果用户想删除部分组件,也可使用 "replaceMerge"。详见 组件合并模式
    • lazyUpdate 可选。在设置完 option 后是否不立即更新图表,默认为 false,即同步立即更新。如果为 true,则会在下一个 animation frame 中,才更新图表。
    • silent 可选。阻止调用 setOption 时抛出事件,默认为 false,即抛出事件。

组件合并模式

对于一种类型的组件(如:xAxis, series):

  • 如果设置opts.notMergetrue,那么旧的组件会被完全移除,新的组件会根据option创建。
  • 如果设置opts.notMergefalse,或者没有设置 opts.notMerge
    • 如果在opts.replaceMerge里指定组件类型,这类组件会进行替换合并
    • 否则,会进行普通合并

操作环境:

  • win 10
  • node v14.20.0
  • npm 8.5.3
  • @vue/cli 5.0.6
  • vue 2.6.14
  • echarts 5.3.3

二、环境搭建

1、基础的 node ,npm、vue 的环境搭建

参见博文:Web 前端 之 Vue vue cli 环境的搭建简单整理(简单的一些注意事项)

2、创建 vue 工程

命令:vue create project-name,这里选择的是 vue 2

3、工程创建好后,安装 echarts

命令:npm install echarts -S

三、使用 echarts

全局引入 echarts

1、main.js 组件中引入 echarts

// 引入echarts
import * as echarts from 'echarts'
// 设置全局 echarts
Vue.prototype.$echarts = echarts 

 2、添加 echart 显示容器

在 HelloWorld.vue 中修改设置一个宽高的容器

<template>
	<div class="hello">
		<div id="myChart" :style="{width: '50%', height: '300px'}"></div>
	</div>
</template>

 3、在 HelloWorld.vue 使用全局的 echarts

<script>

	export default {
		name: 'HelloWorld',
		mounted() {
			this.drawBar();
		},
		methods: {
			drawBar() {
				// 基于准备好的dom,初始化echarts实例
				// 全局使用 echarts 初始化(this.$echarts)
				let myChart = this.$echarts.init(document.getElementById('myChart'))
				
				// 绘制图表
				myChart.setOption({
					title: {
						text: '在Vue中使用echarts'
					},
					tooltip: {},
					xAxis: {
						data: ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"]
					},
					yAxis: {},
					series: [{
						name: '销量',
						type: 'bar',
						data: [5, 20, 36, 10, 10, 20]
					}]
				});
			}
		}
	}
</script>

4、在 App.vue 引入 HelloWorld 中去除多余的,保留如图的

5、回到终端 npm run serve,在浏览器中效果

局部按需引入 echarts

6、修改 HelloWorld.vue 脚本,局部引入 echarts

<script>
	// 引入echarts
	import * as echarts from 'echarts'
	export default {
		name: 'HelloWorld',
		mounted() {
			this.drawBar();
		},
		methods: {
			drawBar() {
				// 基于准备好的dom,初始化echarts实例
				// 全局使用 echarts 
				// let myChart = this.$echarts.init(document.getElementById('myChart'))
				// 调用局部的 echarts 
				let myChart = echarts.init(document.getElementById('myChart'))
				// 绘制图表
				myChart.setOption({
					title: {
						text: '在Vue中使用echarts'
					},
					tooltip: {},
					xAxis: {
						data: ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"]
					},
					yAxis: {},
					series: [{
						name: '销量',
						type: 'bar',
						data: [5, 20, 36, 10, 10, 20]
					}]
				});
			}
		}
	}
</script>

四、自动缩放 echarts

Echarts本身是不支持自动缩放的,但是Echarts为我们提供了resize方法

// 设置该 chart 的 resize 方法
window.addEventListener("resize", myChart.resize);
<script>
	// 引入echarts
	import * as echarts from 'echarts'
	export default {
		name: 'HelloWorld',
		mounted() {
			this.drawBar();
		},
		methods: {
			drawBar() {
				// 基于准备好的dom,初始化echarts实例
				// 全局使用 echarts 
				// let myChart = this.$echarts.init(document.getElementById('myChart'))
				// 调用局部的 echarts 
				let myChart = echarts.init(document.getElementById('myChart'))
				// 绘制图表
				myChart.setOption({
					title: {
						text: '在Vue中使用echarts'
					},
					tooltip: {},
					xAxis: {
						data: ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"]
					},
					yAxis: {},
					series: [{
						name: '销量',
						type: 'bar',
						data: [5, 20, 36, 10, 10, 20]
					}]
				});
				
				// 设置该 chart 的 resize 方法
				window.addEventListener("resize", myChart.resize)
			}
		}
	}
</script>

五、数据更新,自动刷新 echart 图表

因为Echarts是数据驱动的,这意味着只要我们重新设置数据,那么图表就会随之重新渲染,这是实现本需求的基础。如果想要支持数据的自动刷新,必然需要一个监听器能够实时监听到数据的变化然后告知Echarts重新设置数据。可以使用 Vue 的 watch 为我们进行数据更新监听,从而刷新 echart

1、抽出 option 属性

				option: {
					title: {
						text: '在Vue中使用echarts'
					},
					tooltip: {},
					xAxis: {
						data: ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"]
					},
					yAxis: {},
					series: [{
						name: '销量',
						type: 'bar',
						data: [5, 20, 36, 10, 10, 20]
					}]
				}

2、watch 中监听 option 数据的变化,同时更新 echart

		watch:{
			// 监听 option 更新
			option: {
				// 更新处理,也可以 handler(newVal,oldVal)
				handler(newVal){
					if(newVal){
						this.myChart.setOption(newVal)
					}
				},
				//关键,对象内部属性的监听(内部有数据更新,也进行对应的watch触发)
				deep: true
			},
		},

3、简单的数据更新处理函数(实际使用中从后台服务器获取数据更新)

			//添加refreshData方法进行自动更新设置数据
			refreshData() {
				// 更新定时更新函数
				setInterval(() => {
					let sDataLength = this.option.series[0].data.length
					console.log('refreshData')
					let data = []
					// 数据随机值更新
					for (let i = 0; i < sDataLength; i++) {
						data[i] = Math.floor(Math.random() * 100) + 1
					}
					// 更新数据
					this.option.series[0].data = data
				}, 1000)

4、完整代码

<template>
	<div class="hello">
		<div id="myChart" :style="{width: '50%', height: '300px'}"></div>
	</div>
</template>

<script>
	// 引入echarts
	import * as echarts from 'echarts'
	export default {
		name: 'HelloWorld',
		data() {
			return {
				myChart: null,
				option: {
					title: {
						text: '在Vue中使用echarts'
					},
					tooltip: {},
					xAxis: {
						data: ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"]
					},
					yAxis: {},
					series: [{
						name: '销量',
						type: 'bar',
						data: [5, 20, 36, 10, 10, 20]
					}]
				}
			}
		},
		watch:{
			// 监听 option 更新
			option: {
				// 更新处理,也可以 handler(newVal,oldVal)
				handler(newVal){
					if(newVal){
						this.myChart.setOption(newVal)
					}
				},
				//关键,对象内部属性的监听(内部有数据更新,也进行对应的watch触发)
				deep: true
			},
		},
		
		mounted() {
			this.drawBar();
		},
		methods: {
			drawBar() {
				// 基于准备好的dom,初始化echarts实例
				// 全局使用 echarts 
				// this.myChart = this.$echarts.init(document.getElementById('myChart'))
				// 调用局部的 echarts 
				this.myChart = echarts.init(document.getElementById('myChart'))
				// 绘制图表
				this.myChart.setOption(this.option);

				// 设置该 chart 的 resize 方法
				window.addEventListener("resize", this.myChart.resize)
				
				// 动态刷线数据
				this.refreshData()
			},

			//添加refreshData方法进行自动更新设置数据
			refreshData() {
				// 更新定时更新函数
				setInterval(() => {
					let sDataLength = this.option.series[0].data.length
					console.log('refreshData')
					let data = []
					// 数据随机值更新
					for (let i = 0; i < sDataLength; i++) {
						data[i] = Math.floor(Math.random() * 100) + 1
					}
					// 更新数据
					this.option.series[0].data = data
				}, 1000)

			}
		}
	}
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>

</style>

5、动态更新chart 效果

六、绘制折线图

1、更新 HelloWorld.vue 代码,绘制折线

<template>
	<div class="hello">
		<div id="myChart" :style="{width: '50%', height: '300px'}"></div>
	</div>
</template>

<script>
	// 引入echarts
	import * as echarts from 'echarts'
	export default {
		name: 'HelloWorld',
		data() {
			return {
				myChart: null,
				option: {
					title: {
						text: '曲线',
					},
					tooltip: {
						trigger: 'axis',

					},
					legend: {
						data: ['昨日(11月8日)', '今日(11月9日)']
					},
					grid: {
						left: '1%',
						right: '1%',
						bottom: '3%',
						containLabel: true
					},
					toolbox: {
						show: false,
						feature: {
							dataZoom: {
								yAxisIndex: 'none'
							},
							dataView: {
								readOnly: false
							},
							magicType: {
								type: ['line', 'bar']
							},
							restore: {},
							saveAsImage: {}
						}
					},
					color: ["red", "#CD3333"],
					xAxis: {
						type: 'category',
						boundaryGap: false,
						data: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17',
							'18', '19', '20', '21', '22', '23', '24'
						]
					},
					yAxis: {
						type: 'value',
						name: '单位(kW)',
						axisLabel: {
							formatter: '{value}'
						}
					},
					series: [{
							name: '昨日(11月8日)',
							type: 'line',
							data: [110, 106, 110, 110, 318, 119, 205, 256, 156, 309, 256, 306, 206, 356, 456, 486,
								565.45, 234, 156, 206, 126, 256, 150, 276
							],

						},
						{
							type: 'line',
							name: '今日(11月9日)',
							data: [210, 136, 120, 120, 118, 219, 195, 176, 156, 329, 356, 346, 406.54, 256, 156],
						}
					]
				}
			}
		},
		watch: {
			// 监听 option 更新
			option: {
				// 更新处理,也可以 handler(newVal,oldVal)
				handler(newVal) {
					if (newVal) {
						this.myChart.setOption(newVal)
					}
				},
				//关键,对象内部属性的监听(内部有数据更新,也进行对应的watch触发)
				deep: true
			},
		},

		mounted() {
			this.drawBar();
		},
		methods: {
			drawBar() {
				// 基于准备好的dom,初始化echarts实例
				// 全局使用 echarts 
				// this.myChart = this.$echarts.init(document.getElementById('myChart'))
				// 调用局部的 echarts 
				this.myChart = echarts.init(document.getElementById('myChart'))
				// 绘制图表
				this.myChart.setOption(this.option);

				// 设置该 chart 的 resize 方法
				window.addEventListener("resize", this.myChart.resize)

			}
		}
	}
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>

</style>

2、效果图

七、绘制饼图

1、更新 HelloWorld .vue 代码,绘制饼图

<template>
	<div class="hello">
		<div id="myChart" :style="{width: '50%', height: '300px'}"></div>
	</div>
</template>

<script>
	// 引入echarts
	import * as echarts from 'echarts'
	export default {
		name: 'HelloWorld',
		data() {
			return {
				myChart: null,
				option: {
					title: {
						text: '某站点用户访问来源',
						subtext: '纯属虚构',
						x: 'center'
					},
					tooltip: {
						trigger: 'item',
						formatter: "{a} <br/>{b} : {c} ({d}%)"
					},
					legend: {
						orient: 'vertical',
						left: 'left',
						data: ['直接访问', '邮件营销', '联盟广告', '视频广告', '搜索引擎']
					},
					series: [{
						name: '访问来源',
						type: 'pie',
						radius: '55%',
						center: ['50%', '60%'],
						data: [{
								value: 335,
								name: '直接访问'
							},
							{
								value: 310,
								name: '邮件营销'
							},
							{
								value: 234,
								name: '联盟广告'
							},
							{
								value: 135,
								name: '视频广告'
							},
							{
								value: 1548,
								name: '搜索引擎'
							}
						],
						itemStyle: {
							emphasis: {
								shadowBlur: 10,
								shadowOffsetX: 0,
								shadowColor: 'rgba(0, 0, 0, 0.5)'
							}
						}
					}],
				},
			}
		},
		watch: {
			// 监听 option 更新
			option: {
				// 更新处理,也可以 handler(newVal,oldVal)
				handler(newVal) {
					if (newVal) {
						this.myChart.setOption(newVal)
					}
				},
				//关键,对象内部属性的监听(内部有数据更新,也进行对应的watch触发)
				deep: true
			},
		},

		mounted() {
			this.drawBar();
		},
		methods: {
			drawBar() {
				// 基于准备好的dom,初始化echarts实例
				// 全局使用 echarts 
				// this.myChart = this.$echarts.init(document.getElementById('myChart'))
				// 调用局部的 echarts 
				this.myChart = echarts.init(document.getElementById('myChart'))
				// 绘制图表
				this.myChart.setOption(this.option);

				// 设置该 chart 的 resize 方法
				window.addEventListener("resize", this.myChart.resize)

			}
		}
	}
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>

</style>

 2、效果图

八、绘制全国地图

1、下载 china.js ,引入到 assets/plugins/china.js

(注意:如果china,js 报 eslint 错误,可以使用在china.js 文件头添加 /*eslint-disable*/ 忽略 eslint 检查)

china.js 下载地址: echarts/test/data/map/js at master · apache/echarts · GitHub

1、更新 HelloWorld.vue 代码,绘制地图

<template>
	<div class="hello">
		<div id="myChart" :style="{width: '50%', height: '300px'}"></div>
	</div>
</template>

<script>
	// 局部引入 echarts
	import * as echarts from 'echarts'
	// 引入echarts
	//let echarts = require('echarts/lib/echarts')
	// 引入中国地图数据
	import '@/assets/plugins/china.js' 
	export default {
		name: 'HelloWorld',
		data() {
			return {
				myChart: null,
				option: {
					title: {
						text: 'iphone销量',
						subtext: '纯属虚构',
						left: 'center'
					},
					tooltip: {
						trigger: 'item'
					},
					legend: {
						orient: 'vertical',
						left: 'left',
						data: ['iphone3', 'iphone4', 'iphone5']
					},
					visualMap: {
						min: 0,
						max: 2500,
						left: 'left',
						top: 'bottom',
						text: ['高', '低'], // 文本,默认为数值文本
						calculable: true
					},
					toolbox: {
						show: false,
						orient: 'vertical',
						left: 'right',
						top: 'center',
						feature: {
							dataView: {
								readOnly: false
							},
							restore: {},
							saveAsImage: {}
						}
					},
					series: [{
						itemStyle: {
							normal: {
								color: function(params) {
									var colorList = [
										'#C1232B', '#B5C334', '#FCCE10', '#E87C25', '#27727B',
										'#FE8463', '#9BCA63', '#FAD860', '#F3A43B', '#60C0DD',
										'#D7504B', '#C6E579', '#F4E001', '#F0805A', '#26C0C0'
									];
									return colorList[params.dataIndex]
								},

							}
						},
						name: 'iphone3',
						type: 'map',
						mapType: 'china',
						roam: false,
						label: {
							normal: {
								show: true
							},
							emphasis: {
								show: true
							}
						},
						data: [{
								name: '北京',
								value: this.randomData()
							},
							{
								name: '天津',
								value: this.randomData()
							},
							{
								name: '上海',
								value: this.randomData()
							},
							{
								name: '重庆',
								value: this.randomData()
							},
							{
								name: '河北',
								value: this.randomData()
							},
							{
								name: '河南',
								value: this.randomData()
							},
							{
								name: '云南',
								value: this.randomData()
							},
							{
								name: '辽宁',
								value: this.randomData()
							},
							{
								name: '黑龙江',
								value: this.randomData()
							},
							{
								name: '湖南',
								value: this.randomData()
							},
							{
								name: '安徽',
								value: this.randomData()
							},
							{
								name: '山东',
								value: this.randomData()
							},
							{
								name: '新疆',
								value: this.randomData()
							},
							{
								name: '江苏',
								value: this.randomData()
							},
							{
								name: '浙江',
								value: this.randomData()
							},
							{
								name: '江西',
								value: this.randomData()
							},
							{
								name: '湖北',
								value: this.randomData()
							},
							{
								name: '广西',
								value: this.randomData()
							},
							{
								name: '甘肃',
								value: this.randomData()
							},
							{
								name: '山西',
								value: this.randomData()
							},

							{
								name: '内蒙古',
								value: this.randomData()
							},
							{
								name: '陕西',
								value: this.randomData()
							},

							{
								name: '吉林',
								value: this.randomData()
							},
							{
								name: '福建',
								value: this.randomData()
							},
							{
								name: '贵州',
								value: this.randomData()
							},
							{
								name: '广东',
								value: this.randomData()
							},
							{
								name: '青海',
								value: this.randomData()
							},
							{
								name: '西藏',
								value: this.randomData()
							},
							{
								name: '四川',
								value: this.randomData()
							},
							{
								name: '宁夏',
								value: this.randomData()
							},
							{
								name: '海南',
								value: this.randomData()
							},
							{
								name: '台湾',
								value: this.randomData()
							},
							{
								name: '香港',
								value: this.randomData()
							},
							{
								name: '澳门',
								value: this.randomData()
							}
						]
					}]
				},
			}

		},
		watch: {
			// 监听 option 更新
			option: {
				// 更新处理,也可以 handler(newVal,oldVal)
				handler(newVal) {
					if (newVal) {
						this.myChart.setOption(newVal)
					}
				},
				//关键,对象内部属性的监听(内部有数据更新,也进行对应的watch触发)
				deep: true
			},
		},

		mounted() {
			this.drawBar();
		},
		methods: {
			drawBar() {
				// 基于准备好的dom,初始化echarts实例
				// 全局使用 echarts 
				// this.myChart = this.$echarts.init(document.getElementById('myChart'))
				// 调用局部的 echarts 
				this.myChart = echarts.init(document.getElementById('myChart'))
				// 绘制图表
				this.myChart.setOption(this.option);

				// 设置该 chart 的 resize 方法
				window.addEventListener("resize", this.myChart.resize)
			},
			
			randomData() {
				return Math.round(Math.random() * 1000);
			}
		}
	}
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>

</style>

3、效果图

九、绘制省地图(北京为例)

1、下载beijing.js ,添加到assets/plugins/beijing.js

(注意:如果beijing,js 报 eslint 错误,可以使用在china.js 文件头添加 /*eslint-disable*/ 忽略 eslint 检查)

下载beijing.js地址:

echarts/test/data/map/js/province at master · apache/echarts · GitHub

 

 2、更新 HelloWorld.vue 代码,绘制北京地图

<template>
	<div class="hello">
		<div id="myChart" :style="{width: '50%', height: '400px'}"></div>
	</div>
</template>

<script>
	// 局部引入 echarts
	import * as echarts from 'echarts'
	// 引入echarts
	//let echarts = require('echarts/lib/echarts')
	// 引入中国地图数据
	import '@/assets/plugins/beijing.js'
	export default {
		name: 'HelloWorld',
		data() {
			return {
				myChart: null,
				option: {
					title: {
						text: '北京地图',
						subtext: '-。-'
					},
					tooltip: {
						trigger: 'item',
						formatter: function(a) {
							return a[2];
						}
					},
					legend: {
						orient: 'vertical',
						x: 'right',
						data: ['数据名称']
					},
					dataRange: {
						min: 0,
						max: 1000,
						color: ['orange', 'yellow'],
						text: ['高', '低'], // 文本,默认为数值文本
						calculable: true
					},
					series: [{
						name: '数据名称',
						type: 'map',
						mapType: '北京',
						selectedMode: 'single',
						itemStyle: {
							normal: {
								label: {
									show: true
								}
							},
							emphasis: {
								label: {
									show: true
								}
							}
						},
						data: [{
								name: '怀柔区',
								value: Math.round(Math.random() * 1000)
							},
							{
								name: '延庆县',
								value: Math.round(Math.random() * 1000)
							},
							{
								name: '密云县',
								value: Math.round(Math.random() * 1000)
							},
							{
								name: '昌平区',
								value: Math.round(Math.random() * 1000)
							},
							{
								name: '平谷区',
								value: Math.round(Math.random() * 1000)
							},
							{
								name: '顺义区',
								value: Math.round(Math.random() * 1000)
							},
							{
								name: '门头沟区',
								value: Math.round(Math.random() * 1000)
							},
							{
								name: '海淀区',
								value: Math.round(Math.random() * 1000)
							},
							{
								name: '朝阳区',
								value: Math.round(Math.random() * 1000)
							},
							{
								name: '石景山区',
								value: Math.round(Math.random() * 1000)
							},
							{
								name: '西城区',
								value: Math.round(Math.random() * 1000)
							},
							{
								name: '东城区',
								value: Math.round(Math.random() * 1000)
							},
							{
								name: '宣武区',
								value: Math.round(Math.random() * 1000)
							},
							{
								name: '丰台区',
								value: Math.round(Math.random() * 1000)
							},
							{
								name: '房山区',
								value: Math.round(Math.random() * 1000)
							},
							{
								name: '通州区',
								value: Math.round(Math.random() * 1000)
							},
							{
								name: '大兴区',
								value: Math.round(Math.random() * 1000)
							},

						]
					}]
				},
			}

		},
		watch: {
			// 监听 option 更新
			option: {
				// 更新处理,也可以 handler(newVal,oldVal)
				handler(newVal) {
					if (newVal) {
						this.myChart.setOption(newVal)
					}
				},
				//关键,对象内部属性的监听(内部有数据更新,也进行对应的watch触发)
				deep: true
			},
		},

		mounted() {
			this.drawBar();
		},
		methods: {
			drawBar() {
				// 基于准备好的dom,初始化echarts实例
				// 全局使用 echarts 
				// this.myChart = this.$echarts.init(document.getElementById('myChart'))
				// 调用局部的 echarts 
				this.myChart = echarts.init(document.getElementById('myChart'))
				// 绘制图表
				this.myChart.setOption(this.option);

				// 设置该 chart 的 resize 方法
				window.addEventListener("resize", this.myChart.resize)
			},
		}
	}
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>

</style>

3、效果图

 十、绘制世界地图

注意:也可以在:

1、下载 world.js,添加到assets/plugins/world.js

(注意:如果world,js 报 eslint 错误,可以使用在china.js 文件头添加 /*eslint-disable*/ 忽略 eslint 检查)

下载world.js地址: echarts/world.js at master · apache/echarts · GitHub

2、在 public中添加一个 jsons/world.json,然后,更新 HelloWorld.vue 代码,绘制地图

这里添加了一个 axios 进行 json 加载(npm install axios -S)

<template>
	<div class="hello">
		<div id="myChart" :style="{width: '50%', height: '400px'}"></div>
	</div>
</template>

<script>
	// 局部引入 echarts
	import * as echarts from 'echarts'
	// 引入echarts
	//let echarts = require('echarts/lib/echarts')
	// 引入中国地图数据
	import '@/assets/plugins/world.js'
	import axios from 'axios'
	export default {
		name: 'HelloWorld',
		data() {
			return {
				myChart: null,
				option: {

				}
			}
		},
		watch: {
			// 监听 option 更新
			option: {
				// 更新处理,也可以 handler(newVal,oldVal)
				handler(newVal) {
					if (newVal) {
						this.myChart.setOption(newVal)
					}
				},
				//关键,对象内部属性的监听(内部有数据更新,也进行对应的watch触发)
				deep: true
			},
		},

		mounted() {
			this.getWorld();
		},
		methods: {
			getWorld() {

				axios.get('jsons/world.json').then((res) => {
					let namemap = res.data.namemap
					let dataArr = res.data.dataArr
					this.drawMap(namemap, dataArr)
				})
			},
			drawMap(name, data) {
				// 基于准备好的dom,初始化echarts实例
				let chart = echarts.init(document.getElementById('myChart'))
				// 监听屏幕变化自动缩放图表
				window.addEventListener('resize', function() {
					chart.resize()
				})
				// 绘制图表
				chart.setOption({
					// 图表主标题
					title: {
						text: '世界地图', // 主标题文本,支持使用 \n 换行
						top: 10, // 定位 值: 'top', 'middle', 'bottom' 也可以是具体的值或者百分比
						left: 'center', // 值: 'left', 'center', 'right' 同上
						textStyle: { // 文本样式
							fontSize: 24,
							fontWeight: 600,
							color: '#000'
						}
					},
					grid: {
						width: '100%',
						height: '100%',
						left: '0%',
						right: '0%',
						bottom: '0%',
						containLabel: true
					},
					// 提示框组件
					tooltip: {
						trigger: 'item', // 触发类型, 数据项图形触发,主要在散点图,饼图等无类目轴的图表中使用
						// 提示框浮层内容格式器,支持字符串模板和回调函数两种形式
						// 使用函数模板  传入的数据值 -> value: number | Array
						formatter: function(val) {
							if (val.data == null) return;
							return val.data.name + ': ' + val.data.value
						}
					},
					// 视觉映射组件
					visualMap: {
						min: 0,
						max: 10000,
						text: ['max', 'min'],
						realtime: false,
						calculable: true,
						color: ['#0064d0', '#c3e0ff'],
					},
					series: [{
						type: 'map', // 类型
						// 系列名称,用于tooltip的显示,legend 的图例筛选 在 setOption 更新数据和配置项时用于指定对应的系列
						name: '世界地图',
						mapType: 'world', // 地图类型
						// 是否开启鼠标缩放和平移漫游 默认不开启 如果只想要开启缩放或者平移,可以设置成 'scale' 或者 'move' 设置成 true 为都开启
						roam: true,
						// 图形上的文本标签
						label: {
							show: false // 是否显示对应地名
						},
						zoom: 1.2,
						// 地图区域的多边形 图形样式
						itemStyle: {
							// areaColor: '#7B68EE', // 地图区域的颜色 如果设置了visualMap,areaColor属性将不起作用
							borderWidth: 0.5, // 描边线宽 为 0 时无描边
							borderColor: '#000', // 图形的描边颜色 支持的颜色格式同 color,不支持回调函数
							borderType: 'solid' // 描边类型,默认为实线,支持 'solid', 'dashed', 'dotted'
						},
						// 高亮状态下的多边形和标签样式
						emphasis: {
							label: {
								show: true, // 是否显示标签
								color: '#fff' // 文字的颜色 如果设置为 'auto',则为视觉映射得到的颜色,如系列色
							},
							itemStyle: {
								areaColor: '#FF6347' // 地图区域的颜色
							}
						},
						// 自定义地区的名称映射
						nameMap: name,
						// 地图系列中的数据内容数组 数组项可以为单个数值
						data: data
					}]
				})

			},
		}
	}
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>

</style>

3、效果图

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

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

相关文章

【网络通信】websocket如何断线重连

Vue <template><div><button click"sendDevName(xxxxxxxx)">发送</button>{{data}}</div> </template><script> export default {name: HelloWorld,data () {return {data: null}},// html加载完成后执行initWebSocket()…

Vue3-路由跳转专题详细总结

一、基本路由 点击事件似乎可以使用模板更改视图中的内容&#xff0c;个人认为与路由的区别是路由能使网页中的地址栏发生变化 请先阅读基础第二篇 1.创建一个组件,并引入 2.js文件中配置路径 //name相当于别名{path:/tabView,component:TabView},{name:myComPany,path:compan…

Vue3项目搭建全过程

目录 一、前言 二、搭建准备 三、搭建项目 四、启动项目 一、前言 在2020年的9月19日&#xff0c;万众期待的Vue3终于发布了正式版&#xff0c;命名为“One Piece”。 它也带来了很多新的特性&#xff1a;更好的性能、更小的包体积、更好的TypeScript集成、更优秀的API设…

前端面试真题宝典(一)

面试题真题 闭包和柯里化 闭包是什么&#xff1f;闭包是能够读取其他函数内部变量的函数 柯里化是什么&#xff1f;柯里化是把一个多个参数的函数转化为单参数函数的方法 闭包的用途&#xff1a;闭包的主要用途是为了不污染全局变量&#xff0c;用闭包的局部变量来做一些库…

30个题型+代码(冲刺2023蓝桥杯)(中)

2023.3.13~4.13持续更新 目录 &#x1f34e;注意 &#x1f33c;前言 &#x1f33c;十&#xff0c;KMP&#xff08;留坑&#xff09; &#x1f33c;十一&#xff0c;Trie&#xff08;留坑&#xff09; &#x1f33c;十二&#xff0c;BFS &#x1f44a;(一)1562. 微博转发…

获取街道、镇级的地图geoJson数据方法,使用echarts绘制出街道、镇级的地图区域画面(中山市为例)

一、需求 1、在echarts上绘制市级以下的区、县的区域地图。 2、在市级下很多都是有区、县的区域&#xff0c;而少部分是不存在区、县的&#xff0c;是直接市下面一级就是街道、镇级别的区域。 3、统一管理区域数据&#xff0c;有区县的市直接拿区县的geoJson数据&#xff0c;没…

炸弹人小游戏代码开源(python)

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a;小刘主页 ♥️每天分享云计算网络运维课堂笔记&#xff0c;努力不一定有收获&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️夕阳下&#xff0c;是最美的绽放&#xff0…

Ajax--》请求操作以及跨域相关讲解

目录 jQuery中的Ajax 请求超时与网络异常处理 取消请求 Ajax请求—fetch() 跨域 jQuery中的Ajax 在jQuery中应该如何发送Ajax请求呢&#xff1f;看到这篇文章你就能大概了解到如何在jQuery中发送Ajax。 要想使用jQuery框架&#xff0c;肯定是需要引进jQuery资源的&#…

CSS实现单行、多行文本溢出显示省略号(…)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录一、单行超出显示省略号二、多行超出显示省略号一、单行超出显示省略号 描述&#xff1a;如果文字超出父元素指定宽度&#xff0c;文字会自动换行&#xff0c;而连续…

Node.js——文件模块和路径模块(读写文件,处理路径)

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;也会涉及到服务端 &#x1f4c3;个人状态&#xff1a; 在校大学生一枚&#xff0c;已拿 offer&#xff08;秋招&#xff09; &#x1f947;推荐学习&…

MySQL - 死锁的产生及解决方案

MySQL - 死锁的产生及解决方案1. 死锁与产生死锁的四个必要条件1.1 什么是死锁1.2 死锁产生的4个必要条件2. 死锁案例2.1 表锁死锁2.2 行锁死锁2.3 共享锁转换为排他锁3. 死锁排查4. 实例分析4.1 案例描述4.2 案例死锁问题复现4.3 死锁排查4.4 解决死锁5. 如何避免死锁1. 死锁与…

【保姆级】JMeter Mqtt 压测配置

忽然有个紧急任务要对某个服务做MQTT做压测&#xff0c;紧急实操下JMeter&#xff0c;这里记录下非专业测试员的测试过程、(▽&#xff40;)&#xff0c;欢迎&#x1f44f;大家检查指点(&#xffe3;∇&#xffe3;)/下载⏬工具JMeter官方下载地址https://jmeter.apache.org/do…

【前端】1.学习了一段时间的vue,总结一下Vue书写规范

学习了一段时间的vue&#xff0c;总结一下Vue书写规范命名规范普通变量命名规范常量命名规范组件命名规范method 方法命名命名规范views 下的文件命名props 命名规范结构化规范命名规范 在团体开发项目中&#xff0c;为了团队所有成员书写可维护的代码&#xff0c;而不是一次性…

JS入门到精通完整版

前言 JavaScript&#xff08;简称“JS”&#xff09; 是一种具有函数优先的轻量级&#xff0c;解释型或即时编译型的编程语言。它是作为开发Web页面的脚本语言而出名&#xff0c;JavaScript 基于原型编程、多范式的动态脚本语言&#xff0c;并且支持面向对象、命令式、声明式、…

【前端灵魂脚本语言JavaScript①】——JS引入方式

&#x1f41a; 作者: 阿伟 &#x1f482; 个人主页: Flyme awei &#x1f40b; 希望大家多多支持&#x1f618;一起进步呀&#xff01; &#x1f4ac; 文章对你有帮助&#x1f449;关注✨点赞&#x1f44d;收藏&#x1f4c2; JavaScript引入 文章目录JavaScript引入一、JS介绍二…

PTA第六章作业详解

&#x1f680;write in front&#x1f680; &#x1f4dd;个人主页&#xff1a;认真写博客的夏目浅石. &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd; &#x1f4e3;系列专栏&#xff1a;夏目的作业 &#x1f4ac;总结&#xff1a;希望你看完之后&am…

vue+uniapp瀑布流布局多种实现方式

文章目录前言一、实现原理二、代码实现1.方式1&#xff08;图片高度累加比较法&#xff09;2.方式2&#xff08;父元素高度比较法&#xff09;三.uniapp实现代码实现四、多列实现代码实现前言 瀑布流布局是网页设计常见的一种布局&#xff0c;一般用于图片多列展示。列宽固定&…

Vue3:状态管理-Store(Vuex,Pinia)

什么是状态管理 理论上来说&#xff0c;每一个 Vue 组件实例都已经在“管理”它自己的响应式状态了 它是一个独立的单元&#xff0c;由以下几个部分组成 状态&#xff1a;驱动整个应用的数据源&#xff1b;视图&#xff1a;对状态的一种声明式映射&#xff1b;交互&#xff1a…

写给20、21级学生的话

写给20、21级学生的话前言一、关于招聘变招生&#xff0c;你怎么看&#xff1f;二、对于即将实习/已经实习的学生&#xff0c;你有什么建议&#xff1f;1.学习方面2.提升方面三、思想成年真的很重要前言 最近&#xff0c;有一些同学遇到的实习问题&#xff0c;我统一回复下&…

Vue2通知提醒框(Notification)

项目相关依赖版本信息 可自定义设置以下属性&#xff1a; 自动关闭的延时时长&#xff08;duration&#xff09;&#xff0c;单位ms&#xff0c;默认4500ms消息从顶部弹出时&#xff0c;距离顶部的位置&#xff08;top&#xff09;&#xff0c;单位像素px&#xff0c;默认24p…