0
나는 다음과 같은 데이터 세트가 있습니다정렬 수평 막대 차트 D3js
FrequencyData = [
{label:"QWERTY", value:0},
{label:"AZERTY", value:14},
{label:"AAAAAA", value:20},
{label:"BBBBBB", value:30},
{label:"CCCCCC", value:40},
{label:"DDDDDDD", value:45},
{label:"EEEEEE", value:21},
];
그리고이 데이터 집합을 기준으로 수평 막대 그래프 그리는 코드 :
는function createBarChart(dataset) {
$elem[0].svg = null;
var margin = {top: 20, right: 10, bottom: 120, left: 10},
width = $elem[0].parentNode.clientWidth - margin.left - margin.right,
height = $elem[0].parentNode.clientHeight - margin.top - margin.bottom;
var mappedDataset = dataset.map(function(d) { return d.value; });
var div = d3.select($elem[0]).append("div").attr("class", "toolTip");
var formatPercent = d3.format("");
var y = d3.scale.ordinal()
//.domain(mappedDataset.sort(function(a, b) { return mappedDataset[a] - mappedDataset[b]; }))
.domain(dataset.map(function(d) { return d.label; }))
.rangeRoundBands([0, height], 0.1, 0.3);
var x = d3.scale.linear()
.domain([0, d3.max(dataset, function(d) { return d.value; })])
.range([0, width]);
var xAxis = d3.svg.axis()
.scale(x)
.tickSize(-height)
.orient("bottom");
d3.select($elem[0]).selectAll("svg").remove()
var svg = d3.select($elem[0]).append("svg")
.attr("width", width + margin.left + margin.right)
.attr("height", height + margin.top + margin.bottom)
.append("g")
.attr("transform", "translate(" + margin.left + "," + margin.top + ")");
svg.append("g")
.attr("class", "x axis")
.attr("transform", "translate(0," + height + ")")
.call(xAxis);
svg.append("g")
.attr("class", "x axis")
.attr("transform", "translate(0," + height + ")")
.call(xAxis);
svg.select(".y.axis").remove();
svg.select(".x.axis").remove();
svg.append("g")
.append("text")
.attr("transform", "rotate(0)")
.attr("x", 170)
.attr("dx", ".1em")
.style("text-anchor", "end")
.text("Frequency of Visit/Time Spent (mins)");
//console.log(dataset);
var bar = svg.selectAll(".bar")
.data(dataset, function(d) { return d.label; })
// new data:
bar.enter().append("rect")
.attr("class", "bar")
.attr("x", function(d) { return 0; })
.attr("y", function(d) { return y(d.label); })
.attr("width", function(d) { return x(d.value); }) // return 0 if want to animate
.attr("height", y.rangeBand())
.text(function(d) { return d.label; });
svg.selectAll(".bartext")
.data(dataset, function(d) { return d.label; })
.enter()
.append("text")
.attr("class", "bartext")
.attr("text-anchor", "middle")
.attr("fill", "white")
.attr("x", function(d,i) {
if (d.value==0) {return x(d.value)+50;}
return x(d.value)/2;
})
.attr("y", function(d,i) {
//if (d.value==0){return};
return y(d.label)+15;
})
.text(function(d){
//if (d.value==0){return};
return d.label;
});
bar.on("mousemove", function(d){
if (in_transition) { return; }
div.style("left", d3.event.pageX+"px");
div.style("top", d3.event.pageY-130+"px");
div.style("display", "inline-block");
div.html((d.value)+"%");
});
bar.on("mouseout", function(d){
if (in_transition) { return; }
div.style("display", "none");
});
// removed data:
bar.exit().remove();
$elem[0].svg = svg;
}, delay);
}
여기 일이
내가 원하는 것을를 내림차순으로 정렬 된 막대를 가지며, 이때 정렬되지 않습니다. 문제는 Y 축이 레이블을 도메인으로 사용하기 때문에 문제가되는 것 같습니다. 그러나 값으로 변경하면 그래프 버그가 나타나서 원하는 것을 표시하지 않습니다. 아무것도를 정렬하지 않습니다 분명히
mappedDataset.sort(function(a, b) { return mappedDataset[a] - mappedDataset[b]; }))
그러나 :
또한, 나는 (이 코드에서뿐만 아니라 위의 코드와 같이) 일부 d3
분류 기능을 시도했다. 어떤 아이디어? 감사.
예는 않습니다! 내 코드에서 비슷한 것을했지만,'reverse()'함수에 대해서는 몰랐다. 어떻게 작동합니까? 그냥 뒤집니까? 나는 그것의 사용을 이해하는 데 어려움을 겪고있다 – Shoplifter20
자바 스크립트 배열 메서드의 일부로, 당신은 그것을 할 수있다. 또는 그냥'return b.value - a.value'를 사용하라. https://developer.mozilla.org/ko-US/docs/Web/JavaScript/Reference/Global_Objects/Array – torresomar
예'return b.value - a.value '로 예제를 보았지만 작동하지 않았습니다. 나는 틀린 장소에서 분류하고 있었다. 고맙습니다! – Shoplifter20