Javascript 如何使用d3.js以包含毫秒的时间格式缩放图形的x轴?

Javascript 如何使用d3.js以包含毫秒的时间格式缩放图形的x轴?,javascript,d3.js,graph,axis,Javascript,D3.js,Graph,Axis,我想通过使用csv数据使用d3.js生成热图。对于热图绘制,我尝试设置x轴、y轴和z轴。但我在设置图表的x轴时遇到了一些问题 示例csv数据: var csv_data = "date,bucket,count\n07:31:01 001,10000,12\n07:31:01 119,50000,13\n07:31:01 128,60000,53\n07:31:01 200,90000,24\n07:31:01 555,75000,56"; 程序代码- <script> v

我想通过使用csv数据使用d3.js生成热图。对于热图绘制,我尝试设置x轴、y轴和z轴。但我在设置图表的x轴时遇到了一些问题

示例csv数据:

var csv_data = "date,bucket,count\n07:31:01 001,10000,12\n07:31:01 119,50000,13\n07:31:01 128,60000,53\n07:31:01 200,90000,24\n07:31:01 555,75000,56";
程序代码-

    <script>
var margin = {top: 20, right: 90, bottom: 30, left: 50},
    width = 960 - margin.left - margin.right,
    height = 500 - margin.top - margin.bottom;


var parseDate = d3.time.format("%Y-%m-%d").parse,
    formatDate = d3.time.format("%b %d");

//
var x = d3.time.scale().range([0, width]),
    y = d3.scale.linear().range([height, 0]),
    z = d3.scale.linear().range(["white", "steelblue"]);

// The size of the buckets in the CSV data file.
// This could be inferred from the data if it weren't sparse.
var xStep = 864e5,
    yStep = 100;

var svg = d3.select("body").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 + ")");

    var csv_data = "date,bucket,count\n07:31:01 001,10000,12 005\n07:31:01 119,50000,13\n07:31:01 128,60000,53";

    var buckets = d3.csv.parse(csv_data);
    buckets.forEach(function(d) {
        d.date = d.date;
        d.bucket = +d.bucket;
        d.count = +d.count;
    });

    x.domain(d3.extent(buckets, function(d) { return d.date; }));
    y.domain(d3.extent(buckets, function(d) { return d.bucket; }));
    z.domain([0, d3.max(buckets, function(d) { return d.count; })]);

    // Extend the x- and y-domain to fit the last bucket.
    // For example, the y-bucket 3200 corresponds to values [3200, 3300].
    x.domain([x.domain()[0], +x.domain()[1] + xStep]);
    y.domain([y.domain()[0], y.domain()[1] + yStep]);

    // Display the tiles for each non-zero bucket.
    svg.selectAll(".tile")
      .data(buckets)
      .enter().append("rect")
      .attr("class", "tile")
      .attr("x", function(d) { return x(d.date); })
      .attr("y", function(d) { return y(d.bucket + yStep); })
      .attr("width", x(xStep) - x(0))
      .attr("height",  y(0) - y(yStep))
      .style("fill", function(d) { return z(d.count); });

  // Add a legend for the color values.
  var legend = svg.selectAll(".legend")
      .data(z.ticks(6).slice(1).reverse())
    .enter().append("g")
      .attr("class", "legend")
      .attr("transform", function(d, i) { return "translate(" + (width + 20) + "," + (20 + i * 20) + ")"; });

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

  legend.append("text")
      .attr("x", 26)
      .attr("y", 10)
      .attr("dy", ".35em")
      .text(String);

  svg.append("text")
      .attr("class", "label")
      .attr("x", width + 20)
      .attr("y", 10)
      .attr("dy", ".35em")
      .text("Count");

  // Add an x-axis with label.
  svg.append("g")
      .attr("class", "x axis")
      .attr("transform", "translate(0," + height + ")")
      .call(d3.svg.axis().scale(x).orient("bottom"))
    .append("text")
      .attr("class", "label")
      .attr("x", width)
      .attr("y", -6)
      .attr("text-anchor", "end")
      .text("Time");

  // Add a y-axis with label.
  svg.append("g")
      .attr("class", "y axis")
      .call(d3.svg.axis().scale(y).orient("left"))
    .append("text")
      .attr("class", "label")
      .attr("y", 6)
      .attr("dy", ".71em")
      .attr("text-anchor", "end")
      .attr("transform", "rotate(-90)")
      .text("Latency");

    </script>

