D3에서 만든 햇살 차트가 있습니다. 각 '꽃잎'은 데이터의 하위 집합을 나타냅니다. 사용자가 '꽃잎'을 중 하나를 클릭하면, 나는 (이미지 참조) 그 일부를 보여에만 밖으로 패닝, 그것은 전환하려는 :D3 - 햇살 차트의 전환 호
나는 문제가 제대로에 코드를 얻는 데 전이.
클릭하면 모든 '꽃잎'이 사라지고 나머지 패스는 원을 따라 움직여야합니다 (attrTween, arcTween 및 보간? 사용). 변경되는 기본 값은 angleSize (var angleSize = (2 * Math.PI)/theData.length;
)입니다.
나는 많은 성공없이 기준으로 this, this, this 및 this를 사용하여 시도했습니다. 애니메이션을 처리하는 가장 좋은 방법은 무엇입니까?
시간 내 주셔서 감사합니다.
->Plunker Here을 참조하십시오. < -
코드는 다음과 같습니다 :
var colors = {
'Rank1' : '#3FA548',
'Rank2' : '#00B09E',
'Rank3' : '#8971B3',
'Rank4' : '#DFC423',
'Rank5' : '#E74341'
};
var $container = $('.chart'),
m = 40,
width = $container.width() - m,
height = $container.height() - m,
r = Math.min(width, height)/2;
var study = null;
var arc = d3.svg.arc();
d3.csv('text.csv', ready);
function ready(err, data) {
if (err) console.warn('Error', err);
var svg = d3.select('.chart')
.append('svg')
.attr({
'width' : (r + m) * 2,
'height' : (r + m) * 2,
'class' : 'container'
})
.append('g')
.attr('transform', 'translate(' + (width/4) + ', ' + (height/2) + ')');
var slice = svg.selectAll('.slice');
function updateChart(study) {
if (study) {
var theData = data.filter(function(d) {
return d.study_name === study;
});
} else {
var theData = data;
}
slice = slice.data(theData);
slice.enter()
.append('g')
.attr('class', 'slice');
var angleSize = (2 * Math.PI)/theData.length;
var startRadArr = [],
endRadArr = [];
for (var i = 0; i < data.length; i++) {
var startRadius = (width/20),
endRadius = startRadius;
for (var x = 0; x < 4; x++) {
startRadArr.push(startRadius);
if (x == 0) {
endRadius += Number(data[i].group1_score) * (width/500);
} else if (x == 1) {
endRadius += Number(data[i].group2_score) * (width/500);
} else if (x == 2) {
endRadius += Number(data[i].group3_score) * (width/500);
} else {
endRadius += Number(data[i].group4_score) * (width/500);
}
endRadArr.push(endRadius);
startRadius = endRadius + 0.3;
}
}
var startRadGroup = [],
endRadGroup = [];
for (i = 0; i < startRadArr.length; i += 4) {
startRadGroup.push(startRadArr.slice(i, i + 4));
}
for (i = 0; i < endRadArr.length; i += 4) {
endRadGroup.push(endRadArr.slice(i, i + 4));
}
slice.selectAll('path')
.remove();
for (var x = 0; x < 4; x++) {
slice.append('path')
.attr({
'class' : function(d, i) {
if (x == 0) {
return d.group1_class;
} else if (x == 1) {
return d.group2_class;
} else if (x == 2) {
return d.group3_class;
} else {
return d.group4_class;
}
},
'company' : function(d, i) {
return d.brand_name;
},
'cat' : function(d, i) {
if (x == 0) {
return 'Group1';
} else if (x == 1) {
return 'Group2';
} else if (x == 2) {
return 'Group3';
} else {
return 'Group4';
}
},
'study' : function(d, i) {
return d.study_name;
},
'companyid' : function(d, i) {
return d.brand_id;
},
'startradius' : function(d, i) {
return startRadGroup[i][x];
},
'endradius' : function(d, i) {
return endRadGroup[i][x];
},
'startangle' : function(d, i) {
return angleSize * i;
},
'endangle' : function(d, i) {
return angleSize * (i + 1);
}
})
.on('click', selectStudy);
}
slice.exit()
.remove();
slice.selectAll('path')
.attr({
'd' : function(d) {
return arc({
innerRadius : +d3.select(this)[0][0].attributes.startradius.nodeValue,
outerRadius : +d3.select(this)[0][0].attributes.endradius.nodeValue,
startAngle : +d3.select(this)[0][0].attributes.startangle.nodeValue,
endAngle : +d3.select(this)[0][0].attributes.endangle.nodeValue
})
}
});
}
function selectStudy(d) {
study = $(this).attr('study');
updateChart(study);
}
updateChart();
}
EDIT 제대로 입력 작업, 업데이트 및 종료 패턴을 포함하는 (this 기준) 코드를 업데이트
. 그러나 전환에 대해 아직 확실하지 않습니다. 대부분의 예제는 d3.interpolate(this._current, a);
과 비슷한 것을 사용하도록 링크했습니다. 서로 다른 데이터간에 트위닝됩니다.
이 차트에서 this._current와 a는 동일하지만 angleSize (var angleSize = (2 * Math.PI)/theData.length;
), startAngle 및 endAngle만이 변경됩니다.
먼저 슬라이스를 전환하기 전에 모든 슬라이스를 제거하고 있지만 전환을 시작하려면 슬라이스를 시작 지점과 함께 다시 만들어야합니다. 또한 데이터를 더 깊은 구조로 다시 포맷하여 각 지점에 대해 4 번 반복 할 필요가 없는지 고려하십시오. – Owen
@ 오웬 예. remove()는 이상한 동작을위한 임시 픽스였습니다 (새 데이터는 이전 데이터에 추가됩니다). 제거 -> [링크] (https://plnkr.co/edit/JwCy84YBVSxDERZOp1z0?p=preview)를 주석 처리했습니다. 데이터에 관해서는 불행히도 형식에 대한 어떠한 통제도하지 않습니다. JS 솔루션을 찾을 것인가? Excel에서 수동으로 변경하지 않는 것이 좋습니다. – BastionGamma
또한 v4 대신 d3 v3을 사용하는 이유는 무엇입니까? – Owen