3

私はd3とJavaScriptを初めて使用するので、建設的なフィードバックをいただければ幸いです。2つのソース(GISSとHAD)から1880年から2010年までの気候データ(温度異常)をプロットすることを含むd3を学習するための実践例をモックアップしています。これまで、このデータを使用してd3で複数の折れ線グラフを生成しました。コードとデータはこちらhttps://gist.github.com/natemiller/0c3659e0e6a0b77dabb0

この例では、データは元々灰色でプロットされていますが、マウスオーバーすると各線の色が異なります。

2つの機能を追加したいと思います。

  1. マウスオーバー時に、マウスオーバーした行が上になるように行を並べ替えて、基本的に行を並べ替えたいと思います。これには基本的にSVGを再プロットする必要があることを読み、これに沿ってコードを試しました

    source.append("path")
    .attr("class", "line")
    .attr("d", function(d) { return line(d.values); })
    .style("stroke", "lightgrey")
    .on("mouseover", function() {
      if (active) active.classed("highlight", false);
      active = d3.select(this.parentNode.appendChild(this))
          .classed("highlight", true);
    })
          .style("stroke",function(d) {return color(d.name);})
    .on("mouseout", function(d) {
    d3.select('#path-' + d.name)
    .transition()
    .duration(750)
    .style("stroke", "lightgrey")
    })
    .attr("id", function(d, i) { return "path-" + d.name; });
    

ここで、.on( "mouseover" ...コードは、現在の "moused-over"行を強調表示することを目的としています。私の例では機能していないようです。すべての行が最初に強調表示されてから、mouseover/で灰色に変わります。マウスアウト。誰かが私のコードを更新する方法を特定するのを手伝ってくれたら、マウスオーバーで行を並べ替えることができます。

  1. 線またはそのラベルのいずれかをマウスで押すと、線とラベルの色が更新されるように、線にラベルを付けることで遊んでいます。idを使って少し遊んだことがありますが、これまでのところ、テキストと線の両方で色を変更することはできません。1.線の上にマウスを置いてテキストの色を変更します。2。テキストの上にマウスを置いて線の色を変更します。2。線の上にマウスを置いて線を変更しますが、線とテキストの両方はありません。どちらかをマウスオーバーすると色が変わります。これは(IDを使用して)開始として機能するコードのセクションですが、パスを指定するだけで、テキストとパスを指定しないため、完全には機能しません。両方をd3.select('#path-'、'#text-' ...とそのバリエーションに追加しようとしましたが、機能しないようです。

    source.append("path")
    .attr("class", "line")
    .attr("d", function(d) { return line(d.values); })
    .style("stroke", "lightgrey")
    .on("mouseover", function(d){
    d3.select(this)
    .style("stroke",function(d) {return color(d.name);});
    })
    .on("mouseout", function(d) {
    d3.select('#path-' + d.name)
    .transition()
    .duration(750)
    .style("stroke", "lightgrey")
    })
    .attr("id", function(d, i) { return "path-" + d.name; });
    
    
    
    source.append("text")
    .datum(function(d) { return {name: d.name, value: d.values[d.values.length - 15]}; })
    .attr("transform", function(d) { return "translate(" + x(d.value.date) + "," + y(d.value.temperature) + ")"; })
    .attr("x", 5)
    .attr("dy", ".35em")
    .style("stroke", "lightgrey")
    .on("mouseover", function(d){
    d3.select('#path-' + d.name)
    .style("stroke",function(d) {return color(d.name);});
     })
    .on("mouseout", function(d) {
    d3.select('#path-' + d.name)
    .transition()
    .duration(750)
    .style("stroke", "lightgrey")
    })
    .text(function(d) { return d.name; })
    .attr("font-family","sans-serif")
    .attr("font-size","11px")
    
    .attr("id", function(d, i) { return "text-" + d.name; });
    

よろしくお願いします。私はd3とこのヘルプサーブに不慣れです。現時点では学習曲線が急ですが、この例とコードがかなり明確であることを願っています。それがない場合は、どうすれば改善できるかを教えてください。質問を再投稿できます。

本当にありがとう、

ネイト

4

1 に答える 1

1

Chris Viauは、d3Googleグループでこの質問に良い答えを提供しました。 https://groups.google.com/forum/?fromgroups=#!topic/d3-js/-Ra66rqHGk4

秘訣は、パスのg親を選択して、他のパスと並べ替えることです。

this.parentNode.parentNode.appendChild(this.parentNode);

これにより、現在の選択範囲のコンテナ「g」が他のすべての「g」の上に追加されます。

これは他の多くのインスタンスでも役立つことがわかりました。

クリスありがとう!

于 2013-03-08T20:20:00.887 に答える