d3js技术文档

摘要:
环境和安装d3js环境:windows7安装方法:inhttps://github.com/mbostock/d下载d3压缩包,将其解压缩并放入项目目录,其中包含d3的js库。例如,如果本文使用ror环境进行开发,请将提取的d3.js文件放入C:UsersAdministratorDesktopportal-ec2appassetsjavascript目录。工作内容用d3js显示了项目中相应交换机和虚拟机的拓扑。交换机和虚拟机之间的拓扑关系存储在项目数据库中。使用Ruby语言导出数据库中的数据关系后,使用d3js将数据可视化。
 

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:UsersAdministratorDesktopportal-ec2appassetsjavascripts目录下。

 

 

 

 

 

工作内容

         把工程内对应的交换机和虚拟机的拓扑结构用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页面,即可看到类似的拓扑关系图

 d3js技术文档第1张

其他问题

         在学习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技术文档》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇设计模式之动态代理(转载)何时用ExecuteDataSet / ExecuteReader() / ExecuteScalar下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

H3C交换机配置链路聚合

<H3C>system-view //进入配置模式 动态链路聚合: [SW]dis cu //查看所有配置端口信息 [SW]int Bridge-Aggregation 1 //创建链路聚合组端口1 [SW-Bridge-Aggregation1]link-aggregation mode dynamic //链路聚合模式动态 [SW-Br...

交换机修改IP地址池租约时间

具体思路: 进入地址池视图,使用expired命令修改时间。 1.telnet 登录交换机 2.查看当前配置 dis cu 3.找到dhcp server ip-pool XXX XXX就是地址池名字 4.system-view 进入系统视图 5.dhcp server ip-pool XXX 进入地址池视图 6.expired day 0 hour 5...

H3C交换机修改时间

首先学习: NTP  network time protocol  网络时间协议 UTC  世界协调时间   # 查看时钟设置  dis clock #图片为已经配置好的时钟 有两种时钟获取方式 1.开取NTP ,由网络时钟服务器获取时间    clock protocol ntp mdc mdc-id 2.不置时钟服务器,             cl...

配置远程服务器,使hyper-v能够连接网络

一般远程服务器只有一个网卡和IP,如果你要在服务器上装虚拟机,那么要使虚拟机能够连接网络,必须要创建虚拟交换机。 如果创建虚拟交换机并桥接,那么就会改变IP地址,改变IP地址,就连接不上远程服务器。造成了一个死循环。 怎么解决呢,下面说一个方法,可以不桥接的方法,使hyper-v连接上网络 1.打开Hyper-v管理器--》  选择虚拟交换机管理器--创建...

华为交换机堆叠配置

华为交换机配置堆叠,请大家参考。   --------------------------------------------------------------------------------------------------------------------------------------------------------------...

H3C 交换机VRRP和堆叠

1. 前言 平时对系统和主机的维护工作比较多一些, 对网络设备的配置就相对少了很多。最近为了上一批设备,针对交换机的配置也学习了一番,本文记录几个在实操中用到的实例。 2. 概念 在系统运维中,经常会用冗余的方式来保证业务、服务、系统的高可用性,而在网络中也存在冗余和高可用的方式。对于交换机来说,VRRP 和 堆叠。 2.1 MSTP 这里不准备对 STP...