当前位置: 首页 > 知识库问答 >
问题:

为什么d3时标只显示我00:00?

唐健
2023-03-14

我是d3的新手,我正在尝试用它做一些数据可视化。我找到了一些关于如何在d3中创建时标的示例,但是当我按照示例尝试创建时标时,它失败了。我很沮丧,因为我想不出哪里出了问题...这个例子是这样的:如何使用d3.js在xAxis上格式化时间

    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”的图。这里出什么问题了?希望有人能帮帮我。谢谢!

共有1个答案

司寇飞航
2023-03-14

您的示例数据来自不同的日子,所以这里发生的是D3选择代表值(即日子之间的界限)并为其打勾。由于您的日期格式只显示小时和分钟,00:00是您的全部。

你基本上有两个选择。您可以更改日期格式以显示日期(这是D3想要的),或者您可以将刻度值显式设置为您想要的任何值。对于第一个,可以使用d3.time.format(“%a”)。对于第二个,请参阅文档。

 类似资料:
  • 我试图在一个Jasper报告中显示多个表,我使用子报告来实现这个功能。但我一直在显示几个子报告。实际上,只显示其中一个(第一个)。 以下是我的主report.jrxml: 下面是subjectSubreport.jrxml: 这是printersSubreport.jrxml: 当我切换子报告时,第一个报告正确显示,另一个报告消失。在JasperSoft Studio中,一切都很好,当我将它们导出

  • 大家好,我想问一下为什么我在Javascript上的过滤器只显示第一行,不能取消过滤?我是javascript的新手,我已经给了这个类一个数字来检查,但似乎不起作用,这是我的代码 null null

  • 问题内容: 最近,我一直在开发此网站,并试图在其中添加超棒的字体图标,以便其可扩展。 问题是他们没有露面。 看一下HTML: 要么 我确实把样式表引用放在了头上。 我不知道为什么他们没有出现。 这里是参考: 好了,这是完整的html: 问题答案: 根据您的参考,您有: 具体来说,就是这个部分。 但是,在您的完整html下是这样的: 您是否尝试过更换与您的全HTML变成这样?

  • 我正在中写入我的。当我编写Ndf记录时,它工作得很好,但当我尝试使标签只读时,我得到了。这是发生异常的代码: 该makeReadOnly适用于Mifare Ultralight (MF0ICU1)标签。

  • 问题内容: 我有一个包含日期的数据库表 我正在使用MySQL。有时从程序中将没有日期的数据传递到数据库。因此, 当使用带错误的日期列调用表数据时,日期值会自动分配给它 在插入数据时,我尝试将null值传递给日期,但是将其分配给当前时间。 有什么办法可以在不更改表结构的情况下获得? 问题答案: 您可以在数据源配置中直接使用此JDBC URL: jdbc:mysql://您的服务器:3306 /您的数

  • 我的挂机命令工作得很好,除了我只能使用一个词原因。例如,我会说-afk遛狗。每当有人在我挂机的不和谐服务器上定位我时,它只会说(用户)如果afk。原因:走路。我正在想办法让它说多个单词而不是一个。这是我的AFK命令 @客户。_消息(消息)上的事件异步定义:全局afkdict if消息。afkdict作者:afkdict。pop(message.author)