在D3.js

时间:2016-03-25 12:36:52

标签: javascript jquery d3.js

我已经尝试了几天但却无法找到解决方案。我有一个时间序列数据,每5分钟一次,可以延续数天。我对D3和Java Script很安静。我花了一些时间来构建它。以下是jsfiddle的链接,我一直在努力:

https://jsfiddle.net/adityap16/d61gtadm/2/

代码:

var data = [
{"mytime": "2015-12-01T11:10:00.000Z", "value": 64},
{"mytime": "2015-12-01T11:15:00.000Z", "value": 67},
{"mytime": "2015-12-01T11:20:00.000Z", "value": 70},
{"mytime": "2015-12-01T11:25:00.000Z", "value": 64},
{"mytime": "2015-12-01T11:30:00.000Z", "value": 72},
{"mytime": "2015-12-01T11:35:00.000Z", "value": 75},
{"mytime": "2015-12-01T11:40:00.000Z", "value": 71},
{"mytime": "2015-12-01T11:45:00.000Z", "value": 80}
];
var parseDate = d3.time.format("%Y-%m-%dT%H:%M:%S.%LZ").parse;

data.forEach(function(d) {
          d.mytime = parseDate(d.mytime);
        });
//var margin = { top: 30, right: 30, bottom: 40, left:50 },
var margin = { top: 30, right: 30, bottom: 40, left:50 },
height = 200,
width = 800;
var color =  "green";
var xaxis_param = "mytime";
var yaxis_param = "value"
var params1 =  {margin:margin,height:height,width:width, color: color, xaxis_param:xaxis_param, yaxis_param :yaxis_param};
draw_graph(data,params1);




function  draw_graph(data,params){


    //Get the margin 
    var xaxis_param = params.xaxis_param;
    var yaxis_param = params.yaxis_param;
    var color_code = params.color;
    var margin = params.margin;
    var height = params.height - margin.top - margin.bottom,
        width = params.width - margin.left - margin.right;

    console.log("1")

    var x_extent = d3.extent(data, function(d){
        return d[xaxis_param]});
    console.log("2")
    var y_extent = d3.extent(data, function(d){
        return d[yaxis_param]});

    var x_scale = d3.time.scale()
        .domain(x_extent)
        .range([0,width]);

    console.log("3")

    var y_scale = d3.scale.linear()
        .domain([0,y_extent[1]])
        .range([height,0]);



    //Line
    var lineGen = d3.svg.line()
        .x(function (d) {
            return x_scale(d[xaxis_param]);
        })
        .y(function (d) {
            return y_scale(d[yaxis_param]);
        });
    var myChart = d3.select('body').append('svg')
                    .style('background', '#E7E0CB')
                    .attr('width', width + margin.left + margin.right)
                    .attr('height', height + margin.top + margin.bottom)
                    .append('g')
                    .attr('transform', 'translate('+ margin.left +', '+ margin.top +')');
            myChart
                    .append('svg:path')
                    .datum(data)
                    .attr('class', 'line')
                    .attr("d",lineGen)
                    .attr('stroke', color_code)
                    .attr('stroke-width', 1)
                    .attr('fill', 'none');


    var legend = myChart.append("g")
          .attr("class", "legend")
          .attr("transform", "translate(" + 5 + "," + (height - 25) + ")")

        legend.append("rect")
          .style("fill", color_code)
          .attr("width", 20)
          .attr("height", 20);

        legend.append("text")
          .text(yaxis_param)
          .attr("x", 25)
          .attr("y", 12);

    var vGuideScale = d3.scale.linear()
        .domain([0,y_extent[1]])
        .range([height, 0])

    var vAxis = d3.svg.axis()
        .scale(vGuideScale)
        .orient('left')
        .ticks(5)


    var hAxis = d3.svg.axis()
        .scale(x_scale)
        .orient('bottom')
        .ticks(d3.time.minute, 5);

  myChart.append("g")
      .attr("class", "x axis")
      .attr("transform", "translate(0," + height + ")")
      .call(hAxis);

  myChart.append("g")
      .attr("class", "y axis")
      .call(vAxis)


}

我目前难以接受两个问题。

a。)我必须在每天结束时放置垂直标记。如何放置垂直线以显示从一天到另一天的这些过渡(标记)(只是一条简单的黑色垂直线会做什么?

b。)我们可以处理丢失的数据,假设我没有获得一天的数据,我可以在那段时间内获得空白并立即绘制第二天的数据。 (这个并不重要)?

1 个答案:

答案 0 :(得分:1)

这是一个有效的jsfiddle:https://jsfiddle.net/kmandov/d61gtadm/3/

这是你如何达到预期效果的方法:

问题a。)每天的垂直刻度:

首先,创建一个新的主轴并将tickSize设置为-height,这样刻度就会一直显示在图表中:

var majorAxis = d3.svg.axis()
  .scale(x_scale)
  .orient('bottom')      
  .ticks(d3.time.day, 1)
  .tickSize(-height);    

然后创建相应的svg元素:

  myChart.append("g")
      .attr("class", "x axis major")
      .attr("transform", "translate(0," + height + ")")
      .call(majorAxis);  

然后删除主要标记的标签(您不希望它们重叠):

.axis.major text {
  display: none;
}

这是M. Bostock本人的一个很好的例子:http://bl.ocks.org/mbostock/4349486

问题B.)缺少数据

在行上设置.defined()

var lineGen = d3.svg.line()
    .defined(function(d) { return d[yaxis_param]; })    
    .x(function (d) {
        return x_scale(d[xaxis_param]);
    })
    .y(function (d) {
        return y_scale(d[yaxis_param]);
    });

以下是有关如何处理数据中的差距的示例:http://bl.ocks.org/mbostock/3035090