Echarts---绘制气泡图

4,068 阅读2分钟

上一小节介绍过的散点图,只含有两个变量。如果还想要再增加变量,那么可以使用点的大小来表示。因为图中包含大小不一致的点,像气泡一样,所以称这种图为气泡图(bubble)。 因此,气泡图与散点图不同的是,气泡图是在基础散点图上添加一个维度,即用气泡大小表示一个新的维度。 此外,气泡图与散点图最直观的区别在于:散点图中的数据点长得大小一样,气泡图中的气泡却大小各不相同。

  1. 绘制标准气泡图

标准气泡图可用于观察3个指标的关系。利用由系统使用随机函数自动生成的100个元素观察每个元素中3个数值的关系,如图所示。 由图可知,在图中,出现了两种灰度的气泡,分别为bubble1和bubble2,并且每一个气泡的大小都不相同。

image.png

图例的源代码如下:

<html>

<head>
	<meta charset="utf-8">
	<!-- 引入 ECharts 文件 -->
	<script src="js/echarts.js"></script>

</head>

<body>
	<!---为ECharts准备一个具备大小(宽高)的DOM--->
	<div id="main" style="width: 800px; height: 600px"></div>
	<script type="text/javascript">
		//基于准备好的DOM,初始化ECharts图表
		var myChart = echarts.init(document.getElementById("main"));
		//指定图表的配置项和数据
		function random() {  //生成一个范围在(-90,90)随机数的函数
			var r = Math.round(Math.random() * 90);
			return (r * (r % 2 == 0 ? 1 : -1));  //返回一个值为(-90,90)的随机数
		}
		//生成有100个元素的数组,每个元素有三个数值,数组中前两个元素的值的范围在(-90,90),
		//第三个元素的值是表示气泡大小的随机数,其范围是(0,90)
		function randomDataArray() {
			var d = [];
			var len = 100;
			while (len--) {
				d.push([random(), random(), Math.abs(random()),]);
			}
			return d;
		}
		var option = {
			color: ['#FFCCCC', 'green'],  //配置气泡的颜色系列
			title: {  //配置标题组件
				x: 40, text: '标准气泡图示例', subtext: "随机生成"
			},
			tooltip: {  //配置提示框组件
				trigger: 'axis', showDelay: 0,
				axisPointer: {
					show: true, type: 'cross',
					lineStyle: { type: 'dashed', width: 1 }
				}
			},
			legend: { x: 240, data: ['bubble1', 'bubble2'] },  //配置图例组件
			toolbox: {  //配置工具箱组件
				show: true, x: 450,
				feature: {
					mark: { show: true }, dataZoom: { show: true },
					dataView: { show: true, readOnly: false },
					restore: { show: true }, saveAsImage: { show: true }
				}
			},
			xAxis: [{ type: 'value', splitNumber: 4, scale: true }],
			yAxis: [{ type: 'value', splitNumber: 4, scale: true }],
			series: [  //配置数据系列
				{   //设置数据系列中的第1类气泡bubble1
					name: 'bubble1', type: 'scatter', symbol: 'circle',
					symbolSize: function (value) { return Math.round(value[2] / 5); },
					data: randomDataArray()
				},
				{   //设置数据系列中的第2类气泡bubble2
					name: 'bubble2', type: 'scatter', symbol: 'circle',
					symbolSize: function (value) { return Math.round(value[2] / 5); },
					data: randomDataArray()
				}]
		};
		//使用刚指定的配置项和数据显示图表
		myChart.setOption(option); 
	</script>
</body>

</html>

在标准气泡图实例代码中,共有两组气泡数组bubble1和bubble2。 每组气泡数组中有100个元素,数组中每个元素具有3个数值,这3个数值是由系统使用随机函数自动生成的。 元素的前两个值为范围在(-90,90)之间的随机数,用于表示数据的位置。 元素的第3个值是范围为[0,90)的随机数,用于表示气泡的大小

  1. 绘制各国人均寿命与GDP气泡图

利用1990年和2015年各国人均寿命与GDP数据,观察人均GDP、人均寿命、总人口、国家名称和年份5个指标的关系,如图所示。 由图可知,横坐标表示人均GDP,纵坐标表示人均寿命,圆圈的大小表示该国的人口数量,不同灰度代表着年份。当鼠标指向图中的某个圆圈时,就会在圆圈的上面显示这个圆圈所代表的国家和所对应的年份。

