เหตุใดมาตราส่วนเวลา d3 จึงแสดงเฉพาะเวลา 00:00 น.

ฉันเพิ่งเคยใช้ d3 และฉันกำลังพยายามแสดงข้อมูลเป็นภาพด้วย ฉันพบตัวอย่างบางส่วนเกี่ยวกับวิธีสร้างมาตราส่วนเวลาใน d3 แต่เมื่อฉันทำตามตัวอย่างและพยายามสร้างมาตราส่วนเวลา กลับล้มเหลว ฉันรู้สึกหงุดหงิดเพราะไม่รู้ว่ามันผิดพลาดตรงไหน... ตัวอย่างมีดังนี้: วิธีจัดรูปแบบเวลาบน xAxis ใช้ d3.js

ดังนั้นรหัสของฉันจึงเป็นเช่นนี้:

    boxplotdata =[]
    boxplotdata.push(
    {"datetime":"2013-10-30 01:47",length: 500, start:100,deep1_a:130,deep1:50,deep2_a:200,deep2:60,deep3_a:280,deep3:50,deep4_a:350,deep4:60},
    {"datetime":"2013-10-31 01:45",length: 600, start:200,deep1_a:230,deep1:60,deep2_a:300,deep2:60,deep3_a:380,deep3:50,deep4_a:450,deep4:60},
    {"datetime":"2013-11-01 02:11",length: 550,start:150,deep1_a:180,deep1:50,deep2_a:250,deep2:60,deep3_a:350,deep3:50,deep4_a:410,deep4:60},
    {"datetime":"2013-11-02 01:59",length: 500,start:160,deep1_a:190,deep1:80,deep2_a:300,deep2:60,deep3_a:370,deep3:50,deep4_a:430,deep4:60},          
);

//SET MARGIN FOR THE CANVAS
var margin = {top: 30, right: 10, bottom: 10, left: 10},
    width = 960 - margin.left - margin.right,
    height = 600 - margin.top - margin.bottom;

var parseDate = d3.time.format("%Y-%m-%d %H:%M").parse; 

//SET X AND Y
var x = d3.time.scale()
    .domain([0,11])
    .range([50, width]);

var y = d3.time.scale()
    .domain([new Date(boxplotdata[0].datetime),d3.time.day.offset(new Date(boxplotdata[boxplotdata.length-1].datetime),1)])
    .rangeRound([20, height-margin.top- margin.bottom]);

var xAxis = d3.svg.axis()
    .scale(x)
    .orient("top")
    .tickFormat(d3.time.format("%H:%M"))
    //.ticks(d3.time.minutes,15)
    //.tickPadding(8);  

var yAxis = d3.svg.axis()
    .scale(y)
    .orient('right')
    .ticks(d3.time.days,1)
    .tickFormat(d3.time.format('%m-%d'))
    .tickSize(0)
    .tickPadding(8);

var line = d3.svg.line()
    .x(function(d) { return x(d.datetime); });


var w=960,h=1000;



  d3.select("#chart").selectAll("svg").remove(); //Old canvas must be removed before creating a new canvas.
  var svg=d3.select("#chart").append("svg") 
          //.attr("width",w).attr("height",h);            
            .attr("width",w+margin.right+margin.left).attr("height",h+margin.top+margin.bottom) 
            .append("g")
                .attr("transform", "translate(" + margin.left + "," + margin.top + ")");                

boxplotdata.forEach(function(d) {
    d.datetime = parseDate(d.datetime);
});

x.domain(d3.extent(boxplotdata, function(d) { return d.datetime; }));



  bars = svg.selectAll("g")
       .data(boxplotdata)
       .enter()
       .append("g");

รหัสการวาดบางส่วนที่นี่... และสุดท้าย:

     svg.append("g")
      .attr("class", "x axis")
      //.attr('transform', 'translate(0, ' + (height - margin.top - margin.bottom) + ')')
      .call(xAxis);

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

อย่างไรก็ตาม เมื่อฉันพยายาม ฉันทำได้เพียงกราฟที่มีเวลาทั้งหมดบน xAxis ที่แสดงเป็น "00:00" เกิดอะไรขึ้นที่นี่? หวังว่าบางคนสามารถช่วยฉันได้ ขอบคุณ!


person Ni Yan    schedule 11.11.2013    source แหล่งที่มา


คำตอบ (2)


ข้อมูลตัวอย่างของคุณมาจากวันที่ต่างกัน ดังนั้นสิ่งที่เกิดขึ้นที่นี่คือ D3 กำลังเลือกค่าที่เป็นตัวแทน (เช่น ขอบเขตระหว่างวัน) และทำเครื่องหมายไว้ เนื่องจากรูปแบบวันที่ของคุณแสดงเฉพาะชั่วโมงและนาที คุณจึงได้รับค่า 00:00 เท่านั้น

โดยทั่วไปคุณมีสองตัวเลือกที่นี่ คุณสามารถเปลี่ยนรูปแบบวันที่เพื่อแสดงวัน (ซึ่งเป็นสิ่งที่ D3 ตั้งใจไว้) หรือคุณสามารถตั้งค่าขีดอย่างชัดเจนเป็นสิ่งที่คุณต้องการก็ได้ ในตอนแรกคุณสามารถใช้เช่น d3.time.format("%a"). ในส่วนที่สอง โปรดดูเอกสารประกอบ

person Lars Kotthoff    schedule 11.11.2013

สวัสดี คุณสามารถใช้ฟังก์ชัน TickFormat บนแกนได้

var xAxis = d3.svg.axis() .scale(x) .orient("bottom") .tickFormat(d3.time.format("%H"));

person abhinavxeon    schedule 06.02.2018