Echarts人口金字塔

先看一下设计效果图,如下图;这里完全实现这个效果是不好实现的,个人觉得有两个难点,一个是Y轴的列标,还有就是渐变效果,尝试了一下没有成功,就打住了

然后看一下最终的效果图,虽然有点丑,理想和现实总是有差距的对吧,废话不多说,下面看看我实现的心路历程吧。

获取数据

数据来源也是自己获取的,在数据库表中,只存了用户的出生年月日,也就是说,我需要根据当前系统时间,和存在库表中的时间计算年龄,然后根据算出来的年龄和性别分组,得到count即可,以下是我使用mssql数据库的查询语句,需要查看的就是sql中的datediff()这个方法,百度一下很多说明的,没有什么难点,很简单理解的sql语句

SELECT sex,CASE when datediff(year,Birthday,getdate()) <= 19 then '20岁以内'when datediff(year,Birthday,getdate()) between 20 and 29 then '20-30'when datediff(year,Birthday,getdate()) between 30 and 39 then '30-40'when datediff(year,Birthday,getdate()) between 40 and 49 then '40-50'when datediff(year,Birthday,getdate()) between 50 and 59 then '50-60'when datediff(year,Birthday,getdate()) between 60 and 69 then '60-70'when datediff(year,Birthday,getdate()) between 70 and 79 then '70-80'when datediff(year,Birthday,getdate()) between 80 and 89 then '90-90'else '90岁以上' end as 年龄段,count(*) as 年龄段人数from User WHERE DeleteStatus = 0group byCASE when datediff(year,Birthday,getdate()) <= 19 then '20岁以内'when datediff(year,Birthday,getdate()) between 20 and 29 then '20-30'when datediff(year,Birthday,getdate()) between 30 and 39 then '30-40'when datediff(year,Birthday,getdate()) between 40 and 49 then '40-50'when datediff(year,Birthday,getdate()) between 50 and 59 then '50-60'when datediff(year,Birthday,getdate()) between 60 and 69 then '60-70'when datediff(year,Birthday,getdate()) between 70 and 79 then '70-80'when datediff(year,Birthday,getdate()) between 80 and 89 then '90-90'else '90岁以上' END,sex优化后
select t1.ageLevel,t1.sex,count(0) amount from (
select case when age between 20 and 29 then '20-30'
when age between 30 and 39 then '30-40'
when age between 40 and 49 then '40-50'
when age between 50 and 59 then '50-60'
when age between 60 and 69 then '60-70'
when age between 70 and 79 then '70-80'
when age between 80 and 89 then '80-90'
else '90以上' end
as ageLevel,sex from (
select datediff(year,Birthday,getdate()) age,* from User
) t
) t1
group by t1.ageLevel,t1.sex
order by t1.sex,t1.ageLevel
前端echarts实现