image.png

图例的源代码如下:

<html>

<head>
    <meta charset = "utf-8">
    <!-- 引入 ECharts 文件 -->
    <script src = "js/echarts.js"></script>

</head>

<body>
    <!---为ECharts准备一个具备大小(宽高)的DOM--->
    <div id = "main" style = "width: 900px; height: 600px"></div>
    <script type = "text/javascript">
        //基于准备好的DOM,初始化ECharts图表
        var myChart = echarts.init(document.getElementById("main"));
        //指定图表的配置项和数据
        var data = [
            [[28604, 77, 17096869, 'A', 1990], [31163, 77.4, 27662440, 'B', 1990],
            [1516, 68, 1154605773, 'C', 1990], [13670, 74.7, 10582082, 'D', 1990],
            [28599, 75, 4986705, 'E', 1990], [29476, 77.1, 56943299, 'F', 1990],
            [31476, 75.4, 78958237, 'G', 1990], [28666, 78.1, 254830, 'H', 1990],
            [1777, 57.7, 870601776, 'I', 1990], [29550, 79.1, 122249285, 'J', 1990],
            [2076, 67.9, 20194354, 'K', 1990], [12087, 72, 42972254, 'L', 1990],
            [24021, 75.4, 3397534, 'M', 1990], [43296, 76.8, 4240375, 'N', 1990],
            [10088, 70.8, 38195258, 'O', 1990], [19349, 69.6, 147568552, 'P', 1990],
            [10670, 67.3, 53994605, 'Q', 1990], [26424, 75.7, 57110117, 'R', 1990],
            [37062, 75.4, 252847810, 'S', 1990]],
            [[44056, 81.8, 23968973, 'A', 2015], [43294, 81.7, 35939927, 'B', 2015],
            [13334, 76.9, 1376048943, 'C', 2015], [21291, 78.5, 11389562, 'D', 2015],
            [38923, 80.8, 5503457, 'E', 2015], [37599, 81.9, 64395345, 'F', 2015],
            [44053, 81.1, 80688545, 'G', 2015], [42182, 82.8, 329425, 'H', 2015],
            [5903, 66.8, 1311050527, 'I', 2015], [36162, 83.5, 126573481, 'J', 2015],
            [1390, 71.4, 25155317, 'K', 2015], [34644, 80.7, 50293439, 'L', 2015],
            [34186, 80.6, 4528526, 'M', 2015], [64304, 81.6, 5210967, 'N', 2015],
            [24787, 77.3, 38611794, 'O', 2015], [23038, 73.13, 143456918, 'P', 2015],
            [19360, 76.5, 78665830, 'Q', 2015], [38225, 81.4, 64715810, 'R', 2015],
            [53354, 79.1, 321773631, 'S', 2015]]];
        var option = {
            backgroundColor: new echarts.graphic.RadialGradient(0.3, 0.3, 0.8, [
                { offset: 0, color: '#f7f8fa' },
                { offset: 1, color: '#cdd0d5' }]),
            title: { x: 20, y: 5, text: '1990年与2015年各国家人均寿命与GDP' },
            legend: { x: 510, y: 14, right: 10, data: ['1990', '2015'] },
            grid: {
                top: '10%',  // 组件离容器上侧的距离,百分比字符串或整型数字
                left: '5%',    // 组件离容器左侧的距离,百分比字符串或整型数字
                right: '12%',
                bottom: '3%',
                containLabel: true //grid 区域是否包含坐标轴的刻度标签,
            },
            xAxis: { splitLine: { lineStyle: { type: 'dashed' } }, name: 'GDP(亿美元)' },
            yAxis: { splitLine: { lineStyle: { type: 'dashed' } }, scale: true, name: '人均寿命(岁)' },
            series: [{
                name: '1990', data: data[0], type: 'scatter',
                symbolSize: function (data) { return Math.sqrt(data[2]) / 5e2; },
                label: {
                    emphasis: {
                        show: true, position: 'top',
                        formatter: function (param) { return (param.data[3] + "," + param.data[4]); }
                    }
                },
                itemStyle: {
                    normal: {
                        shadowBlur: 10, shadowOffsetY: 5,
                        shadowColor: 'rgba(120, 36, 50, 0.5)',
                        color: new echarts.graphic.RadialGradient(0.4, 0.3, 1, [{
                            offset: 0, color: 'rgb(251, 118, 123)'
                        }, {
                            offset: 1, color: 'rgb(204, 46, 72)'
                        }])
                    }
                }
            },
            {
                name: '2015', data: data[1], type: 'scatter',
                symbolSize: function (data) { return Math.sqrt(data[2]) / 5e2; },
                label: {
                    emphasis: {
                        show: true, position: 'top',
                        formatter: function (param) { return (param.data[3] + "," + param.data[4]); }
                    }
                },
                itemStyle: {
                    normal: {
                        shadowBlur: 10, shadowOffsetY: 5,
                        shadowColor: 'rgba(25, 100, 150, 0.5)',
                        color: new echarts.graphic.RadialGradient(0.4, 0.3, 1, [
                            { offset: 0, color: 'rgb(129, 227, 238)' },
                            { offset: 1, color: 'rgb(25, 183, 207)' }])
                    }
                }
            }]
        };
        //使用刚指定的配置项和数据显示图表
        myChart.setOption(option); 
    </script>
