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 ...
随机推荐
- C++编程练习(7)----“KMP模式匹配算法“字符串匹配
子串在主串中的定位操作通常称做串的模式匹配. KMP模式匹配算法实现: /* Index_KMP.h头文件 */ #include<string> #include<sstream& ...
- UI进阶 即时通讯之XMPP登录、注册
1.XMPP环境搭建 http://www.cnblogs.com/fearlessyyp/p/5506644.html 第一次打开可能会有点儿慢,图片很多,步骤很详细,祝搭建成功. 2.工程中添加X ...
- 从C#到TypeScript - 接口
总目录 从C#到TypeScript - 类型 从C#到TypeScript - 高级类型 从C#到TypeScript - 变量 从C#到TypeScript - 接口 从C#到TypeScript ...
- asp.net core mvc实现伪静态功能
在大型网站系统中,为了提高系统访问性能,往往会把一些不经常变得内容发布成静态页,比如商城的产品详情页,新闻详情页,这些信息一旦发布后,变化的频率不会很高,如果还采用动态输出的方式进行处理的话,肯定会给 ...
- javase基础回顾(二)LinkedList需要注意的知识点 阅读源码收获
我们在学习这一块内容时需要注意的一个问题是 集合中存放的依然是对象的引用而不是对象本身. List接口扩展了Collection并声明存储一系列元素的类集的特性.使用一个基于零的下标,元素可以通过它们 ...
- ZwQueryVirtualMemory枚举进程模块
ZwQueryVirtualMemory算是枚举进程方法中的黑科技吧,主要是该方法可以检测出隐藏的模块(类似IceSword). 代码VS2015测试通过 再次奉上源码链接:https://githu ...
- Angular2 Service实践——实现简单音乐播放服务
引言: 如果说组件系统(Component)是ng2应用的躯体,那把服务(Service)认为是流通于组件之间并为其带来生机的血液再合适不过了.组件间通信的其中一种优等选择就是使用服务,在ng1里就有 ...
- 在SQL Server里如何处理死锁
在今天的文章里,我想谈下SQL Server里如何处理死锁.当2个查询彼此等待时会发生死锁,没有一个查询可以继续它们的操作.首先我想给你大致讲下SQL Server如何处理死锁.最后我会展示下SQL ...
- Altium Designer(DXP)小技巧之模块化布局
原创博客转载需注明地址 在我们用Altium Designer进行电路板的绘制的时候经常会遇到模块化布局的问题 就比如电源模块(电源芯片及其外围芯片)放在一起 传感器模块(传感器芯片及其外围芯片)放在 ...
- 轻松理解python中的闭包和装饰器 (下)
在 上篇 我们讲了python将函数做为返回值和闭包的概念,下面我们继续讲解函数做参数和装饰器,这个功能相当方便实用,可以极大地简化代码,就让我们go on吧! 能接受函数做参数的函数我们称之为高阶函 ...