我结合网上查找的实例,和官网的api参数说明,凑出了最后的效果,话不多说,直接上代码

 ajaxFormData('@Url.Action("GetTalentsAgesGrade", "Home")', {},function (res) {let data = res.Data;for (var i = 0; i < data.length; i++) {gendarGrade.push(data[i].name)let temp = {name: "",value: ""};if (data[i].sex == "男") {temp.name = data[i].name;temp.value = -data[i].value;maleList.push(temp)} else {temp.name = data[i].name;temp.value = data[i].value;femaleList.push(temp)}list.push(data[i].value);}list.sort(function (num1, num2) {return num1 - num2;})let tempString = '1';maxValue = eval(list[list.length - 1]);//取最大值for (let i = 0; i <= maxValue.length - 1; i++) {tempString += '0';}// maxValue = Math.ceil(maxValue / 100) * 100;//向上取整(比如346 取400)maxValue = Math.ceil(maxValue / Number(tempString)) *
Number(tempString);//向上取整(比如346 取400)gendarGrade = Array.from(new Set(gendarGrade));//目录去重let mybarChart = echarts.init(document.getElementById('barContainer1'));let option = {title: {show: false,text: '人才男女比例结构图',},backgroundColor: '#fff',tooltip: {trigger: 'axis',axisPointer: {            // 坐标轴指示器,坐标轴触发有效type: 'shadow'        // 默认为直线,可选为:'line' |
'shadow'},formatter: function (data) {let ttt = data[0].name;for (let i = 0; i < data.length; i++) {ttt += '<br/>' + data[i].seriesName + ':' +
(Math.abs(data[i].value))+'人';}return ttt;}},legend: {//图例设置data: ['男士', '女士'],x: '2%',y:'5%',                             },color: ['#2575fc', '#ff1493'],//颜色设置、grid: {x: '10%',x2: '5%',y: '18%',y2:'14%'},xAxis: [{type: 'value',mix: function () {let aa =-1 *  maxValue;return aa;},max: maxValue,axisLabel: {formatter: function (a) {return Math.abs(a);},color: '#7d7d7d',fontWeight:'11'},axisTick: { show: false },axisLine: {lineStyle: {color:'#d8d8d8',}},splitLine: {show: true},splitNumber: 100,minInterval: 80,maxInterval: 200,itemStyle: {normal: {//这里设置了没有效果,本来是尝试做渐变效果的color: new echarts.graphic.LinearGradient(//右 / 下 / 左 / 上1, 0, 0, 0,[{ offset: 0, color: '#2575fc' },{ offset: 0.5, color: '#2c6af6' },{ offset: 1, color: '#6a11cb' }])}                                }}],yAxis: [{type: 'category',nameLocation: "middle",axisTick: { show: false },data: gendarGrade,axisLabel: {                                       color: '#1d1d1b',fontWeight: '11'},}],series: [{name: '男士',type: 'bar',stack: '总量',barWidth:'50%',data: maleList},{name: '女士',type: 'bar',stack: '总量',barWidth: '50%',data: femaleList}]};mybarChart.setOption(option);});

最后简单总结下前端实现的思路,其实就是一个柱状图的实现,让其分组结果左右显示,最重要的是左边,我让其value全部为负数了,这样就能显示在左边了,最后鼠标移入和图形显示为什么不是负数呢,建议看一下tooltip.formatter()和xAxis.formatter()这里的重写方法,echarts的官方说明文档是有详细说明的。最后比较坑的点是,如果左右最大值不一样的话,y轴就没在整个图的中间,这里我的解决办法,是xAxis.max设置的值是,这两组数据的最大值。

我做的还原度不是很好,但对没接触过echarts的我来说又是一次小成长,在学习的路上,我一直是捡贝壳的小男孩。

这篇文章是由这个博客网站作者发布的

Echarts人口金字塔相关推荐

  1. R语言ggplot2可视化:可视化人口金字塔图、人口金字塔显示不同性别不同年龄段的人口数,是了解人口组成的最优可视化方法、人口金字塔图可以用来表示按体积排序的群体的分布、形成漏斗结构

    R语言ggplot2可视化:可视化人口金字塔图.人口金字塔显示不同性别不同年龄段的人口数,是了解人口组成的最优可视化方法.人口金字塔图可以用来表示按体积排序的群体的分布.形成漏斗结构(Populati ...

  2. Python使用matplotlib可视化人口金字塔图、人口金字塔显示不同性别不同年龄段的人口数,是了解人口组成的最优可视化方法、人口金字塔图可以用来表示按体积排序的群体的分布、形成漏斗结构

    Python使用matplotlib可视化人口金字塔图.人口金字塔显示不同性别不同年龄段的人口数,是了解人口组成的最优可视化方法.人口金字塔图可以用来表示按体积排序的群体的分布.形成漏斗结构(Popu ...

  3. tableau:人口金字塔图

    首先我们来看看数据源长什么样: 前三项是地区信息,age是年龄,gender表示性别,counts表示这一年龄的男性or女性的人数. 我们看到age中有null的字样,查看原始的excel表格,发现n ...

  4. py实战绘制人口金字塔图

    大家好,我是执念斩长河,一个刚刚学习python绘图的学渣.今天非常开心阅读了<python数据可视化>(黑马程序员编著)其中的"绘制人口金字塔图"章节被我成功运行出来 ...

  5. Tableau绘图一热图、日历图、人口金字塔、标靶图、凹凸图、帕累托图

    Tableau绘图一热图.日历图.人口金字塔.标靶图.凹凸图.帕累托图 本文首发于博客冰山一树Sankey,去博客浏览效果更好.直接右上角搜索该标题即可 一.热图 例子:示例超市 可以通过更改颜色来改 ...

  6. WPF仿百度Echarts人口迁移图

    关于大名鼎鼎的百度Echarts我就不多说了 不了解的朋友直接看官方的例子吧 http://echarts.baidu.com/examples.html 前阵子我加入了一个WPF的技术交流群 此de ...

  7. Tableau 第十天 人口金字塔、漏斗图、箱线图

    关注微信公共号:小程在线 关注CSDN博客:程志伟的博客 视频地址:https://www.bilibili.com/video/BV1E4411B7ef?p=10 第十天 32.人口金字塔 33.漏 ...

  8. 快速入门Tableau系列 | Chapter10【人口金字塔、漏斗图、箱线图】

    Chapter10 32.人口金字塔 33.漏斗图 34.箱纸图 32.人口金字塔 人口金字塔在本质上是一堆条形图 人口金字塔是一种特殊的旋风图 步骤: ①创建"年龄"计算字段:右 ...

  9. 如何在 R 中创建人口金字塔

    人口金字塔是显示给定人口的年龄和性别分布的图表.这是一张有用的图表,可以轻松了解人口构成以及当前人口增长趋势. 如果人口金字塔呈矩形,则表明人口增长速度较慢:老一代正在被大小大致相同的新一代所取代. ...

最新文章

  1. Linux 中创建 USB 启动盘来拯救 Windows 用户
  2. 【MySQL】面试官:如何查询和删除MySQL中重复的记录?
  3. 插上翅膀,让Excel飞起来——xlwings(一)
  4. c语言的编译环境出错怎么办,编译是通过,连接时出错,怎么办
  5. Item03. 设计模式 Item04. STL
  6. 【Java文件操作】txt文件的创建
  7. 我的Mac os x中的nginx配置文件nginx.conf
  8. 科技部:推进人工智能和实体经济深度融合 壮大智能经济
  9. collections模块 :namedtuple、deque、defaultdict、OrderedDict、ChainMap、Counter
  10. 一种基于Android、iOS系统的移动端身份证识别技术,手机拍照扫描识别
  11. 华硕电脑开启无线服务器,华硕ASUS路由器无线中继模式设置步骤图解
  12. android 矢量粒子动画,Android碎裂的粒子效果
  13. 多人如何通过小程序上传照片、视频、素材、文章,然后点赞投票评选?
  14. LPC1768 SPI 外设控制DA(PCM1796)调试记录
  15. 编译错误:In function `_sbrk_r‘:sbrkr.c:(.text._sbrk_r+0xc): undefined reference to `_sbrk‘
  16. IDEA SpringBoot项目Docker一键部署
  17. Linux下socket编程之UDP简单实现
  18. C语言实现3个数的最小公倍数和最大公约数
  19. 一个简单的宿舍管理系统
  20. 天翼文化参展深圳文博会 冒险大作《海盗鬼皮书》引热捧

热门文章

  1. TDK的新的惊人的旧风格的boombox
  2. 计算机网络 - 练习(一百三十八)
  3. ✖ 1 problem (1 error, 0 warnings) 1 error and 0 warnings potentially fixable with the `--fix` opti
  4. 控制台 - BRAS系列之爱立信认证服务器用户查询总结
  5. mysql数据库及应用 作业_MySQL数据库设计与应用作业答案
  6. cjl指标(cjl指标)
  7. [乡土民间故事_徐苟三传奇]第十七回_新老爷错寻调弄鬼
  8. Omnifocus导图解析
  9. xcode No such module
  10. 熊猫TV 弹幕助手 (开源 、 Java)