我现在正在处理的D3图有几个问题:
我无法y axis
在页面上正确对齐。这些数字超出了最左边的边界,因此无法看到。
我希望条形图中使用的列在刻度线之间整齐地对齐,并且在两侧均匀间隔。
小提琴:http : //jsfiddle.net/bf1gf8ep/8/
D3.js
var barWidth = 70;
var width = (barWidth + 10) * 7;
var height = 200;
var data = [{"label" : "1/7yrs", "contract" : "111830.17", "annReturn" : "1.63%"},
{"label" : "2/7yrs", "contract" : "115311.17", "annReturn" : "2.07%"},
{"label" : "3/7yrs", "contract" : "118984.65", "annReturn" : "2.52%"},
{"label" : "4/7yrs", "contract" : "122859.65", "annReturn" : "2.98%"},
{"label" : "5/7yrs", "contract" : "126947.77", "annReturn" : "3.46%"},
{"label" : "6/7yrs", "contract" : "131260.74", "annReturn" : "3.94%"},
{"label" : "7/7yrs", "contract" : "135810.92", "annReturn" : "4.44%"}];
var margin = { top: 20, right: 20, bottom: 20, left: 20 };
var chart = d3.selectAll("body").append("svg:svg")
.attr("width", width + margin.left + margin.right)
.attr("height", height + margin.top + margin.bottom + 20);
var x = d3.scale.linear().domain([0, data.length]).range([0, width]);
var y = d3.scale.linear().range([height, 0]);
var xAxis = d3.svg.axis().scale(x).orient("bottom");
var yAxis = d3.svg.axis().scale(y).orient("left").ticks(5);
chart.append("g")
.attr("class", "axis").call(xAxis)
.attr("transform", "translate(0," + (height) + ")");
chart.append("g")
.attr("class", "axis")
.attr("transform", "translate(" + 10 + ",0)")
.call(yAxis);
x = d3.scale.linear().domain([0, data.length]).range([0, width]);
y = d3.scale.linear().domain([0, 135810.92 + 1000]).range([height, 0]);
chart.selectAll("rect")
.data(data)
.enter()
.append("svg:rect")
.attr("x", function (d, i) { return x(i); })
.attr("y", function (d) { return y(d.contract); })
.attr("height", function (d) { return height - y(d.contract); })
.attr("width", barWidth)
.attr("fill", "#2d578b");
chart.selectAll("text.contractInfo")
.data(data)
.enter()
.append("svg:text")
.attr("x", function(d, i) { return x(i) + barWidth; })
.attr("y", function(d) { return y(d.contract); })
.attr("dx", -barWidth / 2)
.attr("dy", "1.2em")
.attr("text-anchor", "middle")
.text(function(d) { return d.contract; })
.attr("fill", "white")
.attr("class", "contractInfo");
chart.selectAll("text.yAxis")
.data(data)
.enter().append("svg:text")
.attr("x", function (d, i) { return x(i) + barWidth; })
.attr("y", height)
.attr("dx", -barWidth / 2)
.attr("dy", "15px")
.attr("text-anchor", "middle")
.attr("style", "font-size: 12; font-family; Helvetica, sans-serif")
.text(function (d) { return d.label; })
.attr("transform", "translate(0, 18)")
.attr("class", "yAxis");
截屏
您已经完成了所有艰苦的工作,只需要再使用margin变量即可。您真正想要做的就是将栏向右推20px
或margin.left
并将它们居中。该width
变量已设置为barwidth + 10
,因此您需要10px
填充。要居中,您需要在条宽上添加一半的填充。因此,在创建这些条时将它们放在一起,需要添加margin.left和5,即:
.attr("x", function (d, i) { return x(i) + margin.left + 5; })
您还需要使用完全相同的代码移动文本。
还需要通过添加margin.left值来移动xAxis,例如:
.attr("transform", "translate(" + margin.left + "," + (height) + ")");
我还注意到您对y scale max进行了硬编码,因此我引入了ymax变量来计算最大值,并如下修改了y变量;
var ymax = d3.max(data, function(d) { return d.contract; });
var y = d3.scale.linear().domain([0, ymax]).range([height, 0]);
上面概述的方法的替代方法是附加一个group元素,以将条放置在其中并通过margin变量平移该组。这样可以避免必须在条形几何图形中使用margin变量。
无论如何,我碰到了你的小提琴,其中包含到这里的更新
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句