2017-12-11 4 views
0

私は2つのチャート、1つのバーと1つのライン、同じ単純なHTMLページを表示しようとしています。どちらのチャートも異なるHTMLファイルに表示されたときに正しく表示されますが、一緒に置くと壊れます。d3 javascriptは同じページに複数のグラフを表示します

creating multiple divsでこの回答のアドバイスごとに私はグラフを保持する2つのdivオブジェクトを作成し、それらを別々に指定しました。それだけ棒グラフおよび線グラフの軸を示しているが第二のdiv

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

に取り付け最初のdiv

// append the svg obgect to the body of the page 
// appends a 'group' element to 'svg' 
// moves the 'group' element to the top left margin 
var svg = d3.select("#Chart2").append("svg") 
     .attr("width", width + margin.left + margin.right) 
     .attr("height", height + margin.top + margin.bottom) 
     .append("g") 
     .attr("transform", 
     "translate(" + margin.left + "," + margin.top + ")"); 

に取り付け

<!--Create svg elements to hold d3 object --> 
    <div id="Chart1"></div> 

    <div id="Chart2"></div> 

。グラフの行が表示されず、エラーを示すためにコンソールに出力が表示されません。 Program Output

完全なコードは、折れ線グラフは、レンダリング時にいくつかの問題を持つことがあり、ここで

<html> 
     <body> 

     <!--Create svg elements to hold d3 object --> 
     <div id="Chart1"></div> 

     <div id="Chart2"></div> 

<script> 

      // set the dimensions and margins of the graph 
      var margin = {top: 50, right: 20, bottom: 80, left: 120}, 
       width = 960 - margin.left - margin.right, 
       height = 900 - margin.top - margin.bottom; 

      // parse the date/time 
      var parseTime = d3.timeParse("%Y"); 

      // set the ranges 
      var x = d3.scaleTime().range([0, width]); 
      var y = d3.scaleLinear().range([height, 0]); 

      // define the line 
      var valueline = d3.line() 
       .x(function(d) { return x(d.year); }) 
       .y(function(d) { return y(d.sum); }); 

      // append the svg obgect to the body of the page 
      // appends a 'group' element to 'svg' 
      // moves the 'group' element to the top left margin 
      var svg = d3.select("#Chart2").append("svg") 
       .attr("width", width + margin.left + margin.right) 
       .attr("height", height + margin.top + margin.bottom) 
       .append("g") 
       .attr("transform", 
         "translate(" + margin.left + "," + margin.top + ")"); 

      // Get the data 
      d3.csv("data/YearContributionSum.csv", function(error, data2) { 
       if (error) throw error; 

       // format the data 
       data2.forEach(function(d) { 
        d.year = parseTime(d.year); 
        d.sum = +d.sum; 
        }); 

       // Scale the range of the data 
       x.domain(d3.extent(data2, function(d) { return d.year; })); 
       y.domain([0, d3.max(data2, function(d) { return d.sum; })]); 

       // Add the valueline path. 
       svg.append("path") 
        .data([data2]) 
        .attr("class", "line") 
        .attr("d", valueline); 

       // Add the X Axis 
       svg.append("g") 
        .attr("transform", "translate(0," + height + ")") 
        .call(d3.axisBottom(x)); 


       // text label for the x axis 
       svg.append("text")    
        .attr("transform", 
         "translate(" + (width/2) + " ," + 
             (height + margin.top + 20) + ")") 
        .style("text-anchor", "middle") 
        .text("Year");  

       // Add the Y Axis 
       svg.append("g") 
        .call(d3.axisLeft(y)); 

        // text label for the y axis 
       svg.append("text") 
        .attr("transform", "rotate(-90)") 
        .attr("y", 0 - margin.left) 
        .attr("x",0 - (height/2)) 
        .attr("dy", "1em") 
        .style("text-anchor", "middle") 
        .text("Sum of Contributions");  

      }); 

     </script> 
     <script> 

      var margin = {top: 20, right: 30, bottom: 100, left: 80}, 
       width = 1500 - margin.left - margin.right, 
       height = 800 - margin.top - margin.bottom; 

      var x = d3.scaleBand() 
       .rangeRound([0, width], .1); 
      var y = d3.scaleLinear() 
       .range([height, 0]); 

      var xAxis = d3.axisBottom(x); 
      var yAxis = d3.axisLeft(y); 

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

      d3.csv("data/PurposeContributionSum.csv", type, function(error, data) { 
       if (error) throw error; 
       data.sort(function(a, b){ return b.sum - a.sum;}); 
       x.domain(data.map(function(d) { return d.purpose; })); 
       y.domain([0, d3.max(data, function(d) { return d.sum; })]); 

       BarChart.append("g") 
        .attr("class", "x axis") 
        .attr("transform", "translate(0," + height + ")") 
        .call(xAxis) 
        .selectAll("text") 
        .attr("y", 0) 
        .attr("x", 9) 
        .attr("dy", ".35em") 
        .attr("transform", "rotate(90)") 
        .style("text-anchor", "start"); 

       BarChart.append("g") 
        .attr("class", "y axis") 
        .call(yAxis); 

       BarChart.selectAll(".bar") 
        .data(data) 
        .enter().append("rect") 
        .attr("class", "bar") 
        .attr("x", function(d) { return x(d.purpose); }) 
        .attr("y", function(d) { return y(d.sum); }) 
        .attr("height", function(d) { return height - y(d.sum); }) 
        .attr("width", x.bandwidth()); 
      }); 

      function type(d) { 
       d.sum = +d.sum; // coerce to number 
       return d; 
      } 

     </script> 
    </body> 
<\html> 
+0

何が起こります各スクリプトの縮尺と軸の名前を変更するとどうなりますか? –

+0

xとyの名前が1つに変更されました。行は表示されますが、x軸はグラフの中央を切っています –

+0

使用しているデータについての詳細が必要な場合は、行のパスを作成しようとするときに問題があると思います。使用しているデータを見ることは可能ですか? – torresomar

答えて

0

で、あなたのコードは、折れ線グラフの正しい入力を与えられた動作しているようですが、ここでworking JSbinです。

const contributionSum = [ // Had to mock this 
    { year: '1990', sum: 1000 }, 
    { year: '1991', sum: 1090 }, 
    { year: '1992', sum: 900 }, 
    { year: '1993', sum: 1300 }, 
    { year: '1994', sum: 1250 }, 
    { year: '1995', sum: 1150 }]; 
// Format data 
const formatContributions = contributionSum.map(v => { 
    return { 
     year: parseTime(v.year), 
     sum: +v.sum 
    } 
}); 
// Scale the range of the data 
x.domain(d3.extent(formatContributions, d => d.year)); 
y.domain([0, d3.max(formatContributions, d => d.sum)]); 

私は問題はあなたが折れ線グラフに提供されている入力から来ていると思いますが、私はまた、棒グラフで順序で物事を保つためにいくつかの追加の変数を作成する必要がありましたが、レンダリング:

var xBar = d3.scaleBand() 
    .rangeRound([0, width], .1); 
var yBar = d3.scaleLinear() 
    .range([height, 0]); 

var xBarAxis = d3.axisBottom(xBar); 
var yBarAxis = d3.axisLeft(yBar); 
関連する問題