![cover](https://img-blog.csdnimg.cn/img_convert/d6f49151552eaf37321e7c617b851bca.png)
Echarts可视化教程(十五)—— 大屏可视化
Echarts可视化教程(十五)—— 大屏可视化
任务描述
本关任务:按照要求绘制大屏图。
相关知识
本关我们将学习Echarts
中大屏图的绘制。
所谓大屏图,指的是将多个可视化图表绘制在一个页面上,这种页面一般需要较大的屏幕来展示,所以被称为大屏图。
大屏图多用在年度总结、监控、数据汇总等场景,比如公安部交通局日常用来监控全国公路、铁路、民航、水运的监控中心就需要使用这种大图。
本关我们将学习绘制的大图如下所示(看不清楚请点击图片):
图 1 大屏图
构建布局
这张大图由六张子图组成,分为上下两层。
上层中,考虑到折线图需要宽一点才能展示完全,所以中间的图较宽。
下层所有的图一样宽,在使用Echarts
之前,我们先要使用html
和css
对图片的分布进行布局,控制好每一张图的位置和大小,这样呈现起来才更加美观。
我们布局的html
程序如下所示:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>ECharts</title>
<!-- 引入 echarts.js -->
<script type="text/JavaScript" src="../static/echarts.min.js"></script>
<script type="text/JavaScript" src="../static/echarts-wordcloud.min.js"></script>
<link rel="stylesheet" type="text/css" href="../static/main.css">
</head>
<body>
<!-- 为ECharts准备一个具备大小(宽高)的Dom -->
<div id="title">
中美两国综合国力对比
</div>
<div id="up">
<div id="up-left">
</div>
<div id="up-middle">
</div>
<div id="up-right">
</div>
</div>
<div id="down">
<div id="down-left">
</div>
<div id="down-middle">
</div>
<div id="down-right">
</div>
</div>
</body>
</html>
其用来布局的样式文件如下(即main.css
):
body{
width:100%;
height:100%;
}
#title{
margin-top:10px;
float:left;
margin-left:48%;
width:52%;
height:30px;
background-color:#ffffff;
font-size:26px;
}
#up{
margin-top:10px;
float:left;
margin-left:5%;
width:90%;
height:400px;
background-color:#ffffff;
}
#up-left{
float:left;
width:20%;
height:100%;
background-color:#ffffff;
}
#up-middle{
float:left;
margin-left:5%;
width:50%;
height:100%;
background-color:#ffffff;
}
#up-right{
float:left;
margin-left:5%;
width:20%;
height:100%;
background-color:#ffffff;
}
#down{
margin-top:10px;
float:left;
margin-left:5%;
width:90%;
height:400px;
background-color:#ffffff;
}
#down-left{
float:left;
width:30%;
height:100%;
background-color:#ffffff;
}
#down-middle{
float:left;
margin-left:5%;
width:30%;
height:100%;
background-color:#ffffff;
}
#down-right{
float:left;
margin-left:5%;
width:30%;
height:100%;
background-color:#ffffff;
}
因为Echarts
会控制每一张图内部的样式,所以我们的css
只需要控制图的整体样式即可,重点是图和图之间的相对位置要布局合理。比如留足合适的间距。
折线图、柱状图的绘制
我们先来看下位于上方的正中间的折线图和柱状图的绘制,它的程序如下所示:
var myChart = echarts.init(document.getElementById('up-middle'));
myChart.setOption({
grid:{
width:"65%"
},
title : {
x:"20%",
text : "人口、人均GDP、GDP总量增长清空"//标题
},
tooltip : {
},
legend: {
x:"80%",
y:15,
orient:"vertical",
data:['中国总人口(百万)', '美国总人口(百万)', '中国GDP总量(亿美元)', '美国GDP总量(亿美元)', '中国人均GDP(美元)', '美国人均GDP(美元)']//图例
},
xAxis : [
{
name: "年份",
type : 'category',//表示x轴的每一项由几组数据组成
data : ['1980','1985','1990','1995','2000','2005','2010','2015', '2020']//x轴标题
}
],
yAxis : [
{
type : 'value'//每一项都是数据
}
],
series : [
{
/********* Begin *********/
//作为本关题目,这里不给出
/********* End *********/
itemStyle : { color:'rgb(252,144,115)'},//柱子样式
data:[98100,105100,113500,120500, 126300, 130400,133800, 137100, 140200]//数据
},
{
/********* Begin *********/
//作为本关题目,这里不给出
/********* End *********/
itemStyle : { color:'rgb(187,230,115)'},//柱子样式
data:[22900,24000,25200,26600, 28200, 29600,30900, 32100, 33200]
},
{
name:'中国人均GDP(美元)',//数据的名字
type:'line',//表示柱状图
itemStyle : { color:'rgb(118,102,79)', normal: {label : {show: true}}},//柱子样式
data:[194, 294, 317, 609, 959, 1753, 4550, 8066, 10500]//数据
},
{
name:'美国人均GDP(美元)',
type:'line',
itemStyle : { color:'rgb(67,74,80)', normal: {label : {show: true}}},//柱子样式
data:[12574, 18236, 23888, 28690, 36334, 44114, 48466, 56863, 63543]
},
{
name:'中国GDP总量(亿美元)',//数据的名字
type:'line',//表示柱状图
itemStyle : { color:'rgb(60,46,123)', normal: {label : {show: true}}},//柱子样式
data:[1911, 3094, 3608, 7345, 12113, 22859, 60871, 110616, 147227]//数据
},
{
name:'美国GDP总量(亿美元)',
type:'line',
itemStyle : { color:'rgb(8,117,78)', normal: {label : {show: true}}},//柱子样式
data:[28573, 43389, 59631, 76397, 102523, 130366, 149921, 182383, 209366]
},
]
});
这里的程序细节我们在柱状图和折线图这两个课程中已经讲的很详细,这里不再赘述。
稍微需要提醒的是,柱状图需要堆积,折线图不需要使用堆积功能。
饼状图
上方左侧是饼图,绘制的是中美两国2020
年的世界五百强企业数量的对比,它的程序如下所示:
var myChart = echarts.init(document.getElementById('up-left'));
myChart.setOption({
grid:{
width:"85%"
},
title : {
x:"2%",
text : "世界五百强企业数量对比(2020)"//标题
},
tooltip : {
},
color:["rgb(178,94,70)", "rgb(9,163,65)"],
legend: {
x:"80%",
y:20,
orient:"vertical",
data:['中国', '美国']//图例
},
series : [
{
name:'世界五百强企业数量',//数据的名字
type:'pie',//表示柱状图
radius:'60%',//圆的半径
itemStyle : {normal: {label : {show: true}}},
/********* Begin *********/
//作为本关题目,这里不给出
/********* End *********/
}
]
});
这里的知识点请参考:饼状图,需要注意的是,输入的数据可以直接是数字,没有必要提前计算百分比。
雷达图
我们用雷达图来展示中美军队之间的对比,程序如下:
//右侧
var myChart = echarts.init(document.getElementById('up-right'));
myChart.setOption({
grid:{
width:"95%"
},
title : {
x:"12%",
text : "中美军力对比(2020)"//标题
},
tooltip : {
},
color:["rgb(237,223,174)", "rgb(9,163,65)"],
legend: {
x:"80%",
y:20,
orient:"vertical",
data:['中国', '美国']//图例
},
radar: [{ //配置雷达图坐标系组件,只适用于雷达图
center: ['50%', '56%'], //设置中心坐标,数组的第1项是横坐标,第2项是纵坐标
radius: '60%', //设置圆的半径,数组的第一项是内半径,第二项是外半径
name: { //设置(圆外的标签)雷达图每个指示器名称
formatter: '{value}',
textStyle: {color: '#000' }
},
splitNumber: 2, //设置指示器轴的分割段数,default
//设置坐标轴轴线设置
axisLine: { lineStyle: { color: '#fff', width: 1, type: 'solid', } },
//设置坐标轴在grid区域中的分隔线
splitLine: { lineStyle: { color: '#fff', width: 1, } },
splitArea: {
show: true,
areaStyle: { color: ['#abc', '#abc', '#abc', '#abc'] }
}, //设置分隔区域的样式
indicator: [ //配置雷达图指示器,指定雷达图中的多个变量,跟data中value对应
//设置指示器的名称,最大值,标签的颜色
{ name: '军费开支', max: 10300 },
{ name: '军队数量', max: 340 },
{ name: '航母数量', max: 14 },
{ name: '五代机数量', max: 400 },
{ name: '洲际导弹数量', max: 4100 }]
}],
series: [{
name: '雷达图', //系列名称,用于tooltip的显示,图例筛选
type: 'radar', //系列类型: 雷达图
data: [ //设置雷达图的数据是多变量(维度)
{ //设置第1个数据项
name: '中国', //数据项名称
value: [2520, 200, 3, 150, 350], //value是具体数据
symbol: 'triangle',
//设置拐点标志样式
itemStyle: { normal: { borderColor: 'blue', borderWidth: 3 } },
},
{ //设置第2个数据项
name: '美国',
value: [7780, 140, 11, 250, 3750],
symbol: 'circle',
//设置拐点标志样式
itemStyle: { normal: { borderColor: 'rgba(51,0,255,1)', borderWidth: 3, } },
}
]
},]
});
雷达图的知识点请参考:雷达图
仪表盘
我们使用仪表盘来展示中美两国的人类发展指数,如下:
//下方左侧
var myChart = echarts.init(document.getElementById('down-left'));
myChart.setOption({
grid:{
x:'left'
},
title : {
x:"10%",
text : "人类发展指数对比(2020)"//标题
},
tooltip : {
},
color:["rgb(178,94,70)", "rgb(9,163,65)"],
series: [
{
name: "",
center:['35%', '50%'],
type: 'gauge',//仪表盘
min: 0,//示数的最小值
max: 1,//示数的最大值
radius: "80%",//仪表的半径
splitNumber: 1, //刻度数量
startAngle: 180,//起始的角度
endAngle: 0,//结束的角度
axisLine: { // 坐标轴线
lineStyle: { // 属性lineStyle控制线条样式
width: 40,//圆环的半径
color: [ //渐变的颜色
[1, new echarts.graphic.LinearGradient(0, 0, 1, 0, [{
offset: 0,
color: '#3aa600'
}, {
offset: 1,
color: '#f70700'
}])]
],
}
},
axisLabel: {
show: true,//不显示刻度标签
},
detail: {
offsetCenter: [20, '-45%'],//数值的位置
},
data: [{
value: 0.761, //指针数值
}]
},
{
name: "",
center:['35%', '50%'],
z:3,
type: 'gauge',//仪表盘
min: 0,//示数的最小值
max: 1,//示数的最大值
radius: "80%",//仪表的半径
splitNumber: 1, //刻度数量
startAngle: 180,//起始的角度
endAngle: 0,//结束的角度
axisLine: { // 坐标轴线
show:false
},
axisLabel: {
show: false,//不显示刻度标签
},
detail: {
offsetCenter: [80, '-5%'],//数值的位置
},
data: [{
value: 0.926, //指针数值
}]
}
]
});
仪表盘知识点请参考:仪表盘,这里的仪表盘是将两个仪表盘叠加起来的效果,其中的上层仪表盘我们只保留了指针。这样最终就会显示一个仪表,两个指针。
散点图
我们用散点图来表示两国在近年来的出口总额情况对比:
//下方中间
var myChart = echarts.init(document.getElementById('down-middle'));
myChart.setOption({
grid:{
x:'13%',
width:"75%"
},
title : {
x:"2%",
text : "中美出口总额对比"//标题
},
tooltip : {
},
color:["rgb(178,94,70)", "rgb(9,163,65)"],
legend: {
x:"80%",
y:10,
orient:"vertical",
data:['中国', '美国']//图例
},
xAxis : [
{
scale:true,
name:'年份'
}
],
yAxis : [
{
scale:true,
name:'出口总额(亿美元)'
}
],
series : [
{
name:'中国',
type:'scatter',
symbolSize:10,
symbol:'diamond',
data: [
[2014, 43030.38], [2015, 39586.44], [2016, 36849.25],
[2017, 41044.70], [2018, 46230.40], [2019, 45753.00], [2020, 46462.60]
]
},
{
name:'美国',
type:'scatter',
symbolSize:10,
symbol:'rect',
data: [
[2014, 28424.00], [2015, 27980.44], [2016, 29854.25],
[2017, 31058.70], [2018, 32156.40], [2019, 34025.00], [2020, 29560.60]
]
}
]
});
散点图的知识点请参考:散点图
词云图
最后是词云图,展示了2020
年的中美两国的关键词:
var myChart = echarts.init(document.getElementById('down-right'));
myChart.setOption({
title: { //配置标题组件
text: '中美2020关键词',
x: 'center', y: 15,
textStyle: {
color: 'green', fontSize: 22,
}
},
tooltip: { show: true }, //配置提示框组件
series: [{ //数据系列及其配置
name: '中美2020关键词', //设置名称
type: 'wordCloud', //设置图表类型为字云图
sizeRange: [15, 100], //设置数据大小范围
size: ['80%', '80%'], //设置显示的字云图的大小
textRotation: [0, 45, 90, 135, -45, -90], //设置文字倾斜角度
textPadding: 3, //设置文字之间的间距
autoSize: { enable: true, minSize: 5 }, //设置文字的自动大小
textStyle: {
normal: {
color: function () {
return 'rgb(' + [
Math.round(Math.random() * 255),
Math.round(Math.random() * 255),
Math.round(Math.random() * 255)
].join(',') + ')';
}
},
emphasis: {
shadowBlur: 26,
color: '#333',
shadowColor: '#ccc',
fontSize: 20
}
},
data: [ //设置具体的数据
{ name: "新冠", value: 15884 }, { name: "疫情", value: 16180 },
{ name: "抗疫", value: 9089 }, { name: "武汉", value: 6229 },
{ name: "湖北", value: 3860 }, { name: "口罩", value: 3745 },
{ name: "复工", value: 1318 }, { name: "复产", value: 1307 },
{ name: "复课", value: 1261 }, { name: "疫苗", value: 1046 },
{ name: "病毒", value: 1234 }, { name: "隔离", value: 1100 },
{ name: "防护", value: 1046 }, { name: "居家办公", value: 915 },
{ name: "消毒", value: 1023 }, { name: "停工", value: 924 },
{ name: "COVID-19", value: 15822 }, { name: "virus", value: 12814 },
{ name: "mask", value: 5193 }, { name: "Trump", value: 8447 },
{ name: "BLM", value: 5524 }, { name: "Biden", value: 3448 },
{ name: "fraud", value: 1447 }, { name: "vaccine", value: 1442 },
{ name: "New York", value: 1439 }, { name: "race", value: 2169 },
{ name: "MAGA", value: 2409 }
] //data结束
}] //series结束
});
词云图的教程链接时:词云图
最终画出来的效果就是图1
。
编程要求
根据提示,在右侧编辑器Begin
和End
之间补充代码,绘制如下的大屏图(这个图是我们把例子中的图的下半部分去掉了,因为下半部分的词云图词语的位置是随机的,无法测评):
图 2 结果图
要求(以图片为准,这里仅为提示作用):
- 你需要补充的有三个地方;
- 前两个地方需要补充
name
、type
、statck
属性; - 第三个地方需要补充
data
属性,其中中国是124
、美国是121
。 - 最后的图片必须和结果图一模一样。
测试说明
我们将调用浏览器接口,打开你修改的这段代码生成的网页,并截图获取其中的图像,和正确的图像进行对比,从而判断你补充的程序是否正确,正确将输出:“图像对比一致,恭喜通关!”
同时我们将展示你生成的图像和正确的图像,你可以通过观察图像的方式修改自己尚未通过的代码。
测试输入: 预期输出:图像对比一致,恭喜通关!
开始你的任务吧,祝你成功!
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>ECharts</title>
<!-- 引入 echarts.js -->
<script type="text/JavaScript" src="../static/echarts.min.js"></script>
<script type="text/JavaScript" src="../static/echarts-wordcloud.min.js"></script>
<link rel="stylesheet" type="text/css" href="../static/main.css">
</head>
<body>
<!-- 为ECharts准备一个具备大小(宽高)的Dom -->
<div id="title">
中美两国综合国力对比
</div>
<div id="up">
<div id="up-left">
</div>
<div id="up-middle">
</div>
<div id="up-right">
</div>
</div>
<script type="text/javascript">
//中间大图
var myChart = echarts.init(document.getElementById('up-middle'));
myChart.setOption({
grid:{
width:"65%"
},
title : {
x:"20%",
text : "人口、人均GDP、GDP总量增长清空"//标题
},
tooltip : {
},
legend: {
x:"80%",
y:15,
orient:"vertical",
data:['中国总人口(百万)', '美国总人口(百万)', '中国GDP总量(亿美元)', '美国GDP总量(亿美元)', '中国人均GDP(美元)', '美国人均GDP(美元)']//图例
},
xAxis : [
{
name: "年份",
type : 'category',//表示x轴的每一项由几组数据组成
data : ['1980','1985','1990','1995','2000','2005','2010','2015', '2020']//x轴标题
}
],
yAxis : [
{
type : 'value'//每一项都是数据
}
],
series : [
{
/********* Begin *********/
stack:'1',
name:"中国总人口(百万)",
type:'bar',
/********* End *********/
itemStyle : { color:'rgb(252,144,115)'},//柱子样式
data:[98100,105100,113500,120500, 126300, 130400,133800, 137100, 140200]//数据
},
{
/********* Begin *********/
stack:'1',
name:"美国总人口(百万)",
type:'bar',
/********* End *********/
itemStyle : { color:'rgb(187,230,115)'},//柱子样式
data:[22900,24000,25200,26600, 28200, 29600,30900, 32100, 33200]
},
{
name:'中国人均GDP(美元)',//数据的名字
type:'line',//表示柱状图
itemStyle : { color:'rgb(118,102,79)', normal: {label : {show: true}}},//柱子样式
data:[194, 294, 317, 609, 959, 1753, 4550, 8066, 10500]//数据
},
{
name:'美国人均GDP(美元)',
type:'line',
itemStyle : { color:'rgb(67,74,80)', normal: {label : {show: true}}},//柱子样式
data:[12574, 18236, 23888, 28690, 36334, 44114, 48466, 56863, 63543]
},
{
name:'中国GDP总量(亿美元)',//数据的名字
type:'line',//表示柱状图
itemStyle : { color:'rgb(60,46,123)', normal: {label : {show: true}}},//柱子样式
data:[1911, 3094, 3608, 7345, 12113, 22859, 60871, 110616, 147227]//数据
},
{
name:'美国GDP总量(亿美元)',
type:'line',
itemStyle : { color:'rgb(8,117,78)', normal: {label : {show: true}}},//柱子样式
data:[28573, 43389, 59631, 76397, 102523, 130366, 149921, 182383, 209366]
},
]
});
//左侧
var myChart = echarts.init(document.getElementById('up-left'));
myChart.setOption({
grid:{
width:"85%"
},
title : {
x:"2%",
text : "世界五百强企业数量对比(2020)"//标题
},
tooltip : {
},
color:["rgb(178,94,70)", "rgb(9,163,65)"],
legend: {
x:"80%",
y:20,
orient:"vertical",
data:['中国', '美国']//图例
},
series : [
{
name:'世界五百强企业数量',//数据的名字
type:'pie',//表示柱状图
radius:'60%',//圆的半径
itemStyle : {normal: {label : {show: true}}},
/********* Begin *********/
data:[{value:124,name:'中国'},{value:121,name:'美国'}]
/********* End *********/
}
]
});
//右侧
var myChart = echarts.init(document.getElementById('up-right'));
myChart.setOption({
grid:{
width:"95%"
},
title : {
x:"12%",
text : "中美军力对比(2020)"//标题
},
tooltip : {
},
color:["rgb(237,223,174)", "rgb(9,163,65)"],
legend: {
x:"80%",
y:20,
orient:"vertical",
data:['中国', '美国']//图例
},
radar: [{ //配置雷达图坐标系组件,只适用于雷达图
center: ['50%', '56%'], //设置中心坐标,数组的第1项是横坐标,第2项是纵坐标
radius: '60%', //设置圆的半径,数组的第一项是内半径,第二项是外半径
name: { //设置(圆外的标签)雷达图每个指示器名称
formatter: '{value}',
textStyle: {color: '#000' }
},
splitNumber: 2, //设置指示器轴的分割段数,default
//设置坐标轴轴线设置
axisLine: { lineStyle: { color: '#fff', width: 1, type: 'solid', } },
//设置坐标轴在grid区域中的分隔线
splitLine: { lineStyle: { color: '#fff', width: 1, } },
splitArea: {
show: true,
areaStyle: { color: ['#abc', '#abc', '#abc', '#abc'] }
}, //设置分隔区域的样式
indicator: [ //配置雷达图指示器,指定雷达图中的多个变量,跟data中value对应
//设置指示器的名称,最大值,标签的颜色
{ name: '军费开支', max: 10300 },
{ name: '军队数量', max: 340 },
{ name: '航母数量', max: 14 },
{ name: '五代机数量', max: 400 },
{ name: '洲际导弹数量', max: 4100 }]
}],
series: [{
name: '雷达图', //系列名称,用于tooltip的显示,图例筛选
type: 'radar', //系列类型: 雷达图
data: [ //设置雷达图的数据是多变量(维度)
{ //设置第1个数据项
name: '中国', //数据项名称
value: [2520, 200, 3, 150, 350], //value是具体数据
symbol: 'triangle',
//设置拐点标志样式
itemStyle: { normal: { borderColor: 'blue', borderWidth: 3 } },
},
{ //设置第2个数据项
name: '美国',
value: [7780, 140, 11, 250, 3750],
symbol: 'circle',
//设置拐点标志样式
itemStyle: { normal: { borderColor: 'rgba(51,0,255,1)', borderWidth: 3, } },
}
]
},]
});
</script>
</body>
</html>
![Logo](https://devpress.csdnimg.cn/79de2bf0b7994defa4242ef90d5513fa.jpg)
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)