NVD3,在加载新图表之前清除 svg

Posted

技术标签:

【中文标题】NVD3,在加载新图表之前清除 svg【英文标题】:NVD3, Clear svg before loading new chart 【发布时间】:2014-04-22 12:36:19 【问题描述】:

我在同一个 svg 中调用了几个不同的 NVD3 图表。 我使用按钮来调用函数,每个函数都包含一个使用自己数据的新图表。

有没有办法在不删除的情况下清除我的单个 svg? 我想按一个按钮来调用我的图表,但在加载新图表之前清除 svg。

使用这种图表时这不是问题...例如,调用两个multibarhorizontal 图表只会更新形状,这很好。 问题是加载两个不同的图表,如折线和条形图。

提前致谢

EDIT - 答案必须类似于 d3.select("svg").remove() 但这只是删除 svg。我只想清除它。

【问题讨论】:

你试过d3.selectAll("svg > *").remove()吗? 这就是答案,它有效,感谢 Lars Kotthoff。 太好了,我会添加这个作为参考答案。 if "chart.useInteractiveGuideline(true);"已启用,即使情节已被删除,旧指南仍然存在,有人知道如何修复吗? 【参考方案1】:

您可以使用 "svg > *" 选择器选择 SVG 下方的所有元素,即要删除所有这些元素,请这样做

d3.selectAll("svg > *").remove();

【讨论】:

如何删除图表随附的相关工具提示?每次我绘制新图表时似乎都会附加更多工具提示 @FinbarMaginn 这完全取决于您如何实现工具提示。我建议您就此提出一个单独的问题。【参考方案2】:

这对我有用:

var svg = d3.select("svg");
svg.selectAll("*").remove();

【讨论】:

【参考方案3】:

如果您正在开发具有多个显示不同 d3 图表的小部件的仪表板,请使用以下

d3.selectAll("#d3-donutChart > *").remove(); 

这只会清除特定图表,不会清除网页中的所有 svg。

在订阅 Angular 2 中的数据后添加此行。

【讨论】:

【参考方案4】:

这是对我有用的。

d3.selectAll("svg").remove();

【讨论】:

【参考方案5】:

在创建按钮后放上这段代码

$("svg").remove()

【讨论】:

【参考方案6】:
For Re-Drawing the D3 Graphs by clearing the existing sketch and updating.
<body>
...
<input name="reDraw" type="button" value="Re-Draw" onclick="reDraw('data2.csv')" />
...

<script>

var margin = top: 20, right: 20, bottom: 30, left: 40,
    width = 960 - margin.left - margin.right,
    height = 500 - margin.top - margin.bottom;

var x0 = d3.scale.ordinal()
    .rangeRoundBands([0, width], .1);

var x1 = d3.scale.ordinal();

var y = d3.scale.linear()
    .range([height, 0]);

var color = d3.scale.ordinal().range(["#98abc5", "#8a89a6", "#7b6888", "#6b486b", "#a05d56", "#d0743c", "#ff8c00"]);

var xAxis = d3.svg.axis()
    .scale(x0)
    .orient("bottom");

var yAxis = d3.svg.axis()
    .scale(y)
    .orient("left")
    .tickFormat(d3.format(".2s"));

//d3.select('#chart svg')

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 updateData = function(getData)

    d3.selectAll('svg > g > *').remove();

    d3.csv(getData, function(error, data) 
      if (error) throw error;

      var ageNames = d3.keys(data[0]).filter(function(key)  return key !== "State"; );

      data.forEach(function(d) 
        d.ages = ageNames.map(function(name)  return name: name, value: +d[name]; );
      );

      x0.domain(data.map(function(d)  return d.State; ));
      x1.domain(ageNames).rangeRoundBands([0, x0.rangeBand()]);
      y.domain([0, d3.max(data, function(d)  return d3.max(d.ages, function(d)  return d.value; ); )]);

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

      svg.append("g")
          .attr("class", "y axis")
          .call(yAxis)
        .append("text")
          .attr("transform", "rotate(-90)")
          .attr("y", 6)
          .attr("dy", ".71em")
          .style("text-anchor", "end")
          .text("Population");

      var state = svg.selectAll(".state")
          .data(data)
        .enter().append("g")
          .attr("class", "state")
          .attr("transform", function(d)  return "translate(" + x0(d.State) + ",0)"; );

      state.selectAll("rect")
          .data(function(d)  return d.ages; )
        .enter().append("rect")
          .attr("width", x1.rangeBand())
          .attr("x", function(d)  return x1(d.name); )
          .attr("y", function(d)  return y(d.value); )
          .attr("height", function(d)  return height - y(d.value); )
          .style("fill", function(d)  return color(d.name); );

      var legend = svg.selectAll(".legend")
          .data(ageNames.slice().reverse())
        .enter().append("g")
          .attr("class", "legend")
          .attr("transform", function(d, i)  return "translate(0," + i * 20 + ")"; );

      legend.append("rect")
          .attr("x", width - 18)
          .attr("width", 18)
          .attr("height", 18)
          .style("fill", color);

      legend.append("text")
          .attr("x", width - 24)
          .attr("y", 9)
          .attr("dy", ".35em")
          .style("text-anchor", "end")
          .text(function(d)  return d; );

    );



updateData('data1.csv');

</script>
</body>

【讨论】:

在您的文件夹中使用 data1.csv 和 data2.csv 试试上面的代码。谢谢, 这个问题在两年前就得到了充分的回答。这真的没有添加任何东西。 d3.selectAll('svg > g > *').remove(); 这是实际答案哥们 d3.selectAll('svg > g > *').remove();

以上是关于NVD3,在加载新图表之前清除 svg的主要内容,如果未能解决你的问题,请参考以下文章

清除之前绘制的图表 MPAndroidChart - Android?

去除IE10自带的清除按钮

nvd3.js 图表 ajax 数据重绘 - 缺少悬停效果 + 前 yAxis 比例

生成新单元格时清除集合视图单元格(iOS7 - AFNetworking)

斯威夫特:清除 UIView

如何重启活动并清除玩家状态?