svg/d3中轴转换的语法

Sar*_*rah 15 javascript svg d3.js

我有一个非常基本的语法问题.我一直在学习d3,SVG和Javascript,主要是通过编辑别人的代码,这很有挑战性.

目标是在更新数据和基于数据的比例后更新y轴.我希望轴 - 刻度线和标签以及所有 - 转换为数据域.轴未更新.问题可能与范围有关,或者我引用了错误的SVG元素.(实际上有几个地块同时更新,但我只关注其中一个的轴.)

 
function makeYaxis (chart, scale, nticks, label, width, height, xmf, visName)
{
    var yAxis = d3.svg.axis()
    .scale(scale)
    .orient("left")
    .ticks(nticks);
    chart.append("svg:g")
    .attr("class","y axis")
    .append("g")
    .attr("transform","translate(60,1)") // fix magic #
    .call(yAxis);
    var xMove = xmf.yylMarginFactor * width - 1;
    var yMove = (((1 - xmf.xxbMarginFactor) * height + 
          xmf.xxtMarginFactor * height) / 2);
    chart.append("svg:text")
    .attr("class", visName + "xLabel")
    .attr("x", 0)
    .attr("y", 0)
    .attr("dy", "-2.8em")
    .text(label)
    .attr("transform", "rotate(-90) translate(-" + yMove + "," + xMove + ")");
}
function makeYscale (plotMargin, thedata, xmf)
{
    var dataMin = d3.min(thedata[0]);
    var dataMax = d3.max(thedata[0]);
    var yyMargin = d3.max([plotMargin * (dataMax - dataMin),0.05]);
    var yy = d3.scale.linear()
    .domain([dataMin - yyMargin, yyMargin + dataMax])
    .range([(1 - xmf.xxbMarginFactor) * height, xmf.xxtMarginFactor * height]);
    return yy;
}
// Set up this visualization
var chart = d3.select("#vis1")
  .append("svg:svg")
  .attr("class", "vis1chart")
  .attr("width", width)
  .attr("height", height);
var yy = makeYscale(plotMargin, thetas, xmf);
makeYaxis(chart, yy, nYTicks, "parameter", width, height, xmf, "vis1"); var points = chart.selectAll("circle.vis1points") .data(thetas) .enter().append("svg:circle") .attr("class", "vis1points") .attr("cx", function (d, i) { return xx(i); }) .attr("cy", function (d, i) { return yy(d); }) .attr("r", 3); points.transition() .attr("cx", function (d, i) { return xx(i); }) .attr("cy", yy) .duration(dur); vis1move(); function vis1move () { function movePoints () { var tmp = chart.selectAll(".vis1points").data(thetas[0], function (d, i) { return i; } ); var opa1 = points.style("stroke-opacity"); var opa2 = points.style("fill-opacity"); tmp .enter().insert("svg:circle") .attr("class", "vis1points") .attr("cx", function (d, i) { return xx(i); }) .attr("cy", yy) .attr("r", 3) .style("stroke-opacity", opa1) .style("fill-opacity", opa2); tmp.transition() .duration(10) .attr("cx", function (d, i) { return xx(i); }) tmp.exit() .transition().duration(10).attr("r",0).remove(); }; // (Code for updating theta, the data, goes here) // Update axes for this vis yy = makeYscale(plotMargin, thetas, xmf); var transition = chart.transition().duration(10); var yAxis = d3.svg.axis() .scale(yy) .orient("left") .ticks(4); transition.select("y axis").call(yAxis); movePoints(); // Previously had been before axis update (fixed) }

对不起,我不能得到这个独立的.

是对的transition.select.("y axis").call(yAxis)吗?这里有什么明显的东西吗?


编辑:为了简单起见,我现在有了

 // Update axes for this vis
    yy = makeYscale(plotMargin, thetas, xmf);
    var yAxis = d3.svg.axis().scale(yy);
    chart.select("y axis").transition().duration(10).call(yAxis);

我想知道我在第一个位置(in makeYaxis())创建轴的方式是否阻止我正确选择它.该yy功能在引擎盖下返回正确的值,数据点将被正确绘制和重新缩放.只是轴被"卡住了".

Sar*_*rah 7

根据meetamit的建议和这里的例子,我偶然发现了似乎是一个解决方案.

首先,在功能上makeYaxis(),我删除了该行.append("g").我还将类名更新为yaxis.该功能现在读取

function makeYaxis (chart, scale, nticks, label, width, height, xmf, visName)
{
    var yAxis = d3.svg.axis()
    .scale(scale)
    .orient("left")
    .ticks(nticks);
    chart.append("svg:g")
    .attr("class","yaxis") // note new class name
//  .append("g")
    .attr("transform","translate(60,1)") 
    .call(yAxis);
    // everything else as before
}

然后我在电话中添加了一段额外的时间select(".yaxis"):

chart.select(".yaxis").transition().duration(10).call(yAxis);
Run Code Online (Sandbox Code Playgroud)

如果有人能够向我解释为什么这个解决方案似乎有效,我将非常感激.

  • 啊,首先,我完全忽略了答案中缺失的时期.你明白为什么需要这段时间吗?这就是css选择器的工作原理.你正在选择具有`class ="yaxis"`的东西,因此选择器是`".yaxis"`就像你有`id ="yaxis"`选择器将是``#yaxis``.(你可以通过google搜索css选择器阅读更多内容).如果你想以前面的方式做,你要添加2个类,`.attr("class","y axis")`,你的select语句将是`select(".y.axis")`(每个班级的一个时期). (3认同)
  • 接下来,你删除的`.append("g")`导致yAxis被分配给第二个`g`(没有类),住在父`g`(有一个".yaxis"类)里面).第一次这样做很好.但是,在数据刷新之后,您将修改后的`yAxis`(和转换)应用于`chart.select(".yaxis")`,这是父组,而不是从被删除的`g`.这意味着没有办法对其进行过渡; 它不是相同的元素(它也可以解释为什么没有渲染任何东西,尽管我预计至少轴只能渲染w/o过渡). (3认同)
  • 谢谢.这非常有帮助. (2认同)