开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的27天,点击查看活动详情
使用预定义的比例放置元素
介绍
当比例尺建立好后,是时候重新映射散点图了。 比例尺就像操作函数一样,将 x
和 y
的原数据值变为适合并可在 SVG 画布上正确渲染的值。 它们使数据在屏幕的布局区域内部。
用比例尺函数为 SVG 图形设置坐标属性值。 这包括 rect
或者 text
元素的 x
和 y
属性,或者 circles
的 cx
和 cy
。 以下是一个例子:
shape
.attr("x", (d) => xScale(d[0]))
比例尺设置图形坐标属性来将数据点放置在 SVG 画布上。 当你显示实际数据值时,不用使用比例尺,例如,在提示框或标签中的 text()
方法。
实操
使用 xScale
和 yScale
将 circle
和 text
图形放置在 SVG 画布上。 对于 circles
,使用比例尺设置 cx
和 cy
属性, 半径为 5
个单位。
对于 text
元素,使用比例尺设置 x
和 y
属性。 标签应该标注在点的右边, 为此,在将 x
数据值传递给 xScale
之前,要给它加上 10
个单位。
- 应该有 10 个
circle
元素。 - 在使用比例尺后,第一个
circle
元素的cx
值应该大约为91
,cy
值应该大约为368
。 它的r
值应为5
。 - 在使用比例尺后,第二个
circle
元素的cx
值应该大约为159
,cy
值应该大约为181
。 它的r
值应为5
。 - 在使用比例尺后,第三个
circle
元素的cx
值应该大约为340
,cy
值应该大约为329
。 它的r
值应为5
。 - 在使用比例尺后,第四个
circle
元素的cx
值应该大约为131
,cy
值应该大约为60
。 它的r
值应为5
。 - 在使用比例尺后,第五个
circle
元素的cx
值应该大约为440
,cy
值应该大约为237
。 它的r
值应为5
。 - 在使用比例尺后,第六个
circle
元素的cx
值应该大约为271
,cy
值应该大约为306
。 它的r
值应为5
。 - 在使用比例尺后,第七个
circle
元素的cx
值应该大约为361
,cy
值应该大约为351
。 它的r
值应为5
。 - 在使用比例尺后,第八个
circle
元素的cx
值应该大约为261
,cy
值应该大约为132
。 它的r
值应为5
。 - 在使用比例尺后,第九个
circle
元素的cx
值应该大约为131
,cy
值应该大约为144
。 它的r
值应为5
。 - 在使用比例尺后,第十个
circle
元素的cx
值应该大约为79
,cy
值应该大约为326
。 它的r
值应为5
。 - 应该有 10 个
text
元素。 - 在使用比例尺后,第一个标签的
x
值应该大约为100
,y
值应该大约为368
。 - 在使用比例尺后,第二个标签的
x
值应该大约为168
,y
值应该大约为181
。 - 在使用比例尺后,第三个标签的
x
值应该大约为350
,y
值应该大约为329
。 - 在使用比例尺后,第四个标签的
x
值应该大约为141
,y
值应该大约为60
。 - 在使用比例尺后,第五个标签的
x
值应该大约为449
,y
值应该大约为237
。 - 在使用比例尺后,第六个标签的
x
值应该大约为280
,y
值应该大约为306
。 - 在使用比例尺后,第七个标签的
x
值应该大约为370
,y
值应该大约为351
。 - 在使用比例尺后,第八个标签的
x
值应该大约为270
,y
值应该大约为132
。 - 在使用比例尺后,第九个标签的
x
值应该大约为140
,y
值应该大约为144
。 - 在使用比例尺后,第十个标签的
x
值应该大约为88
,y
值应该大约为326
。
<body>
<script>
const dataset = [ [ 34, 78 ],
[ 109, 280 ],
[ 310, 120 ],
[ 79, 411 ],
[ 420, 220 ],
[ 233, 145 ],
[ 333, 96 ],
[ 222, 333 ],
[ 78, 320 ],
[ 21, 123 ]
];
const w = 500;
const h = 500;
const padding = 60;
const xScale = d3.scaleLinear()
.domain([0, d3.max(dataset, (d) => d[0])])
.range([padding, w - padding]);
const yScale = d3.scaleLinear()
.domain([0, d3.max(dataset, (d) => d[1])])
.range([h - padding, padding]);
const svg = d3.select("body")
.append("svg")
.attr("width", w)
.attr("height", h);
svg.selectAll("circle")
.data(dataset)
.enter()
.append("circle")
.attr("cx",d=>xScale(d[0]))
.attr("cy",d=>yScale(d[1]))
.attr("r",5)
svg.selectAll("text")
.data(dataset)
.enter()
.append("text")
.text((d) => (d[0] + ", "
+ d[1]))
.attr("x",d=>xScale(d[0]+10))
.attr("y",d=>yScale(d[1]))
</script>
</body>