0

d3 を使用して、一連の svg 要素全体を特定の選択に追加する最良の方法は何ですか。たとえば...最初に四角形を追加します。

        tb.append("svg:rect")
        .attr("width", "18")
        .attr("height", "18")
        .attr("y", "9")
        .attr("x", (i * 20) + 5)
        .attr("rx", "4")
        .attr("ry", "4");

オプションに応じて、アイコンを追加したいと思います。アイコンは、一連のパス、四角形、または多角形である可能性があります。ただし、動的であり、オプションに基づいています。だから私は次のようなことをしたいと思います:

tb.append('<path d="M9.826,4.703C8.863,3.057,7.014,2.032,5.001,2.032c-2.012,0-3.861,1.024-4.829,2.671L0,5l0.173,0.299C1.141,6.944,2.99,7.968,5.001,7.968c2.012,0,3.862-1.023,4.825-2.669L10,5L9.826,4.703z M8.451,5.189C7.764,6.235,6.441,6.888,5,6.888c-1.438,0-2.762-0.652-3.453-1.698l-0.124-0.19l0.124-0.188C2.239,3.764,3.562,3.112,5,3.112c1.441,0,2.763,0.651,3.451,1.698l0.125,0.188L8.451,5.189z"/><circle cx="4.999" cy="5" r="1.905"/>');

また

tb.append('<polygon points="8.272,0 5.8,4.166 9,4.166 1.615,10 3.461,5 1,5 3.743,0.007"/>');

しかし、要素のタイプやさまざまな属性が入力されたときにわかりません。要素全体を文字列として挿入するだけのパターンはありますか? またはより良いパターン?

4

1 に答える 1

6

編集:以下に回答を入力しましたが、質問を読み直したところ、「動的でオプションに基づく」とは、アイコンの種類がデータに依存していることを実際に意味していたかどうかわかりません。誤解した場合はお知らせください。この回答を削除します....


dataArrayデータを構成するオブジェクトの配列であるとしましょう。

そして、次のようになります。

var selection = d3.selectAll('.icon').data(dataArray)

次に、あなたが求めているように聞こえるのは、条件付きで要素を作成することです。たとえば、データに応じて<rect>またはのいずれかです。<circle>理想的には、あなたが望むものは –– しかし d3 ではそれをさせません –– は:

selection.enter()
  .append(function(d) { // <-- doesn't work :(
    return d.type == 'round' ? 'circle' : 'rect';
  })
  .attr('class', 'icon');

つまり、.append()メソッドは関数を受け入れません。したがって、代わりに、次のことができます。

selection.enter()
  .append('g')
  .each(function(d, i) {
    var g = d3.select(this); // That's the svg:g we've just created
    if(d.type == 'round')
      g.append('circle')
    else
      g.append('rect')
  })
  .attr('class', 'icon');

DOM で得られるものは次のようなものです (もちろん、中身によって異なりますdataArray):

<svg>
  <g class="icon">
    <circle>
  </g>
  <g class="icon">
    <rect>
  </g>
  <g class="icon">
    <rect>
  </g>
  <g class="icon">
    <circle>
  </g>
于 2013-04-03T22:41:15.463 に答える