# chpater-3 可视化数据

eg1:

![](https://2325800184-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LAbbjuBBZkc46mRixxv%2F-LAcDiat-NtKd2m5qvWi%2F-LAcDmgudTWW8RZd42D2%2Fimage.png?alt=media\&token=975c3c83-7ae6-4a43-a54c-2dd7317afe08)

```javascript
 var data = [10,40,60];

    var canvas = d3.select('body')
        .append('svg')
        .attr('width',500)
        .attr('height',500);

    canvas.selectAll('rect')
        .data(data)
        .enter()
        .append('rect')
        .attr('width',function(item){return item*10})
        .attr('height',50)
        .attr('y',function(item,i){
            return i*60
        })
        .attr('fill','skyblue')
```

eg2:

![](https://2325800184-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LAbbjuBBZkc46mRixxv%2F-LAcEavEFlVRBLdkfZf5%2F-LAcEdNb8iPfhY7QZXQc%2Fimage.png?alt=media\&token=3a662458-6001-4861-a6d8-0890ec1bedb9)

```javascript
var data = [10,40,60];

    var canvas = d3.select('body')
        .append('svg')
        .attr('width',500)
        .attr('height',500);

    canvas.selectAll('rect')
        .data(data)
        .enter()
        .append('rect')
        .attr('width',40)
        .attr('height',function(item){
            return item*10
        })
        .attr('x',function(item,i){
            return i*60
        })
        .attr('y',function(item){
             return 500-item*10
        })
        .attr('fill','skyblue')
```

## methods:

### 1.selectAll()

选择所有的节点, 没有的话返回一个空的数组节点群( empty array or empty selection), 可将这些空的数组绑定数据, 用 data()方法

### 2.data()&#x20;

绑定数据到空节点 (empty selection)

这里，data()是用来绑定数据到选择的DOM元素上.这样以后，就可以针对这些数据做一些相关操作，比如设置元素宽度等。

从表面上，并不能看出什么变化。但在内部，它是在对应的DOM元素上添加了一个\_\_data\_\_属性，可以通过document.getElementsByTagName("p")\[0].\_\_data\_\_看到。

### 3.enter()

{% hint style="info" %}
简言之,占位符，虚拟dom
{% endhint %}

当DOM数量少于data的数量，或者压根一个都没有的时候，我们一般会希望让程序帮忙创建。下面的例子，我们没有事先提供DOM元素：

```
<body></body>
```

仍旧执行：

```
 d3.select("body").selectAll("p").data([1, 2, 3])
```

enter()是用来在绑定数据之后，选择缺少的那部分DOM元素。我们可能会疑惑，既然是缺少的部分，怎么选择呢？这里就需要我们发挥一点想象力，想象我们选择了一些不存在的东西。我们可以称之为“虚拟DOM”或“占位符(placeholder)”。

enter()只是进行选择，并未实际添加所需DOM元素。因此在enter()之后一般都会配合append()来进行DOM元素的实际创建。

由此以来，我们使用 d3.select("body").selectAll("p").data(\[1, 2, 3]).enter().append("p") 即可根据数据自动创建所需的DOM元素。

### 4.exit()

与enter()相反，exit()是用来选择那些与数据相比多出来的DOM元素。

在下面例子中，我们多提供了一个DOM元素：

```
<body>
    <p></p>
    <p></p>
    <p></p>
    <p></p>
</body>
```

这回就容易理解了，因为是多出来的，那么就是实际存在的，即最后一个\<p>。

多出来的话，我们可以接着用.remove()移除这些元素，代码如下：

```
d3.select("body").selectAll("p").data([1, 2, 3]).exit().remove();
```
