Web纯前端“旭日图”实现元素周期表


Posted in Javascript onMarch 10, 2017

一、什么是旭日图

旭日图是在Excel 2016中新增的一种图表。有些类似饼图,饼图的优势是可以显示占比。但是饼图只能显示单级数据。旭日图用来表示多层级数据的占比。旭日图以一种分层方式显示,非常适合用来显示层级数据。层次结构中每个级别的比例通过1个圆环表示,离原点越近代表圆环级别越高,最内层的圆表示顶级结构,然后一层一层去看数据的占比情况。

我们通过一个简单的示例,初步感受一下旭日图的魅力。

季度 月份 销量
Q1 1月份   29
2月份 第一周 63
第二周 54
第三周 91
第四周 78
3月份   49
Q2 4月份   66
5月份   110
6月份   42
Q3 7月份   19
8月份   73
9月份   109
Q4 10月份   32
11月份   112
12月份   99

表1 某产品的销量统计

Web纯前端“旭日图”实现元素周期表 

图1 用旭日图表示的销量

通过表1我们可以看到它是一个层级数据,第1级是季度,第2级是月份,第3级是周。图1是根据表1在Excel中绘制的旭日图。内层显示第1级季度,其外层的圆环显示第2级月份,最外层圆环显示第3级周。显示的每个占比是根据其对应的销售来计算。

二、简单示例

我们了解了旭日图之后,在有些场景中我们就想在自己的系统中使用旭日图。Wijmo中提供了JS控件可以让我们在Web纯前端使用旭日图。如果想在.Net平台下使用旭日图可以了解ComponentOne中的FlexChart。通过下面一个简单的示例,对如何使用旭日图有一个初步的了解。

HTML文件:

1、引入Wijmo的css和js

<!-- Styles -->
 <link href="styles/vendor/wijmo.min.css" rel="external nofollow" rel="stylesheet" />
 <link href="styles/app.css" rel="external nofollow" rel="stylesheet" />
 <!-- Wijmo -->
 <script src="scripts/vendor/wijmo.min.js" type="text/javascript"></script>
 <script src="scripts/vendor/wijmo.chart.min.js" type="text/javascript"></script>
<script src="scripts/vendor/wijmo.chart.hierarchical.min.js" type="text/javascript"> </script>

2、定义一个DIV

这个DIV用户显示旭日图。

<div id="introChart"></div>

3、引入自定义的js文件

<script src="scripts/app.js"></script>
<script src="scripts/sunburst.js"></script>

app.js:

// 产生数据
var app = {
 getData: function () {
  var data = [],
   months = [['Jan', 'Feb', 'Mar'], ['Apr', 'May', 'June'], ['Jul', 'Aug', 'Sep'], ['Oct', 'Nov', 'Dec']],
   years = [2014, 2015, 2016];
  years.forEach(function (y, i) {
   months.forEach(function (q, idx) {
    var quar = 'Q' + (idx + 1);
    q.forEach(function (m) {
     data.push({
      year: y.toString(),
      quarter: quar,
      month: m,
      value: Math.round(Math.random() * 100)
     });
    });
   });
  });
  return data;
 },
};

创建了一个app类,其中包含一个getData方法,用于产生一个多级数据。它的级别分别是年、季度、月份。

sunburst.js:

(function(wijmo, app) {
 'use strict';
 // 创建控件
 var chart = new wijmo.chart.hierarchical.Sunburst('#introChart');
 // 初始化旭日图
 chart.beginUpdate();
 // 旭日图包含的值得属性名
 chart.binding = 'value';
 // 设置层级数据中子项目的名称,用于在旭日图中生成子项
 chart.bindingName = ['year', 'quarter', 'month'];
 // 设置数据源
 chart.itemsSource = app.getData();
 // 设置数据显示的位置
 chart.dataLabel.position = wijmo.chart.PieLabelPosition.Center;
 // 设置数据显示的内容
 chart.dataLabel.content = '{name}';
 // 设置选择模式
 chart.selectionMode = 'Point';
 chart.endUpdate();
})(wijmo, app);

根据Div的ID创建一个Sunburst对象,设置数据源以及相关属性。数据源通过app.getData()提供。

下面是程序运行的结果。

 Web纯前端“旭日图”实现元素周期表

图2 运行结果

三、用“旭日图”实现元素周期表

