一、什么是旭日图

旭日图是在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 某产品的销量统计

图1 用旭日图表示的销量

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

二、简单示例

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

HTML文件:

1、引入Wijmo的css和js

2、定义一个DIV

这个DIV用户显示旭日图。

3、引入自定义的js文件

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()提供。

下面是程序运行的结果。

图2 运行结果

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

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

图3 元素周期表

HTML文件:

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

1、引入自定义的js文件

2、定义一个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);

运行结果:

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

四、源码下载

旭日图简单示例的源码:

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

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

用html5做元素周期表,Web纯前端“旭日图”实现元素周期表相关推荐

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

    一.什么是旭日图 旭日图是在Excel 2016中新增的一种图表.有些类似饼图,饼图的优势是可以显示占比.但是饼图只能显示单级数据.旭日图用来表示多层级数据的占比.旭日图以一种分层方式显示,非常适合用 ...

  2. html5游戏联机教程,纯前端如何利用帧同步做一款联机游戏?

    一.游戏帧同步 1.简介 ·现代多人游戏中,多个客户端之间的通讯大多以同步多方状态为主要目标,为了实现这一目标,主要有两个技术方向:状态同步.帧同步. ·状态同步的思想中不同玩家屏幕上的一致性的表现并 ...

  3. html5生成excel,H5纯前端生成Excel表格

    H5纯前端生成Excel表格方法如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 var arr = [ 14 { 15 "姓名":"喵喵喵" ...

  4. html5前端开发做什么,Web前端能做什么开发

    对于想要学习HTML5大前端的人来说,从哪里开始入手是困扰他们的难题.前端开发工作已经变的越来越复杂,仅仅是想罗列一份前端开发的学习列表就已经是一件艰巨的工作.曾经只要会编写HTML, CSS和Jav ...

  5. 新一代纯前端控件集 WijmoJS 2018V2发布,提供 Web 设计器,可动态设计页面并生成代码...

    概述 作为一款纯前端控件集,WijmoJS 秉承"快如闪电,触控优先"的设计理念,在提供优质服务和产品的同时,专注于企业应用开发,不断优化产品架构,与时俱进.除在全球率先支持 An ...

  6. html5培训靠谱吗,html5培训和web前端有靠谱的吗?

    html5培训和web前端培训有靠谱的吗? 我是2016年应届毕业生工商管理专业,同年6月7日我这天完全结束了自己的学生时代,经朋友介绍在毕业的第二天,我只身一人来到了兄弟连(www.itxdl.cn ...

  7. 02.Web大前端时代之:HTML5+CSS3入门系列~H5结构元素

    Web大前端时代之:HTML5+CSS3入门系列:http://www.cnblogs.com/dunitian/p/5121725.html 1.结构元素 可以理解为语义话标记,比如:以前这么写&l ...

  8. 04. Web大前端时代之:HTML5+CSS3入门系列~HTML5 表单

    Web大前端时代之:HTML5+CSS3入门系列:http://www.cnblogs.com/dunitian/p/5121725.html 一.input新增类型: 1.tel:输入类型用于应该包 ...

  9. 【web】【django】datatable的button扩展实现纯前端下载和copy指定列内容,以及django的HTTPResponse实现下载功能

    Table of Contents 功能需求描述 一 使用Datatables实现纯前端下载.拷贝 二 query db 实现下载(django) 功能需求描述 用户需要以网页为媒介,从DB里拉取一些 ...

最新文章

  1. 为什么汉字不能当密码,假如用汉字做密码,又会怎样?
  2. 【Groovy】Groovy 方法调用 ( 字符串切割 | 使用 Java 语法切割字符串 | 使用 Groovy 语法切割字符串直接为变量赋值 | 数组赋值给变量 变量个数小于等于数组长度 )
  3. 内核模块相关命令:lsmod,depmod,modprob...
  4. FLV提取AAC音频单独播放并实现可视化的频谱
  5. 网站“注册流程”如何“照顾用户”?
  6. PCB设计中的问题整理
  7. 《Python Cookbook 3rd》笔记(1.15):通过某个字段将记录分组
  8. fastapi 安全性 / APIRouter / BackgroundTasks / 元数据 / 测试调试
  9. 引用dll文件要复制到本地
  10. 五种常见粗粮的最佳养生吃法
  11. 摆脱了Excel重复做表,换个工具轻松实现报表自动化,涨薪三倍
  12. pdf2swf process阻塞问题
  13. 《GAMES104-现代游戏引擎:从入门到实践》-05 学习笔记
  14. actran安装教程linux,Linux平台Actran软件安装
  15. 使用xadmin搜索search_fields报错:Related Field got invalid lookup: icontains
  16. 使用lux(annie)下载视频
  17. 风冷精密空调安装规范
  18. 传奇列表获取失败与登录器太老怎么解决
  19. 魔兽会封python_Python爬取大量数据时,如何防止IP被封?
  20. docker启动nginx及问题处理

热门文章

  1. 【英语阅读】纽约时报 | 电子阅读设备是如何“杀死”你的睡眠的
  2. MySQL主从复制出现 Slave_IO_Running: No/Connecting
  3. linux命令格式化为exfat,如何在 Linux 上将 USB 盘格式化为 exFAT | Linux 中国
  4. java拳皇游戏制作
  5. 论文阅读:EfficientDet:可扩展且高效的目标检测
  6. 数据库常考填空题合集
  7. CAD电气原理图,60多套主流PLC电气图纸,有三菱,欧姆龙,西门子,基恩士,大量实践成功应用案例,图库,变频器
  8. ORACLE-19C DataGuard配置
  9. 1536. 均分纸牌 (递推 思维
  10. elementUI中的el-table标签介绍