2017-02-09 9 views
2

D3を使用して折れ線グラフを作成していますが、X軸のデータ配列に存在する値のみを表示したいとします。D3 - X軸の不必要な値

var svg = d3.select("div#chart").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 + ")"); 


// Add the X Axis 
var xAxis = svg.append("g") 
.attr("class", "x axis") 
.attr("transform", "translate(0," + height + ")") 
.call(d3.axisBottom(x).tickFormat(d3.timeFormat("%d/%m %H:%M"))) 
.selectAll("text") 
.attr("transform", "rotate(90)") 
.attr("dy", ".35em") 
.attr("y", 0) 
.attr("x", 9) 
.style("text-anchor", "start"); 

完全なコードはここにある:JSFiddle

答えて

1

使用tickValues:値の配列が指定されている場合

、指定された値は、ティックではなく規模の自動ティック・ジェネレータを使用するために使用されます。

したがって、あなたのデータ配列内の日付を持つ配列を作成するには、単に書くことができます。https://jsfiddle.net/jy2qL7ka/

そして、ここで同じコード:

ここ
.tickValues(data.map(d=>d.date)) 

は、あなたの更新フィドルですスタックスニペット:

var margin = { 
 
      top: 20, 
 
      right: 80, 
 
      bottom: 90, 
 
      left: 50 
 
      }; 
 
      var data = [ 
 
      \t {date: '2017-01-15 21:39:12', value: 0}, 
 
      {date: '2017-01-15 21:43:12', value: 1}, 
 
      {date: '2017-01-15 21:44:12', value: 0}, 
 
      {date: '2017-01-15 21:48:12', value: 1}, 
 
      {date: '2017-01-15 21:50:12', value: 0}, 
 
      {date: '2017-01-15 21:53:12', value: 1}, 
 
      {date: '2017-01-15 21:55:12', value: 0} 
 
      ]; 
 
      
 
      var width = 400 - margin.left - margin.right, 
 
      height = 450 - margin.top - margin.bottom; 
 

 
      var parseDate = d3.timeParse("%Y-%m-%d %H:%M:%S"); 
 
      var x = d3.scaleTime().range([0, width]); 
 
      var y = d3.scaleLinear().range([height, 0]); 
 

 
      // define the line 
 
      var line = d3.line().curve(d3.curveStep) 
 
      .x(function (d) { 
 
       return x(d.date); 
 
      }) 
 
      .y(function (d) { 
 
       return y(d.value); 
 
      }); 
 

 
      var svg = d3.select("body").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 + ")"); 
 

 
      // format the data 
 
      data.forEach(function (d) { 
 
      d.date = parseDate(d.date); 
 
      }); 
 

 
      x.domain(d3.extent(data, function (d) { 
 
      return d.date; 
 
      })); 
 

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

 

 
      // Add the line path. 
 
      svg.append("path") 
 
      .data([data]) 
 
      .attr("class", "line") 
 
      .style("fill", "none") 
 
      .attr("d", line) 
 
      .style('stroke', 'blue'); 
 

 
      svg.selectAll("dot") 
 
      .data(data) 
 
      .enter().append("circle") 
 
      .attr("r", 4) 
 
      .attr("cx", function (d) { return x(d.date); }) 
 
      .attr("cy", function (d) { return y(d.value); }) 
 
      .style("fill", 'blue'); 
 

 
      // Add the X Axis 
 
      var xAxis = svg.append("g") 
 
      .attr("class", "x axis") 
 
      .attr("transform", "translate(0," + height + ")") 
 
      .call(d3.axisBottom(x) 
 
.tickValues(data.map(d=>d.date)) 
 
.tickFormat(d3.timeFormat("%d/%m %H:%M"))) 
 
      .selectAll("text") 
 
      .attr("transform", "rotate(90)") 
 
      .attr("dy", ".35em") 
 
      .attr("y", 0) 
 
      .attr("x", 9) 
 
      .style("text-anchor", "start"); 
 
      
 
      // Add the Y Axis 
 
      svg.append("g") 
 
      .call(d3.axisLeft(y));
<script src="https://d3js.org/d3.v4.min.js"></script>

+0

お返事ありがとうございます@ gerardo-furtado! あなたの提案はうまくいきます! しかし、日付を終了日に更新すると、ラベルは他のものより上になります。 私の例をもう一度見てください。[JSFiddle](https://jsfiddle.net/tsjnzey2/4/) –

+0

もう、**別の問題です。ここのあなたの特定の問題は解決されました。この他の問題に関する別の質問を投稿することをお勧めします。 –

+0

Ok @ gerardo-furtado!ありがとうございました! –