[D3] 12. Basic Transitions with D3

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <script src="../bower_components/underscore/underscore-min.js"></script>
    <script src="../ventor/d3.min.js"></script>
    <style type="text/css">

        body {
            padding-top: 50px;
            padding-left: 100px;

        }

        #chartArea {
            width: 400px;
            height: 300px;
            background-color: #CCC;
        }

        .bar {
            display: inline-block;
            width: 20px;
            height: 75px; /* Gets overriden by D3-assigned height below */
            margin-right: 2px;
            /* fill: teal; *//* SVG doesn‘t have background prop, use fill instead*/
            z-index: 99;
        }

        .bubble, .center {
            display: inline-block;
            fill: purple;
            fill-opacity: 0.5;
            stroke: black;
            stroke-weight: 1px;;
            z-index: 15;
        }

        .center {
            z-index: 10;
        }

        .active {
            fill: magenta;
            fill-opacity: 0.5;
            stroke-width: 3px;
        }

        .axis path, .axis line {
            fill: none;
            stroke: #000;
            stroke-width: 1px;
            shape-rendering: crispEdges;
        }

    </style>
</head>
<body>
<button onclick="update()">Update</button>
<section id="chartArea"></section>
<script>

    function update(){
        console.log("update");
        _.each(dataset, function(d) {
            d.x = Math.round(Math.random() * 100);
            d.y = Math.round(Math.random() * 100);
            d.r = Math.round(5 + Math.random() * 10);
        });

        svg.selectAll(‘circle‘)
                .transition()
                .duration(600)
                .style(‘fill‘, "lightblue")
                .attr(‘cx‘, function(each_data, index) {
                    return xScale(each_data.x);
                })
                .attr(‘cy‘, function(each_data) {
                    return yScale(each_data.y);
                })
                .transition()
                .duration(600)
                .attr(‘r‘, function(each_data, i) {
                    return each_data.r;
                });
    }

    var dataset = _.map(_.range(30), function(num) {
                return {
                    x: Math.round(Math.random() * 100),
                    y: Math.round(Math.random() * 100),
                    r: Math.round(5 + Math.random() * 10)
                };
            }), //reandom generate 15 data from 1 to 50
            margin = {top: 20, right: 20, bottom: 40, left: 40},
            w = 400 - margin.left - margin.right,
            h = 300 - margin.top - margin.bottom;

    var svg = d3.select(‘#chartArea‘).append(‘svg‘)
            .attr(‘width‘, w + margin.left + margin.right)
            .attr(‘height‘, h + margin.top + margin.bottom)
            .append(‘g‘) //The last step is to add a G element which is a graphics container in SBG.
            .attr(‘transform‘, ‘translate(‘ + margin.left + ‘, ‘ + margin.top + ‘)‘); //Then offset that graphic element by our left and top margins.

    var yScale = d3.scale.linear()
            .domain([0, d3.max(dataset, function(d) {
                return d.y; //tell the max function just need to care about y prop
            })])
            .range([h, 0]);

    var yAxis = d3.svg.axis()
            .scale(yScale)
            .orient(‘left‘)
            .ticks(10)
            .innerTickSize(10)
            .outerTickSize(10)
            .tickPadding(10);
    svg.append(‘g‘)
            .attr(‘class‘, ‘y axis‘)
            .attr(‘transform‘, ‘translate(0,0)‘)
            .call(yAxis);

    var xScale = d3.scale.linear()
            .domain([0, 100])
            .range([0, w]);

    var xAxis = d3.svg.axis()
            .scale(xScale)
            .orient(‘bottom‘)
            .ticks(10)
            .innerTickSize(6)
            .outerTickSize(12)
            .tickPadding(12);

    svg.append(‘g‘)
            .attr(‘class‘, ‘x axis‘)
            .attr(‘transform‘, ‘translate(0, ‘ + h + ‘)‘)
            .call(xAxis);

    svg.selectAll(‘circle‘)
            .data(dataset)
            .enter()
            .append(‘circle‘)// svg doesn‘t have div, use rect instead
            .attr(‘class‘, "bubble")
            .attr(‘cx‘, function(each_data, index) {
                return xScale(each_data.x);
            })
            .attr(‘cy‘, function(each_data) {
                return yScale(each_data.y);
            })
            .attr(‘r‘, function(each_data, i) {
                return each_data.r;
            })
            .on(‘mouseover‘, function() {
                d3.select(this).classed(‘active‘, true)
            })
            .on(‘mouseleave‘, function() {
                d3.select(this).classed(‘active‘, false)
            })
            .on(‘mousedown‘, function(d) {
                var p_cx = d.x, p_cy = d.y, p_r = d.r;
                d3.select(this).transition().duration(500).attr(‘r‘, d.r * 1.5);
                svg.append(‘circle‘)
                        .attr(‘class‘, "center")
                        .attr(‘cx‘, function() {
                            return xScale(p_cx);
                        })
                        .attr(‘cy‘, function() {
                            return yScale(p_cy);
                        })
                        .attr(‘r‘, function() {
                            return p_r / 4;
                        })
                        .style(‘fill‘, ‘red‘);
            })
            .on(‘mouseup‘, function(d) {

                d3.select(this).transition().duration(250).delay(100).attr(‘r‘, d.r)
            });
</script>
</body>
</html>
时间: 2024-08-04 18:54:45

[D3] 12. Basic Transitions with D3的相关文章

[D3] Create Chart Axes with D3 v4

Most charts aren’t complete without axes to provide context and labeling for the graphical elements being displayed. This lesson introduces D3’s APIs for creating, customizing, and displaying axes while building on topics from previous lessons. var m

[D3] Reuse Transitions in D3 v4

D3 transitions start executing as soon as they’re created, and they’re destroyed once they end. This can present some challenges when attempting to create reusable transitions. This lesson demonstrates how to overcome those challenges using various a

[D3] Basic Interactivity with D3 v4

Data visualizations are a lot more interesting when they’re interactive. Whether it’s clicks, roll overs, or drags, it makes things more compelling, and D3 is up to the task. This lesson demonstrates how to implement basic interactions and shows how

[D3 + AngularJS] 15. Create a D3 Chart as an Angular Directive

Integrating D3 with Angular can be very simple. In this lesson, you will learn basic integration as well as how to create D3 charts that can be packaged as AngularJS directives. <!DOCTYPE html> <html ng-app="app"> <head lang="

[D3] Create DOM Elements with D3 v4

Change is good, but creating from scratch is even better. This lesson shows you how to create DOM elements from D3 and insert them into your document as needed. You’ll officially be on your way to creating data visualizations! d3.select('.title') .in

d3可视化实战00:d3的使用心得和学习资料汇总

最近以来,我使用d3进行我的可视化工具的开发已经3个月了,同时也兼用其他一些图表类库,自我感觉稍微有点心得.之前我也写过相关文章,我涉及的数据可视化的实现技术和工具,但是那篇文章对于项目开发而言太浅了.于是想写关于d3进行项目实战的系列文章,就像我之前的angularjs实战系列文章一样把整个开发过程中遇到的各种问题及解决办法梳理成章,以为留存.作为开篇,我还是想先把这段时间来我一直参考的资料做一个整理,并谈一些宏观的体会. 一.前方有坑,注意! ————————————————————————

D3数据绑定

这里转载一个非常经典的关于D3数据绑定的帖子,由D3作者自己写的,非常棒,以至于我忍不住全文copy到此. 原文地址 Thinking with Joins Say you’re making a basic scatterplot using D3, and you need to create some SVG circle elements to visualize your data. You may be surprised to discover that D3 has no pri

Learning D3.js d3的path讲解

转帖: http://jsbin.com/omajal/23/edit?html,output svg的path标签被称为”可以组成任何形状的形状” SVG Path可以绘制任何形状的图形,包括矩形,圆形,椭圆,折线,多边形,直线,曲线等.W3 标准对SVG 的Path定义如下SVG路径代表一个形状的轮廓,可以描边,填充,用作剪切路径,或任何三者的结合.W3提供了一个形象的比喻,用钢笔和纸来表示svg的path* 想象一个钢笔放在一张纸上.* 钢笔在某点与纸接触.* 笔尖移动到另一处.* 这两个

d3系列2--api攻坚战02

<html> <head> <style type="text/css"> .area{ fill:steelblue; } </style> <title></title> </head> <body> <script src="js/d3.v3.min.js" type="text/javascript" charset="utf-