将结果转换为d3中的百分比

时间:2013-05-03 03:43:09

标签: javascript d3.js

我刚刚开始学习d3.js + Line Chart with Legend&提示。我能够使它工作,但我想要的是yAxis结果是百分比格式。尝试使用tickFormat但不知何故它不会将我的原始数字转换为百分比。 T__T

这是我的js代码

chart = d3LineWithLegend()
            .xAxis.label('Date')
            .width(700)
            .height(300)
            .yAxis.label('Frequency');


var svg = d3.select('#histogram svg').datum(data);

svg.transition().duration(1000)
  .attr('width', 700)
  .attr('height', 300)
  .call(chart);


chart.dispatch.on('showTooltip', function(e) {
    var offset = $('#histogram').offset(), // { left: 0, top: 0 }
    left = e.pos[0] + offset.left,
    top = e.pos[1] + offset.top,
    // formatter = d3.format(".04f");
    formatter = d3.format(".0%");
    var yAxis = d3.svg.axis().orient("left").tickFormat(formatter);//added this part but it didn't work
    console.log(yAxis);

    var dateObj = (new Date(e.point[0]));

    var year = dateObj.getFullYear();
    var month = dateObj.getMonth() + 1;
    var day = dateObj.getDate();
    var hours = dateObj.getHours();
    var date = month + '-' + day + '-' + year;
    if(filter === 'hour') {
      date = date + ', ' + hours + ':00';
    }

    var content = '<h3>' + date + '</h3>' +
              '<p>' +
              '<span class="value">' + (e.point[1]) + '</span>' +
              '</p>';

    nvtooltip.show([left, top], content);
});

chart.dispatch.on('hideTooltip', function(e) {
   nvtooltip.cleanup();
});

上面代码中的问题似乎是什么?如果我不在客户端工作,我正在考虑在服务器端调整它。但是工作太多了。

1 个答案:

答案 0 :(得分:9)

d3.format(".0%")不会进行缩放。它只需乘以100并在其末尾添加%。 (而且我相信.0%会增加精确度。如果你想要精确到第十位,请使用.1%而不是。不知道是否需要)

您可能希望使用d3.scale.linear()以便首先缩放数据,使其在0到1的范围内。然后您可以创建一个使用0到1的域的yscale,在最终的y轴上对应0%到100%。

//Run data through this pre-scaling.
prescale = d3.scale.linear()
                   .domain([dataMin, dataMax])
                   .range([0,1])

//Use this y-scale in place of another potential y-scaling function.

yScale = d3.scale.linear()
                 .domain([0, 1])
                 .range([canvasHeightLow, canvasHeightHigh]);


//Afterwards, you can use this yScale to build your yAxis

formatter = d3.format(".0%");

yAxis = d3.svg.axis().orient("left")
                     .scale(yScale)
                     .tickFormat(formatter)

希望这有帮助。