前言
在项目中,有时候我们会一些需求,比如要用Echarts绘制一个饼状图,并且要设置一个下拉列表,当我点击某个选项的时候,饼状图里面的数据会改变,图表样式也会发生改变。我们可以配合Jquery来实现这个功能。
准备工作
首先,去下载Jquery和Echarts的Js包,引入项目当中,这里给个地址:
Jquery:https://jquery.com/download/
Echarts:https://github.com/apache/echarts/releases
编写Html和CSS代码
因为要用到Echarts,所以我们需要准备一个定义了宽高的盒子,也就是一个div
标签,用来显示饼状图。
<div class="panel pie1"> <!--一个面板划分为两部分,标题和图表--> <h2>广西各县域耕地碳储量占比(总-万吨)</h2> <div class="chart">图表</div> <!--每一个盒子只有一个before和after,面板要设置四个角的话,需要在添加一个盒子才行--> <div class="panel-footer"></div> </div>
复制
.panel { height: 300px; width: 400px; }
复制
编写Js代码
Html代码主要是用来组织结构的,Js代码才是核心代码。我们可以先准备好要切换的数据(注意:数据是伪造的):
var cityData = [ { name: '广西全省', data: [ {value: 17.05, name: '南宁市'}, {value: 14.40, name: '柳州市'}, {value: 18.03, name: '桂林市'}, {value: 58.57, name: '梧州市'}, {value: 83.17, name: '北海市'}, {value: 44.69, name: '防城港市'}, {value: 145.66, name: '钦州市'}, {value: 172.15, name: '贵港市'}, {value: 129.59, name: '玉林市'}, {value: 158.79, name: '百色市'}, {value: 66.44, name: '贺州市'}, {value: 150.46, name: '河池市'}, {value: 102.63, name: '来宾市'}, {value: 161.69, name: '崇左市'} ] }, { name: '南宁市', data: [ {value: 7.88, name: '兴宁区'}, {value: 6.91, name: '青秀区'}, {value: 19.90, name: '江南区'}, {value: 09.44, name: '西乡塘区'}, {value: 4.82, name: '良庆区'}, {value: 18.42, name: '邕宁区'}, {value: 28.83, name: '武鸣区'}, {value: 62.03, name: '隆安县'}, {value: 32.48, name: '马山县'}, {value: 26.50, name: '上林县'}, {value: 61.25, name: '宾阳县'}, {value: 01.59, name: '横州市'} ] }, { name: '柳州市', data: [ {value: 1.22, name: '城中区'}, {value: 0.50, name: '鱼峰区'}, {value: 5.60, name: '柳南区'}, {value: 2.19, name: '柳北区'}, {value: 20.41, name: '柳江区'}, {value: 43.90, name: '柳城县'}, {value: 60.01, name: '鹿寨县'}, {value: 12.50, name: '融安县'}, {value: 61.72, name: '融水苗族自治县'}, {value: 9.35, name: '三江侗族自治县'}, ] }, { name: '桂林市', data: [ {value: 42.09, name: '秀峰区'}, {value: 343.81, name: '叠彩区'}, {value: 734.00, name: '象山区'}, {value: 253.88, name: '七星区'}, {value: 25535.11, name: '雁山区'}, {value: 153535.44, name: '临桂区'}, {value: 48.7606, name: '阳朔县'}, {value: 725.65, name: '灵川县'}, {value: 22256.44, name: '全州县'}, {value: 1469.74, name: '兴安县'}, {value: 46255.82, name: '永福县'}, {value: 52753.63, name: '灌阳县'}, {value: 2675.94, name: '龙胜各族自治县'}, {value: 5266.66, name: '资源县'}, {value: 5267.15, name: '平乐县'}, {value: 52554.60, name: '恭城瑶族自治县'}, {value: 2540.02, name: '荔浦市'} ] }, { name: '梧州市', data: [ {value: 2413.66, name: '万秀区'}, {value: 249.05, name: '长洲区'}, {value: 5249.93, name: '龙圩区'}, {value: 3467.67, name: '苍梧县'}, {value: 24235.40, name: '藤县'}, {value: 4212446.06, name: '蒙山县'}, {value: 4634156.79, name: '岑溪市'}, ] }, { name: '北海市', data: [ {value: 8.13, name: '海城区'}, {value: 103.88, name: '银海区'}, {value: 95.09, name: '铁山港区'}, {value: 376.07, name: '合浦县'}, ] }, { name: '防城港市', data: [ {value: 4615.42, name: '港口区'}, {value: 116464.58, name: '防城区'}, {value: 186449.25, name: '上思县'}, {value: 26445.43, name: '东兴市'}, ] }, { name: '钦州市', data: [ {value: 253216.19, name: '钦南区'}, {value: 2253444.46, name: '钦北区'}, {value: 46301.32, name: '灵山县'}, {value: 186363.70, name: '浦北县'}, ] }, { name: '贵港市', data: [ {value: 16375.75, name: '港北区'}, {value: 22463.02, name: '港南区'}, {value: 16373.68, name: '覃塘区'}, {value: 36365.21, name: '平南县'}, {value: 59633.50, name: '桂平市'}, ] }, { name: '玉林市', data: [ {value: 6263.47, name: '玉州区'}, {value: 10663.27, name: '福绵区'}, {value: 16352.76, name: '容县'}, {value: 16635.44, name: '陆川县'}, {value: 36363.85, name: '博白县'}, {value: 1684.96, name: '兴业县'}, {value: 63203.82, name: '北流市'}, ] }, { name: '百色市', data: [ {value: 85.15, name: '右江区'}, {value: 108.91, name: '田阳区'}, {value: 126.81, name: '田东县'}, {value: 126.26, name: '德保县'}, {value: 66.76, name: '那坡县'}, {value: 58569.56, name: '凌云县'}, {value: 4577.07, name: '乐业县'}, {value: 1273.76, name: '田林县'}, {value: 574745.41, name: '西林县'}, {value: 147491.67, name: '隆林各族自治县'}, {value: 21745.54, name: '靖西市'}, {value: 12174.89, name: '平果市'} ] }, { name: '贺州市', data: [ {value: 151.7415, name: '八步区'}, {value: 102747.34, name: '平桂区'}, {value: 53474.78, name: '昭平县'}, {value: 13374.87, name: '钟山县'}, {value: 187475.30, name: '富川瑶族自治县'}, ] }, { name: '河池市', data: [ {value: 9851.23, name: '金城江区'}, {value: 353.60, name: '宜州区'}, {value: 1385857.77, name: '南丹县'}, {value: 56.20, name: '天峨县'}, {value: 688559.20, name: '凤山县'}, {value: 9853.06, name: '东兰县'}, {value: 187.93, name: '罗城仫佬族自治县'}, {value: 18591.88, name: '环江毛南族自治县'}, {value: 7758.52, name: '巴马瑶族自治县'}, {value: 18579.85, name: '都安瑶族自治县'}, {value: 11582.21, name: '大化瑶族自治县'}, ] }, { name: '来宾市', data: [ {value: 78513.64, name: '兴宾区'}, {value: 16851.14, name: '忻城县'}, {value: 16385.19, name: '象州县'}, {value: 20588.51, name: '武宣县'}, {value: 18582.55, name: '金秀瑶族自治县'}, {value: 43585.61, name: '合山市'} ] }, { name: '崇左市', data: [ {value: 3885874.22, name: '江州区'}, {value: 385572.66, name: '扶绥县'}, {value: 278584.62, name: '宁明县'}, {value: 858219.63, name: '龙州县'}, {value: 23850.09, name: '大新县'}, {value: 153855.80, name: '天等县'}, {value: 268585.68, name: '凭祥市'} ] } ]
复制
按照一般的饼状图代码先绘制一个不能改变的饼状图:
var myChart = echarts.init(document.querySelector('.pie1 .chart')); var option = { tooltip: { trigger: 'item', formatter: '{a} <br/>{b} : {c} ({d}%)' }, legend: { bottom: '0%', itemWidth: 10, itemHeight: 10, //图例文字设置 textStyle: { color: "rgba(255,255,255,.5)", fontSize: "12" } }, series: [ { //color: ['#006cff', '#60cda0', '#ed8884', '#ff9f7f', '#0096ff', '#9fe6b8', '#32c5e9', '#1d9dff'], name: cityData[0].name, type: 'pie', //内圆半径和外圆半径 radius: ['10%', '70%'], //水平居中和垂直居中 center: ['50%', '40%'], roseType: 'radius', // 文本标签控制饼形图文字的相关样式, 注意它是一个对象 label: { color: '#fff', fontSize: 12, }, //引导线调整 labelLine: { show: true, //连接扇形图线长 length: 6, //连接文字线长 length2: 8 }, data: cityData[0].data } ] }; myChart.setOption(option); //4、让图表跟随屏幕自适应 window.addEventListener("resize", function () { myChart.resize(); });
复制
效果如下:
添加下拉列表和事件
我们在标题旁边添加一个下拉列表:
<div class="panel pie1"> <!--一个面板划分为两部分,标题和图表--> <h2>广西各县域耕地碳储量占比(总-万吨) <select class="code-select"> <option value="广西全省">广西全省</option> <option value="南宁市">南宁市</option> <option value="柳州市">柳州市</option> <option value="桂林市">桂林市</option> <option value="梧州市">梧州市</option> <option value="北海市">北海市</option> <option value="防城港市">防城港市</option> <option value="钦州市">钦州市</option> <option value="贵港市">贵港市</option> <option value="玉林市">玉林市</option> <option value="百色市">百色市</option> <option value="贺州市">贺州市</option> <option value="河池市">河池市</option> <option value="来宾市">来宾市</option> <option value="崇左市">崇左市</option> </select> </h2> <div class="chart">图表</div> <!--每一个盒子只有一个before和after,面板要设置四个角的话,需要在添加一个盒子才行--> <div class="panel-footer"></div> </div>
复制
通过Jquery来捕获被点击的下拉列表索引,并且根据不同的选项切换不同的数据:
//5、选择要显示的市区 $('.code-select').on('change', function () { //获取选中的option的索引值 var index = $(".code-select").get(0).selectedIndex; //更换数据 option.series[0].name = cityData[index].name; option.series[0].data = cityData[index].data; //重新渲染 myChart.setOption(option); });
复制
这里特别要注意的是,切换数据之后,要重新渲染页面,否则饼状图是不会改变的!!!
效果如下:
默认是显示第一份数据,点击下拉列表的不同选项会动态改变展示的数据和图表样式,如图:
完整代码
//饼状图1——广西各县域耕地碳储量占比 (function () { var cityData = [ { name: '广西全省', data: [ {value: 17.05, name: '南宁市'}, {value: 14.40, name: '柳州市'}, {value: 18.03, name: '桂林市'}, {value: 58.57, name: '梧州市'}, {value: 83.17, name: '北海市'}, {value: 44.69, name: '防城港市'}, {value: 145.66, name: '钦州市'}, {value: 172.15, name: '贵港市'}, {value: 129.59, name: '玉林市'}, {value: 158.79, name: '百色市'}, {value: 66.44, name: '贺州市'}, {value: 150.46, name: '河池市'}, {value: 102.63, name: '来宾市'}, {value: 161.69, name: '崇左市'} ] }, { name: '南宁市', data: [ {value: 7.88, name: '兴宁区'}, {value: 6.91, name: '青秀区'}, {value: 19.90, name: '江南区'}, {value: 09.44, name: '西乡塘区'}, {value: 4.82, name: '良庆区'}, {value: 18.42, name: '邕宁区'}, {value: 28.83, name: '武鸣区'}, {value: 62.03, name: '隆安县'}, {value: 32.48, name: '马山县'}, {value: 26.50, name: '上林县'}, {value: 61.25, name: '宾阳县'}, {value: 01.59, name: '横州市'} ] }, { name: '柳州市', data: [ {value: 1.22, name: '城中区'}, {value: 0.50, name: '鱼峰区'}, {value: 5.60, name: '柳南区'}, {value: 2.19, name: '柳北区'}, {value: 20.41, name: '柳江区'}, {value: 43.90, name: '柳城县'}, {value: 60.01, name: '鹿寨县'}, {value: 12.50, name: '融安县'}, {value: 61.72, name: '融水苗族自治县'}, {value: 9.35, name: '三江侗族自治县'}, ] }, { name: '桂林市', data: [ {value: 42.09, name: '秀峰区'}, {value: 343.81, name: '叠彩区'}, {value: 734.00, name: '象山区'}, {value: 253.88, name: '七星区'}, {value: 25535.11, name: '雁山区'}, {value: 153535.44, name: '临桂区'}, {value: 48.7606, name: '阳朔县'}, {value: 725.65, name: '灵川县'}, {value: 22256.44, name: '全州县'}, {value: 1469.74, name: '兴安县'}, {value: 46255.82, name: '永福县'}, {value: 52753.63, name: '灌阳县'}, {value: 2675.94, name: '龙胜各族自治县'}, {value: 5266.66, name: '资源县'}, {value: 5267.15, name: '平乐县'}, {value: 52554.60, name: '恭城瑶族自治县'}, {value: 2540.02, name: '荔浦市'} ] }, { name: '梧州市', data: [ {value: 2413.66, name: '万秀区'}, {value: 249.05, name: '长洲区'}, {value: 5249.93, name: '龙圩区'}, {value: 3467.67, name: '苍梧县'}, {value: 24235.40, name: '藤县'}, {value: 4212446.06, name: '蒙山县'}, {value: 4634156.79, name: '岑溪市'}, ] }, { name: '北海市', data: [ {value: 8.13, name: '海城区'}, {value: 103.88, name: '银海区'}, {value: 95.09, name: '铁山港区'}, {value: 376.07, name: '合浦县'}, ] }, { name: '防城港市', data: [ {value: 4615.42, name: '港口区'}, {value: 116464.58, name: '防城区'}, {value: 186449.25, name: '上思县'}, {value: 26445.43, name: '东兴市'}, ] }, { name: '钦州市', data: [ {value: 253216.19, name: '钦南区'}, {value: 2253444.46, name: '钦北区'}, {value: 46301.32, name: '灵山县'}, {value: 186363.70, name: '浦北县'}, ] }, { name: '贵港市', data: [ {value: 16375.75, name: '港北区'}, {value: 22463.02, name: '港南区'}, {value: 16373.68, name: '覃塘区'}, {value: 36365.21, name: '平南县'}, {value: 59633.50, name: '桂平市'}, ] }, { name: '玉林市', data: [ {value: 6263.47, name: '玉州区'}, {value: 10663.27, name: '福绵区'}, {value: 16352.76, name: '容县'}, {value: 16635.44, name: '陆川县'}, {value: 36363.85, name: '博白县'}, {value: 1684.96, name: '兴业县'}, {value: 63203.82, name: '北流市'}, ] }, { name: '百色市', data: [ {value: 85.15, name: '右江区'}, {value: 108.91, name: '田阳区'}, {value: 126.81, name: '田东县'}, {value: 126.26, name: '德保县'}, {value: 66.76, name: '那坡县'}, {value: 58569.56, name: '凌云县'}, {value: 4577.07, name: '乐业县'}, {value: 1273.76, name: '田林县'}, {value: 574745.41, name: '西林县'}, {value: 147491.67, name: '隆林各族自治县'}, {value: 21745.54, name: '靖西市'}, {value: 12174.89, name: '平果市'} ] }, { name: '贺州市', data: [ {value: 151.7415, name: '八步区'}, {value: 102747.34, name: '平桂区'}, {value: 53474.78, name: '昭平县'}, {value: 13374.87, name: '钟山县'}, {value: 187475.30, name: '富川瑶族自治县'}, ] }, { name: '河池市', data: [ {value: 9851.23, name: '金城江区'}, {value: 353.60, name: '宜州区'}, {value: 1385857.77, name: '南丹县'}, {value: 56.20, name: '天峨县'}, {value: 688559.20, name: '凤山县'}, {value: 9853.06, name: '东兰县'}, {value: 187.93, name: '罗城仫佬族自治县'}, {value: 18591.88, name: '环江毛南族自治县'}, {value: 7758.52, name: '巴马瑶族自治县'}, {value: 18579.85, name: '都安瑶族自治县'}, {value: 11582.21, name: '大化瑶族自治县'}, ] }, { name: '来宾市', data: [ {value: 78513.64, name: '兴宾区'}, {value: 16851.14, name: '忻城县'}, {value: 16385.19, name: '象州县'}, {value: 20588.51, name: '武宣县'}, {value: 18582.55, name: '金秀瑶族自治县'}, {value: 43585.61, name: '合山市'} ] }, { name: '崇左市', data: [ {value: 3885874.22, name: '江州区'}, {value: 385572.66, name: '扶绥县'}, {value: 278584.62, name: '宁明县'}, {value: 858219.63, name: '龙州县'}, {value: 23850.09, name: '大新县'}, {value: 153855.80, name: '天等县'}, {value: 268585.68, name: '凭祥市'} ] } ] var myChart = echarts.init(document.querySelector('.pie1 .chart')); var option = { tooltip: { trigger: 'item', formatter: '{a} <br/>{b} : {c} ({d}%)' }, legend: { bottom: '0%', itemWidth: 10, itemHeight: 10, //图例文字设置 textStyle: { color: "rgba(255,255,255,.5)", fontSize: "12" } }, series: [ { //color: ['#006cff', '#60cda0', '#ed8884', '#ff9f7f', '#0096ff', '#9fe6b8', '#32c5e9', '#1d9dff'], name: cityData[0].name, type: 'pie', //内圆半径和外圆半径 radius: ['10%', '70%'], //水平居中和垂直居中 center: ['50%', '40%'], roseType: 'radius', // 文本标签控制饼形图文字的相关样式, 注意它是一个对象 label: { color: '#fff', fontSize: 12, }, //引导线调整 labelLine: { show: true, //连接扇形图线长 length: 6, //连接文字线长 length2: 8 }, data: cityData[0].data } ] }; myChart.setOption(option); //4、让图表跟随屏幕自适应 window.addEventListener("resize", function () { myChart.resize(); }); //5、选择要显示的市区 $('.code-select').on('change', function () { //获取选中的option的索引值 var index = $(".code-select").get(0).selectedIndex; //更换数据 option.series[0].name = cityData[index].name; option.series[0].data = cityData[index].data; //重新渲染 myChart.setOption(option); }); })();
复制