javascript - 如果没有 d3 中的缩放事件,我的矩形没有很好的坐标
问题描述
我正在放大图表。但我有一个问题。我的矩形需要一个缩放事件才能显示在正确的位置,如果它们没有这个事件,它们就会显示在错误的坐标处。
我做了一个 jsfiddle https://jsfiddle.net/Natko/mr1250un/90/
问题出在这部分代码中(我认为)
this.chart.selectAll()
.data(this.viewpoint)
.join("g")
.attr("x", d => this.x(d.x))
.attr("y", d => this.y(d.y))
.append("rect")
.attr("id", 'rectangle')
.attr("width", 10)
.attr("height", 10)
.attr('fill', 'orange')
}
除 x 和 y 坐标外,所有属性都有效。但是当我使用缩放事件更新坐标时,它们会显示在正确的位置。
change(d) {
var newX = d.transform.rescaleX(this.x);
var newY = d.transform.rescaleY(this.y);
this.xAxis.call(d3.axisBottom(newX))
this.yAxis.call(d3.axisLeft(newY))
this.chart.selectAll("#rectangle")
.attr("x", d => newX(d.x) - 2)
.attr("y", d => newY(d.y) - 5 )
},
这是this.x
和this.y
this.x = d3.scaleLinear()
.range([0, width - margin.left - margin.right]);
this.y = d3.scaleLinear()
.range([height - margin.top - margin.bottom, 0]);
this.xAxis = this.chart.append("g")
.attr(
"transform",
`translate(0, ${height - margin.top - margin.bottom})`
);
this.yAxis = this.chart.append("g");
有人有解决我问题的想法吗?
解决方案
您的代码有多个错误,以下是要点:
您添加一个
<g>
元素并根据 and 设置它transform
(我在小提琴中看到它,而不是在问题的代码示例中)x
,y
没关系。您
<rect>
在每个下添加一个<g>
并将相同的分配id
给所有。它不会起作用,id
应该是独一无二的。您根本不需要该属性,请忽略它。您不能对元素使用
x
和y
属性。<g>
你应该使用变换:g.attr('transform', 'translate(x, y)')
在“更改”中,您尝试在
<rect>
其中设置坐标,而不是为元素本身<g>
分配新的坐标。保持原样。transform
<g>
<rect>
您可以
transform
使用一个简单的公式计算:transformedX = originalX * e.transform.k + e.transform.x
,其中e
是 D3 缩放事件。
推荐阅读
- linux - How to split a variable with text content on an empty line
- javascript - IF/ELSE 破坏 javascript 和 JSON 交互的逻辑
- react-native - 在反应原生道具中传递函数
- r - 如何在会话启动时获取密码
- string - Powershell 用通配符替换
- javascript - 功能如何表现异常?
- apache-spark - 快速压缩
- postgresql - 如何在 postgres 中使用 DO
- json - 可以 Loggly 解析(派生值)JSON 数组(使用 HTTP/S 批量端点接收)
- javascript - 使用向下箭头选择下一个列表项