资讯专栏INFORMATION COLUMN

D3.js绘制实时映射的缩略图

miqt / 2047人阅读

摘要:在做可视化的很多时候,我们需要在主图的一角设置一个缩略图来掌握全局情况。,缩略图的绘制完成,很简单的例子,按照这个思路可以完成大部分可视化的缩略图绘制。

在做可视化的很多时候,我们需要在主图的一角设置一个缩略图来掌握全局情况。本次将使用力导向图作为例子,完成缩略图的实现。

绘制的原理就是依靠主图的数据再画一个图出来,无需再次计算,只改变图形形态。

最终效果

主图节点拖动,缩略图跟着变化。
http://en.jsrun.net/UyiKp/show

代码解析 数据

依然使用之前例子的力导向图绘制数据及方法

var nodes = [
  {value:"66666666",type:"home",index:"0"},
  {value:"11111111111",type:"phone",index:"1"},
  {value:"22222222222",type:"phone",index:"2"},
  {value:"33333333333",type:"phone",index:"3"},
  {value:"44444444444",type:"phone",index:"4"},
  {value:"55555555555",type:"phone",index:"5"},
  {value:"aaa",type:"weixin",index:"6"},
  {value:"bbb",type:"weixin",index:"7"},
  {value:"ccc",type:"weixin",index:"8"},
  {value:"ffffd",type:"weixin",index:"9"},
  {value:"eee",type:"weixin",index:"10"},
  {value:"fff",type:"weixin",index:"11"},
];
var links = [
  {source:0,target:1},
  {source:0,target:2},
  {source:0,target:3},
  {source:0,target:4},
  {source:0,target:5},
  {source:2,target:6},
  {source:2,target:7},
  {source:2,target:8},
  {source:3,target:9},
  {source:3,target:10},
  {source:3,target:11},
]
力导向图绘制
var height = 500;
var width = 500;
var svg = d3.select("#forceMap").append("svg")
                        .attr("width",width)
            .attr("height",height)
            .attr("id","forceSvg");
var mapG = svg.append("g")
.attr("id","forceGroup");

var force = d3.layout.force()
                    .nodes(nodes)
                    .links(links)
                    .size([width,height])
                    .linkDistance(100)
                    .charge([-1250])
                    .gravity(0.5)
                    .friction(0.5);
force.start();
var linkG = mapG.selectAll(".link")
.data(links)
.enter()
.append("line")
.attr("class","link")
.attr("stroke","#ccc");
var nodeG = mapG.selectAll(".node")
.data(nodes)
.enter()
.append("circle")
.attr("class","node")
.attr("r",8)
.attr("fill",function(d){
  switch(d.type){
    case "home": return "red";break;
    case"phone": return "blue";break;
    case "weixin": return "green";break;
  }
})
 .call(force.drag); //这个例子为节点添加了可拖动的功能


force.on("tick", function () {
                      linkG.attr("x1", function (d) {
                        return d.source.x;
                    })
                    .attr("y1", function (d) {
                        return d.source.y;
                    })
                    .attr("x2", function (d) {
                        return d.target.x;
                    })
                    .attr("y2", function (d) {
                        return d.target.y;
                    });


                nodeG.attr("cx", function (d) {
                    return d.x
                })
                .attr("cy", function(d){
                  return d.y
                });
   drawThumb(); //在tick最后,执行绘制缩略图
});

这次代码中添加了drag方法,为了使节点可拖动。

绘制缩略图
function drawThumb(){

//每次绘制前删除之前的图形(这是一种简单有效的动画理论,但是比较消耗资源,之后会介绍如何节省资源完成需求)
  d3.select("#thumbSvg").remove();
  
  var thumbSvg = d3.select("#thumbMap").append("svg")
            .attr("width",100)
            .attr("height",100)
            .attr("id","thumbSvg");
    var thumbG = thumbSvg.append("g")
    .attr("id","thumbGroup");
    var thumbLink = thumbG.selectAll(".tlink")
    .data(links)
    .enter()
    .append("line")
    .attr("class","tlink")
    .attr("stroke","#ccc")
    //缩略图绘制和主图的差异在这,不需要tick,只需要把节点的坐标直接赋予即可
    .attr("x1", function (d) {
                        return d.source.x/5;//这里的除5是缩略图和主图的比例,thumbWidth/forceWidth
                    })
                    .attr("y1", function (d) {
                        return d.source.y/5;
                    })
                    .attr("x2", function (d) {
                        return d.target.x/5;
                    })
                    .attr("y2", function (d) {
                        return d.target.y/5;
                    });
var thumbNode = thumbG.selectAll(".tnode")
.data(nodes)
.enter()
.append("circle")
.attr("class","tnode")
.attr("r",1.2)//图形尺寸都要缩小
.attr("fill",function(d){
  switch(d.type){
    case "home": return "red";break;
    case"phone": return "blue";break;
    case "weixin": return "green";break;
  }
})
.attr("cx", function (d) {
                    return d.x/5
                })
                .attr("cy", function(d){
                  return d.y/5
                });
}

在绘制缩略图时,我在最前面有一个remove方法,就是用新的图形代替旧的图形,完成缩略图的动画效果,模拟了tick。
但在实际使用中,数据量很大时,如此删了画画了删,非常耗资源。
所以更好的方法是判断是否有thumbSvg,有的话就只改变node和link的x,y,没有的话就按上面代码一样绘制。

ok,缩略图的绘制完成,很简单的例子,按照这个思路可以完成大部分可视化的缩略图绘制。除了拖动外,还可以添加缩放和平移功能,但注意缩放时所有尺寸的比例都会跟着变化,会复杂很多。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/88717.html

相关文章

  • 声明式与响应式——前端新一代数据可视化方案

    摘要:数据可视化图表图表作为数据可视化最常见的表现形式之一,往往被以偏概全的认为图表就是数据可视化。严格来说,数据可视化应该是连接数据与视觉的一个映射关系,将数据映射成人更容易感知其规律的可视化结果。 题目中的新一代是个相对的概念,事实上本文即将介绍的方法已经有了生产环境可用的实现方案(这也侧面佐证了其可行性),但考虑到此方法与现在大部分前端项目中所使用的数据可视化方案相比仍有一些优势,因此...

    xuhong 评论0 收藏0
  • 片上传缩略预览

    摘要:目标画布的左上角在目标上轴的位置。允许对绘制的图像进行缩放。如果不说明,在绘制时图片高度不会缩放。如果不说明,整个矩形从坐标的和开始,到图像的右下角结束。需要绘制到目标上下文中的,源图像的矩形选择框的高度。 在上传图片进行预览时,直接抓取原图时由于原图过大会影响性能,即对所上传图片进行压缩小图展示; 思路: 利用 canvas 对原图进行压缩重绘,抓取区域以中心为基点最大范围绘制缩略图...

    Pocher 评论0 收藏0
  • D3.js数据可视化

    摘要:和之前用的有啥不同和都是用来生成各类图表的,区别的话可以从使用方法和实现方式上是通过来绘制图形具体使用方法是通过方法初始化一个实例并通过方法生成一个简单的柱状图很轻松搞定。通过来绘制图形使用时需要先创建画布元素然后进行各种绘制图形。 你的淘宝年度消费报告那炫酷的图表一下子让人忘了自己花了多少钱,各大门户网站、媒体都开始大量使用图表,于是乎又有一批工具等待我们学习的路上 什么是D3.js...

    songze 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<