echarts柱图自定义为硬币堆叠的形式
看这标题,可能会有一些人不太明白,那么直接上图,就是柱图展示形式如下图(兼容IE8)
要想实现这样展示效果。我们想用echarts直接实现不行的,即使是纹理填充也不可行的,但是我们可以借助echarts柱图展示来进行二次操作来现实。那么如何实现呢?
下面我们开始讲解:
1.思路:
从设计图中,我们要知道蓝色部分随着值的变化而变化,而灰色部分高度是不变的。
我们可以通过把柱图的透明度设为0,然后获取每根柱图的高度,每根柱图的位置,然后创建一个元素,把获取到每根柱图的高度和位置赋给这个元素,通过设置元素背景图片填充样式来实现
2.根据上面的思路,那就开始着手了,直接上代码
先把样式设置好:
<style>
*{margin: 0;padding: 0;}
.bar-p,.bar-g{
position: absolute;
z-index: 9999;
width:22px ;/*柱图的宽度*/
}
.bar-p>span,.bar-g>span{
position: absolute;
left: 50%;
width: 80px;
text-align: center;
margin-left: -40px;
margin-top: -18px;
}
.bar-g>span{
color: #808182;
}
.bar-p>span{
color: #0b7cd1;
}
.bar-p{background: url("../img/bar.png") repeat-y 50% 100%;}
/*灰色的在这里高度是固定的,不管多大值*/
.bar-g{background: url("../img/bar1.png") no-repeat 50% 100%;height: 5px!important;}
</style>
html和js代码:
<div id="main" style="width: 60%; height: 500px;margin:10px auto;"></div>
<script>
/*
* @echarts3版本:v3.2.2
* */
var option=null,xAxisData=[],numData=[],numData1=[];
for(var i=1;i<9;i++){
xAxisData.push('币种'+i);
if(i>=6) numData[i-1]=-10;
else numData[i-1]=i*20;
numData1[i-1]=Math.abs(numData[i-1]);
}
option = {
color: ['#3398DB'],
tooltip : {
trigger: 'item',
formatter:'{b}:{c}',
axisPointer : { // 坐标轴指示器,坐标轴触发有效
type : 'shadow' // 默认为直线,可选为:'line' | 'shadow'
}
},
grid: {
left: '3%',
right: '4%',
bottom: '3%',
containLabel: true
},
xAxis : [
{
type : 'category',
data : xAxisData,
axisLine:{
lineStyle:{
color:'#ccc'
}
},
axisTick:false // 坐标轴刻度不显示的话直接这样
}
],
yAxis : [
{
type : 'value',
axisLabel:{
show:false
},
splitLine:{
lineStyle:{
color:'#ddd'
}
},
axisLine:{
show:false
},
axisTick:false // 坐标轴刻度不显示的话直接这样
}
],
series : [
{
type:'bar',
barWidth: 22,
data:numData1,
itemStyle:{
normal:{
opacity:0
}
}
}
]
};
var myChart = echarts.init(document.getElementById('main'));
// 使用刚指定的配置项和数据显示图表。
myChart.setOption(option);
/*
* getModel() echarts模型的获取
* getSeriesByIndex(i) 这个i表示series的下标,现在的series只有一个 所以直接是0
* */
var model=myChart.getModel(),
layer=model.getSeriesByIndex(0),
layouts=layer._data._itemLayouts;// 获取每根柱图的位置和高度和宽度
var div=document.getElementById('main').getElementsByTagName('div')[0]; // 获得div
var elem,height=document.getElementById('main').offsetHeight,bottom=height-layouts[0]['y'];
for(var i= 0,len=layouts.length;i<len;i++){
elem=document.createElement('div');
if(numData[i]<0) elem.className='bar-g';
else elem.className='bar-p';
elem.style.bottom=bottom+'px';
elem.style.left=layouts[i]['x']+'px';
elem.style.height=Math.abs(layouts[i]['height'])+'px';
elem.innerHTML='<span>'+numData[i]+'</span>';
div.appendChild(elem);
}
</script>
运行结果如下:
其实上面的js代码是实现了这个效果,但是有一个问题,就是for循环输出div的,每次循环都是从document中创建一个div,其实这样是不可取的,而且每次都要设置样式!
所以我们应该通过从innerHTML来输出会更好,因为我们的代码就是要简洁、性能优化得最好、条理清晰,更少的代码做更多的事情等!
所以我们要改成下面这样的:
<script>
/*
* @echarts3版本:v3.2.2
* */
var option=null,xAxisData=[],numData=[],numData1=[];
for(var i=1;i<9;i++){
xAxisData.push('币种'+i);
if(i>=6) numData[i-1]=-10;
else numData[i-1]=i*20;
numData1[i-1]=Math.abs(numData[i-1]);
}
option = {
color: ['#3398DB'],
tooltip : {
trigger: 'item',
formatter:'{b}:{c}',
axisPointer : { // 坐标轴指示器,坐标轴触发有效
type : 'shadow' // 默认为直线,可选为:'line' | 'shadow'
}
},
grid: {
left: '3%',
right: '4%',
bottom: '3%',
containLabel: true
},
xAxis : [
{
type : 'category',
data : xAxisData,
axisLine:{
lineStyle:{
color:'#ccc'
}
},
axisTick:false // 坐标轴刻度不显示的话直接这样
}
],
yAxis : [
{
type : 'value',
axisLabel:{
show:false
},
splitLine:{
lineStyle:{
color:'#ddd'
}
},
axisLine:{
show:false
},
axisTick:false // 坐标轴刻度不显示的话直接这样
}
],
series : [
{
type:'bar',
barWidth: 22,
data:numData1,
itemStyle:{
normal:{
opacity:0
}
}
}
]
};
var myChart = echarts.init(document.getElementById('main'));
// 使用刚指定的配置项和数据显示图表。
myChart.setOption(option);
/*
* getModel() echarts模型的获取
* getSeriesByIndex(i) 这个i表示series的下标,现在的series只有一个 所以直接是0
* */
var model=myChart.getModel(),
layer=model.getSeriesByIndex(0),
layouts=layer._data._itemLayouts;// 获取每根柱图的位置和高度和宽度
var div=document.getElementById('main').getElementsByTagName('div')[0]; // 获得div
var elem="",height=document.getElementById('main').offsetHeight,bottom=height-layouts[0]['y'];
for(var i= 0,len=layouts.length;i<len;i++){
elem+='<div class="'+(numData[i]<0?'bar-g':'bar-p')+
'"style="bottom:'+bottom+'px;left:'+layouts[i]['x']+'px;height:'+Math.abs(layouts[i]['height'])+'px;">'+
'<span>'+numData[i]+'</span>'+
'</div>';
}
div.appendChild(document.createElement('div'));
div.getElementsByTagName('div')[0].innerHTML=elem;
</script>
运行结果如下:
echarts柱图自定义为硬币堆叠的形式的更多相关文章
- vue 使用Echarts 环形图 自定义legend formatter 富文本标签
main.js 引入echarts // 引入echarts import Echarts from 'echarts' Vue.prototype.$echarts = Echarts < ...
- echarts 中 柱图 、折线图、柱图层叠
app.title = '折柱混合'; option = { tooltip: { trigger: 'axis', axisPointer: { type: 'cross', crossStyle: ...
- echarts - 特殊需求实现代码汇总之【柱图】篇
其实包括饼图.线图在内,和柱图都一样的感觉,他们的配置项基本也是对应的那几个,所以想实现某些相似的效果,只要找到对应的属性就可以了. 1.柱图渐变色设置 还记得上篇线图中的实现是在areaStyle的 ...
- ECharts折线图堆叠设置为不堆叠的方法
下图是ECharts折线图堆叠的官方源码,设置折线图不堆叠只需要将每一个stack的值设置为不一样的名称或者将stack属性删除即可. option = { title: { text: '折线图堆叠 ...
- Echarts设置y轴值间隔 以及设置 barWidth : 30,//柱图宽度
需求:如图,y轴之间的距离太小,这样就太过于拥挤了,现在要修改echarts里面的属性,设置y轴值间隔让图表看上去舒服一些. 其实很多问题,真的只是因为自己没有好好的看文档,很多文档上面都写的 ...
- Echarts-柱状图柱图宽度设置
先看两张图 图中柱图只需要设置series中的坐标系属性barWidth就可以, 这种图柱状图,折叠柱状图都适应 eg: /** * 堆积柱状图 * @param xaxisdata x轴:标签(数组 ...
- d3.js 教程 模仿echarts折线图
今天我们来仿echarts折线图,这个图在echarts是折线图堆叠,但是我用d3改造成了普通的折线图,只为了大家学习(其实在简单的写一个布局就可以).废话不多说商行代码. 1 制作 Line 类 c ...
- echarts雷达图
用echarts展现雷达图的定制 <!doctype html> <html> <head> <meta charset="utf-8"& ...
- dev控件chart简单实现多图例,双曲线,双柱图,曲线与柱图
1.效果图 2.数据源代码: ; i < ; i++) { == ) { dt1.Rows.Add( * i); dt2.Rows.Add( * i+); } else { dt1.Rows.A ...
随机推荐
- 源码(07) -- java.util.Iterator<E>
java.util.Iterator<E> 源码分析(JDK1.7) ----------------------------------------------------------- ...
- C++编程练习(1)----“实现简单的线性表的顺序存储结构“
线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素. 故可以用数组来实现顺序存储结构. 用C++编写的利用数组实现简单的读取.插入和删除功能的线性表. #include< ...
- removeAll
问题:无法移除2个集合中相同元素 方法:移除所包含的其所有元素. 在执行removeAll方法时,会先对集合元素进行比较,如果元素相等才执行移除操作,说到这,相信很多人都已经明白是怎么回事了,因为不相 ...
- 用JS计算预计时间与现在时间的差
1.我用的是bootstrap网格布局,首先要引入bootstrap类. (1)<script src="jquery-1.11.2.min.js"></scri ...
- 使用fliter实现ie下css中rgba的效果
直接举例吧background-color: rgba(255,255,255,0.8); 设置背景颜色为白色,不透明度设为80% 在ie下可以用fliter这一属性进行设置: filter:prog ...
- HDU 4256 The Famous Clock
The Famous Clock Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- slf4j+log4j的使用
maven依赖引入 <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j1 ...
- ssh免密码和ssh-copy-id命令
Linux系统配置免密码的方式: 1:ssh-keygen -t rsa 生成密钥 2:ssh-copy-id -i ~/.ssh/id_rsa.pub 127.0.0.1 把本机的公钥追到jifen ...
- MASM32快速起步
MASM32是一个免费的软件程序,让您编辑Microsoft宏汇编程序(MASM)代码从一个基本的文本界面.它强调MASM代码各部分以不同的颜色,使其更容易扫描和检测错误.它提供了一个简单的布局程序员 ...
- jQuery_第三章_工厂函数