使用d3.js开发的整数的格式化条形图

时间:2014-12-09 15:04:35

标签: d3.js

我使用d3.js开发了条形图。开发的条形图包含在小提琴中。我是d3.js的新手。所以我很难格式化图形。我希望格式化图形而不是下面的图形。

我遇到的主要问题是,图表不显示-ve旁边的-ve整数,以便在y轴上绘制。例)绘制的值是-490,我当前的图表在y轴上没有显示-500。此问题也退出+ ve值

代码如下:

    var mainApp = angular.module('mainApp', []);

mainApp.controller('FIItradingController',
                   ['$scope', function($scope) {
var data = [
  {name: "01-12-2014",    value:  4984.6},
  {name: "02-12-2014",    value:  -109.45},
  {name: "03-12-2014",    value: 474},
  {name: "04-12-2014",   value: 391.07},
  {name: "05-12-2014",    value: 106.82},
  {name: "06-12-2014",     value: -12.36},
  {name: "07-12-2014",    value:  10},
  {name: "08-12-2014",    value:  20}
];

var data1 = [4, 8, 15, 16, 23, 42];

   var margin = {top: 20, right: 30, bottom: 30, left: 40},
    width = 960 - 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 x = d3.scale.linear()
    .range([0, width]);*/

/*var chart = d3.select(".chart")
    .attr("width", width);*/

/*var x = d3.scale.linear()
    .domain([0, d3.max(data)])
    .range([0, width]);*/

var chart = d3.select(".chart")
    .attr("width", width + margin.left + margin.right)
    .attr("height", height + margin.top + margin.bottom)
  .append("g")
    .attr("transform", "translate(" + margin.left + "," + margin.top + ")");                      

$scope.render = function(data) {

    /*var chart = d3.select(".chart")
    .attr("width", width)
    .attr("height", barHeight * data.length);*/

    /*bar.append("rect")
    .attr("width", x)
    .attr("height", barHeight - 1); 

    bar.append("rect")
      .attr("width", function(d) { return x(d.value); })
      .attr("height", barHeight - 1);

      bar.append("text")
      .attr("x", function(d) { return x(d.value) - 3; })
      .attr("y", barHeight / 2)
      .attr("dy", ".35em")
      .text(function(d) { return d.value; });

          x.domain([0, d3.max(data, function(d) { return d.value; })]);
    chart.attr("height", barHeight * data.length);

    */
     x.domain(data.map(function(d) { return d.name; }));
     //y.domain([0, d3.max(data, function(d) { return d.value; })]);

    y.domain([d3.min(data,function(d){return d.value}), d3.max(data, function(d) { return d.value; })]);

    chart.append("g")
      .attr("class", "x axis")
      .attr("transform", "translate(0," + (height) + ")")
      .call(xAxis);

  chart.append("g")
    .attr("class", "y axis")
    .call(yAxis)
  .append("text")
    .attr("transform", "rotate(-90)")
    .attr("y", 6)
    .attr("dy", ".71em")
    .style("text-anchor", "end")
    .text("Frequency");

/*chart.selectAll(".bar")
      .data(data)
    .enter().append("rect")
      .attr("class", "bar")
      .attr("x", function(d) { return x(d.name); })
      .attr("y", function(d) { return y(d.value); })
      .attr("height", function(d) { return height - y(d.value); })
      .attr("width", x.rangeBand());*/

    chart.selectAll(".bar")
    .data(data)
  .enter().append("rect")
    .attr("class", function(d) { return d.value < 0 ? "bar negative" : "bar positive"; })
    .attr("y", function(d) {return y(Math.max(0, d.value)); })
    .attr("x", function(d) { return x(d.name); })
    .attr("height", function(d) {return Math.abs(y(d.value) - y(0)); })
    .attr("width", x.rangeBand());

}
function type(d) {
  d.value = +d.value; // coerce to number
  return d;
}
$scope.render(data); 

                   }]);

如果有人知道请帮助我。小提琴如下:

http://jsfiddle.net/HB7LU/8960/

enter image description here

1 个答案:

答案 0 :(得分:0)

因此,您的情节 显示负值 - 它只是看起来像是从图表区域下方下降,因为y轴上的最低点是图表结束的位置。

有几种方法可以解决这个问题(例如将d3.min()的输出乘以1.1以增加一些空间),但最简单和最优雅的方法可能只是添加.nice()你的y尺度,如下:

y.domain([d3.min(data,function(d){return d.value}), d3.max(data, function(d) { return d.value; })])
 .nice();

您也可以考虑使用d3.extent()代替d3.min()d3.max()。它返回minimum and maximum values in an array的双值数组。我也会在定义之后立即将.domain().nice()放到y上;没有必要将它宣布为40行。现在我们有了这个:

var y = d3.scale.linear()
     .range([height, 0])
     .domain(d3.extent(data, function(d) { return d.value; }))
     .nice();

Forked fiddle