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

一、什么是旭日图

旭日图是在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

    <!-- Styles -->
    <link href="styles/vendor/wijmo.min.css" rel="stylesheet" />
    <link href="styles/app.css" 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()提供。

下面是程序运行的结果。

图2 运行结果

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

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

图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);

运行结果:

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

四、源码下载

  旭日图简单示例的源码:

    SunburstIntro.zip

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

    PeriodicSunburst.zip

时间: 2024-10-17 07:45:11

Web纯前端“旭日图”实现元素周期表的相关文章

用旭日图展示数据的三种方法

什么是旭日图? 旭日图(Sunburst Chart)是一种现代饼图,它超越传统的饼图和环图,能表达清晰的层级和归属关系,以父子层次结构来显示数据构成情况.旭日图中,离远点越近表示级别越高,相邻两层中,是内层包含外层的关系. 在实际项目中使用旭日图,可以更细分溯源分析数据,真正了解数据的具体构成.而且,旭日图不仅数据直观,而且图表用起来特别炫酷,分分钟拉高数据汇报的颜值!很多数据场景都适合用旭日图,比如,在销售汇总报告中,方便看到每个店铺的销售业绩分布(如下图): 做旭日图的三种方法 1. 用E

[web建站] 极客WEB大前端专家级开发工程师培训视频教程

极客WEB大前端专家级开发工程师培训视频教程  教程下载地址: http://www.fu83.cn/thread-355-1-1.html 课程目录:1.走进前端工程师的世界HTML51.HTML5与HTML4的区别2.HTML5新增的主体结构元素3.HTML5新增的的非主体结构元素 4.HTML5表单新增元素与属性5.HTML5表单新增元素与属性(续)6.HTML5改良的input元素的种类 7.HTML5增强的页面元素8.HTML5编辑API之Range对象(一)9.HTML5编辑API之

纯前端实现人脸识别-提取-合成

原文地址前端路上, 转载请注明出处. 最近火爆朋友圈的军装照H5大家一定还记忆犹新,其原理是先提取出照片中的面部,然后与模板进行合成,官方的合成处理据说由天天P图提供技术支持,后端合成后返回给前端展示,形式很新颖效果也非常好,整个流程涉及的人脸识别和图像合成两项核心技术在前端都有对应的解决方案,因此理论上前端也可以完成人脸识别-提取-合成整个流程,实现纯前端的军装照H5效果. 前端人脸识别 首先需要的是人脸识别,这个一听就觉得高大上的东西原理并不深奥,无非是用人的面部特征规则对图像进行匹配和识别

Vue 2.x + Webpack 3.x + Nodejs 多页面项目框架(上篇——纯前端多页面)

Vue 2.x + Webpack 3.x + Nodejs 多页面项目框架(上篇--纯前端多页面) @(HTML/JS) 一般来说,使用vue做成单页应用比较好,但特殊情况下,需要使用多页面也有另外的好处.例如手Q的多webview架构,新开页面有利于ios右划返回,也避免了返回时页面的刷新. 所以,这里我们探讨一下如何配置实现多页面的项目框架.这里是开篇,先以最简单的纯前端多页面为例入手,最终目标是完成Node.js多页面直出+前后端同构的架构. 本文源代码:https://github.c

纯前端导出pdf文件

纯前端js导出pdf,已经用于生产环境. 工具: 1.html2canvas,一种让html转换为图片的工具. 2.pdfmake或者jspdf ,一种生成.编辑pdf,并且导出pdf的工具. pdfmake:http://pdfmake.org 优点: 能够支持中文,具有部分自适应布局功能,需要vfs_fonts.js字体文件. 缺点:支持中文的vfs_fonts.js文件一般较大. 如果图片过大,不会自动分页. 生成vfs_fonts.js文件的方法如图,npm install pdfmak

SpreadJS纯前端表格控件V11.1震撼来袭

全球最大的控件提供商葡萄城宣布,纯前端表格控件SpreadJS 正式发布2018 V11.1 版本,新版本提供撤销/重做功能,并增强了UI和数据筛选,极大的扩展了产品的实用功能,可更加方便优雅的嵌入您的应用系统. Spread 是一系列功能和Excel类似的表格工具,支持桌面.Web和移动平台开发,用于在您的应用系统中实现Excel导入导出.表格数据录入和编辑等交互功能,并提供灵活的定制能力和丰富的数据可视化效果.Spread 在功能和布局上与Excel高度相似,全系列包括适用于前端平台Spre

纯前端表格控件SpreadJS V11.2新版本发布,全面支持React和Vue

SpreadJS是一款基于 HTML5 的纯 Java 电子表格和网格功能控件,在外观.功能和操作上都与 Excel 高度类似,在表格数据处理上比 Grid 类控件更为优秀,被开发人员誉为"可嵌入系统开发的在线Excel". 近日,纯前端表格控件 SpreadJS V11.2 正式推出,全面支持 React 和Vue,并提供了工作表区域偏移和 CSS 自定义分组等功能. 本次更新的主要内容有: SpreadJS 全面支持 React 和 Vue SpreadJS 现在支持与 React

「圣诞特辑」纯前端实现人脸识别自动佩戴圣诞帽

在线体验地址:hksite.cn/prjs/christmashat 源码地址:https://github.com/hk029/christmas-hat 写在开头 叮叮当,叮叮当,吊儿个郎当,一年一度的圣诞节到咯,我不由的回想起了前两年票圈被圣诞帽支配的恐惧.打开票圈全是各种@官方求帽子的: 票圈头像也瞬间被圣诞帽攻陷: 在那段时间,你没一顶圣诞帽还真不好意思发票圈 各种戴帽子的软件也如雨后春笋般浮现出来,不管是小程序还是美图软件无一例外的都增加了戴圣诞帽的功能.但是对于懒人的我来说,自己调

纯前端的图片预览

尊重原创,转载请注明来自:http://www.cnblogs.com/fsjohnhuang/p/3925827.html ^_^肥仔John 一.前言 图片上传是一个普通不过的功能,而图片预览就是就是上传功能中必不可少的子功能了.在这之前,我曾经通过订阅input[type=file]元素的onchange事件,一旦更改路径则将图片上传至服务器,接着就获取图片路径并赋值到img元素上.先不管文件异步提交的解决方案,就是服务端清理那些临时的预览图片已经增加不少工作量了. 偶然从MDN上找到纯前