【问题标题】:How to alter this d3.js graph如何改变这个 d3.js 图
【发布时间】:2012-11-10 21:00:38
【问题描述】:

这是一个 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数据中的最小值开始。并且可以通过任何方式配置轴上两个标记之间的距离。

【问题讨论】:

    标签: javascript canvas charts svg d3.js


    【解决方案1】:

    要配置你的坐标轴,你必须修改你的比例。

    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 来格式化scales,所以刻度的最小值是数据中的最小值。要解决此问题,请改用 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
    

    您可以为 bar_xpos min 使用 0,但如果您按年计算则没有意义,因为您的数据将无法实际读取。我在这里用了 2000 分钟。

    工作示例here

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

    编辑: 修改了yheight 属性。高度则相反,否则在图表下方。链接已更新。

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

    【讨论】:

    • 但现在图表显示错误数据。2008 年的计数为 200,但显示小于 100,其他类似
    • 你是对的。我的错。我已经更新了答案来解决这个问题。
    猜你喜欢
    • 2013-08-01
    • 2020-11-24
    • 1970-01-01
    • 2017-11-25
    • 2013-11-29
    • 1970-01-01
    • 2016-08-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多