用D3画简单的力导图

   由于10月国庆后,换了新工作,需要做一些可视化的图表,所以在这里整理一下,其中的一部分,今天就先整理力导图。

如上图所以,要完成这么一个力导图,需要的步骤如下:

var forceTree3 = function(setting) {

    var relations = setting.relations,
        links = setting.links,
        selector = setting.selector
    var nodes = {}

    // 上传到服务器需要修改
    var pathUrl = ‘/‘

    d3.select(selector).selectAll(‘svg‘).remove()

    links.forEach(function(link) {

        link.source = nodes[link.source] || (nodes[link.source] = {
            name: link.source
        })

        link.target = nodes[link.target] || (nodes[link.target] = {
            name: link.target
        })

        link.aa = ‘11‘
    });

    var width = 960,
        height = 960;

    var force = d3.layout.force()
        .nodes(d3.values(nodes))
        .links(links)
        .size([width, height])
        .linkDistance(160)
        .charge(-600)
        .on("tick", tick)
        .start();

    var svg = d3.select(selector).append("svg")
        .attr("width", width)
        .attr("height", height);

    var link = svg.selectAll(".link")
        .data(force.links())
        .enter().append("line")
        .attr("class", "link");

    var color = [‘#1a1925‘, ‘#042c3b‘, ‘#1f242b‘]
    var lineColor = [‘#ff7e00‘, ‘#e8b93e‘]

    link.style("stroke", function(d) {

            var source = d.target.name,
                isShow,
                lineObj = d3.select(this)[0][0]

            for (var i = 0; i < relations.length; i++) {

                if (relations[i].obj == source) {

                    isShow = relations[i].show
                }
            }

            if (isShow) {

                return lineColor[d.level]
            } else {
                return ‘#1c346b‘
            }

        })
        .style("stroke-width", 2)

    var node = svg.selectAll(".node")
        .data(force.nodes())
        .enter().append("g")
        .attr("class", "node")
        /*        .on("mouseover", mouseover)
                .on("mouseout", mouseout)*/
        .call(force.drag);

    node.append("circle")
        .attr(‘r‘, function(d, i) {

            var dname = d.name,
                isShow,
                index,
                cirlceObj = d3.select(this)[0][0]

            for (var i = 0; i < relations.length; i++) {

                if (relations[i].obj == dname) {
                    index = relations[i].index
                    isShow = relations[i].show
                }
            }

            if (index === 0) {

                return 28
            } else if (index === 1) {
                return 26
            } else if (index === 2) {
                return 15
            }
        })
        .style("fill", function(d) {

            var dname = d.name,
                isShow,
                cirlceObj = d3.select(this)[0][0]

            for (var i = 0; i < relations.length; i++) {

                if (relations[i].obj == dname) {

                    isShow = relations[i].show
                }
            }

            if (isShow) {

                return color[d.index]
            } else {

                return ‘#1c346b‘
            }
        })

    node.append("svg:image")
        .attr("class", "image")
        .attr("xlink:href", function(d, i) {

            var dname = d.name,
                index,
                isDrawImg,
                imageObj = d3.select(this)[0][0]

            for (var i = 0; i < relations.length; i++) {

                if (relations[i].obj == dname) {

                    index = relations[i].index
                    isDrawImg = relations[i].show
                }
            }

            $(imageObj).data(‘showBig‘, true)

            if (isDrawImg) {

                if (index == 0) {

                    return "images/mProject.png"
                } else if (index == 1) {

                    return "images/mCompany.png"
                } else if (index == 2) {

                    return "images/mPerson.png"
                }

            } else {

                return ‘‘
            }
        })
        .on(‘click‘, function(d, i) {

            var obj = d3.select(this)

            var dname = d.name,
                index,
                isCanClick,
                imageObj = d3.select(this)[0][0],
                showBig = $(imageObj).data(‘showBig‘)

            for (var i = 0; i < relations.length; i++) {

                if (relations[i].obj == dname) {

                    index = relations[i].index
                    isCanClick = relations[i].show
                }
            }

            if (isCanClick) {

                if (showBig) {

                    if (index == 0) {

                        d3.select(this)
                            .attr(‘xlink:href‘, "images/project.png")
                    } else if (index == 1) {

                        d3.select(this)
                            .attr(‘xlink:href‘, "images/company.png")
                    } else if (index == 2) {

                        d3.select(this)
                            .attr(‘xlink:href‘, "images/person.png")
                    }
                    d3.select(this)
                        .attr(‘width‘, ‘124px‘)
                        .attr(‘height‘, ‘124px‘)
                        .attr("x", "-62px")
                        .attr("y", "-62px")

                    var circle = $(this).parent().find(‘circle‘)[0]

                    $(imageObj).data(‘showBig‘, false)

                    d3.select(circle).attr(‘r‘, 62)

                } else {

                    if (index === 0) {

                        d3.select(this)
                            .attr("x", "-32px")
                            .attr("y", "-32px")
                            .attr("width", "64px")
                            .attr("height", "64px")
                            .attr(‘xlink:href‘, "images/mProject.png")
                    } else if (index === 1) {

                        d3.select(this)
                            .attr("x", "-31px")
                            .attr("y", "-31px")
                            .attr("width", "62px")
                            .attr("height", "62px")
                            .attr(‘xlink:href‘, "images/mCompany.png")
                    } else if (index === 2) {

                        d3.select(this)
                            .attr("x", "-15px")
                            .attr("y", "-15px")
                            .attr("width", "30px")
                            .attr("height", "30px")
                            .attr(‘xlink:href‘, "images/mPerson.png")
                    }

                    var circle = $(this).parent().find(‘circle‘)[0]

                    $(imageObj).data(‘showBig‘, true)

                    d3.select(circle).attr(‘r‘, function() {

                        if (index === 0) {

                            return 28
                        } else if (index === 1) {
                            return 26
                        } else {
                            return 15
                        }
                    })

                }
            } else {

                var confirm = window.confirm("确认开通VIP通道")

                if (confirm && showBig) {

                    if (index === 0) {

                        d3.select(this)
                            .attr("x", "-32px")
                            .attr("y", "-32px")
                            .attr("width", "64px")
                            .attr("height", "64px")
                            .attr(‘xlink:href‘, "images/mProject.png")
                    } else if (index === 1) {

                        d3.select(this)
                            .attr("x", "-31px")
                            .attr("y", "-31px")
                            .attr("width", "62px")
                            .attr("height", "62px")
                            .attr(‘xlink:href‘, "images/mCompany.png")
                    } else if (index === 2) {

                        d3.select(this)
                            .attr("x", "-15px")
                            .attr("y", "-15px")
                            .attr("width", "30px")
                            .attr("height", "30px")
                            .attr(‘xlink:href‘, "images/mPerson.png")
                    }

                    var circle = $(this).parent().find(‘circle‘)[0]

                    $(imageObj).data(‘showBig‘, true)

                    d3.select(circle).attr(‘r‘, function() {

                        if (index === 0) {

                            return 28
                        } else if (index === 1) {
                            return 26
                        } else {
                            return 15
                        }
                    })

                } else {

                }
            }
        })
        .attr("x", function(d,i) {

            var dname = d.name,
                index,
                isCanClick,
                imageObj = d3.select(this)[0][0]

            for (var i = 0; i < relations.length; i++) {

                if (relations[i].obj == dname) {

                    index = relations[i].index
                }
            }

            if (index === 0 ){

                return ‘-32px‘
            } else if (index === 1) {

                return ‘-28px‘
            } else if (index === 2) {

                return  ‘-15px‘
            }
        })
        .attr("y",  function(d,i) {

            var dname = d.name,
                index,
                isCanClick,
                imageObj = d3.select(this)[0][0]

            for (var i = 0; i < relations.length; i++) {

                if (relations[i].obj == dname) {

                    index = relations[i].index
                }
            }

            if (index === 0 ){

                return ‘-32px‘
            } else if (index === 1) {

                return ‘-28px‘
            } else if (index === 2) {

                return  ‘-15px‘
            }
        })
        .attr("width",  function(d,i) {

            var dname = d.name,
                index,
                isCanClick,
                imageObj = d3.select(this)[0][0]

            for (var i = 0; i < relations.length; i++) {

                if (relations[i].obj == dname) {

                    index = relations[i].index
                }
            }

            if (index === 0 ){

                return ‘64px‘
            } else if (index === 1) {

                return ‘56px‘
            } else if (index === 2) {

                return  ‘30px‘
            }
        })
        .attr("height",  function(d,i) {

            var dname = d.name,
                index,
                isCanClick,
                imageObj = d3.select(this)[0][0]

            for (var i = 0; i < relations.length; i++) {

                if (relations[i].obj == dname) {

                    index = relations[i].index
                }
            }

            if (index === 0 ){

                return ‘64px‘
            } else if (index === 1) {

                return ‘56px‘
            } else if (index === 2) {

                return  ‘30px‘
            }
        })
        .style(‘cursor‘, ‘pointer‘)

    node.append("svg:title")
        .text(function(d) {
            return d.name;
        });

    function tick() { //打点更新坐标
        link
            .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;
            });

        node
            .attr("transform", function(d) {
                return "translate(" + d.x + "," + d.y + ")";
            });
    }

    function imageClick() {

        var obj = d3.select(this)

        var dname = d.name,
            index

        for (var i = 0; i < relations.length; i++) {

            if (relations[i].obj == dname) {

                index = relations[i].index
            }
        }

        $(this).data(‘mIndex‘, index)

        if (index == 0) {

            d3.select(this)
                .attr(‘width‘, ‘124px‘)
                .attr(‘height‘, ‘124px‘)
                .attr(‘xlink:href‘, "images/project.png")
        }
    }

    function mouseover() {
        d3.select(this).select("circle").transition()
            .duration(750)
            .attr("r", 60);
    }

    function mouseout() {
        d3.select(this).select("circle").transition()
            .duration(750)
            .attr("r", function(d, i) {

                if (d.index == 0) {

                    return 28
                } else if (d.index == 1) {
                    return 26
                } else {
                    return 15
                }
            })
    }
}
时间: 2024-10-14 02:28:31