var margin={顶部:20,右侧:90,底部:30,左侧:50},
宽度=960-margin.left-margin.right,
高度=500-margin.top-margin.bottom;
var parseDate=d3.time.format(“%Y-%m-%d”).parse,
formatDate=d3.time.format(“%b%d”);
//
var x=d3.time.scale().range([0,width]),
y=d3.刻度.线性().范围([高度,0]),
z=d3.刻度.线性().范围([“白色”,“钢蓝色]);
//CSV数据文件中存储桶的大小。
//如果数据不是稀疏的,就可以从中推断出来。
var xStep=864e5,
yStep=100;
var svg=d3.选择(“正文”).追加(“svg”)
.attr(“宽度”,宽度+边距。左侧+边距。右侧)
.attr(“高度”,高度+边距。顶部+边距。底部)
.附加(“g”)
.attr(“转换”、“平移”(+margin.left+)、“+margin.top+”);
var csv_data=“日期,桶,计数\n07:31:01 00110000,12 005\n07:31:01 11950000,13\n07:31:01 12860000,53”;
var bucket=d3.csv.parse(csv_数据);
bucket.forEach(函数(d){
d、 日期=d.日期;
d、 铲斗=+d.铲斗;
d、 计数=+d.count;
});
x、 域(d3.extent(bucket,函数(d){返回d.date;}));
y、 域(d3.extent(bucket,函数(d){returnd.bucket;}));
z、 域([0,d3.max(bucket,函数(d){返回d.count;})];
//扩展x域和y域以适合最后一个桶。
//例如,y形铲斗3200对应于值[32003300]。
x、 域([x.domain()[0],+x.domain()[1]+xStep]);
y、 域([y.domain()[0],y.domain()[1]+yStep]);
//显示每个非零桶的平铺。
svg.selectAll(“.tile”)
.数据(桶)
.enter().append(“rect”)
.attr(“类别”、“瓷砖”)
.attr(“x”,函数(d){返回x(d.date);})
.attr(“y”,函数(d){返回y(d.bucket+yStep);})
.attr(“宽度”,x(x步)-x(0))
.attr(“高度”,y(0)-y(yStep))
.style(“fill”,函数(d){返回z(d.count);});
//为颜色值添加图例。
var legend=svg.selectAll(“.legend”)
.data(z.ticks(6.slice(1.reverse())
.enter().append(“g”)
.attr(“类”、“图例”)
.attr(“transform”,函数(d,i){return“translate”(+(width+20)+)”,“+(20+i*20)+”);};
图例。追加(“rect”)
.attr(“宽度”,20)
.attr(“高度”,20)
.样式(“填充”,z);
图例。追加(“文本”)
.attr(“x”,26)
.attr(“y”,10)
.attr(“dy”,“.35em”)
.文本(字符串);
svg.append(“文本”)
.attr(“类别”、“标签”)
.attr(“x”,宽度+20)
.attr(“y”,10)
.attr(“dy”,“.35em”)
.文本(“计数”);
//添加带有标签的x轴。
svg.append(“g”)
.attr(“类”、“x轴”)
.attr(“变换”、“平移(0)”、“高度+”)
.call(d3.svg.axis().scale(x.orient(“底部”))
.append(“文本”)
.attr(“类别”、“标签”)
.attr(“x”,宽度)
.attr(“y”,-6)
.attr(“文本锚定”、“结束”)
.文本(“时间”);
//添加带有标签的y轴。
svg.append(“g”)
.attr(“类”、“y轴”)
.call(d3.svg.axis().scale(y).orient(“left”))
.append(“文本”)
.attr(“类别”、“标签”)
.attr(“y”,6)
.attr(“dy”,“.71em”)
.attr(“文本锚定”、“结束”)
.attr(“变换”、“旋转(-90)”)
.文本(“延迟”);
当前图形显示如下:

var csv_data = "date,bucket,count\n07:31:01 001,10000,12\n07:31:01 119,50000,13\n07:31:01 128,60000,53\n07:31:01 200,90000,24\n07:31:01 555,75000,56";


如何在字符串中设置包含数据的图形的x轴?这里我遗漏了什么?

x轴表示时间刻度。您需要传入有效的日期对象,而不是字符串。在您的特定示例中,这将成为:

buckets.forEach(function(d) {
  d.date = timeFormat.parse(d.date);
  d.bucket = +d.bucket;
  d.count = +d.count;
});
其中,timeFormat是格式化程序:

var timeFormat = d3.time.format('%H:%M:%S %L');
要分析毫秒,可以使用:

%L—十进制数形式的毫秒[000999]

在CSV数据中,日期应遵循指定的格式。例如:

07:31:01 001,10000,12005
13:34:01 119,50000,13
17:39:01 128,60000,53
以下是一份工作报告:


@kmandov-你的JSFIDLE在热图上没有显示任何蓝色记号?它只显示x、y和z轴。@kmandov-实际上你需要看到我的问题,然后你才能理解我想做什么。[