在D3 Javascript上将onclick链接添加到动画Y轴标签

时间:2019-12-27 21:43:11

标签: javascript d3.js onclick transition

我想在支持数据集之间转换的D3(V4)图表的Y轴上使标签超链接,以便链接将使用其各自的值执行数据集更新功能(例如,中间标签为'data2 ”,然后点击该标签,应会执行功能update(data2),将活动数据集切换为“ data2”)。我尝试使用.on(“ end”)功能来完成此操作(因为仅选择刻度并添加onclick处理程序似乎由于缺少刻度动画修饰而失败),如下面的代码所示,但未成功。我找不到任何相关示例。有人会对此提出建议吗?

var data1 = [
   {group: "data1", value: 3},
   {group: "data2", value: 14},
   {group: "data3", value: 8}
];
var data2 = [
   {group: "dataA", value: 7},
   {group: "datax", value: 1},
   {group: "datay", value: 18},
   {group: "dataD", value: 12},
   {group: "dataF", value: 20}
];
var data3 = [
   {group: "dataG", value: 13},
   {group: "dataH", value: 8}, 
];
var dataA = [
   {group: "data1", value: 3},
   {group: "data2", value: 8}, 
];

var dataD = [
   {group: "data1", value: 23},
   {group: "data2", value: 8}, 
]; 
var datax = [
   {group: "data1", value: 5},
   {group: "data2", value: 5}, 
]; 
var dataF = [
   {group: "dataf1", value: 5},
   {group: "dataf2", value: 15}, 
]; 
var margin = {top: 30, right: 30, bottom: 70, left: 60},
    width = 500 - margin.left - margin.right,
    height = 300 - margin.top - margin.bottom;
var svg = d3.select("#test")
  .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 y = d3.scaleBand()
  .range([ 0, height])
  .padding(0.2);
var yAxis = svg.append("g")
  .attr("class", "myYaxis")

var x = d3.scaleLinear()
  .range([ 0, width ])
var xAxis = svg.append("g")
   .attr("transform", "translate(0,0)")
 
function update(data) {
	if (typeof data == 'string'){
		data = this[data];
	}
	x.domain([0, d3.max(data, function(d) { return d.value }) ]);
	xAxis.transition().duration(1000).call(d3.axisTop(x))
	y.domain(data.map(function(d) { return d.group; }))
	
	yAxis.transition().duration(1000).call(d3.axisLeft(y));	
	var	ylinks = d3.selectAll('.myYaxis text');
	var ylExit = ylinks.exit().remove();
	ylinks
		.data(data)
		.style('cursor', 'pointer')
		.on('click', function (d, i) {
			var x = data[i].group;
			console.log('i is ' + i + ' x is ' + x);
			update(x);
		});
	ylinks.transition()
		
	    .duration(1000)
	    .style('cursor', 'pointer');
		
}
update(data1)
<script src="https://d3js.org/d3.v4.js"></script>
<div id="test"></div>

在遇到错误并在此处找到D3: .transition() not working with events的Gerardo Furtado的回复后,我能够创建之后的Y轴标签onclick事件。但是,一个问题(反映在所示的控制台消息中)是,y轴的selectAll标签作用域仅限于所有已加载数据集中构建的数据,而不仅仅是当前数据集,因此data [i]中的索引(i)引用了多余的元素而不是正确的元素(即,一旦单击了第一个数据集,链接就不再对应于标签)。为了解决这个问题,我可能需要删除每个新数据集负载上的链接,但是这样做没有任何成功。我已经更新了上面的代码并使其可运行。

0 个答案:

没有答案
相关问题