如何更改此d3.js图

时间:2012-11-22 12:49:32

标签: javascript canvas charts svg d3.js

这是d3 js图表的链接。

http://enjalot.com/inlet/4131006/

这是代码

    var w = 300,
    h = 300,
    padding = 31,
    p = 10;

var data = [{count:200,year:2008},
    {count:240,year:2010},
    {count:290,year:2009}];

var bar_height = d3.scale.linear()
    .domain(d3.extent(data, function(d) { return d.count; }) )  // min max of count
    .range([p,h-p]);  // min max of area to plot in


var bar_xpos = d3.scale.linear()
    .domain(d3.extent(data, function(d) { return d.year; }) )  // min max of year
    .range([p,w-p]);  // min max of area to plot in


var xAxis = d3.svg.axis()
            .scale(bar_xpos)
            .orient("bottom")
            .ticks(5);  //Set rough # of ticks

var yAxis = d3.svg.axis()
            .scale(bar_height)
            .orient("left")
            .ticks(5);

var svg = d3.select("svg")
    .attr("width", w)
    .attr("height", h);

svg.append("g")
    .attr("class", "axis")
    .attr("transform", "translate(0," + (h - padding) + ")")
    .call(xAxis);

svg.append("g")
    .attr("class", "axis")
    .attr("transform", "translate(" + padding + ",0)")
    .call(yAxis);

svg.selectAll("rect")
    .data(data)
    .enter().append("rect")
    .attr("x", function(d) {
        return bar_xpos(d.year); })
    .attr("y", function(d) { 
        return h - bar_height(d.count); })
    .attr("width", 10)
    .attr("height", function(d) {return bar_height(d.count); })
    .attr("fill", "steelblue")

我已经能够将y轴和x轴绘制到该图形但它们看起来不正确。存在一些问题 矩形线不在X轴上。 图表上的x轴和y轴上没有0。它从json数据的最小值开始。并且任何方式都可以配置轴上两个标记之间的距离。

1 个答案:

答案 0 :(得分:3)

要配置轴,您必须修改比例。

var bar_height = d3.scale.linear()
    .domain(d3.extent(data, function(d) { return d.count; }) )  // min max of count
    .range([p,h-p]);  // min max of area to plot in


var bar_xpos = d3.scale.linear()
    .domain(d3.extent(data, function(d) { return d.year; }) )  // min max of year
    .range([p,w-p]);  // min max of area to plot in

d3.extent()同时返回数据的最小值和最大值,并将其用作图表的域。由于您使用bar_heightbar_xpos来设置scale的格式,因此比例的最小值是数据中的最小值。要解决此问题,请改用d3.max(),如下所示:

var bar_height = d3.scale.linear()
    .domain([d3.max(data, function(d) { return d.count; }), 0] )  // min max of count
    .range([p,h-p]);  // min max of area to plot in


var bar_xpos = d3.scale.linear()
    .domain([2000, d3.max(data, function(d) { return d.year; })] )  // min max of year
    .range([p,w-p]);  // min max of area to plot in

你可以使用0作为你的bar_xpos min,但是如果你要年复一年没有意义,因为你的数据实际上是无法读取的。我在这里用了2000分钟。

工作示例here

此外,在此示例中,我将您的条形位置格式化为与轴对齐得更好。我将.attr('width', 10)替换为.attr('width', barwidth),并从barwidth attr中减去x。这将使条形图的右边缘与轴的右边缘对齐,而不是溢出边缘。

修改 修改了yheight属性。高度是相反的,在图表下,否则。链接已更新。

.attr("y", function(d) { 
    return bar_height(d.count); })
.attr("width", barwidth)
.attr("height", function(d) {return h - bar_height(d.count) - padding; })