我正在尝试 d3js,但我的第一个基本柱形图(垂直条形图)工作时遇到了问题。我发现唯一有点难以理解的是缩放的东西。我想用标签制作 x 和 y 轴刻度,但我有以下问题:
首先是我的数据:
{
"regions":
["Federal","Tigray","Afar","Amhara","Oromia","Gambella","Addis Ababa","Dire Dawa","Harar","Benishangul-Gumuz","Somali","SNNPR "],
"institutions":
[0,0,34,421,738,0,218,22,22,109,0,456]
}
在 y 轴上,值在那里,但顺序相反。这是代码:
var y = d3.scale.linear().domain([0, d3.max(data.institutions)]).range([0, height]);
然后我使用这个比例来创建一个 y 轴:
var yAxis = d3.svg.axis().scale(y).orient("left");
并将此轴添加到 svg 元素
svgContainer.append("g")
.attr("class", "y axis")
.call(yAxis)
.append("text")
.attr("transform", "rotate(-90)")
.attr("y", 6)
.attr("dy", ".71em")
.style("text-anchor", "end")
.text("Institutions");
这里的问题是 y 轴从顶部的 0 和底部的 700 开始,这是可以的,但它应该是相反的顺序。
另一个问题是x轴。我想要一个序数比例,因为我想要输入的值在我上面的区域名称中。这就是我所做的。
var x = d3.scale.ordinal()
.domain(data.regions.map(function(d) { return d.substring(0, 2); }))
.rangeRoundBands([0, width], .1);
然后是轴
var xAxis = d3.svg.axis()
.scale(x)
.orient("bottom");
最后将其添加到 svg 元素
svgContainer.append("g")
.attr("class", "x axis")
.attr("transform", "translate( 0," + height + ")")
.call(xAxis);
这里的问题是出现了刻度线和标签,但它们的间距不均匀,并且与我正在绘制的矩形的中心不对应。这是完整的代码,因此您可以看到发生了什么。
$(document).ready(function(){
d3.json("institutions.json", draw);
});
function draw(data){
var margin = {"top": 10, "right": 10, "bottom": 30, "left": 50}, width = 700, height = 300;
var x = d3.scale.ordinal()
.domain(data.regions.map(function(d) { return d.substring(0, 2); }))
.rangeRoundBands([0, width], .1);
var y = d3.scale.linear()
.domain([0, d3.max(data.institutions)])
.range([0, height]);
var xAxis = d3.svg.axis()
.scale(x)
.orient("bottom");
var yAxis = d3.svg.axis()
.scale(y)
.orient("left");
var svgContainer = d3.select("div.container").append("svg")
.attr("class", "chart")
.attr("width", width + margin.left + margin.right)
.attr("height", height + margin.top + margin.bottom)
.append("g")
.attr("transform", "translate(" +margin.left+ "," +margin.right+ ")");
svgContainer.append("g")
.attr("class", "x axis")
.attr("transform", "translate( 0," + height + ")")
.call(xAxis);
svgContainer.append("g")
.attr("class", "y axis")
.call(yAxis)
.append("text")
.attr("transform", "rotate(-90)")
.attr("y", 6)
.attr("dy", ".71em")
.style("text-anchor", "end")
.text("Institutions");
svgContainer.selectAll(".bar")
.data(data.institutions)
.enter()
.append("rect")
.attr("class", "bar")
.attr("x", function(d, i) {return i* 41;})
.attr("y", function(d){return height - y(d);})
.attr("width", x.rangeBand())
.attr("height", function(d){return y(d);});
}