D3js基础课06:数据绑定

在 D3 中,我们可以将数据绑定到 DOM 中的 HTML 元素。类似于将数据(在JavaScript中定义)关联到元素,这些元素稍后可以被引用来执行操作。

绑定

要制作图形,还必须使用 data 和 attr 方法。

  • data() 方法是D3的灵魂。通过它,一个数据数组被绑定到页面元素。
  • attr() 方法允许我们设置页面元素的属性。在本例中,我们设置了height、width、color和x/y location属性。
<script src="https://d3js.org/d3.v6.min.js"></script>
<div id="view010601"></div>
<script>
    data = [1, 2, 3, 4];
    d3.select("#view010601")         // select the view
        .selectAll("p")         // empty <p> selections to be used later
        .data(data)             // parses data, and runs below operations n times
            .enter()            // creates new data-bound element
        .append("p")            // append <p> tag for each datum
            .text("I'm no. 1"); // changes attribute's value
</script>

用户自定义函数

<script src="https://d3js.org/d3.v6.min.js"></script>
<div id="view010602"></div>
<script>
    data = [1, 2, 3, 4];
    d3.select("#view010602")
        .selectAll("p")
        .data(data)
            .enter()
        .append("p")
            .text(function(d) {return "I'm no " + d}) // custom function
</script>

奇偶判断?

<script src="https://d3js.org/d3.v6.min.js"></script>
<div id="view010603"></div>
<script>
    data = [1, 2, 3, 4];
    d3.select("#view010603")
        .selectAll("p")
        .data(data)
            .enter()
        .append("p")
            .text(function(d) {return "I'm no " + d})
            .style("color", function(d) {
                if (d%2 == 0) { return "red" }  // if even
            })
</script>

匿名函数

在我们的代码示例中,我们将 x,y,height 设置为匿名函数。这些可能有点混乱,所以让我们深入了解一下这意味着什么。

传递给函数的参数 d 表示我们的数据集。匿名函数有一个参数,用于刚绑定到 data 语句中页面元素的数据值。这是 D3 内置的。此变量(d)的名称是任意的,但通常使用d,因为它表示数据值。

绑定到页面元素的数据本身就是一个对象。在这个例子中,d 是我们的对象,可以在这个函数中进行局部操作。如果我们的数据对象有属性,您可以在此步骤中引用这些属性。例如,如果我们的数据集是一个JSON,有两个属性,number of rats(number)和city(city),我们可以像在任何其他JavaScript对象中一样引用它。i、 e.d.号码。我们稍后会更详细地看这个!

<script src="https://d3js.org/d3.v6.min.js"></script>
<div id="view010604"></div>
<script>
    // Width and height of the SVG object
    w = 150;
    h = 155;

    data = [ 40, 90, 30, 60 ];
    svg = d3.select('#view010604')
        .append( "svg" );

    svg.selectAll( "rect" )
        .data( data )
            .enter()
        .append( "rect" )
            .attr( "x", (d,i) => (i*25 + 30)) 
                // Set x coordinate of rectangle to index of data value (i)*25.
                // Add 30 to account for our left margin.
            .attr( "y", d => h-d )      // Set y coordinate for each bar to height minus the data value
            .attr( "width", 20 )
            .attr( "height", d => d)    // Set height of rectangle to data value
            .attr( "fill", "steelblue");
</script>

我们所做的是选择一堆不存在的矩形,所以我们得到一个空的选择。上面代码块中接下来的几行代码通过绑定数据、使用 enter() 并附加新元素来创建这些元素。

  • data() -我们使用 data()方法将数据绑定到空选择,它将返回数据集中的四个数据值。
  • enter() -加载数据时,它将遍历数据集,并将所有方法应用于数据集的每个值。enter()方法为找不到相应DOM元素的每个数据元素创建占位符。因为它是迭代的,所以它将创建四个占位符。
  • append() —最后,append(“rect”)方法将在每个没有“rect”元素的占位符中插入一个矩形,这是它们的全部。
  • attr() —迭代设置属性,例如每个矩形元素的(x,y)位置、宽度和高度。现在,它们都位于相同的位置(0,0),具有相同的宽度(20)和高度(100)。我们需要使用函数使其正常工作,并将在下一步对此进行详细说明。

Enter 和 Exit 函数是如何工作的

enter() 和 exit() 方法分别基于传入数据处理新元素和未使用的元素。花一分钟的时间完全掌握这些是值得的!

enter() 方法告诉 D3 当数据数组中的元素多于选择中的元素时该怎么做。因此,如果在一个输入数据集中有12行,但在调用 enter() 方法时只有8个 rect 元素,那么 D3 将转到 enter() 方法后面的部分来确定要做什么。通常,enter 函数将用于为给定的可视化创建 append() 新元素。exit() 方法告诉 D3 当数据数组中的元素多于选择中的元素时该怎么做。通常,这将用于清除不再需要的元素。你可以把它们想象成'go'和'stop'方法,其中 enter() 是前者,exit() 是后者。

Enter 和 Exit 函数是如何工作的

对于数据中的每个值,运算符都会以一对一的方式检查是否存在相应的 DOM 元素:

  • enter 状态是一个选择,它包含每个数据值的占位符,这些数据值在原始选择中没有对应的元素。
  • 更新状态是包含与绑定数据值匹配的现有元素的选择。
  • 退出状态是一个也包含现有元素的选择,但找不到与其匹配的数据值时该如何处理。

匹配项由.data的第二个参数确定,该参数指定一个键函数。如果没有指定键函数(如上面的代码单元),D3 将执行索引连接:第一个数据值连接到第一个 DOM 元素,第二个值连接到第二个元素,依此类推。

课后作业

修改前面的代码,修改条形图的颜色,还有将条形图改变方向。

改变颜色
改变方向
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容