Javascript 如何创建具有负值的柱状图?
我试图将水平条形图旋转为垂直条形图,但不知道如何实现。我可以创建一个普通的柱状图,但一旦我尝试输入负值并计算y和高度,所有的麻烦都会消失。给你。(至少我能够创建y轴(我想) 我做错了什么Javascript 如何创建具有负值的柱状图?,javascript,d3.js,Javascript,D3.js,我试图将水平条形图旋转为垂直条形图,但不知道如何实现。我可以创建一个普通的柱状图,但一旦我尝试输入负值并计算y和高度,所有的麻烦都会消失。给你。(至少我能够创建y轴(我想) 我做错了什么 var data = [{"letter":"A",'frequency':10},{"letter":"B","frequency":-5},{"letter":"C","frequency":7}]; var margin = {top: 20, right: 20, bottom: 30, left:
var data = [{"letter":"A",'frequency':10},{"letter":"B","frequency":-5},{"letter":"C","frequency":7}];
var margin = {top: 20, right: 20, bottom: 30, left: 40}, width = 750 - margin.left - margin.right, height = 500 - margin.top - margin.bottom;
var x = d3.scale.ordinal().rangeRoundBands([0, width], .1);
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");
var svg = d3.select("body").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 + ")");
var x0 = Math.max(-d3.min(data), d3.max(data));
x.domain(data.map(function(d) { return d.letter; }));
y.domain([d3.min(data, function(d) { return d.frequency; }), d3.max(data, function(d) { return d.frequency; })]);
svg.append("g")
.attr("class", "x axis")
.attr("transform", "translate(0," + height + ")")
.call(xAxis);
svg.append("g")
.attr("class", "y axis")
.call(yAxis);
svg.selectAll(".bar")
.data(data).enter().append("rect")
.attr("class", "bar")
.attr("x", function(d, i) { return x(d.letter); })
.attr("y", function(d, i) { return x(Math.min(0, d.frequency));})
.attr("width", x.rangeBand())
.attr("height", function(d) { return Math.abs(x(d.frequency) - x(0)); });
看起来这里有两个问题:
.attr(“y”,函数(d,i){return x(…);})
现在应该是.attr(“y”,函数(d,i){return y(…);})
。对于height
属性中的比例也是如此X
属性为X(0)
。对于Y轴上基于0的条形图,条形图的Y
属性不是Y(0)
,而是Y(值)
(因为条形图的“底部”不再是矩形的前缘)-因此在该代码中,需要使用Math.max(0,值)
(这将为正值提供Y(值)
)而不是Math.min(0,值)
:
参见更新的fiddle:行var x0=Math.max(-d3.min(数据),d3.max(数据));不再有贡献,因为数据不再是数字数组,因此x0不再是数字。谢谢@京3142:你说得对。我的坏习惯是保持这种状态。相关:
svg.selectAll(".bar")
// ...snip...
.attr("y", function(d, i) { return y(Math.max(0, d.frequency));})
.attr("height", function(d) { return Math.abs(y(d.frequency) - y(0)); });