javascript - D3 过渡。在折线图上使用多条线,并希望在按下按钮时在线之间平滑过渡

标签 javascript svg d3.js

我有一个用 d3 编写的小折线图,我希望它的行为方式是在打开该图时可以看到一条 svg 线路径,然后当用户单击一个按钮时,我会就像现有的 svg 线路径一样平滑地过渡到代表新的且略有不同的数据集的线路径。

我可以很好地转换常规属性,但它正在转换让我难过的“d”属性。代码在这里

var w = 500;
var h = 300;
var padding = 30;

var dataset = [
  [1.3, 2015],
  [2.1, 2036.25],
  [3.4, 2057.5],
  [3.5, 2057.5],
  [4, 2100]
];

//Create scale functions
var yScale = d3.scale.linear()
  .domain([0, 4])
  .range([h - padding, padding]);

var xScale = d3.scale.linear()
  .domain([2015, 2100])
  .range([padding, w - padding * 2]);

//Define X axis
var xAxis = d3.svg.axis()
  .scale(xScale)
  .orient("bottom");

//Define Y axis
var yAxis = d3.svg.axis()
  .scale(yScale)
  .orient("left");

//Create SVG element
var svg = d3.select("body")
  .append("svg")
  .attr("width", w)
  .attr("height", h);

var lineFunc = d3.svg.line()
  .x(function(d) {
    return xScale(d[1]);
  })
  .y(function(d) {
    return yScale(d[0]);
  })
  .interpolate('linear');

svg.append('svg:path')
  .transition()
  .attr('d', lineFunc(dataset))
  .attr('class', 'dataline');


//Create X axis
svg.append("g")
  .attr("class", "axis")
  .attr("transform", "translate(0," + (h - padding) + ")")
  .call(xAxis);

//Create Y axis
svg.append("g")
  .attr("class", "axis")
  .attr("transform", "translate(" + padding + ",0)")
  .call(yAxis);

//create event listener and data reset functions
d3.select("button")
  .on("click", function() {
    dataset = [
      [1, 2015],
      [2.05, 2036.25],
      [3.25, 2057.5],
      [3.3, 2057.5],
      [3.7, 2100]
    ];
    var dynamoBar = svg.append('svg:path')
      .transition()
      .attr("d", lineFunc(dataset))
      .attr("class", "dataline");
  })
        .axis path,
        .axis line {
          fill: black;
          stroke: none;
          shape-rendering: crispEdges;
        }

        .axis text {
          font-family: sans-serif;
          font-size: 11px;
        }

        .dataline {
          stroke: purple;
          stroke-width: 1;
          fill: none;
        }
<button id="button">Try it</button>
<script type="text/javascript" src="http://d3js.org/d3.v3.min.js"></script>

最佳答案

当您选择要使用新数据转换的行时(单击按钮后),您正在创建一个新的路径:

var dynamoBar = svg.append('svg:path')...

而是选择现有路径:

var dynamoBar = svg.select('.dataline')...

请参阅此 fiddle :http://jsfiddle.net/henbox/L2hehcry/

关于javascript - D3 过渡。在折线图上使用多条线,并希望在按下按钮时在线之间平滑过渡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26323011/

相关文章:

html - 相当于常规 html 元素中的 text-anchor

javascript - 在 D3 V4 中添加自定义画笔 handle ?

javascript - d3从mysql数据库导入数据返回 "undefined"

javascript - 当对象内部出现 "get"函数时,Javascript 语法是什么?

svg - Wkhtmltopdf无法打印SVG路径( Highcharts )

javascript - 如何计算关系中元组的数量(Sequelize)

html - 如何在 HTML5 中正确且响应式地缩放 SVG?

javascript - 有没有一种简单的方法可以在 d3.csvParse 遇到空行时停止它?

javascript - 公开 JavaScript 源映射有什么合法的安全问题吗?

javascript - 验证更改时的 bootstrap-datepicker 字段