Echart是目前前端图表展示比较流行的框架之一,官方提供了很多样示例,可以实现大多数的图表需求,但在日前的项目中,往往会有一些自定义的图表,如地铁交通图,显示站点人流等信息这种自定义的图表,就需要我们对echart进行自定义的开发,下面展示了如何利用线图实现地铁效果,上图:
要实现这种效果除了掌握echart 线图的配置,数据准备也是关键的一步,如何利用Js通过一张图取出每个点的坐标,就需要我们写一个取点的方法,通过鼠标事件自动取点,这个不是本文讨论的内容。
直接上代码:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>第一个 ECharts 实例</title>
<!-- 引入 echarts.js -->
<script src="https://cdn.staticfile.org/echarts/4.3.0/echarts.min.js"></script>
</head>
<body>
<!-- 为ECharts准备一个具备大小(宽高)的Dom -->
<div id="main" style="width: 1200px;height:700px;"></div>
<script type="text/javascript">
// 基于准备好的dom,初始化echarts实例
var myChart = echarts.init(document.getElementById('main'));
var line1 =
[
{point:[0,552] ,name:" 一号线 ",icon:"name",line:1,labelPosition:"right"},
{point:[104,552] ,name:" 十三号街 ",icon:"circle",line:1,labelPosition:"bottom"},
{point:[178,552] ,name:" 中央大街 ",icon:"circle",line:1,labelPosition:"top"},
{point:[246,552] ,name:" 七号街 ",icon:"circle",line:1,labelPosition:"bottom"},
{point:[307,552] ,name:" 四号街 ",icon:"circle",line:1,labelPosition:"bottom"},
{point:[337,580] ,name:" 张士 ",icon:"circle",line:1,labelPosition:"left"},
{point:[367,611] ,name:" 开发大道 ",icon:"circle",line:1,labelPosition:"right"},
{point:[367,645] ,name:" 于洪广场 ",icon:"circle",line:1,labelPosition:"left"},
{point:[369,679] ,name:" 迎宾路 ",icon:"circle",line:1,labelPosition:"top"},
{point:[436,679] ,name:" 重工街 ",icon:"circle",line:1,labelPosition:"bottom"},
{point:[504,679] ,name:" 启工街 ",icon:"circle",line:1,labelPosition:"top"},
{point:[572,679] ,name:" 保工街 ",icon:"circle",line:1,labelPosition:"bottom"},
{point:[635,679] ,name:" 铁西广场 ",icon:"jx",line:1,labelPosition:"top"},
{point:[711,679] ,name:" 云峰北街 ",icon:"circle",line:1,labelPosition:"top"},
{point:[779,679] ,name:" 沈阳站 ",icon:"circle",line:1,labelPosition:"bottom"},
{point:[847,679] ,name:" 太原街 ",icon:"circle",line:1,labelPosition:"top"},
{point:[916,679] ,name:" 南市场 ",icon:"circle",line:1,labelPosition:"bottom"},
{point:[984,679] ,name:" 青年大街 ",icon:"jx",line:1,labelPosition:"top"},
{point:[1066,679] ,name:" 怀远门 ",icon:"circle",line:1,labelPosition:"top"},
{point:[1143,679] ,name:" 中街 ",icon:"circle",line:1,labelPosition:"bottom"},
{point:[1221,679] ,name:" 东中街 ",icon:"circle",line:1,labelPosition:"bottom"},
{point:[1295,679] ,name:" 滂江街 ",icon:"jx",line:1,labelPosition:"top"},
{point:[1374,679] ,name:" 黎明广场 ",icon:"circle",line:1,labelPosition:"right"},
]
var line2 =
[
{point:[947,1632] ,name:" 二号线 ",icon:"name",line:2,labelPosition:"right"},
{point:[947,1532], name:"蒲田路 ",icon:"circle",line:2,labelPosition:"right"},
{point:[947,1477], name:"蒲河路 ",icon:"circle",line:2,labelPosition:"right"},
{point:[947,1424], name:"人杰湖公园 ",icon:"circle",line:2,labelPosition:"right"},
{point:[947,1371], name:"辽宁大学 ",icon:"circle",line:2,labelPosition:"right"},
{point:[947,1318], name:"航空航天大 ",icon:"circle",line:2,labelPosition:"right"},
{point:[947,1263], name:"师范大学 ",icon:"circle",line:2,labelPosition:"right"},
{point:[947,1210], name:"医学院 ",icon:"circle",line:2,labelPosition:"right"},
{point:[947,1162], name:"三台子 ",icon:"circle",line:2,labelPosition:"right"},
{point:[947,1110], name:"陵西 ",icon:"circle",line:2,labelPosition:"right"},
{point:[947,1057], name:"新乐遗址 ",icon:"circle",line:2,labelPosition:"right"},
{point:[947,1006], name:"北陵公园 ",icon:"circle",line:2,labelPosition:"right"},
{point:[969,951] , name:"中医药大学 ",icon:"jx",line:2,labelPosition:"right"},
{point:[985,906] , name:"岐山路 ",icon:"circle",line:2,labelPosition:"right"},
{point:[985,847] , name:"沈阳北站 ",icon:"circle",line:2,labelPosition:"right"},
{point:[985,795] , name:"金融中心 ",icon:"circle",line:2,labelPosition:"right"},
{point:[985,735] , name:"市府广场 ",icon:"circle",line:2,labelPosition:"top"},
{point:[985,680] , name:"青年大街 ",icon:"jx",line:2,labelPosition:"right"},
{point:[985,631] , name:"青年公园 ",icon:"circle",line:2,labelPosition:"right"},
{point:[985,575] , name:"工业展览馆 ",icon:"circle",line:2,labelPosition:"right"},
{point:[985,501] , name:"市图书馆 ",icon:"circle",line:2,labelPosition:"right"},
{point:[1031,455], name:"五里河 ",icon:"circle",line:2,labelPosition:"right"},
{point:[1089,398], name:"奥体中心 ",icon:"jx",line:2,labelPosition:"right"},
{point:[1131,355], name:"营盘街 ",icon:"circle",line:2,labelPosition:"right"},
{point:[1171,315], name:"世纪大厦 ",icon:"circle",line:2,labelPosition:"left"},
{point:[1171,263], name:"白塔河路 ",icon:"circle",line:2,labelPosition:"right"},
{point:[1171,211], name:"全运路 ",icon:"circle",line:2,labelPosition:"bottom"},
]
var line10 =
[
{point:[399,1175] ,name:"十号线 ",icon:"name",line:10,labelPosition:"right"},
{point:[399,1075] ,name:"丁香湖 ",icon:"circle",line:10,labelPosition:"top"},
{point:[399,1003] ,name:"元江街 ",icon:"circle",line:10,labelPosition:"left"},
{point:[450,951] ,name:"向工街 ",icon:"circle",line:10,labelPosition:"bottom"},
{point:[503,951] ,name:"塔湾街 ",icon:"circle",line:10,labelPosition:"top"},
{point:[643,950] ,name:"淮河街沈医二院 ",icon:"jx",line:10,labelPosition:"bottom"},
{point:[763,951] ,name:"百鸟公园 ",icon:"circle",line:10,labelPosition:"bottom"},
{point:[866,951] ,name:"长江街 ",icon:"circle",line:10,labelPosition:"bottom"},
{point:[968,951] ,name:"中医药大学 ",icon:"jx",line:10,labelPosition:"bottom"},
{point:[1107,951] ,name:"陵东街 ",icon:"circle",line:10,labelPosition:"top"},
{point:[1214,951] ,name:"北塔 ",icon:"circle",line:10,labelPosition:"right"},
{point:[1297,868] ,name:"合作街 ",icon:"circle",line:10,labelPosition:"right"},
{point:[1297,782] ,name:"东北大马路 ",icon:"circle",line:10,labelPosition:"right"},
{point:[1297,680] ,name:"滂江街 ",icon:"jx",line:10,labelPosition:"right"},
{point:[1297,631] ,name:"长安路 ",icon:"circle",line:10,labelPosition:"right"},
{point:[1297,587] ,name:"万莲 ",icon:"circle",line:10,labelPosition:"right"},
{point:[1297,535] ,name:"泉园 ",icon:"circle",line:10,labelPosition:"right"},
{point:[1297,490] ,name:"江东街 ",icon:"circle",line:10,labelPosition:"right"},
{point:[1297,446] ,name:"长青桥 ",icon:"circle",line:10,labelPosition:"right"},
{point:[1344,400] ,name:"长青南街 ",icon:"jx",line:10,labelPosition:"right"},
{point:[1397,346] ,name:"理工大学 ",icon:"circle",line:10,labelPosition:"right"},
{point:[1397,267] ,name:"张沙布 ",icon:"circle",line:10,labelPosition:"bottom"},
]
var line9 =
[
{point:[642,1165] ,name:"九号线 ",icon:"name",line:9,labelPosition:"right"},
{point:[642,1065] ,name:"怒江公园 ",icon:"circle",line:9,labelPosition:"top"},
{point:[642,951] ,name:"淮河街沈医二院 ",icon:"jx",line:9,labelPosition:"top"},
{point:[642,880] ,name:"皇姑屯 ",icon:"circle",line:9,labelPosition:"right"},
{point:[642,813] ,name:"重型文化广场 ",icon:"circle",line:9,labelPosition:"right"},
{point:[642,746] ,name:"北二路 ",icon:"circle",line:9,labelPosition:"right"},
{point:[642,679] ,name:"铁西广场 ",icon:"jx",line:9,labelPosition:"right"},
{point:[642,629] ,name:"兴华公园 ",icon:"circle",line:9,labelPosition:"right"},
{point:[642,584] ,name:"沈辽路 ",icon:"circle",line:9,labelPosition:"right"},
{point:[611,551] ,name:"滑翔 ",icon:"circle",line:9,labelPosition:"right"},
{point:[576,519] ,name:"吉利湖街 ",icon:"circle",line:9,labelPosition:"left"},
{point:[576,459] ,name:"大通湖街 ",icon:"circle",line:9,labelPosition:"right"},
{point:[576,399] ,name:"曹仲 ",icon:"circle",line:9,labelPosition:"bottom"},
{point:[704,399] ,name:"浑河站 ",icon:"circle",line:9,labelPosition:"bottom"},
{point:[767,399] ,name:"胜利南街 ",icon:"circle",line:9,labelPosition:"top"},
{point:[830,399] ,name:"长白南 ",icon:"circle",line:9,labelPosition:"bottom"},
{point:[893,399] ,name:"榆树台 ",icon:"circle",line:9,labelPosition:"top"},
{point:[955,399] ,name:"金阳大街 ",icon:"circle",line:9,labelPosition:"bottom"},
{point:[1020,399] ,name:"彩霞街 ",icon:"circle",line:9,labelPosition:"top"},
{point:[1087,399] ,name:"奥体中心 ",icon:"jx",line:9,labelPosition:"bottom"},
{point:[1186,395] ,name:"天成街 ",icon:"circle",line:9,labelPosition:"top"},
{point:[1255,396] ,name:"朗日街 ",icon:"circle",line:9,labelPosition:"bottom"},
{point:[1347,398] ,name:"长青南街 ",icon:"jx",line:9,labelPosition:"bottom"},
{point:[1447,397] ,name:"建筑大学 ",icon:"circle",line:9,labelPosition:"right"},
]
var data = [];
var allPoint = line1.concat(line2).concat(line9).concat(line10)
var dataMap = {}
for(var i=0;i<allPoint.length;i++){
var item = allPoint[i]
if(dataMap[item.name.trim()])continue;
dataMap[item.name.trim()] = "1"
var c = item.line==1?"#FFFF00":(item.line==2?"#0066FF":(item.line==10?"#66009D":"#FFB7DD"))
data.push(
{
name: item.name.trim(),
tooltip: { formatter: "{b}" },
symbol: item.icon,
symbolSize: item.icon=="name"?[1,1]:[5+10*(item.icon=="jx"?1:0), 5+10*(item.icon=="jx"?1:0)],
value: [item.point[0]*0.6,item.point[1]*0.7],
fixed: true,
category: 1,
label: { color: "#000", position: item.labelPosition,textStyle:{fontSize:item.icon=="name"?12:8}},
itemStyle: {
normal: {
borderColor: '#f58f23',
borderWidth: 2,
color: item.icon?"#fff":new echarts.graphic.LinearGradient(0, 0, 1, 0, [{ offset: 0, color: c }, { offset: 1, color: c } ])
}
}
}
);
}
var links = [];
for(var i=2;i<line1.length;i++){
var itemName = line1[i].name.trim()
var itempreName = line1[i-1].name.trim()
links.push({
source: itempreName,
target: itemName,
lineStyle: {
normal: {
color: "#7FFFD4",
}
}
})
}
for(var i=2;i<line2.length;i++){
var itemName = line2[i].name.trim()
var itempreName = line2[i-1].name.trim()
links.push({
source: itempreName,
target: itemName,
lineStyle: {
normal: {
color: "#7FFF00",
}
}
})
}
for(var i=2;i<line9.length;i++){
var itemName = line9[i].name.trim()
var itempreName = line9[i-1].name.trim()
links.push({
source: itempreName,
target: itemName,
lineStyle: {
normal: {
color: "#008B8B",
}
}
})
}
for(var i=2;i<line10.length;i++){
var itemName = line10[i].name.trim()
var itempreName = line10[i-1].name.trim()
links.push({
source: itempreName,
target: itemName,
lineStyle: {
normal: {
color: "#00BFFF",
}
}
})
}
var option = {
title: {
text: '沈阳地铁线路图',
textStyle: {
color: 'black',
fontSize: 20
},
x: 'center',
top: 10
},
//不设置背景颜色就是透明色
//backgroundColor: '#000',
xAxis: {
show: false,
min: 0,
max: 1200,
// type: "value",
//开启x轴坐标
axisPointer: {
show: false
},
},
yAxis: {
show: false,
min: 0,
max: 1200,
// type: "value",
//开启y轴坐标
axisPointer: {
show: false
},
},
tooltip: {},
// legend: {
// show: false
// },
series: [{
type: "graph",
zlevel: 5,
draggable: false,
coordinateSystem: "cartesian2d", //使用二维的直角坐标系(也称笛卡尔坐标系)
symbol: "rect",
symbolOffset: ["15%", 0],
label: {
normal: {
show: true
}
},
data: data,
links: links,
lineStyle: {
normal: {
opacity: 0.6, //线条透明度
color: "#53B5EA",
curveness: 0, //站点间连线曲度,0表示直线
width: 8 //线条宽度
}
}
}
]
};
if(option){
myChart.setOption(option);
}
</script>
</body>
</html>