【问题标题】:d3 custom bar chart bars using svg paths instead of rectsd3自定义条形图条使用svg路径而不是rects
【发布时间】:2012-10-06 12:36:11
【问题描述】:

我正在尝试构建一个 d3 条形图,但由于设计者狡猾,我需要在每个条形的左上角和右上角设置圆角。我想我正在取得进展,但我可以使用一些帮助来推动它。

在学习 d3 和 svg 方面仍处于上坡路,所以我希望我没有错过任何明显的东西。

我已经使用 rects(注释掉的部分)成功地完成了这项工作,但是有一个缺陷,可能是我绘制路径的方式。我作为参数传递给 topRoundedRect 函数的匿名函数(例如 function(datum, index) { return x(index); })在附加到路径的 d 属性之前没有被评估,我没有明白为什么。所以我最终得到这样的错误:

Error: Problem parsing d="Mfunction (datum, index) { return x(index); }3,function (datum) { return height - y(datum); }h34a3,3 0 0 1 3,3vNaNh-40vNaNa3,3 0 0 1 3,-3z"

您能提供的任何建议都很棒。代码如下。

var data = [60.45,60.45,89.54,120.34,106.45,127.43];

var barWidth = 40;
var width = (barWidth + 10) * data.length;
var height = 500; 


var x = d3.scale.linear().domain([0, data.length]).range([0, width]);
var y = d3.scale.linear().domain([0, d3.max(data, function(datum) { return datum; })]).
  rangeRound([0, height]);

// add the canvas to the DOM
var barDemo = d3.select("body").
  append("svg").
  attr("width", width).
  attr("height", height);


function topRoundedRect(x, y, width, height, radius) {
    return "M" + (x + radius) + "," + y
       + "h" + (width - (radius * 2))
       + "a" + radius + "," + radius + " 0 0 1 " + radius + "," + radius
       + "v" + (height - radius)
       + "h" + (0-width)
       + "v" + (0-(height-radius))
       + "a" + radius + "," + radius + " 0 0 1 " + radius + "," + -radius
       + "z";
}  

  /*
barDemo.selectAll("rect").
  data(data).
  enter().
  append("svg:rect").
  attr("x", function(datum, index) { return x(index); }).
  attr("y", function(datum) { return height - y(datum); }).
  attr("height", function(datum) { return y(datum); }).
  attr("width", barWidth).
  attr("fill", "url(#barGradient)");   */


  barDemo.selectAll("path").
    data(data).
    enter().append("path").
        attr("d", topRoundedRect(
            function(datum, index) { return x(index); },
            function(datum) { return height - y(datum); },
            barWidth,
            function(datum) { return y(datum); },
            3))
        .style("fill","#ffcc00")
        .style("stroke","none");      

【问题讨论】:

    标签: svg d3.js data-visualization bar-chart


    【解决方案1】:

    你的属性的参数应该是一个以数据和索引为参数的函数。试试:

    attr("d", function(datum, index) { 
        return topRoundedRect(    x(index), 
                                  height - y(datum),
                                  barWidth,
                                  y(datum),
                                  3);
    })
    

    【讨论】:

    • 谢谢,@Superboggly。完美运行!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-03
    • 1970-01-01
    • 2021-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多