成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

D3.js繪制實(shí)時(shí)映射的縮略圖

miqt / 2089人閱讀

摘要:在做可視化的很多時(shí)候,我們需要在主圖的一角設(shè)置一個(gè)縮略圖來(lái)掌握全局情況。,縮略圖的繪制完成,很簡(jiǎn)單的例子,按照這個(gè)思路可以完成大部分可視化的縮略圖繪制。

在做可視化的很多時(shí)候,我們需要在主圖的一角設(shè)置一個(gè)縮略圖來(lái)掌握全局情況。本次將使用力導(dǎo)向圖作為例子,完成縮略圖的實(shí)現(xiàn)。

繪制的原理就是依靠主圖的數(shù)據(jù)再畫一個(gè)圖出來(lái),無(wú)需再次計(jì)算,只改變圖形形態(tài)。

最終效果

主圖節(jié)點(diǎn)拖動(dòng),縮略圖跟著變化。
http://en.jsrun.net/UyiKp/show

代碼解析 數(shù)據(jù)

依然使用之前例子的力導(dǎo)向圖繪制數(shù)據(jù)及方法

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},
]
力導(dǎo)向圖繪制
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); //這個(gè)例子為節(jié)點(diǎn)添加了可拖動(dòng)的功能


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最后,執(zhí)行繪制縮略圖
});

這次代碼中添加了drag方法,為了使節(jié)點(diǎn)可拖動(dòng)。

繪制縮略圖
function drawThumb(){

//每次繪制前刪除之前的圖形(這是一種簡(jiǎn)單有效的動(dòng)畫理論,但是比較消耗資源,之后會(huì)介紹如何節(jié)省資源完成需求)
  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,只需要把節(jié)點(diǎn)的坐標(biāo)直接賦予即可
    .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
                });
}

在繪制縮略圖時(shí),我在最前面有一個(gè)remove方法,就是用新的圖形代替舊的圖形,完成縮略圖的動(dòng)畫效果,模擬了tick。
但在實(shí)際使用中,數(shù)據(jù)量很大時(shí),如此刪了畫畫了刪,非常耗資源。
所以更好的方法是判斷是否有thumbSvg,有的話就只改變node和link的x,y,沒有的話就按上面代碼一樣繪制。

ok,縮略圖的繪制完成,很簡(jiǎn)單的例子,按照這個(gè)思路可以完成大部分可視化的縮略圖繪制。除了拖動(dòng)外,還可以添加縮放和平移功能,但注意縮放時(shí)所有尺寸的比例都會(huì)跟著變化,會(huì)復(fù)雜很多。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/88717.html

相關(guān)文章

  • 聲明式與響應(yīng)式——前端新一代數(shù)據(jù)可視化方案

    摘要:數(shù)據(jù)可視化圖表圖表作為數(shù)據(jù)可視化最常見的表現(xiàn)形式之一,往往被以偏概全的認(rèn)為圖表就是數(shù)據(jù)可視化。嚴(yán)格來(lái)說(shuō),數(shù)據(jù)可視化應(yīng)該是連接數(shù)據(jù)與視覺的一個(gè)映射關(guān)系,將數(shù)據(jù)映射成人更容易感知其規(guī)律的可視化結(jié)果。 題目中的新一代是個(gè)相對(duì)的概念,事實(shí)上本文即將介紹的方法已經(jīng)有了生產(chǎn)環(huán)境可用的實(shí)現(xiàn)方案(這也側(cè)面佐證了其可行性),但考慮到此方法與現(xiàn)在大部分前端項(xiàng)目中所使用的數(shù)據(jù)可視化方案相比仍有一些優(yōu)勢(shì),因此...

    xuhong 評(píng)論0 收藏0
  • 片上傳縮略預(yù)覽

    摘要:目標(biāo)畫布的左上角在目標(biāo)上軸的位置。允許對(duì)繪制的圖像進(jìn)行縮放。如果不說(shuō)明,在繪制時(shí)圖片高度不會(huì)縮放。如果不說(shuō)明,整個(gè)矩形從坐標(biāo)的和開始,到圖像的右下角結(jié)束。需要繪制到目標(biāo)上下文中的,源圖像的矩形選擇框的高度。 在上傳圖片進(jìn)行預(yù)覽時(shí),直接抓取原圖時(shí)由于原圖過大會(huì)影響性能,即對(duì)所上傳圖片進(jìn)行壓縮小圖展示; 思路: 利用 canvas 對(duì)原圖進(jìn)行壓縮重繪,抓取區(qū)域以中心為基點(diǎn)最大范圍繪制縮略圖...

    Pocher 評(píng)論0 收藏0
  • D3.js數(shù)據(jù)可視化

    摘要:和之前用的有啥不同和都是用來(lái)生成各類圖表的,區(qū)別的話可以從使用方法和實(shí)現(xiàn)方式上是通過來(lái)繪制圖形具體使用方法是通過方法初始化一個(gè)實(shí)例并通過方法生成一個(gè)簡(jiǎn)單的柱狀圖很輕松搞定。通過來(lái)繪制圖形使用時(shí)需要先創(chuàng)建畫布元素然后進(jìn)行各種繪制圖形。 你的淘寶年度消費(fèi)報(bào)告那炫酷的圖表一下子讓人忘了自己花了多少錢,各大門戶網(wǎng)站、媒體都開始大量使用圖表,于是乎又有一批工具等待我們學(xué)習(xí)的路上 什么是D3.js...

    songze 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<