D3js技术文档

概述

D3 allows you to bind arbitrary data to a Document Object Model (DOM), and then apply data-driven transformations to the document. For example, you can use D3 to generate an HTML table from an array of numbers. Or, use the same data to create an interactive SVG bar chart with smooth transitions and interaction.

D3 is not a monolithic framework that seeks to provide every conceivable feature. Instead, D3 solves the crux of the problem: efficient manipulation of documents based on data. This avoids proprietary representation and affords extraordinary flexibility, exposing the full capabilities of web standards such as CSS3, HTML5 and SVG. With minimal overhead, D3 is extremely fast, supporting large datasets and dynamic behaviors for interaction and animation. D3’s functional style allows code reuse through a diverse collection of components and plugins.

特点

D3的全称是(Data-Driven Documents),顾名思义可以知道是一个关于数据驱动的文档的javascript类库。说得简单一点,D3.js主要是用于操作数据的,它通过使用HTML、SVG、CSS来给你的数据注入生命,即转换为各种简单易懂的绚丽的图形。

D3 是最流行的可视化库之一,它被很多其他的表格插件所使用。它允许绑定任意数据到DOM,然后将数据驱动转换应用到Document中。你可以使用它用一个数组创建基本的HMTL表格,或是利用它的流体过度和交互,用相似的数据创建惊人的SVG条形图。

环境和安装d3js

环境:windows 7

 

 

         安装方法:   https://github.com/mbostock/d 下载d3压缩包,将其解压放入工程目录其内包含了d3的js库。比如本文使用ror环境开发,则将解压好的d3.js      文件放入C:\Users\Administrator\Desktop\portal-ec2\app\assets\javascripts目录下。

 

 

 

 

 

工作内容

把工程内对应的交换机和虚拟机的拓扑结构用d3js表现出来。交换机和虚拟机的拓扑关系储存在工程内数据库(mysql)中,通过使用ruby语言将数据库中数据关系导出来后,使用d3js将其数据可视化。

数据库中有3张表来表示这个拓扑关系:

1、  switch_type:表示交换机是物理交换机还是虚拟交换机

2、  switch_to_switch:表示交换机之间的连接关系

3、  vm_to_switch:表示虚拟机和交换机之间的连接关系

工作流程

1.    将数据从数据库中导出

在对应的controller中取出数据库数据,放入相应的实例变量

#存储拓扑

 def topo
@vts = VmToSwitch.all
@sts = SwitchToSwitch.all
@stvs = SwitchToVswitch.all
end

  

在对应的views文件中储存所得到的实例变量中的数据

<% vts_size = @vts.size %>

    <% sts_size = @sts.size %>

    <% stvs_size = @stvs.size %>

    <% all_size = vts_size + sts_size + stvs_size %>

    <% v_and_s = Array.new(all_size ) %>

    <% for i in 0..sts_size-1 do %>

    <% v_and_s[i] = @sts[i] %>

    <% end %>

    <% for i in sts_size..sts_size+vts_size-1 do %>

    <% v_and_s[i] = @vts[i-sts_size] %>

    <% end %>

    <% for i in sts_size+vts_size..all_size do %>

    <% v_and_s[i] = @vts[i-sts_size-vts_size] %>

<% end %>

  

这样,所有的关系都已经储存在v_and_s数组中了。

2.    把数据生成拓扑关系

生成拓扑关系中的点,放入nodes数组中

  for(i = 0;i < idnum - vts_size; ++i)          //把switch放入nodes

      {

        var node1 = {

          "name": ids[i],

           "type": "circle",

           "switch_type": hashTable2[ids[i]]

        };

        nodes.push(node1);

      }

      for(i = idnum - vts_size;i < idnum; ++i)     //把vm放入nodes

      {

        var node1 = {

          "name": ids[i],

           "type": "rect",

           "switch_type": "rect" };

        nodes.push(node1);

      }

  

