【问题标题】:How to put data on line chart when x axis and data has a time range当x轴和数据有时间范围时如何将数据放在折线图上
【发布时间】:2017-12-27 00:10:50
【问题描述】:

我需要使用 d3 创建一个折线图,其中 x 轴的时间格式为 %H:%M:%S,间隔为 1 小时。我正在使用d3.svg.line 在图表上画线。 X 和 Y 轴都被正确绘制,但线不会绘制,出现异常。

错误:属性 d:预期数字...

xLable 值没有被转换成行路径?

var	elementid = "#linechart";
var margin = {top: 10, right: 30, bottom: 90, left: 30};
var width = $(elementid).innerWidth()  - (margin.left + margin.right);
var height = $(elementid).innerHeight() - (margin.top + margin.bottom);

var	data = [{xLabel: "00:30:00", yLabel: 50},
    {xLabel: "04:00:20", yLabel: 12},
    {xLabel: "10:00:00", yLabel: 10},
    {xLabel: "14:20:00", yLabel: 5},
    {xLabel: "15:30:10", yLabel: 11},
    {xLabel: "17:00:00", yLabel: 12},
    {xLabel: "19:00:00", yLabel: 30},
    {xLabel: "22:00:00", yLabel: 25}];

var x = d3.time.scale()
.nice(d3.time.day)
.range([0, width - margin.left - margin.right]);

var y = d3.scale.linear().range([height, 0]);
  y.domain([0, d3.max(data, function (d) {
    return d.yLabel;
  })]);

var xAxis = d3.svg.axis().scale(x)
      .ticks(d3.time.hours,1).tickFormat(d3.time.format("%H:%M:%S"));

var yAxis = d3.svg.axis().scale(y)
    .orient("left").ticks(5);

var svg = d3.select(elementid)
    .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
  svg.append("g")
    .attr("class", "x axis")
    .attr("transform", "translate(0," + height + ")")
    .call(xAxis)
    .selectAll("text")
    .style("text-anchor", "end")
    .attr("dx", "-.8em")
    .attr("dy", ".15em")
    .attr("transform", function (d) {
    return "rotate(-65)"
  });		

  // Add the Y Axis
  svg.append("g")
    .attr("class", "y axis")
    .call(yAxis);

  // Define the line
  var valueline = d3.svg.line()
    .x(function (d) {
    return x(d.xLabel);
  })
    .y(function (d) {
    return y(d.yLabel);
  });

  // Add the valueline path.
  svg.append("path")
    .attr("class", "line")
    .attr("d", valueline(data));
html,body { width:100%; height:100%; margin:none; padding:none; }
#linechart { width:95%; height:95%; margin:none; padding:none; }

path {
     stroke: steelblue;
     stroke-width: 2;
     fill: none;
 }
 .axis path, .axis line {
     fill: none;
     stroke: grey;
     stroke-width: 1;
     shape-rendering: crispEdges;
 }
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

<div id="linechart" />

【问题讨论】:

    标签: javascript d3.js svg


    【解决方案1】:

    所以您数据中的xLabel 格式不正确。您必须将字符串解析为日期格式。

     data.forEach(function(d) {
          d.xLabel = d3.time.format("%H:%M:%S").parse(d.xLabel);
          d.yLabel = d.yLabel;
     });
    

    我稍微改变了这一行(基于dealing with dates on d3.js axis

    var x = d3.time.scale().domain([data[0].xLabel, data[7].xLabel]).range([0,  
        width - margin.left - margin.right]);
    

    var	elementid = "#linechart";
    var margin = {top: 10, right: 30, bottom: 90, left: 30};
    var width = $(elementid).innerWidth()  - (margin.left + margin.right);
    var height = $(elementid).innerHeight() - (margin.top + margin.bottom);
    
    var	data = [{xLabel: "00:30:00", yLabel: 50},
        {xLabel: "04:00:20", yLabel: 12},
        {xLabel: "10:00:00", yLabel: 10},
        {xLabel: "14:20:00", yLabel: 5},
        {xLabel: "15:30:10", yLabel: 11},
        {xLabel: "17:00:00", yLabel: 12},
        {xLabel: "19:00:00", yLabel: 30},
        {xLabel: "22:00:00", yLabel: 25},
        {xLabel: "23:30:00", yLabel: 25}];
    
     data.forEach(function(d) {
          d.xLabel = d3.time.format("%H:%M:%S").parse(d.xLabel);
          d.yLabel = d.yLabel;
     });
     
     var startDate = d3.time.format("%H:%M:%S").parse("00:00:00");
      
      var endDate = d3.time.format("%H:%M:%S").parse("23:00:00");
      
    var x = d3.time.scale().domain([startDate, endDate]).range([0,  width - margin.left - margin.right]);
    
    var y = d3.scale.linear().range([height, 0]);
      y.domain([0, d3.max(data, function (d) {
        return d.yLabel;
      })]);
    
    var xAxis = d3.svg.axis().scale(x)
          .ticks(d3.time.hours,1).tickFormat(d3.time.format("%H:%M:%S"));
    
    var yAxis = d3.svg.axis().scale(y)
        .orient("left").ticks(5);
    
    var svg = d3.select(elementid)
        .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
      svg.append("g")
        .attr("class", "x axis")
        .attr("transform", "translate(0," + height + ")")
        .call(xAxis)
        .selectAll("text")
        .style("text-anchor", "end")
        .attr("dx", "-.8em")
        .attr("dy", ".15em")
        .attr("transform", function (d) {
        return "rotate(-65)"
      });		
    
      // Add the Y Axis
      svg.append("g")
        .attr("class", "y axis")
        .call(yAxis);
    
      // Define the line
      var valueline = d3.svg.line()
        .x(function (d) {
        return x(d.xLabel);
      })
        .y(function (d) {
        return y(d.yLabel);
      });
    
      // Add the valueline path.
      svg.append("path")
        .attr("class", "line")
        .attr("d", valueline(data));
    html,body { width:100%; height:100%; margin:none; padding:none; }
    #linechart { width:95%; height:95%; margin:none; padding:none; }
    
    path {
         stroke: steelblue;
         stroke-width: 2;
         fill: none;
     }
     .axis path, .axis line {
         fill: none;
         stroke: grey;
         stroke-width: 1;
         shape-rendering: crispEdges;
     }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
    
    <div id="linechart" />

    【讨论】:

    • 感谢 Colin,快完成了。但是 x 域不是从“00:00:00”和“23:00:00”创建时间。因此,如果“23:00:00”出现问题,线条将移出图表。
    • 好的,我在数据中添加了一个条目,它起作用了。现在可以了吗(我没有完全理解你的问题)
    • 实际上根据要求,即使数据没有任何值“23:xx:xx”,我也需要显示从“00:00:00”到“23:00:00”的xaxis刻度”。在数据上添加“23:00:00”后,比例在底部显示“23:00:00”,但如果没有该条目,则不是。
    • 现在看看。我添加了 2 个变量。如果您不希望超过 23:00:00 的值,我认为您必须以另一种方式将其删除。
    • 惊人地解决了我的问题。这就是我想要的,谢谢哥们!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多