2017-02-09 3 views
2

Я создаю линейную диаграмму с использованием D3, и я хотел бы показать в X Axis только значения, которые существуют в моем массиве данных.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:

Если задан массив значений, указанные значения используются для клещи, а не с помощью автоматического генератора тиков в весах.

Таким образом, чтобы создать массив с датами в массиве данных, вы можете просто написать:

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

Вот ваша обновленная скрипка: https://jsfiddle.net/jy2qL7ka/

А вот тот же самый код в Стек сниппет:

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! Спасибо! –

Смежные вопросы