我正在可视化显示给定城市中最常见的音乐会类型。目前,我正在使用d3面积图显示数据。

javascript - 用d3模仿音频波形-LMLPHP

为了使可视化在主题上更加合适,我认为我会尝试使其看起来类似于音频波形,而这正是我遇到的绊脚石。

目前,我仍在使用沿X轴镜像的面积图,当数据在相当长的时间内散布时,这对于某些城市来说看起来不错。但是,在看有很多事件的大城市时,它看起来并不正确。

在这里看起来还可以:
javascript - 用d3模仿音频波形-LMLPHP

这里不是很好:
javascript - 用d3模仿音频波形-LMLPHP

我想我想做的是在面积图的边界内绘制较小的矩形,首先我以为可以使用SVG面积作为遮罩,但是矩形的顶部最终会倾斜...

还考虑只为每个数据点制作一个带有多个条形图的条形图,但我认为这会导致每个点之间的巨大变化。我仍然希望从面积/折线图中得到的数据点之间保持倾斜。

任何人有任何建议吗?我的目标是使可视化如下所示:

javascript - 用d3模仿音频波形-LMLPHP

javascript - 用d3模仿音频波形-LMLPHP

最佳答案

一种方法是不使用数据来创建图表,而使用创建锯齿状线性比例x-> y。接下来,生成所需数量的矩形,并将其索引映射到x位置。休息很容易-遍历索引,将它们映射到x,将获得的x映射到y,就可以开始了。



<!DOCTYPE html>
<head>
  <meta charset="utf-8">
  <script src="https://d3js.org/d3.v4.min.js"></script>
  <style>
    body { margin:0;position:fixed;top:0;right:0;bottom:0;left:0; }
  </style>
</head>

<body>
  <script>

    var data = [{
      x: 1,
      y: 2
    }, {
      x: 5,
      y: 10
    }, {
      x: 15,
      y: 5
    }, {
      x: 20,
      y: 13
    }, {
      x: 25,
      y: 4
    }];

    var rectCount = 8;

    var yScale = d3.scaleLinear()
    	.domain(data.map(function(d){ return d.x; }))
    	.range(data.map(function(d){ return d.y; }));

    var xScale = d3.scaleBand()
    	.domain(d3.range(rectCount))
    	.paddingInner(0.5)
    	.range([d3.min(data, function(d) {return d.x; }),
              d3.max(data, function(d) {return d.x; })]);

    var svg = d3.select("body").append("svg")
      .attr("width", 100)
      .attr("height", 100)
    	.attr('viewBox', '-5 -20 35 40');

    var chartData = d3.range(rectCount).map(function(i){
      var x = xScale(i);
      var width = xScale.bandwidth();
      var y = yScale(x);
      var height = y*2;
      return {
        x: x,
        y: y,
        width: width,
        height: height
      };
    });

    svg.selectAll('rect')
    	.data(chartData)
    .enter()
    	.append('rect')
    	.attr('x', function(d) { return d.x; })
    	.attr('y', function(d) { return -d.y; })
    	.attr('width', function(d) { return d.width; })
    	.attr('height', function(d) { return d.height; })

  </script>
</body>

关于javascript - 用d3模仿音频波形,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54864881/

10-09 16:42