热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

echarts3实现柱状图和饼图详解

本篇文章实现的是以下两种需求:1,使用Echarts3实现柱状图;2,使用Echarts3实现饼图;包含Echarts使用过程中遇到的部分坑的解决办法。先上效果图:(PS:饼图实际上是

本篇文章实现的是以下两种需求:

1,使用Echarts3实现柱状图;

2,使用Echarts3实现饼图;

包含Echarts使用过程中遇到的部分坑的解决办法。


先上效果图:


3)js实现

var assetStatics = function () {

var assetChartPie, assetChartBar, color_list;

function beforeInit(p) {
initData();
}

function init(p) {
// 基于准备好的dom,初始化echarts实例
assetChartPie = echarts.init(document.getElementById('asset_chart_pie'));

assetChartBar = echarts.init(document.getElementById('asset_chart_bar'));

$$('#asset_chart_pie').find("canvas").addClass('canvas_pie_chart');

bindEvent("on");
}

function destroy(p) {
bindEvent("off");
}

/*
* 获取数据
* */
function initData() {
color_list = ['#96CEEA', '#7BD6B1', '#4EA8F2', '#FF9566', '#F9E385', '#9C6448',
'#FFBC6C', '#9E96EA', '#9EEA42', '#A1B1BE', '#96CEEA', '#7BD6B1',
'#4EA8F2', '#FF9566', '#F9E385', '#9C6448', '#FFBC6C', '#9E96EA',
'#9EEA42', '#A1B1BE', '#96CEEA', '#7BD6B1', '#4EA8F2', '#FF9566',
'#F9E385', '#9C6448', '#FFBC6C', '#9E96EA', '#9EEA42', '#A1B1BE'];
}

/*
* 绑定事件
* */
function bindEvent(method) {
if (method == "on") {
/*
* 柱状图item项点击事件
* 从seriesId获取当前item项id,然后可根据此id获取需要的数据
* */
assetChartBar.on('click', function (params) {
// console.log(params);
var resource_ids = params.seriesId;
var item_index = params.dataIndex;
var resource_id = resource_ids.split(',')[item_index];
switchToPieChart(resource_id);
});

/*
* 饼状图返回按钮
* 返回到柱状图
* */
$$(document).on('click', '.asset_pie_back', function () {
$$('#asset_chart_bar').css("display", "block");
$$('#asset_chart_pie').css("display", "none");
$$('.asset_pie_back').css("display", "none");
});

assetChartPie.on('click', function (params) {
});

// 图例开关的行为只会触发 legendselectchanged 事件
assetChartPie.on('legendselectchanged', function (params) {
// 获取点击图例的选中状态
var isSelected = params.selected[params.name];
// 在控制台中打印
console.log((isSelected ? '选中了' : '取消选中了') + '图例' + params.name);
// 打印所有图例的状态
console.log(params.selected);
});

assetChartPie.on('legendselected', function (params) {

});

assetChartPie.on('legendunselected', function (params) {

});
}
}

/*
* 显示饼图
* */
function showPieChart(data) {
var option_pie_chart = {
// 全图默认背景
backgroundColor: 'rgba(0,0,0,0)',
// 默认色板
color: data.color_list,
// 图表标题
title: {
show: false,
x: 'center', // 水平安放位置,默认为左对齐,可选为:'center' ¦ 'left' ¦ 'right' ¦ {number}(x坐标,单位px)
y: 45, // 垂直安放位置,默认为全图顶端,可选为:'top' ¦ 'bottom' ¦ 'center' ¦ {number}(y坐标,单位px)
//textAlign: null // 水平对齐方式,默认根据x设置自动调整
backgroundColor: 'rgba(0,0,0,0)',
borderColor: '#ccc', // 标题边框颜色
borderWidth: 0, // 标题边框线宽,单位px,默认为0(无边框)
padding: 5, // 标题内边距,单位px,默认各方向内边距为5,接受数组分别设定上右下左边距,同css
itemGap: 10, // 主副标题纵向间隔,单位px,默认为10,
textStyle: {
fontSize: 18,
fontWeight: 'bolder',
color: '#333' // 主标题文字颜色
},
subtextStyle: {
color: '#aaa' // 副标题文字颜色
},
text: data.title
},
// 图例
legend: {
orient: 'horizontal', // 布局方式,默认为水平布局,可选为:'horizontal' ¦ 'vertical'
x: 'center', // 水平安放位置,默认为全图居中,可选为:'center' ¦ 'left' ¦ 'right' ¦ {number}(x坐标,单位px)
y: 'bottom', // 垂直安放位置,默认为全图顶端,可选为:'top' ¦ 'bottom' ¦ 'center' ¦ {number}(y坐标,单位px)
backgroundColor: 'rgba(0,0,0,0)',
borderColor: '#ccc', // 图例边框颜色
borderWidth: 0, // 图例边框线宽,单位px,默认为0(无边框)
padding: 5, // 图例内边距,单位px,默认各方向内边距为5,
// 接受数组分别设定上右下左边距,同css
itemGap: 10, // 各个item之间的间隔,单位px,默认为10,
// 横向布局时为水平间隔,纵向布局时为纵向间隔
itemWidth: 20, // 图例图形宽度
itemHeight: 14, // 图例图形高度
textStyle: {
color: '#333' // 图例文字颜色
},
data: data.detail
},
// 提示框
tooltip: {
trigger: 'item', // 触发类型,默认数据触发,见下图,可选为:'item' ¦ 'axis'
showDelay: 20, // 显示延迟,添加显示延迟可以避免频繁切换,单位ms
hideDelay: 100, // 隐藏延迟,单位ms
transitionDuration: 0.4, // 动画变换时间,单位s
backgroundColor: 'rgba(0,0,0,0.7)', // 提示背景颜色,默认为透明度为0.7的黑色
borderColor: '#333', // 提示边框颜色
borderRadius: 4, // 提示边框圆角,单位px,默认为4
borderWidth: 0, // 提示边框线宽,单位px,默认为0(无边框)
padding: 5, // 提示内边距,单位px,默认各方向内边距为5,
// 接受数组分别设定上右下左边距,同css
axisPointer: { // 坐标轴指示器,坐标轴触发有效
type: 'line', // 默认为直线,可选为:'line' | 'shadow'
lineStyle: { // 直线指示器样式设置
color: '#48b',
width: 2,
type: 'solid'
},
shadowStyle: { // 阴影指示器样式设置
width: 'auto', // 阴影大小
color: 'rgba(150,150,150,0.3)' // 阴影颜色
}
},
textStyle: {
color: '#fff'
},
formatter: "{a}
{b}: {c} ({d}%)"
},
series: [
{
name: '植物分类统计',
type: 'pie',
center: ['50%', '50%'], // 默认全局居中
radius: ['40%', '55%'], //环
clockWise: false, // 默认逆时针
startAngle: 90,
minAngle: 0, // 最小角度改为0
selectedOffset: 10, // 选中是扇区偏移量
itemStyle: {
normal: {
// color: 各异,
borderColor: '#fff',
borderWidth: 1,
label: {
show: true,
position: 'outer'
// textStyle: null // 默认使用全局文本样式,详见TEXTSTYLE
},
labelLine: {
show: true,
length: 20,
lineStyle: {
// color: 各异,
width: 1,
type: 'solid'
}
}
},
emphasis: {
// color: 各异,
borderColor: 'rgba(0,0,0,0)',
borderWidth: 1,
label: {
show: true,
position: 'outer'
// textStyle: null // 默认使用全局文本样式,详见TEXTSTYLE
},
labelLine: {
show: true,
length: 20,
lineStyle: {
// color: 各异,
width: 1,
type: 'solid'
}
}
}
},
data: data.detail
}
]
};
assetChartPie.showLoading();
//调整饼图参数
option_pie_chart = adjustPieChartOption(data, option_pie_chart);
assetChartPie.setOption(option_pie_chart, true);
assetChartPie.hideLoading();
}

/*
* 显示柱状图
* */
function showBarChart(data) {
var option_bar_chart = {
// 全图默认背景
backgroundColor: 'rgba(0,0,0,0)',
// 默认色板
color: data.color_list,
// 图表标题
title: {
show: false,
x: 'center', // 水平安放位置,默认为左对齐,可选为:'center' ¦ 'left' ¦ 'right' ¦ {number}(x坐标,单位px)
y: 'top', // 垂直安放位置,默认为全图顶端,可选为:'top' ¦ 'bottom' ¦ 'center' ¦ {number}(y坐标,单位px)
//textAlign: null // 水平对齐方式,默认根据x设置自动调整
backgroundColor: 'rgba(0,0,0,0)',
borderColor: '#ccc', // 标题边框颜色
borderWidth: 0, // 标题边框线宽,单位px,默认为0(无边框)
padding: 5, // 标题内边距,单位px,默认各方向内边距为5,接受数组分别设定上右下左边距,同css
itemGap: 10, // 主副标题纵向间隔,单位px,默认为10,
textStyle: {
fontSize: 18,
fontWeight: 'bolder',
color: '#333' // 主标题文字颜色
},
subtextStyle: {
color: '#aaa' // 副标题文字颜色
},
text: data.title
},
tooltip: {
trigger: 'axis',
axisPointer: { // 坐标轴指示器,坐标轴触发有效
type: 'line', // 默认为直线,可选为:'line' | 'shadow'
label: {
show: false
}
}
},
calculable: true,
grid: {
left: '3%',
right: '4%',
bottom: '3%',
containLabel: true
},
xAxis: [
{
type: 'category',
data: data.x_axis,
axisTick: {
alignWithLabel: true
},
axisLabel: {
formatter: function (val) {
//x轴标签文字纵向排列,解决x轴标签过长时,柱状图部分item项不显示
return val.split("").join("\n");
}
}
}
],
yAxis: [
{
name: '树木数',
type: 'value'
}
],
dataZoom: [
{
//是否显示左侧收缩提示条
show: false,
start: 0,
end: 100
},
{
type: 'inside',
start: 0,
end: 100
},
{
//是否显示右侧收缩提示条
show: false,
yAxisIndex: 0,
filterMode: 'empty',
width: 30,
height: '80%',
showDataShadow: false,
left: '93%'
}
],
series: [
{
name: '植物数',
type: 'bar',
center: ['50%', '50%'], // 默认全局居中
barWidth: '25%',
barMaxWidth: 25,//最大宽度
data: data.y_axis,
id: data.id_arr,
itemStyle: {
//修改颜色
normal: {
color: function (params) {
return data.color_list[params.dataIndex]
},
//bar上显示的提示信息
label: {
show: true,
position: 'top',
formatter: '{c}'
}
}
}
}
]
};
assetChartBar.showLoading();
//调整柱状图参数
option_bar_chart = adjustBarChartOption(data, option_bar_chart);
//注意此处:echarts默认为merge,以下setOption会导致数据组合呈现,会同时显示本次和上次的数据
// assetChartBar.setOption(option_bar_chart);
//设置为true即可只使用新数据
assetChartBar.setOption(option_bar_chart, true);
assetChartBar.hideLoading();
}

/*
* 根据当前所选切换表格视图
* */
function switchChartView(type) {
if (type == 'bar') {
switchToBarChart();
} else {
switchToPieChart();
}
}

/*
* 切换到柱状图视图
* */
function switchToBarChart(data) {
$$('#asset_chart_bar').css("display", "block");
$$('#asset_chart_pie').css("display", "none");
$$('.asset_pie_back').css("display", "none");
assembleDataForBarChart(data, function (bar_data) {
console.log(bar_data);
showBarChart(bar_data);
});
}

/*
* 切换到饼状图视图
* */
function switchToPieChart(data) {
$$('#asset_chart_bar').css("display", "none");
$$('#asset_chart_pie').css("display", "block");
$$('.asset_pie_back').css("display", "block");
assembleDataForPieChart(data, function (pie_data) {
console.log(pie_data);
showPieChart(pie_data);
});
}

/*
* 为饼图组装数据
* 假数据
* */
function assembleDataForPieChart(data, _callback) {
var pie_detail = [
{
name: '椰树',
value: 85
},
{
name: '榕树',
value: 156
},
{
name: '桂花树',
value: 684
},
{
name: '菠萝蜜',
value: 48
},
{
name: '木棉树',
value: 62
},
{
name: '四季树',
value: 37
},
{
name: '其他',
value: 76
}
];
var pie_data = {
title: '分类统计',
color_list: color_list,
detail: pie_detail
}
_callback(pie_data);
}

/*
* 为柱状图组装数据
* 假数据
* */
function assembleDataForBarChart(data, _callback) {
var bar_id_arr = ['0_1', '0_2', '0_3', '0_4', '0_5', '0_6', '0_7', '0_8', '0_9', '0_10', '0_11', '0_12'];
var bar_x_arr = ['园区1', '园区2', '园区3', '园区4', '园区5', '园区6', '园区7', '园区8', '园区9', '园区10', '园区11', '园区12'];
var bar_y_arr = [895, 652, 485, 785, 123, 584, 74, 555, 256, 888, 777, 520];
var bar_data = {
title: '植物统计',
color_list: color_list,
id_arr: bar_id_arr,
x_axis: bar_x_arr,
y_axis: bar_y_arr
};
_callback(bar_data);
}

/*
* 根据柱状图item项数量调整柱状图显示参数(柱状图item宽度、显示X轴item项显示数量、柱状图item项颜色等)
* 避免柱状图item项太少时柱状图item项宽度太大,柱状图item项太多时柱状图item项宽度太小,难看
* 这里是简单测试,可根据需求自行调整
* */
function adjustBarChartOption(data, option) {
var count = data.x_axis.length;
//柱状图item宽度
var percent_show = 100;
if (count <11) {
percent_show = 100;
} else if (count > 10 && count <21) {
percent_show = percent_show * 0.8;
option.series[0].barWidth = '40%';
} else if (count > 20 && count <31) {
percent_show = percent_show * 0.45;
option.series[0].barWidth = '50%';
} else {
percent_show = percent_show * 0.3;
option.series[0].barWidth = '60%';
//预置色数组长度不够用
var color_list = [];
for (var i = 0; i color_list[i] = '#96CEEA';
}
//设置柱状图item项颜色
option.color = color_list;
}
//设置柱状图X轴显示的item项数量
option.dataZoom[0].end = percent_show;
option.dataZoom[1].end = percent_show;

return option;
}

/*
* 根据饼图item项调整饼图参数(饼图圆心位置)
* 避免饼图item项太多时,legend和饼图重叠
* 这里是简单测试,可根据需求自行调整
* */
function adjustPieChartOption(data, option) {
var count = data.detail.length;
//饼图圆心高度
var percent_location = '45%';
if (count == 0) {
percent_location = '50%';
option.color = ['#BFBFBF'];
option.series[0].data = {name: '', value: 0};
option.series[0].itemStyle.normal.show = true;
option.legend.data = {name: '', value: 0};
option.legend.show = false;
} else if (count > 0 && count <11) {
percent_location = '40%';
} else if (count > 10 && count <21) {
percent_location = '35%';
} else if (count > 20 && count <31) {
percent_location = '30%';
} else {
percent_location = '30%';
//预置色数组长度不够用
var color_list = [];
for (var i = 0; i color_list[i] = '#96CEEA';
}
//设置饼图item项颜色
option.color = color_list;
}
//设置饼图圆心高度
option.series[0].center[1] = percent_location;

return option;
}

return {
beforeInit: beforeInit,
init: init,
destroy: destroy,
switchChartView: switchChartView
}
}();


