d3、複数のパスを更新

リチャード・モレイ

次のコードには、1つのd3.jsプロットに複数のパスがあります。最初のプロットが機能し、データセットが表示されていd0ます。ロード時には次のようになります。

ロード時に表示されます

d1ボタンを押しときにデータを表示したいので、次のようになります。

ボタンを押した後の外観

現在起こっていることは...何もありません。コンソールにエラーはなく、表示も変更されず、DOMも変更されていません(私にはわかりますか?)。

私は12のコード例とチュートリアルを経験しましたが、ここで何が問題になっているのかわかりません。どんな助けでも大歓迎です(特に私が概念的に欠けているものの説明がある場合)。ありがとう!

var d0 = [{
    id: "A",
    values: [{
      x: .25,
      y: .9
    }, {
      x: .75,
      y: 1
    }]
  },
  {
    id: "B",
    values: [{
      x: .25,
      y: .5
    }, {
      x: .8,
      y: .4
    }]
  },
  {
    id: "C",
    values: [{
      x: .1,
      y: .1
    }, {
      x: .9,
      y: .1
    }]
  }
]


var d1 = [{
    id: "A",
    values: [{
      x: 0,
      y: 1
    }, {
      x: 1,
      y: 1
    }]
  },
  {
    id: "B",
    values: [{
      x: 0,
      y: .5
    }, {
      x: 1,
      y: .5
    }]
  },
  {
    id: "C",
    values: [{
      x: 0,
      y: 0
    }, {
      x: 1,
      y: 0
    }]
  }
]

var svg = d3.select("svg")

var margin = {
  top: 20,
  right: 80,
  bottom: 30,
  left: 50
}
var width = svg.attr("width") - margin.left - margin.right
var height = svg.attr("height") - margin.top - margin.bottom

g = svg.append("g").attr("transform", "translate(" + margin.left + "," + margin.top + ")")

var scaleX = d3.scaleLinear().range([0, width]).domain([0, 1])
var scaleY = d3.scaleLinear().range([height, 0]).domain([0, 1])

g.append("g")
  .attr("class", "axis axis--x")
  .attr("transform", "translate(0," + height + ")")
  .call(d3.axisBottom(scaleX));

g.append("g")
  .attr("class", "axis axis--y")
  .call(d3.axisLeft(scaleY))

var line = d3.line()
  .x(function(d) {
    return scaleX(d.x)
  })
  .y(function(d) {
    return scaleY(d.y)
  });

var lineg = g.selectAll(".lineg")
  .data(d0)
  .enter()
  .append("g")
  .attr("class", "lineg");

lineg.append("path")
  .attr("class", "line")
  .attr("d", function(d) {
    return line(d.values)
  })

