I’m doing a zoom in a chart. But i have a problem. My rectangles need a zoom event to display at the correct position, if they do not have this event, they are displayed at wrong coordinates.
I have done a jsfiddle https://jsfiddle.net/Natko/mr1250un/90/
The problem is in this part of the code (i think)
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')
}
All the attributes are working except the x and y coordinates. But when i’m updating the coordinates with my zoom event, they are displayed in the right place.
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 )
},
And here is the this.x
and 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");
Anyone have an idea to fix my problem ?
Advertisement
Answer
Your code has multiple errors and here are the main points:
You add a
<g>
element and set itstransform
(I saw it in the fiddle, not in the question’s code sample) according tox
andy
, it’s OK.You add a
<rect>
under each<g>
and assign the sameid
to all. It will not work,id
should be unique. You don’t need the attribute at all, omit it.You cannot use
x
andy
attributes for a<g>
element. You should use transform:g.attr('transform', 'translate(x, y)')
In ‘change’, you try to set the
<rect>
coordinates within its<g>
instead of assign newtransform
to the<g>
element itself. Keep the<rect>
as is.You can calculate
transform
with a simple formula:transformedX = originalX * e.transform.k + e.transform.x
, wheree
is a D3 zoom event.