生成拓扑关系中的边,放入edges数组中

 for(i = 0 ; i < all_size; ++i)

      {

        var ss = hashTable[all_array[i][0]];

                   var tt = hashTable[all_array[i][2]]

                   var desc = all_array[i][1];

                   var edges1 = {

                  "source": ss,

                  "target": tt,

                  "des": desc

                   };

                   edges.push(edges1);

      }

  

这样就能生成如下所示的数据对象数组,这样是为了对应d3js中相应的函数

{ nodes: [

                                               { name: "s1" , type:”cicle”,switch_type:”1”},

                                               { name: "s2" ,type:”cicle”,switch_type:”1”},

                                               { name: "s3" ,type:”rect”,switch_type:”2”}

         ],

   edges: [

                                               { source: 0, target: 1 ,des:"s1"},

                                               { source: 0, target: 2 ,des:"s2"},

                                               { source: 1, target: 2 ,des:"s3"}

          ]
}

  

3.    利用数据生成对应的图形

以下工作都是在js脚本中进行,把此js脚本嵌入html页面即可实现可视化功能

在body元素最后添加svg图形

var svg = d3.select("body").append("svg")

                                     .attr("width", w)

                                     .attr("height", h);

  

利用d3js函数库生成力导向模型(拓扑关系图)

var force = d3.layout.force()

                                               .nodes(nodes)

                                               .links(edges)

                                               .size([w, h])

                                               .linkDistance([150])

                                               .charge([-3000]);

         force.start(); //启动模型

  

生成图形中的边

         var edges = svg.selectAll("line")

                                                        .data(dataset.edges)

                                                        .enter()

                                                        .append("line")

                                                        .style("stroke", stroke_color)

                                                        .style("stroke-width", stroke_width)

                                                        .call(force.drag);

  

生成图形中的点

         var node = svg.selectAll("node");

                   node = node.data(dataset.nodes);

                   var nodeEnter = node.enter().append("g")

                     .attr("class", "node")

                     .call(force.drag);

                   nodeEnter.append("circle")

                     .attr("r", 10)

                     .style("fill", function(d, i) {

                            return color(i); })

  

4.    完成

最后,打开对应的html页面,即可看到类似的拓扑关系图

其他问题

在学习d3的过程中,需要了解相应的js语言的知识,其中对应匿名函数的应用非常多,可以进行相应的学习。

在画拓扑关系中遇到一个很痛苦的事情是把矩形和圆表现在一个svg图形中并且使他们满足对应的关系,这样用函数不能进行图形的选择,我做的方法是在一个点中同时添加一个矩形和一个圆,然后可以根据点的属性type来使圆显示或者使矩形显示,这样就做出了将圆和矩形连接在一起的效果!

最后我在http://www.cnblogs.com/juandx/p/3959897.html这篇文章做了一个完整的演示,希望对大家有所帮助

Reference(参考文档)

官方文档:http://d3js.org/

官方力导向模型学习文档:https://github.com/mbostock/d3/wiki/Force-Layout

官方资源:https://github.com/mbostock/d3

