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?
nvd3.js 图表 ajax 数据重绘 - 缺少悬停效果 + 前 yAxis 比例