2016-11-23 13 views
0

私は水平棒グラフをプロットして、エラーなしで取り込みます。私の問題は、X軸が現在のデータセットで少なくとも0から35までの周波数を反映しなければならないことです。今私が見ることができるのは0から8です。誰かが私にエラーを説明し、それを修正するのに役立つことができますか?D3水平棒グラフX軸の範囲がAngularJs経由のデータより短く

SNIPPET:

<html> 

<head> 

    <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.12/angular.min.js"></script> 
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script> 
    <script src="https://cdnjs.cloudflare.com/ajax/libs/d3/4.3.0/d3.min.js"></script> 

</head> 

<body ng-app="myApp" ng-controller="myCtrl"> 

    <svg></svg> 

    <script> 

     //module declaration 
     var app = angular.module('myApp',[]); 

     //Controller declaration 
     app.controller('myCtrl',function($scope){ 

      $scope.svgWidth = 800;//svg Width 
      $scope.svgHeight = 500;//svg Height 

      //Data in proper format 
      var data = [ 
        {"letter": "A","frequency": "5.01"}, 
        {"letter": "B","frequency": "7.80"}, 
        {"letter": "C","frequency": "15.35"}, 
        {"letter": "D","frequency": "22.70"}, 
        {"letter": "E","frequency": "34.25"}, 
        {"letter": "F","frequency": "10.21"}, 
        {"letter": "G","frequency": "7.68"}, 
      ]; 

       //removing prior svg elements ie clean up svg 
       d3.select('svg').selectAll("*").remove(); 

       //resetting svg height and width in current svg 
       d3.select("svg").attr("width", $scope.svgWidth).attr("height", $scope.svgHeight); 

       //Setting up of our svg with proper calculations 
       var svg = d3.select("svg"); 
       var margin = {top: 20, right: 20, bottom: 30, left: 40}; 
       var width = svg.attr("width") - margin.left - margin.right; 
       var height = svg.attr("height") - margin.top - margin.bottom; 

       //Plotting our base area in svg in which chart will be shown 
       var g = svg.append("g"); 

       //shifting the canvas area from left and top 
       g.attr("transform", "translate(" + margin.left + "," + margin.top + ")"); 

       //X and Y scaling 
       var x = d3.scaleLinear().rangeRound([0, width]); 
       var y = d3.scaleBand().rangeRound([height, 0]).padding(0.4); 

       //Feeding data points on x and y axis 
       data.forEach(function(){ 

        x.domain([0, d3.max(data, function(d) { return d.frequency; })]); 
        y.domain(data.map(function(d) { return d.letter; })); 

       }); 

       //Final Plotting 

       //for x axis 
       g.append("g") 
        .attr("transform", "translate(0," + height + ")") 
        .call(d3.axisBottom(x)); 

       //for y axis 
       g.append("g") 
        .call(d3.axisLeft(y)) 
        .append("text") 
        .attr("transform", "rotate(-90)") 
        .attr("y", 6) 
        .attr("dy", "0.71em") 
        .attr("text-anchor", "end"); 

        //for rectangles 
        g.selectAll(".bar") 
        .data(data) 
        .enter() 
        .append("rect") 
        .attr("class", "bar") 
        .attr("y", function(d) { return y(d.letter); }) 
        .attr("x", function(d) { return 0; }) 
        .attr("height", y.bandwidth()) 
        .attr("width", function(d) { return x(d.frequency); }); 

     }); 

    </script> 

</body> 

</html> 

結果:私は現在の棒グラフに四角形やバーの適切な長さを取得するよう

enter image description here

、それぞれで、手伝ってください私が提供しているデータセット。

答えて

2

あなたのコードのこの部分が間違っている:

x.domain([0, d3.max(data, function(d) { return +d.frequency; })]); 
y.domain(data.map(function(d) { return d.letter; }));  
+0

おかげでバディ:

data.forEach(function(){ x.domain([0, d3.max(data, function(d) { return d.frequency; })]); y.domain(data.map(function(d) { return d.letter; })); }); 

はこれでそれを交換してみてください。それは働いた – Deadpool

+0

あなたは大歓迎です! Plz、マークされた回答を受け入れる:) –

関連する問題