Использовать дату из данных JSON в scalelog в d3v4 - PullRequest
0 голосов
/ 07 декабря 2018

Я пытаюсь использовать дату, полученную из моих данных JSON на оси X, используя ScaleLog.Как этот https://bl.ocks.org/andrewdblevins/f4ea65f70dbcb34abc1e4c3d75cfa142 только для времени.У меня на графике есть настройка, которая должна показывать годичные данные по оси X.

Мой код:

var svg = d3.select("#main-chart svg"),
margin = {top: 20, right: 20, bottom: 100, left: 75},
width = +svg.attr("width") - margin.left - margin.right,
height = +svg.attr("height") - margin.top - margin.bottom;

var tooltip = d3.select("body").append("div").attr("class", "toolTip");

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


var colours = d3.scaleOrdinal()
.range(["#d9534f", "#d9534f"]);

var g = svg.append("g")
.attr("transform", "translate(" + margin.left + "," + margin.top + ")");

d3.json(url, function(error, data) {
   if (error) throw error;

x.domain(data.map(function(d) {
      let get_date = "";
      if($('#day').hasClass("active")) {get_date = moment(d.date, 'YYYY-MM-DD').format('MMM DD, YYYY')}
        else if($('#month').hasClass("active")) {get_date = moment(d.date, 'YYYY-MM-DD').format('MMM, YYYY')}
          return get_date; 
      })); 

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

    g.append("g")
    .attr("transform", "translate(0," + height + ")")
    .call(d3.axisBottom(x).ticks(5))
    .selectAll("text")  
    .style("text-anchor", "end")
    .attr("dx", "-.8em")
    .attr("dy", ".15em")
    .attr("transform", "rotate(-65)" );

    g.append("g").call(d3.axisLeft(y).ticks(10).tickFormat(function(d) {return parseInt(d); }).tickSizeInner([-width]));

    g.selectAll(".bar")
    .data(data)
    .enter().append("rect")
    .attr("x", function(d) {let get_date = "";
      if($('#day').hasClass("active")) {get_date = moment(d.date, 'YYYY-MM-DD').format('MMM DD, YYYY')}
        else if($('#month').hasClass("active")) {get_date = moment(d.date, 'YYYY-MM-DD').format('MMM, YYYY')}
          return x(get_date); 
      })
    .attr("y", function(d) {return y(d.total_valid_users); })
    .attr("width", x.bandwidth())
    .attr("height", function(d) { return height - y(d.total_valid_subscribers); })
    .attr("fill", function(d) { return colours(d.date); })
    .on("mousemove", function(d){
      tooltip
      .style("left", d3.event.pageX - 50 + "px")
      .style("top", d3.event.pageY - 70 + "px")
      .style("pointer-events", "none")
      .style("display", "inline-block")
      .html((d.date) + "<br>"  + (d.total_valid_users));
    })
    .on("mouseout", function(d){ tooltip.style("display", "none");});
});

Когда я делаю " Последние 7 дней ".Я получаю: 7 Days Но когда я делаю " В этом году ", все мои данные сбрасываются вместе: Year Я надеялся получить что-то вродеэто на обеих моих шкалах, для оси X: X-Axis и для оси Y: Y-axis

Есть ли в любом случае, чтобы сделать это?

...