</body>

</html>
  1. 绘制城市A、城市B、城市C三个城市空气污染指数气泡图

利用城市A、城市B、城市C三个城市空气污染指数数据,观察AQI指数(空气质量指数)、PM2.5、二氧化硫(SO2)等指标的关系,如图所示。 由图可知,横坐标表示当月的天数,纵坐标表示AQI指数,圆圈的大小表示当天的PM2.5的值,圆圈的明暗代表当天二氧化硫的值。当鼠标指向图中的某个圆圈时,就会显示这个城市当天的空气污染指数的各种不同的数值。

image.png

图例的源代码如下:

<html>

<head>
	<meta charset="utf-8">
	<!-- 引入 ECharts 文件 -->
	<script src="js/echarts.js"></script>
</head>

<body>
	<!---为ECharts准备一个具备大小(宽高)的DOM--->
	<div id="main" style="width: 800px; height: 600px"></div>
	<script type="text/javascript">
		//基于准备好的DOM,初始化ECharts图表
		var myChart = echarts.init(document.getElementById("main"));
		//指定图表的配置项和数据
		var dataBJ = [  //城市A的空气污染指数数据
			[1, 55, 9, 56, 0.46, 18, 6, "良"], [2, 25, 11, 21, 0.65, 34, 9, "优"],
			[3, 56, 7, 63, 0.3, 14, 5, "良"], [4, 33, 7, 29, 0.33, 16, 6, "优"],
			[5, 42, 24, 44, 0.76, 40, 16, "优"], [6, 82, 58, 90, 1.77, 68, 33, "良"],
			[7, 74, 49, 77, 1.46, 48, 27, "良"], [8, 78, 55, 80, 1.29, 59, 29, "良"],
			[9, 267, 216, 280, 4.8, 108, 64, "重污"], [10, 185, 127, 216, 2.52, 61, 27, "中污"],
			[11, 39, 19, 38, 0.57, 31, 15, "优"], [12, 41, 11, 40, 0.43, 21, 7, "优"],
			[13, 64, 38, 74, 1.04, 46, 22, "良"], [14, 108, 79, 120, 1.7, 75, 41, "轻污"],
			[15, 108, 63, 116, 1.48, 44, 26, "轻污"], [16, 33, 6, 29, 0.34, 13, 5, "优"],
			[17, 94, 66, 110, 1.54, 62, 31, "良"], [18, 186, 142, 192, 3.88, 93, 79, "中污"],
			[19, 57, 31, 54, 0.96, 32, 14, "良"], [20, 22, 8, 17, 0.48, 23, 10, "优"],
			[21, 39, 15, 36, 0.61, 29, 13, "优"], [22, 94, 69, 114, 2.08, 73, 39, "良"],
			[23, 99, 73, 110, 2.43, 76, 48, "良"], [24, 31, 12, 30, 0.5, 32, 16, "优"],
			[25, 42, 27, 43, 1, 53, 22, "优"], [26, 154, 117, 157, 3.05, 92, 58, "中污"],
			[27, 234, 185, 230, 4.1, 123, 69, "重污"], [28, 160, 120, 186, 2.77, 91, 50, "中污"],
			[29, 134, 96, 165, 2.76, 83, 41, "轻污"], [30, 52, 24, 60, 1.03, 50, 21, "良"],
			[31, 46, 5, 49, 0.28, 10, 6, "优"]];
		var dataGZ = [  //城市B的空气污染指数数据
			[1, 26, 37, 27, 1.163, 27, 13, "优"], [2, 85, 62, 71, 1.195, 60, 8, "良"],
			[3, 78, 38, 74, 1.363, 37, 7, "良"], [4, 21, 21, 36, 0.634, 40, 9, "优"],
			[5, 41, 42, 46, 0.915, 81, 13, "优"], [6, 56, 52, 69, 1.067, 92, 16, "良"],
			[7, 64, 30, 28, 0.924, 51, 2, "良"], [8, 55, 48, 74, 1.236, 75, 26, "良"],
			[9, 76, 85, 113, 1.237, 114, 27, "良"], [10, 91, 81, 104, 1.041, 56, 40, "良"],
			[11, 84, 39, 60, 0.964, 25, 11, "良"], [12, 64, 51, 101, 0.862, 58, 23, "良"],
			[13, 70, 69, 120, 1.198, 65, 36, "良"], [14, 77, 105, 178, 2.549, 64, 16, "良"],
			[15, 109, 68, 87, 0.996, 74, 29, "轻污"], [16, 73, 68, 97, 0.905, 51, 34, "良"],
			[17, 54, 27, 47, 0.592, 53, 12, "良"], [18, 51, 61, 97, 0.811, 65, 19, "良"],
			[19, 91, 71, 121, 1.374, 43, 18, "良"], [20, 73, 102, 182, 2.787, 44, 19, "良"],
			[21, 73, 50, 76, 0.717, 31, 20, "良"], [22, 84, 94, 140, 2.238, 68, 18, "良"],
			[23, 93, 77, 104, 1.165, 53, 7, "良"], [24, 99, 130, 227, 3.97, 55, 15, "良"],
			[25, 146, 84, 139, 1.094, 40, 17, "轻污"], [26, 113, 108, 137, 1.481, 48, 15, "轻污"],
			[27, 81, 48, 62, 1.619, 26, 3, "良"], [28, 56, 48, 68, 1.336, 37, 9, "良"],
			[29, 82, 92, 174, 3.29, 0, 13, "良"], [30, 106, 116, 188, 3.628, 101, 16, "轻污"],
			[31, 118, 50, 0, 1.383, 76, 11, "轻污"]];
		var dataSH = [  //城市C的空气污染指数数据
			[1, 91, 45, 125, 0.82, 34, 23, "良"], [2, 65, 27, 78, 0.86, 45, 29, "良"],
			[3, 83, 60, 84, 1.09, 73, 27, "良"], [4, 109, 81, 121, 1.28, 68, 51, "轻污"],
			[5, 106, 77, 114, 1.07, 55, 51, "轻污"], [6, 109, 81, 121, 1.28, 68, 51, "轻污"],
			[7, 106, 77, 114, 1.07, 55, 51, "轻污"], [8, 89, 65, 78, 0.86, 51, 26, "良"],
			[9, 53, 33, 47, 0.64, 50, 17, "良"], [10, 80, 55, 80, 1.01, 75, 24, "良"],
			[11, 117, 81, 124, 1.03, 45, 24, "轻污"], [12, 99, 71, 142, 1.1, 62, 42, "良"],
			[13, 95, 69, 130, 1.28, 74, 50, "良"], [14, 116, 87, 131, 1.47, 84, 40, "轻污"],
			[15, 108, 80, 121, 1.3, 85, 37, "轻污"], [16, 134, 83, 167, 1.16, 57, 43, "轻污"],
			[17, 79, 43, 107, 1.05, 59, 37, "良"], [18, 71, 46, 89, 0.86, 64, 25, "良"],
			[19, 97, 71, 113, 1.17, 88, 31, "良"], [20, 84, 57, 91, 0.85, 55, 31, "良"],
			[21, 87, 63, 101, 0.9, 56, 41, "良"], [22, 104, 77, 119, 1.09, 73, 48, "轻污"],
			[23, 87, 62, 100, 1, 72, 28, "良"], [24, 168, 128, 172, 1.49, 97, 56, "中污"],
			[25, 65, 45, 51, 0.74, 39, 17, "良"], [26, 39, 24, 38, 0.61, 47, 17, "优"],
			[27, 39, 24, 39, 0.59, 50, 19, "优"], [28, 93, 68, 96, 1.05, 79, 29, "良"],
			[29, 188, 143, 197, 1.66, 99, 51, "中污"], [30, 174, 131, 174, 1.55, 108, 50, "中污"],
			[31, 187, 143, 201, 1.39, 89, 53, "中污"]];
		var schema = [  //定义数据的模式
			{ name: 'date', index: 0, text: '日' },
			{ name: 'AQIindex', index: 1, text: 'AQI指数' },
			{ name: 'PM25', index: 2, text: 'PM2.5' },
			{ name: 'PM10', index: 3, text: 'PM10' },
			{ name: 'CO', index: 4, text: '一氧化碳(CO)' },
			{ name: 'NO2', index: 5, text: '二氧化氮(NO2)' },
			{ name: 'SO2', index: 6, text: '二氧化硫(SO2)' }];
		var myitemStyle = {  //自定义数据项样式
			normal: {
				opacity: 0.8, shadowBlur: 10, shadowOffsetX: 0,
				shadowOffsetY: 0, shadowColor: 'rgba(0, 0, 0, 0.5)'
			}
		};
		var option = {  //指定图表的配置项和数据
			color: ['red', '#fec42c', '#4169E1'],
			legend: {  //配置图例组件
				y: 11, data: ['城市A', '城市B', '城市C'],
				textStyle: { color: 'black', fontSize: 16 }
			},
			grid: { x: '10%', x2: 150, y: '18%', y2: '10%' },  //配置网格组件
			tooltip: {  //配置工具箱组件
				padding: 10, backgroundColor: '#222',
				borderColor: '#777', borderWidth: 1,
				formatter: function (obj) {
					var value = obj.value;
					return '<div style="border-bottom:1px solid rgba(255,255,255,.3);\
					font-size:18px;padding-bottom:7px;margin-bottom:7px">'
						+ obj.seriesName + ' ' + value[0] + '日:' + value[7] + '</div>'
						+ schema[1].text + ':' + value[1] + '<br>'
						+ schema[2].text + ':' + value[2] + '<br>'
						+ schema[3].text + ':' + value[3] + '<br>'
						+ schema[4].text + ':' + value[4] + '<br>'
						+ schema[5].text + ':' + value[5] + '<br>'
						+ schema[6].text + ':' + value[6] + '<br>';
				}
			},
			xAxis: {  //配置x轴坐标系
				type: 'value', name: '日期', nameGap: 16,
				nameTextStyle: { color: 'black', fontSize: 14 },
				max: 31, splitLine: { show: false },
				axisLine: { lineStyle: { color: 'black' } }
			},
			yAxis: {  //配置y轴坐标系
				type: 'value', name: 'AQI指数', nameLocation: 'end', nameGap: 20,
				nameTextStyle: { color: 'black', fontSize: 16 },
				axisLine: { lineStyle: { color: 'black' } },
				splitLine: { show: true }
			},
			visualMap: [  //配置视觉映射组件
				{
					left: 678, top: '7%', dimension: 2, min: 0,
					max: 250, itemWidth: 30, itemHeight: 120, calculable: true,
					precision: 0.1, text: ['圆形大小:PM2.5'], textGap: 30,
					textStyle: { color: 'black' },
					inRange: { symbolSize: [10, 70] },
					outOfRange: { symbolSize: [10, 70], color: ['rgba(255,255,255,.2)'] },
					controller: { inRange: { color: ['#c23531'] }, outOfRange: { color: ['#444'] } }
				},
				{
					left: 695, bottom: '2%', dimension: 6, min: 0,
					max: 50, itemHeight: 120, calculable: true, precision: 0.1,
					text: ['明暗:二氧化硫'], textGap: 30,
					textStyle: { color: 'black' }, inRange: { colorLightness: [1, 0.5] },
					outOfRange: { color: ['rgba(255,255,255,.2)'] },
					controller: { inRange: { color: ['#c23531'] }, outOfRange: { color: ['#444'] } }
				}
			],
			series: [  //配置指定数据系列
				{ name: '城市A', type: 'scatter', itemStyle: myitemStyle, data: dataBJ },
				{ name: '城市B', type: 'scatter', itemStyle: myitemStyle, data: dataSH, },
				{ name: '城市C', type: 'scatter', itemStyle: myitemStyle, data: dataGZ, }]
		};
		//使用刚指定的配置项和数据显示图表
		myChart.setOption(option); 
	</script>
</body>

</html>