Когда вы переходите / преобразуете элемент <g>
, который является родительским для path
s, на которые вы щелкаете, вы можете просто использовать this.parentNode
для его преобразования.
Например, вобработчик click
, измените следующее:
svg.transition().attr('....
на
d3.select(this.parentNode).transition().attr('...
Хотя я бы посоветовал вам назначить идентификатор для каждой из диаграмм, чтобы выделить их в случаелогику диаграммы многократного использования и используйте этот вновь созданный идентификатор для всех других функций вместо зависимости от глобальных переменных.Например:
var piechart1 = piechart(1).data(data); // pass an ID here
и назначьте его следующим образом:
svg.append('g').attr('id', 'container_' + id) // assign the ID
Вот фрагмент кода с последующей вилкой скрипки:
function piechart(id){
var width = 300;
var height = 300;
var colors = ['red','green','blue']
var innerRadius = 40;
var outerRadius = 60;
var index = 0;
var pie = d3.pie()
.sort(null);
var arc = d3.arc().innerRadius(innerRadius).outerRadius(outerRadius).cornerRadius(5).padAngle(0.05);
function chart(selection){
selection.each(function() {
svg = d3.select(this)
.append('svg')
.attr('width',width)
.attr('height',height)
.append('g').attr('id', 'container_' + id)
.attr('transform','translate('+width/2+','+height/2+')')
path = svg.selectAll("path")
.data(pie(data))
.enter()
.append('path')
.attr('d',function(d){return arc(d)})
.style('fill',function(d,i){return colors[i]})
.style('stroke','black')
.each(function(d) { this._current = d; });
path.on("click",chart.click);
})
}
chart.data = function(value){
if(!arguments.length) return data;
data = value;
if(typeof updateData === 'function') updateData();
return chart;
}
chart.click = function(value){
index = this.__data__.index
var rotate = 0-(value.startAngle + value.endAngle)/2 / Math.PI * 180;
// Transition the pie chart
d3.select(this.parentNode).transition()
.attr("transform", "translate("+width/2+","+height/2+") rotate(" + rotate + ")")
.duration(1000);
}
return chart
}
data = [1,5,8];
var piechart1 = piechart(1).data(data);
d3.select('#chart1').call(piechart1);
var piechart2 = piechart(2).data(data);
d3.select('#chart2').call(piechart2);
<html>
<head>
<script src="https://d3js.org/d3.v4.min.js"></script>
<script src="https://d3js.org/d3-path.v1.min.js"></script>
<script src="https://d3js.org/d3-shape.v1.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<style>
body{
height: 100%;
width: 100%;
/*background-image: url("Computer.png");*/
}
p{
float:left;
}
</style>
</head>
<!-- <img src=Computer.png width="70%" height="100%"> -->
<p id="chart1"></p>
<p id="chart2"></p>
<body >
</body>
</html>
https://jsfiddle.net/rL96uv4g/
Надеюсь, это поможет.