4) 使用

1,在页面初始化时如下调用,初始化图表相关

        assetStatics.beforeInit();
assetStatics.init();

2,需要显示图标时如下调用

        assetStatics.switchChartView('bar');

三,写在后面

1)以上为项目前期技术调研时写的demo,非常简陋,勿喷。后面实际项目中做了不少优化处理(包括样式、关联逻辑、异常处理等),欢迎交流讨论;

2)已在以上代码注释中体现了部分坑的解决办法,后面实际项目中还遇到了些坑并都已解决,马上要下班了,在这里就不写出来了,后面有空也许会完善。各位亲碰到了问题的话可以在评论里留言,说不定你遇到的坑我也遇到过;






推荐阅读
  • SpringBoot uri统一权限管理的实现方法及步骤详解
    本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 本文介绍了一个Java猜拳小游戏的代码,通过使用Scanner类获取用户输入的拳的数字,并随机生成计算机的拳,然后判断胜负。该游戏可以选择剪刀、石头、布三种拳,通过比较两者的拳来决定胜负。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 本文介绍了在Java中gt、gtgt、gtgtgt和lt之间的区别。通过解释符号的含义和使用例子,帮助读者理解这些符号在二进制表示和移位操作中的作用。同时,文章还提到了负数的补码表示和移位操作的限制。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
author-avatar
焦作艾文斯
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有