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 相关文章推荐
js字符编码函数区别分析
Jun 05 Javascript
Jquery AJAX 框架的使用方法
Nov 03 Javascript
node.js中的fs.stat方法使用说明
Dec 16 Javascript
iframe中子父类窗口调用JS的方法及注意事项
Aug 25 Javascript
AngularJS 控制器 controller的详解
Oct 17 Javascript
vue做移动端适配最佳解决方案(亲测有效)
Sep 04 Javascript
5分钟快速掌握JS中var、let和const的异同
Sep 19 Javascript
JS中call()和apply()的功能及用法实例分析
Jun 28 Javascript
javascript面向对象创建对象的方式小结
Jul 29 Javascript
JavaScript常用工具函数大全
May 06 Javascript
JS变量提升及函数提升实例解析
Sep 03 Javascript
js删除指定位置超链接中含有百度与360的标题
Jan 06 Javascript
微信小程序 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
php 连接mssql数据库 初学php笔记
2010/03/01 PHP
php 数组的指针操作实现代码
2011/02/08 PHP
php str_getcsv把字符串解析为数组的实现方法
2017/04/05 PHP
PHP编程计算文件或数组中单词出现频率的方法
2017/05/22 PHP
阿里云Win2016安装Apache和PHP环境图文教程
2018/03/11 PHP
分析 JavaScript 中令人困惑的变量赋值
2007/08/13 Javascript
javascript 面向对象思想 附源码
2009/07/07 Javascript
javascript天然的迭代器
2010/10/29 Javascript
js 手机号码合法性验证代码集合
2012/09/29 Javascript
JavaScript运行机制之事件循环(Event Loop)详解
2014/10/10 Javascript
jquery实现聚光灯效果的方法
2015/02/06 Javascript
JS实现文字放大效果的方法
2015/03/03 Javascript
JavaScript获取各大浏览器信息图示
2015/11/20 Javascript
js+flash实现的5图变换效果广告代码(附演示与demo源码下载)
2016/04/01 Javascript
深入解析js轮播插件核心代码的实现过程
2017/04/14 Javascript
jQuery 开发之EasyUI 添加数据的实例
2017/09/26 jQuery
微信小程序 动画的简单实例
2017/10/12 Javascript
vue2中使用less简易教程
2018/03/27 Javascript
vue-drawer-layout实现手势滑出菜单栏
2020/11/19 Vue.js
Python yield 小结和实例
2014/04/25 Python
Python while、for、生成器、列表推导等语句的执行效率测试
2015/06/03 Python
python中实现指定时间调用函数示例代码
2017/09/08 Python
Python图像处理之简单画板实现方法示例
2018/08/30 Python
python模拟登陆,用session维持回话的实例
2018/12/27 Python
pygame实现成语填空游戏
2019/10/29 Python
Anaconda3+tensorflow2.0.0+PyCharm安装与环境搭建(图文)
2020/02/18 Python
夏威夷灵感服装及配饰:Reyn Spooner
2018/09/18 全球购物
27个经典Linux面试题及答案,你知道几个?
2014/03/11 面试题
幼儿园元旦家长感言
2014/02/27 职场文书
高中教师先进事迹材料
2014/08/22 职场文书
单位委托书范本(3篇)
2014/09/18 职场文书
2014乡镇干部对照检查材料思想汇报
2014/09/26 职场文书
银行先进个人总结
2015/02/15 职场文书
学校勤俭节约倡议书
2015/04/29 职场文书
2016读书月活动心得体会
2016/01/14 职场文书
Redis基本数据类型List常用操作命令
2022/06/01 Redis