一、打包图

  打包图( Pack ),用于表示包含与被包含的关系,也可表示各对象的权重,通常用一圆套一圆来表示前者,用圆的大小来表示后者。

1、布局(数据转换)

var pack = d3.layout.pack().size([ width, height ]).radius(20);

  第 1 行:打包图的布局
  第 2 行:size() 设定转换的范围,即转换后顶点的坐标(x,y),都会在此范围内。
  第 3 行:radius() 设定转换后最小的圆的半径。

  读取数据并转换的代码

d3.json("city2.json", function(error, root) {var nodes = pack.nodes(root);var links = pack.links(nodes);console.log(nodes);console.log(links);
}

  上面用 pack 函数分别将数据转换成了顶点 nodes 和 连线 links。来看看顶点数据被转换成了什么样:

  数据被转换后,多了深度信息(depth),半径大小(r),坐标位置(x,y)等。打包图无需对连线进行绘制。

  注意:无论用什么 Layout 来转换数据,一定要先看转换后的数据是什么再绘制,否则很容易出错。

2、绘制

  绘制的内容有圆和文字,都在 SVG 中绘制。实例代码如下:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>vue生命周期学习</title><script src="d3.min.js"></script>
</head>
<body>
</body>
<script>
//准备画布
var width=500,height=500;
var svg = d3.select("body").append("svg").attr("width",width).attr("height",height);
//布局
var pack = d3.layout.pack().size([width,height]).radius(20);
//读取数据并转换数据
d3.json('city2.json',function(error,root){var nodes = pack.nodes(root);var links = pack.links(nodes);console.log(nodes,links);//画圆svg.selectAll("circle").data(nodes).enter().append("circle").attr("fill","rgb(31, 119, 180)").attr("fill-opacity","0.4").attr("cx",function(d){return d.x;}).attr("cy",function(d){return d.y;}).attr("r",function(d){return d.r;}).on("mouseover",function(d,i){d3.select(this).attr("fill","yellow")}).on("mouseout",function(d,i){d3.select(this).attr("fill","rgb(31, 119, 180)");});//给文本svg.selectAll("text").data(nodes).enter().append("text").attr("font-size","10px").attr("fill","white").attr("fill-opacity",function(d){if(d.depth == 2)return "0.9";elsereturn "0";}).attr("x",function(d){ return d.x; }).attr("y",function(d){ return d.y; }).attr("dx",-12).attr("dy",1).text(function(d){ return d.name; });
})
</script>
</html>

二、地图

  在数据可视化中,地图是很重要的一部分。很多情况会与地图有关联,如中国各省的人口多少,GDP多少等,都可以和地图联系在一起。

  将 JSON 的格式应用于地理上的文件,叫做 GeoJSON 文件。本文就是用这种文件绘制地图。

1、投影函数

var projection = d3.geo.mercator().center([107, 31]).scale(850).translate([width/2, height/2]);

  由于 GeoJSON 文件中的地图数据,都是经度和纬度的信息。它们都是三维的,而要在网页上显示的是二维的,所以要设定一个投影函数来转换经度纬度。如上所示,使用 d3.geo.mercator() 的投影方式。

  第 2 行:center() 设定地图的中心位置,[107,31] 指的是经度和纬度。
  第 3 行:scale() 设定放大的比例。
  第 4 行:translate() 设定平移。

2、地理路径生成器

  为了根据地图的地理数据生成 SVG 中 path 元素的路径值,需要用到 d3.geo.path(),我称它为地理路径生成器

var path = d3.geo.path().projection(projection);

  projection() 是设定生成器的投影函数,把上面定义的投影传入即可。以后,当使用此生成器计算路径时,会自己加入投影的影响。

3、向服务器请求文件并绘制地图

<html>  <head>  <meta charset="utf-8">  <title>中国地图</title>  </head>
<body>
<script src="http://d3js.org/d3.v3.min.js"></script>
<script>var width  = 1000;var height = 1000;var svg = d3.select("body").append("svg").attr("width", width).attr("height", height).append("g").attr("transform", "translate(0,0)");var projection = d3.geo.mercator().center([107, 31]).scale(850).translate([width/2, height/2]);var path = d3.geo.path().projection(projection);var color = d3.scale.category20();d3.json("china.geojson", function(error, root) {if (error) return console.error(error);console.log(root.features);svg.selectAll("path").data( root.features ).enter().append("path").attr("stroke","#000").attr("stroke-width",1).attr("fill", function(d,i){return color(i);}).attr("d", path ).on("mouseover",function(d,i){d3.select(this).attr("fill","yellow");}).on("mouseout",function(d,i){d3.select(this).attr("fill",color(i));});});
</script>
</body>
</html> 

  再次声明:d3.json() 不能直接读取本地文件,因此你需要搭建一个服务器,例如 Apache。但是在火狐浏览器是可以直接读取的。

  接下来,就是给 svg 中添加 path 元素。本例中,每一个 path 表示一个省。要注意 attr(“d”,path) 这一行代码,它相当于:

.attr("d",funtion(d){return path(d);
})

转载于:https://www.cnblogs.com/goloving/p/8618825.html

D3.js系列——布局:打包图和地图相关推荐

  1. D3.js系列——布局:饼状图和力导向图

    一.饼状图 在布局的应用中,最简单的就是饼状图. 1.数据 有如下数据,需要可视化: var dataset = [ 30 , 10 , 43 , 55 , 13 ]; 这样的值是不能直接绘图的.例如 ...

  2. d3.js实现力导向图圈选框选

    #d3.js实现力导向图圈选框选 今天给大家带来的是如何在2D可视化图形中加入通过鼠标拖动圈选功能,以力导向图为例. ##最终效果 demo跳转 ##代码解析 我们是要在节点的上方绘制一个矩形覆盖节点 ...

  3. d3.js实现股权穿透图(vue+d3.js)

    d3.js实现股权穿透图 业务需求 1.实现的效果图 2.安装依赖 3.全部代码(复制粘贴即可实现) 参考git地址 业务需求 前段时间写过一篇使用relation-graph插件实现的股权穿透图效果 ...

  4. 用D3.js画树状图

    做项目遇到一个需求,将具有层级关系的词语用树状图的形式展示它们之间的关系,像这样: 或者是这样: 上面的图片只是样例,跟我下面的代码里面用的数据不同 网上有很多这种数据可视化展示的js控件,我这里选择 ...

  5. D3.js实现力导向图(Dray和Zoom)

    今天遇到个问题就是把json(里面nodes和edges属性)文件通过D3.js展示出来,下午终于弄出来了,写篇博客记录一下. 先展示一下效果图: 放大后是这个效果: 什么是力导向图 D3.js官网: ...

  6. 饼状图的实现方法html,D3.js实现饼状图的方法详解

    前言 小编在之前已经跟大家分享过关于怎样用柱状图和折线图这两种基本图表.这两种图表都是有坐标轴的,现在来说一种没有坐标轴的图表--饼图. 饼状图实现 还是和之前一样,我们先把简单的画图框架搭起来,添加 ...

  7. 使用d3.js开发力导向图

    最近项目需要写一个d3的力导向图,之前没接触过d3.js 所以吧这次开发的经历写一下 文章目录 分配点与线 创建dom 线 点 绘制线 友情提示:不要让设计设计的华丽呼哨,点多了很卡,而且svg 有些 ...

  8. vuejs+d3.js开发的轨道图+饼图

    应公司要求开发了一个流程关联关系轨道图,在开发的过程中发现可以把统计功能也一块做了,所以就有了现在的轨道图+饼图分析的功能.废话不多少,先上效果图: 采用的vuejs+elementui+d3.js开 ...

  9. d3.js v5 饼状图(加载动画、悬浮动画、图注以及悬浮提示框)

    实现的效果大概是这样: 实现代码如下: <html><body></body><style>div{background: #F2F4FF;width: ...

最新文章

  1. 字节终面:CPU 是如何读写内存的?
  2. python使用生成器生成浮点数列表、使用生成器生成(正)负的浮点数列表
  3. Bete冲刺第五阶段
  4. java 中的printStackTrace()方法
  5. 在notebook中如何能完整的显示长文本内容
  6. websocket实现单聊
  7. PHP笔记 ---关于web应用的安全性问题
  8. AIgorand的相关学习参考链接
  9. ERROR streaming.StreamExecution: Query topic_lcc [id =xx, runId=xx] terminated with error
  10. java autorun_〔批处理〕右键添加命令,让Autorun.inf见鬼去吧
  11. Java学习笔记(3)——资源管理
  12. 服务器msdtc没有安全显示项,MSDTC 疑难解答
  13. win10多台计算机共享文件夹设置密码,win10系统给共享文件夹设置密码的操作方法...
  14. 计算机用户个人设置总是重启,联想电脑总是自动重启怎么回事
  15. ls只显示文件名/只显示文件夹名
  16. 《java websocket》之 实现
  17. Effective Java(第三版) 学习笔记 - 第六章 枚举和注解 Rule34~Rule41
  18. mysql印度时区_【工作记录】JDBC连接MySQL,跨时区调查CST转Asia/Shangha
  19. 国美、腾讯的困惑:廉颇老矣,尚能战否?
  20. sql盲注二分法注入脚本

热门文章

  1. 生成二维码接口,前端调用接口将二维码显示在页面上
  2. thinkphp中URL传参数的几种方式
  3. BitmapUtil【缩放bitmap以及将bitmap保存成图片到SD卡中】
  4. spark总结——转载
  5. 大数据量高并发的数据库优化(转)
  6. 使用Lingobit Localizer汉化.net程序(Translate .net program using Lingobit Localizer)
  7. Javascript创建Silverlight Plugin以及自定义nonSilverlight和lowSilverlight样式
  8. 中国高性能计算机TOP100出炉 曙光联想并列第一
  9. oracle 10g/11g 命令对照,日志文件夹对照
  10. 基于Zabbix IPMI监控服务器硬件状况