【问题标题】:D3JS oscillating bubblesD3JS 振荡气泡
【发布时间】:2017-04-29 05:58:18
【问题描述】:

这对某些人来说可能微不足道,但我是 D3JS 的新手。

我正在尝试绘制两个不透明度相对于数组发生变化的静态气泡。我可以绘制气泡,但不能使它们的不透明度不断变化。我正在使用transitiondelay 并且不透明度只能更改一次。这是我的代码示例

(function() {

  var dropsize = 100;
  var gapsize = 20;
  var osc = [[1, 1],[0.5, 0.5],[0, 0],[0.5, 0.5],[1, 1],[0.5, 0.5],[0, 0],[0.5, 0.5]];
  var radius = dropsize / 2;
  var h = 100;
  var w = (4 * radius + 3 * gapsize);
  var svg = d3.select("#chart").append("svg");
  var svg = d3.select("body")
    .append("svg")
    .attr("width", w)
    .attr("height", h)
    .style("background-color", "teal");
  var circles = svg.selectAll("circle")
    .data([radius, 3 * radius])
    .enter()
    .append("circle");
  circles.attr("cx", function(d, i) {
      return d + (i + 1) * gapsize;
    })
    .attr("cy", h / 2)
    .attr("r", function(d, i) {
      return radius;
    })
    .attr("fill", "orange")
    .attr("class", "droplet")
    .attr("id", function(d, i) {
      return "c_" + (i + 1);
    });
  d3.select("#c_1")
    .data(osc)
    .transition().delay(function(d, i) {
      return i * 1000;
    })
    .duration(1000)
    .attr("opacity", function(d) {
      return d[0]
    });
})();

看笔Bubble Chart with D3.js using Realtime Data

【问题讨论】:

    标签: javascript html css d3.js bubble-chart


    【解决方案1】:

    我假设您所说的连续是指平滑过渡,而不是立即从一种不透明状态切换到另一种不透明状态,而不是重复过渡。

    您首先需要在创建圆圈时为其设置初始不透明度:

    .attr("opacity", 0)
    

    然后使用d3.selectAll 而不是d3.select,或者更好的变量circles

    ...
    
    circles
      .data(osc)
      .transition()                        
      .delay(function(d,i){ return i*1000; })
      .duration(1000)
      .attr("opacity",function(d){ return d[0] });
    

    【讨论】:

    • 主要问题是它们没有不透明性可供过渡。所以你需要给他们那个初始值
    • 看我的例子:它没有不透明度的初始值,但它可以工作。除此之外,selectAllselecthere 没有区别,特别是因为 OP 是按 ID 选择的(所以,selectAll 没有意义)。
    • @GerardoFurtado 我在他的 CodePen 中运行了 OP 代码,直到我添加了初始不透明度,它才起作用。我没有查看您的代码,但您可能会发现没有起始值是特定于浏览器的。另外,我对 OP 正在寻找的内容的阅读与您的不同,在我的阅读中,selectAll 非常有意义
    【解决方案2】:

    如果“连续”表示要无限运行过渡,请使用on("end")再次调用过渡函数。

    这是一个例子:

    var toggle;
    
    var data = [0, 1];
    
    transition();
    
    function transition() {
        toggle ^= 1;
        d3.select("circle")
            .transition()
            .duration(1000)
            .style("opacity", data[toggle])
            .on("end", transition);
    }
    <script src="https://d3js.org/d3.v4.min.js"></script>
    <svg>
    	<circle cx="100" cy="100" r="50"></circle>
    </svg>

    【讨论】:

    • 这很好用。谢谢@Gerardo Furtado。这两个气泡应该能够以不同的不透明度振荡。所以一对分别包含每个气泡的不透明度
    • 现在更有意义了!请记住,在我的代码中,数据数组中的两个值是不透明度的两个振荡值。
    • 是的,知道了。但是,由于将来的一些应用,我选择使用setInterval,如下tic = new Date(); setInterval(function () { dt = Math.round((new Date() - tic)/50) % osc.length; d3.select("#c_1").transition().duration(100).style("opacity",function(){ return osc[dt][0]}); d3.select("#c_2").transition().duration(100).style("opacity",function(){ return osc[dt][1]}); })
    • @GerardoFurtado 通过对要读入数组的索引进行异或运算来很好地实现切换。这优雅地结合了开关和数据访问。
    猜你喜欢
    • 2013-12-28
    • 2018-03-28
    • 2016-02-13
    • 2021-12-16
    • 1970-01-01
    • 1970-01-01
    • 2018-04-11
    • 2015-11-30
    • 1970-01-01
    相关资源
    最近更新 更多