有了以上的知识储备之后,我们就可以做复杂一点的实现。下面我们用“旭日图”实现元素周期表。我们上高中的时候,都应该学习过元素周期表,它是类似如下的一张表。这张表更多了展示了元素的信息,但是没有很好的展示元素归类的信息。我们现在用旭日图来做它,对这点进行改善。

Web纯前端“旭日图”实现元素周期表

图3 元素周期表

HTML文件:

和简单示例中的类似,需要引入Wijmo相关的样式和js文件。

1、引入自定义的js文件

<script src="scripts/DataLoader.js"></script>
<script src="scripts/app.js"></script>

2、定义一个DIV

<div id="periodic-sunburst" class="periodic-sunburst"></div>

DataLoader.js:

创建了一个DataLoader类,其中提供两个方法。readFile方法读取json文件获得数据。isInclude 方法判断数组中是否存在指定的元素。generateCollectionView方法中对数据进行加工处理。

var DataLoader = {};
// 一级分类
var METALS_TITLE = "金属";
var NON_METALS_TITLE = "非金属";
var OTHERS_TITLE = "过渡元素";
// 二级分类
var METAL_TYPES = '碱金属|碱土金属|过渡金属|镧系元素|锕系元素|其他金属'.split('|');
var NON_METAL_TYPES = '惰性气体|卤素|非金属'.split('|');
var OTHER_TYPES = '准金属|超锕系'.split('|');
DataLoader = {
 readFile: function (filePath, callback) {
  var reqClient = new XMLHttpRequest();
  reqClient.onload = callback;
  reqClient.open("get", filePath, true);
  reqClient.send();
 },
 isInclude: function (arr, data) {
  if (arr.toString().indexOf(data) > -1)
   return true;
  else
   return false;
 },
 generateCollectionView: function (callback) {
  DataLoader.readFile('data/elements.json', function (e) {
   // 获取数据
   var rawElementData = JSON.parse(this.responseText);
   var elementData = rawElementData['periodic-table-elements'].map(function (item) {
    item.properties.value = 1;
    return item.properties;
   });
   var data = new wijmo.collections.CollectionView(elementData);
   // 利用wijmo.collections.PropertyGroupDescription 进行第一级分组
   data.groupDescriptions.push(new wijmo.collections.PropertyGroupDescription('type', function (item, prop) {
    if (DataLoader.isInclude(METAL_TYPES, item[prop])) {
     return METALS_TITLE;
    } else if (DataLoader.isInclude(NON_METAL_TYPES, item[prop])) {
     return NON_METALS_TITLE;
    } else {
     return OTHERS_TITLE;
    }
   }));
   // 进行第二级分组
   data.groupDescriptions.push(new wijmo.collections.PropertyGroupDescription('type', function (item, prop) {
    return item[prop];
   }));
   callback(data);
  });
 }
};

generateCollectionView方法中调用readFile获得json数据,之后利用Wijmo中提供的CollectionView对数据进行2级分组。第1级是金属、非金属、过渡元素。第2级分别是他们的子级别。第3级是元素,每个元素的Value都是1,表示元素的占比相同。

app.js:

和前边的简单示例相比,这里绑定的数据源是CollectionView.Groups,它是CollectionView中的第一级分组。

var mySunburst;
function setSunburst(elementCollectionView) {
 // 创建旭日图控件
 mySunburst = new wijmo.chart.hierarchical.Sunburst('#periodic-sunburst');
 mySunburst.beginUpdate();
 // 设置旭日图的图例不显示
 mySunburst.legend.position = 'None';
 // 设置内圆半径
 mySunburst.innerRadius = 0.1;
 // 设置选择模式
 mySunburst.selectionMode = 'Point';
 // 设置数据显示的位置
 mySunburst.dataLabel.position = 'Center';
 // 设置数据显示的内容
 mySunburst.dataLabel.content = '{name}';
 // 进行数据绑定
 mySunburst.itemsSource = elementCollectionView.groups;
 // 包含图表值的属性名
 mySunburst.binding = 'value';
 // 数据项名称
 mySunburst.bindingName = ['name', 'name', 'symbol'];
 // 在分层数据中生成子项的属性的名称。
 mySunburst.childItemsPath = ['groups', 'items']; 
 mySunburst.endUpdate();
};
DataLoader.generateCollectionView(setSunburst);

运行结果:

Web纯前端“旭日图”实现元素周期表