用D3画简单的力导图的相关文章

D3官网上的力导图

D3 官网上的力导图整理 其代码: /* * @Author: Administrator * @Date: 2015-11-18 15:45:55 * @Last Modified by: Administrator * @Last Modified time: 2015-11-27 11:49:48 */ 'use strict'; var forceTree = function(setting) { d3.select(setting.selector).selectAll('svg')

思维导图怎么画?绘制思维导图选择什么工具好

思维导图在我们的日常中运用的十分广泛,很多人在绘制思维导图的时候都说很难绘制,不知道该从哪里开始绘制,看到别人绘制的都是那么好看,都羡慕别人是怎么画的?到底是用什么画图工具画的?别着急,今天,小编就来告诉你一个简单的方法,一起往下看吧! 思维导图工具的选择: 随着思维导图越来越多的被人们使用,也因此市面上出现了很多画图工具,一些新手在选择思维导图的时候很难进行选择,在这里,小编经常使用的是迅捷画图,这时一款在线网站,里面有很多的模板,可以直接在线绘制各种思维导图.流程图,操作简单,并且支持多种格

d3 画简单的柱形图

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>testD3-3-drawingDivBar</title> <script type="text/javascript" src="http://localhost:8080/spring/js/d3.js"></script> &

思维导图怎么画?

快节奏的生活中,思维导图是我们得力助手,它能够帮助我们在办公.学习中快速理清思路,提高做事或者学习的思路,其实思维导图应用绝对不仅仅在学习办公上,外出旅行.健身计划.减肥计划.装修流程等等都可以用到思维导图: 今天抽空给大家出一波绘制思维导图的教程,和大家聊聊思维导图怎么画? 绘制思维导图无非两种方法:①手绘:②电脑-迅捷画图http://www.liuchengtu.com/ 使用手绘 在纸的中央画上中心主题,可以加上相关的图像: 顺时针一点方向画第一条主干,写上关键词: 绕着顺时针画上支干并

Vue D3 力导向图

1. 安装 前端工程根目录下执行 yarn add d3 ,安装 d3 依赖包.安装的版本 "d3": "^5.7.0" 2. vue 文件中引入 d3 import * as d3 from 'd3' 例如一个基础的 d3.vue 文件内容,包含基本的 <template> <script> <style> <template> <div> <svg width="960" he

如何画一个精致的思维导图

画思维导图和画一个精致的思维导图还是有很大的区别的,不仅对软件要求比较高,还要将内容更加的丰富,所以就需要下功夫啦,下面交给大家画精致思维导图的操作方法,想要使用的朋友可以参考使用. 工具/原料: 迅捷画图官网,能上网的电脑并带有浏览器 操作方法介绍: 1.进入迅捷画图官网中,在上述列表中有三项操作,选择模板点击进去可以看到有很多制作精美的模板,并且不同的分类归纳的很清楚,需要套用模板的可以点击模板进行编辑使用. 2.这里要绘制的是思维导图,点击新建文件之后会有四个选项可以选择,点击思维导图即可

思维导图 七步学习法

什么是思维导图?思维导图是有效的思维模式,应用于记忆.学习.思考等的思维"地图",利于人脑的扩散思维的展开.思维导图拥有"one page control"一页掌控的能力,可以将成千上万的文字浓缩成一张思维导图.只要通过简单的思维导图教程的学习,你就可以天马行空啦. 运用思维导图,我们可以30秒掌握一个单词:阅读速度提高3-10倍: 运用思维导图,我们可以在职场中提高效率50%以上,极大提高执行力与准确性. 运用思维导图,我们参加外语考试.公务员.资格考试等的通过率

深入浅出Node js 读书笔记 思维导图

最近在研究node,发现是很不错的技术~ 考虑到平时看书转换率不高.遂尝试使用思维导图的方式来对一本书进行分析.感觉如果看完之后能够做个思维导图,对整本书的理解都会提高呢~ 下面第一部分介绍思维导图的做法,第二部分为我看深入浅出Nodejs的读书笔记. PART1 如何在阅读时做思维导图: 简单归纳起来,对一本书做思维导图的技巧主要分为两类:准备及应用.在以下各篇中,共有8个阶段.为方便查找起见,各阶段总结如下,都附有推荐的限制时间. 准备: 1.浏览——制作一个中央图象(10分钟) 2.设定时

5款网页版思维导图工具测评

如今软件工具越来越便利,程序员小哥哥们无所不能,我们需要什么他们就能写出什么,在此感谢先~思维导图工具现在只要你需要,什么平台的都有,手机啦.平板啦.电脑啦,还有网页在线版. 对于懒得下软件的人来说,在线版思维导图就是使用率最高的.所以本文就为这批"懒人"整理了国内比较热门的在线思维导图对比供其参考,让你们可以更好的选择最适合自己的工具. MindMaster平台较全的思维导图工具,但是我知道你既然选在线产品,那肯定就不会去下其他平台的软件了,但是顺便一提,他们的电脑版的头脑风暴还不错