之前在项目中利用canvas实现了折线图,在实现的过程中觉得过于繁琐,前两天看到Echarts这个插件,学习,模仿一下,中文学习网址:http://echarts.baidu.com/index.html
项目的需求为:当数据少于7个的时候,展现第一种样式,当数据多余7个的时候,采用第二种样式,如下图:
实现的思路如下:
1.写出一条简单的折线图
2.修改折线图样式(7个点以内的样式和大于7个点的样式各来一个)
3.后期数据交互实现
4.完整代码
最后实现效果如下(这里把折线改成了曲线):
一.实现简单的折线图
效果图如下:
实现一个基本的折线图代码如下:
——css—–
<style type="text/css">
html,body{
margin:0;
padding: 0;
}
.chartContainer{
width:100%;
height:10rem;
border:1px solid pink;
box-sizing:border-box;
}
</style>
—–html—–
<body>
<div class="chartContainer" id="chart1"></div>
</body>
——js——
<script type="text/javascript">
//初始化echarts实例
var chart1=$("#chart1").get(0);
var myChart=echarts.init(chart1);
var chartDate=[1,3,5,8,10,15,18,22,25,28,30];
//var weight=[55.4,55.9,53];
var weight=[55.4,55.9,53,56,57,58,56.7,53,55,54,53];
//对echarts做基础配置
option={
xAxis:{
data:chartDate
},
yAxis:{
},
series:[
{
name:"体脂",
type:"line",//折线图,还有pie(饼状图),
data:weight
}
]
}
myChart.setOption(option);
</script>
二.修改折线图样式
1:少于7个点的样式
最后实现效果如下图:
<1>调整折线的折线颜色,隐藏x,y轴
series:[
{
name:"体脂",
type:"line",//折线图,还有pie(饼状图),
data:weight,
lineStyle:{//线条颜色
normal:{
color: '#1daffa',
}
},
}
]
<2>调整标注的颜色
series:[
{
name:"体脂",
type:"line",//折线图,还有pie(饼状图),
data:weight,
lineStyle:{//线条颜色
normal:{
color: 'rgba(29, 175, 250, 0.3)',
}
},
itemStyle:{
normal:{
color: 'rgba(29, 175, 250, 0.3)',
}
}
}
]
<3>调整y轴,使y坐标轴从数据最小点开始(不是从0开始,从0开始数据域范围太窄)
yAxis:{
min:"dataMin",//可以设置成特殊值 'dataMin',此时取数据在该轴上的最小值作为最小刻度。
show:false
},
<4>调整标注样式
本来是打算用代码实现外面是半透明,里面是蓝色实心的样式,但是没有找到设置的,看看以后能不能优化,现在用图片代替。
在series里面添加:
symbol:'image://image/dot1.png',
//设置标注点的图片,或者有('circle', 'rect', 'roundRect', 'triangle', 'diamond', 'pin', 'arrow')
symbolSize:10,//标注点的大小
<5>添加标注文本,修改样式
在series里面添加:
label:{
normal:{
show:true,
position:[0,-20],
textStyle:{
color:"#1daffa"
}
}
}
<6>去掉动画效果,把折线变成曲线
在option里面添加,和series同级
animation : false,//是否启用图表初始化动画,默认开启
在series里面添加
smooth:true,//是否平滑曲线显示。
2.大于7个点的实现
<1>首先实现一个简单的曲线,去掉标注
option2={
xAxis:{
data:chartDate,
show:false
},
yAxis:{
boundaryGap:false,
min:"dataMin",
show:false
},
animation : false,//是否启用图表初始化动画,默认开启
series:[
{
name:"体脂",
type:"line",//折线图,还有pie(饼状图),
smooth:true,
symbol:"none",//去掉标注
lineStyle:{//线条颜色
normal:{
color: '#1daffa',
width:1
}
},
itemStyle:{
normal:{
color: 'rgba(29, 175, 250, 0.3)',
}
},
data:weight
}
]
}
<2>实现极点的标注
在series里面添加:
markPoint: {
data: [
{
type:'max',
symbolSize:2,
label: {
normal: {
position: 'top',
formatter: '{c}',
textStyle:{
color:"#1daffa"
}
}
}
},
{
type:'min',
symbolSize:2,
label: {
normal: {
position: 'bottom',
formatter: '{c}',
textStyle:{
color:"#1daffa"
}
}
}
}
]
},
三.后期数据交互
1.当数据少于7个点的时候
var weight=[55.4,55.9,53];
//初始化echarts实例
var chart1=$("#chart1").get(0);
var myChart=echarts.init(chart1);
var chartDate=[1,3,5,8,10,15,18,22,25,28,30];
var weight=[55.4,55.9,53];
//var weight=[55.4,55.9,53,56,57,58,56.7,53,55,54,53];
var dataLength=weight.length;
var symbolImg='image://image/1.png';
if(dataLength <=7 ){
var dataText="[";
var dataArr=new Array();
for(var i=0;i<7;i++){
var noDataText="{value:"+weight[dataLength-1]+",symbol:'emptyCircle',symbolSize:5,label:{ normal:{show:false}}},";
if(i < dataLength){
dataArr.push({"value":weight[i],"symbol":symbolImg,"symbolSize":10});
}else{
dataArr.push({"value":weight[dataLength-1],"symbol":'emptyCircle',"symbolSize":5,"label":{"normal":{"show":false}}});
}
}
}else{
dataArr=weight;
}
2.多余7个点
var weight=[55.4,55.9,53,56,57,58,56.7,53,55,54,53];
四.完整代码
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no" />
<!-- 引入 ECharts 文件 -->
<script src="js/echarts.js"></script>
<script src="js/jquery-3.0.0.min.js"></script>
</head>
<style type="text/css">
html,body{
margin:0;
padding: 0;
}
.chartContainer{
width:100%;
height:10rem;
border:1px solid pink;
box-sizing:border-box;
}
</style>
<body>
<div class="chartContainer" id="chart1">
</div>
</body>
<script type="text/javascript">
//初始化echarts实例
var chart1=$("#chart1").get(0);
var myChart=echarts.init(chart1);
var chartDate=[1,3,5,8,10,15,18,22,25,28,30];
//var weight=[55.4,55.9,53];
var weight=[55.4,55.9,53,56,57,58,56.7,53,55,54,53];
var dataLength=weight.length;
var symbolImg='image://image/1.png';
if(dataLength <=7 ){
var dataText="[";
var dataArr=new Array();
for(var i=0;i<7;i++){
var noDataText="{value:"+weight[dataLength-1]+",symbol:'emptyCircle',symbolSize:5,label:{ normal:{show:false}}},";
if(i < dataLength){
dataArr.push({"value":weight[i],"symbol":symbolImg,"symbolSize":10});
}else{
dataArr.push({"value":weight[dataLength-1],"symbol":'emptyCircle',"symbolSize":5,"label":{"normal":{"show":false}}});
}
}
}else{
dataArr=weight;
}
//对echarts做基础配置
option={
xAxis:{
data:chartDate,
show:false
},
yAxis:{
min:"dataMin",//可以设置成特殊值 'dataMin',此时取数据在该轴上的最小值作为最小刻度。
show:false
},
animation : false,//是否启用图表初始化动画,默认开启
series:[
{
name:"体脂",
type:"line",//折线图,还有pie(饼状图),
smooth:true,//是否平滑曲线显示。
symbol:'image://image/dot1.png',//设置标注点的图片,或者有('circle', 'rect', 'roundRect', 'triangle', 'diamond', 'pin', 'arrow')
symbolSize:10,//标注点的大小
lineStyle:{//线条颜色
normal:{
color: 'rgba(29, 175, 250, 0.3)',
}
},
itemStyle:{
normal:{
color: 'rgba(29, 175, 250, 0.3)',
}
},
label:{
normal:{
show:true,
position:[0,-20],
textStyle:{
color:"#1daffa"
}
}
},
data:dataArr,
}
]
}
option2={
xAxis:{
data:chartDate,
show:false
},
yAxis:{
boundaryGap:false,
min:"dataMin",
show:false
},
animation : false,//是否启用图表初始化动画,默认开启
series:[
{
name:"体脂",
type:"line",//折线图,还有pie(饼状图),
smooth:true,
symbol:"none",//去掉标注
lineStyle:{//线条颜色
normal:{
color: '#1daffa',
width:1
}
},
itemStyle:{
normal:{
color: 'rgba(29, 175, 250, 0.3)',
}
},
markPoint: {
data: [
{
type:'max',
symbolSize:2,
label: {
normal: {
position: 'top',
formatter: '{c}',
textStyle:{
color:"#1daffa"
}
}
}
},
{
type:'min',
symbolSize:2,
label: {
normal: {
position: 'bottom',
formatter: '{c}',
textStyle:{
color:"#1daffa"
}
}
}
}
]
},
data:dataArr
}
]
}
var dataLength=weight.length;
if(dataLength <= 7){
myChart.setOption(option);
}else{
myChart.setOption(option2);
}
</script>
</html>