d3js技术文档的更多相关文章

  1. Atitit usrQBK1600 技术文档的规范标准化解决方案

    Atitit usrQBK1600 技术文档的规范标准化解决方案 1.1. Keyword关键词..展关键词,横向拓展比较,纵向抽象细化拓展知识点1 1.2. 标题必须有高大上词汇,参考文章排行榜,1 ...

  2. Kafka 技术文档

    Kafka 技术文档   目录 1 Kafka创建背景 2 Kafka简介 3 Kafka好处 3.1 解耦 3.2 冗余 3.3 扩展性 3.4 灵活性 & 峰值处理能力 3.5 可恢复性 ...

  3. RabbitMq 技术文档

    RabbitMq 技术文档 目录 1 AMQP简介 2 AMQP的实现 3 RabbitMQ简介 3.1 概念说明 3.2 消息队列的使用过程 3.3 RabbitMQ的特性 4 RabbitMQ使用 ...

  4. [转]unity3d 脚本参考-技术文档

    unity3d 脚本参考-技术文档 核心提示:一.脚本概览这是一个关于Unity内部脚本如何工作的简单概览.Unity内部的脚本,是通过附加自定义脚本对象到游戏物体组成的.在脚本对象内部不同志的函数被 ...

  5. Umbraco官方技术文档 中文翻译

    Umbraco 官方技术文档中文翻译 http://blog.csdn.net/u014183619/article/details/51919973 http://www.cnblogs.com/m ...

  6. [转]chrome技术文档列表

    chrome窗口焦点管理系统 http://www.douban.com/note/32607279/ chrome之TabContents http://www.douban.com/note/32 ...

  7. Niagara技术文档汇总

    Niagara技术文档汇总http://wenku.baidu.com/view/ccdd4e2c3169a4517723a38f.html Niagara讲解要点http://wenku.baidu ...

  8. DL动态载入框架技术文档

    DL动态载入框架技术文档 DL技术交流群:215680213 1. Android apk动态载入机制的研究 2. Android apk动态载入机制的研究(二):资源载入和activity生命周期管 ...

  9. 使用Jupyter Notebook编写技术文档

    1.jupyter Notebook的组成 这里它的组件及其工程构成,帮助大家更好的用好jupyter Notebook 组件 Jupyter Notebook结合了三个组件: 笔记本Web应用程序: ...

随机推荐

  1. C 应用

    前言 1)操作符两端必须加空格,(每行第一个赋值语句对齐). 2)变量名必须是英文(不能是拼音):英文.数字.下划线和美元符号. 3)等于号 == 反过来写(0 == i%4)防止少些赋值号的错误. ...

  2. 两个变量交换的四种方法(Java) 七种方法(JS)

    两个变量交换的四种方法(Java)   对于两种变量的交换,我发现四种方法,下面我用Java来演示一下. 1.利用第三个变量交换数值,简单的方法. (代码演示一下) 1 class TestEV 2 ...

  3. VC++字符串的使用及转换

    CString ,BSTR ,LPCTSTR之间关系和区别 CString是一个动态TCHAR数组,BSTR是一种专有格式的字符串(需要用系统提供的函数来操纵,LPCTSTR只是一个常量的TCHAR指 ...

  4. sureface 屏幕残影问题官方解决方案 - 卸载显卡驱动

    您进入桌面,左下角微软图标(单击右键),选择设备管理器,点开“显示适配器”前面的小三角,找到“Intel(r) hd gRAPHICS 520”, 单击右键卸载,卸载的时候不要勾选“删除此设备的驱动软 ...

  5. 强制删除一个Windows服务

    一个挂起的服务如下图所示,该服务相关的所有按钮都被禁用,包括启动.停止.暂停和恢复. 要停止这个服务,首先记住这个服务的名称,在这里是 ‘EntropySoftCFS’. 然后打开命令行窗口,运行 s ...

  6. [转]WCF类型共享技巧

    调用过WCF服务的同学可能都会遇到这样的问题,同一个实体类型,不同的服务Visual Studio生成了不同的版本,例如Service1.User和Service2.User,对于C#来说,这是两个不 ...

  7. 利用vagrant打包系统--制作自己的box

    前置条件1.安装VirtualBox 2.安装Vagrant 3.在VirtualBox中安装操作系统,例如 CentOS 1)把在virtualBox中安装的系统打包成box 1.我们需要知道虚拟机 ...

  8. 史上最全的CDN内容分发网络实战技巧(网络优化)

    今天来给大家分享下关于 CDN 的东西,以及我自己的一些发现.一些个人的拙见.总共分为 3 个部分:原理.详解.各种坑. 首先说一下 CDN 的基本原理部分,主要分 4 块来描述:CDN 的由来.调度 ...

  9. linux 打包为zip压缩包

    [root@nb linux学习]# zip -r dir.zip dir文件夹/ file文件 adding: dir文件夹/ (stored %) adding: file文件 (deflated ...

  10. yii2 关系...

    link($name) 会使用..get$name...即有hasmany和hasone... // update lazily loaded related objects if (!$relati ...