图4 旭日图表示的元素周期表

四、源码下载

旭日图简单示例的源码:

旭日图表示元素周期表的代码:

PeriodicSunburst.rar

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

Javascript 相关文章推荐
在IE模态窗口中自由查看HTML源码的方法
Mar 08 Javascript
告诉大家什么是JSON
Jun 10 Javascript
JS函数实现动态添加CSS样式表文件
Dec 15 Javascript
详解js中构造流程图的核心技术JsPlumb(2)
Dec 08 Javascript
谈谈target=_new和_blank的不同之处
Oct 25 Javascript
利用python分析access日志的方法
Oct 26 Javascript
Angularjs 动态添加指令并绑定事件的方法
Apr 13 Javascript
纯js实现动态时间显示
Sep 07 Javascript
vue.js 获取select中的value实例
Mar 01 Javascript
CKEditor 4.4.1 添加代码高亮显示插件功能教程【使用官方推荐Code Snippet插件】
Jun 14 Javascript
vue-form表单验证是否为空值的实例详解
Oct 29 Javascript
VUE实现吸底按钮
Mar 04 Vue.js
微信小程序 MD5的方法详解及实例代码
Mar 10 #Javascript
jQuery实现扑克正反面翻牌效果
Mar 10 #Javascript
AngularJS之页面跳转Route实例代码
Mar 10 #Javascript
Angular多选、全选、批量选择操作实例代码
Mar 10 #Javascript
jQuery插件HighCharts绘制2D带有Legend的饼图效果示例【附demo源码下载】
Mar 10 #Javascript
Vue.js之slot深度复制详解
Mar 10 #Javascript
JS实现的自动打字效果示例
Mar 10 #Javascript
You might like
DC游戏Steam周三特惠 《蝙蝠侠》阿卡姆系列平史低
2020/04/09 欧美动漫
基于mysql的bbs设计(四)
2006/10/09 PHP
解决控件遮挡问题:关于有窗口元素和无窗口元素
2007/01/28 PHP
通过php修改xml文档内容的方法
2015/01/23 PHP
Javascript 八进制转义字符(8进制)
2011/04/08 Javascript
在javascript中对于DOM的加强
2013/04/11 Javascript
jquery 新建的元素事件绑定问题解决方案
2014/06/12 Javascript
Javascript中的方法链(Method Chaining)介绍
2015/03/15 Javascript
Bootstrap页面布局基础知识全面解析
2016/06/13 Javascript
关于ES6的六个小特性(二)
2017/02/20 Javascript
超简单的Vue.js环境搭建教程
2017/03/17 Javascript
ES6新特性五:Set与Map的数据结构实例分析
2017/04/21 Javascript
JavaScript变量声明var,let.const及区别浅析
2018/04/23 Javascript
vue实现简单loading进度条
2018/06/06 Javascript
python实现可将字符转换成大写的tcp服务器实例
2015/04/29 Python
python从网络读取图片并直接进行处理的方法
2015/05/22 Python
Python numpy实现数组合并实例(vstack,hstack)
2018/01/09 Python
python 字典中取值的两种方法小结
2018/08/02 Python
Django封装交互接口代码
2020/07/12 Python
Python用来做Web开发的优势有哪些
2020/08/05 Python
Python类绑定方法及非绑定方法实例解析
2020/10/09 Python
文明学生标兵事迹
2014/01/21 职场文书
运动会方阵解说词
2014/02/12 职场文书
十八届三中全会学习方案
2014/02/16 职场文书
三项教育活动实施方案
2014/03/30 职场文书
党务公开方案
2014/05/06 职场文书
英语教育专业自荐信
2014/05/29 职场文书
师德师风剖析材料
2014/09/30 职场文书
正风肃纪剖析材料
2014/09/30 职场文书
公安领导班子四风问题个人整改措施思想汇报
2014/10/09 职场文书
工作检讨书大全
2015/01/26 职场文书
酒店辞职书怎么写
2015/02/26 职场文书
2015年优质护理服务工作总结
2015/04/08 职场文书
springboot拦截器无法注入redisTemplate的解决方法
2021/06/27 Java/Android
springboot创建的web项目整合Quartz框架的项目实践
2022/06/21 Java/Android
win11自动弹出虚拟键盘怎么关闭? Win11关闭虚拟键盘的技巧
2023/01/09 数码科技