function update() {

  var i = g.selectAll(".lineg")
    .data(d1)

  i.enter()
    .append("g")
    .attr("class", "lineg")

  i.exit()
    .remove()

  g.selectAll(".line")
    .attr("d", function(d) {
      return line(d.values)
    })
}
.line {
  fill: none;
  stroke: steelblue;
  stroke-width: 1.5px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/6.2.0/d3.min.js"></script>
<svg width="500" height="300"></svg>
<br/>
<button onclick="update()">Change</button>

ルーベン・ヘルスルート

呼び出す.dataまたは呼び出すすべてのSVG要素.datumには、データオブジェクトへの内部参照があります。更新呼び出しでg、行を保持している要素のデータを更新しましたが、行自体のデータは更新していません。

私は次のコードでそれを行うことができました:

i.select(".line")
  .datum(function(d) {
    return d;
  })
  .attr("d", function(d) {
    return line(d.values)
  })

ここでは、iすでに正しいデータを提供している、新しく選択したグループから始めて、行を選択gし、関数を介して直接データムオブジェクトを渡します。このようにして、データムオブジェクトが更新され、呼び出しline(d.values)は実際にはのd1代わりにからのエントリを使用するようになりましたd0

var d0 = [{
    id: "A",
    values: [{
      x: .25,
      y: .9
    }, {
      x: .75,
      y: 1
    }]
  },
  {
    id: "B",
    values: [{
      x: .25,
      y: .5
    }, {
      x: .8,
      y: .4
    }]
  },
  {
    id: "C",
    values: [{
      x: .1,
      y: .1
    }, {
      x: .9,
      y: .1
    }]
  }
]


var d1 = [{
    id: "A",
    values: [{
      x: 0,
      y: 1
    }, {
      x: 1,
      y: 1
    }]
  },
  {
    id: "B",
    values: [{
      x: 0,
      y: .5
    }, {
      x: 1,
      y: .5
    }]
  },
  {
    id: "C",
    values: [{
      x: 0,
      y: 0
    }, {
      x: 1,
      y: 0
    }]
  }
]

var svg = d3.select("svg")

var margin = {
  top: 20,
  right: 80,
  bottom: 30,
  left: 50
}
var width = svg.attr("width") - margin.left - margin.right
var height = svg.attr("height") - margin.top - margin.bottom

g = svg.append("g").attr("transform", "translate(" + margin.left + "," + margin.top + ")")

var scaleX = d3.scaleLinear().range([0, width]).domain([0, 1])
var scaleY = d3.scaleLinear().range([height, 0]).domain([0, 1])

g.append("g")
  .attr("class", "axis axis--x")
  .attr("transform", "translate(0," + height + ")")
  .call(d3.axisBottom(scaleX));

g.append("g")
  .attr("class", "axis axis--y")
  .call(d3.axisLeft(scaleY))

var line = d3.line()
  .x(function(d) {
    return scaleX(d.x)
  })
  .y(function(d) {
    return scaleY(d.y)
  });

var lineg = g.selectAll(".lineg")
  .data(d0)
  .enter()
  .append("g")
  .attr("class", "lineg");

lineg.append("path")
  .attr("class", "line")
  .attr("d", function(d) {
    return line(d.values)
  })

function update() {
  var i = g.selectAll(".lineg")
    .data(d1)

  i.enter()
    .append("g")
    .attr("class", "lineg")

  i.exit()
    .remove()

  i.select(".line")
    .datum(function(d) {
      return d;
    })
    .attr("d", function(d) {
      return line(d.values)
    })
}
.line {
  fill: none;
  stroke: steelblue;
  stroke-width: 1.5px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/6.2.0/d3.min.js"></script>
<svg width="500" height="300"></svg>
<br/>
<button onclick="update()">Change</button>

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

複数のパスを1つのD3(SVG)にマージする

分類Dev

d3関数で複数のクラスを追加する

分類Dev

要素D3に複数のクラス名を追加する

分類Dev

D3ネストグループを持つ複数のパスに沿ったD3アニメーションマーカー

分類Dev

D3複数の円グラフの更新

分類Dev

d3に複数の「テキスト」要素を追加します

分類Dev

D3:グループ内の複数の要素でデータを更新する

分類Dev

グラフのd3更新パスと円

分類Dev

d3で棒グラフを更新して複数のグラフを生成する

分類Dev

d3で棒グラフを更新して複数のグラフを生成する

分類Dev

d3の角度:エラー:<パス>属性d:期待数「MNaN、25.384615384…」

分類Dev

複数の親を持つD3ツリーの表示

分類Dev

d3jsで複数のパスを選択する

分類Dev

svgおよびd3内のパスのスタイルを更新しています

分類Dev

d3チャート:d3チャートに複数のcssプロパティを設定する方法

分類Dev

d3サークルパッキング-複数行のラベルを印刷する

分類Dev

複数のデータソースを使用するとD3関数が機能しない

分類Dev

d3を使用してテキストの配列を複数のdivに追加する方法

分類Dev

複数の棒グラフのd3複数のy軸

分類Dev

D3:複数の線がある折れ線グラフのnull値をスキップします

分類Dev

d3グループSVG内の複数のテキスト要素をドラッグします

分類Dev

D3:クリックテキストの更新パターンを使用する方法は?

分類Dev

d3軸パスのストローク幅属性を取得

分類Dev

d3 javascript、svgパスの2点間の距離を取得

分類Dev

d3円グラフで複数行のテキストを作成できません

分類Dev

d3ツリーマップで複数のテキストを設定する方法は?

分類Dev

d3同じ関数から複数の属性を設定しますか?

分類Dev

D3 変更パスの y

分類Dev

D3で重複するパスを交互にまたは防止する

Related 関連記事

  1. 1

    複数のパスを1つのD3(SVG)にマージする

  2. 2

    d3関数で複数のクラスを追加する

  3. 3

    要素D3に複数のクラス名を追加する

  4. 4

    D3ネストグループを持つ複数のパスに沿ったD3アニメーションマーカー

  5. 5

    D3複数の円グラフの更新

  6. 6

    d3に複数の「テキスト」要素を追加します

  7. 7

    D3:グループ内の複数の要素でデータを更新する

  8. 8

    グラフのd3更新パスと円

  9. 9

    d3で棒グラフを更新して複数のグラフを生成する

  10. 10

    d3で棒グラフを更新して複数のグラフを生成する

  11. 11

    d3の角度:エラー:<パス>属性d:期待数「MNaN、25.384615384…」

  12. 12

    複数の親を持つD3ツリーの表示

  13. 13

    d3jsで複数のパスを選択する

  14. 14

    svgおよびd3内のパスのスタイルを更新しています

  15. 15

    d3チャート:d3チャートに複数のcssプロパティを設定する方法

  16. 16

    d3サークルパッキング-複数行のラベルを印刷する

  17. 17

    複数のデータソースを使用するとD3関数が機能しない

  18. 18

    d3を使用してテキストの配列を複数のdivに追加する方法

  19. 19

    複数の棒グラフのd3複数のy軸

  20. 20

    D3:複数の線がある折れ線グラフのnull値をスキップします

  21. 21

    d3グループSVG内の複数のテキスト要素をドラッグします

  22. 22

    D3:クリックテキストの更新パターンを使用する方法は?

  23. 23

    d3軸パスのストローク幅属性を取得

  24. 24

    d3 javascript、svgパスの2点間の距離を取得

  25. 25

    d3円グラフで複数行のテキストを作成できません

  26. 26

    d3ツリーマップで複数のテキストを設定する方法は?

  27. 27

    d3同じ関数から複数の属性を設定しますか?

  28. 28

    D3 変更パスの y

  29. 29

    D3で重複するパスを交互にまたは防止する

ホットタグ

アーカイブ