d3の力指向グラフに新しいノードのみを追加するにはどうすればよいですか?

userNick

を使用して力有向グラフを作成しましたd3。これはreactuseEffectフックを使用してコンポーネントにレンダリングされますグラフは最初は正しくレンダリングされますが、入力フォームから送信された新しいノードによって再レンダリング/更新されると、既存のノードが複製されます。

既存のノードはそのままにして.enter()は新しいノードだけが作成されると思いましたが、これは明らかに発生していません。私が間違っているところについて何か助けはありますか?

編集1:これは入ってくるデータのサンプルです

var nodesData = [
{"id": "Do Something", "type": "activity"},
{"id": "My Document", "type": "object"}
]

これはグラフのコードです:

import React, { useRef, useEffect } from 'react';
import * as d3 from 'd3';
import '../../custom_styles/bpForceDirected.css';

interface IProps {
    data?: string;
    linkData?: string;
}

/* Component */
export const BpForceDirectedGraph = (props: IProps) => {

    const d3Container = useRef(null);

    /* The useEffect Hook is for running side effects outside of React,
       for instance inserting elements into the DOM using D3 */
    useEffect(
        () => {
            if (props.data && d3Container.current) {
                var w=500;
                var h=500;
                const svg = d3.select(d3Container.current)
                            .attr("viewBox", "0 0 " + w + " " + h )
                            .attr("preserveAspectRatio", "xMidYMid meet");

                var simulation = d3.forceSimulation()
                    .nodes(props.data);
                simulation
                    .force("charge_force", d3.forceManyBody())
                    .force("center_force", d3.forceCenter(w / 2, h / 2));

                function circleColor(d){
                    if(d.type ==="activity"){
                        return "blue";
                    } else {
                        return "pink";
                    }
                }

                function linkColor(d){
                    console.log(d); 
                    if(d.type === "Activity Output"){
                        return "green";
                    } else {
                        return "red";
                    }
                }

                //Create a node that will contain an object and text label      
                var node = svg.append("g")
                  .attr("class", "nodes")
                  .selectAll("g")
                  .data(props.data)
                  .enter()
                  .append("g");

                node.append("circle")
                        .attr("r", 10)
                        .attr("fill", circleColor);

                node.append("text")
                    .attr("class", "nodelabel")
                    .attr("dx", 12)
                    .attr("dy", ".35em")
                    .text(function(d) { return d.activityname });

                // The complete tickActions() function    
                function tickActions() {
                //update circle positions each tick of the simulation 
                    node.attr('transform', d => `translate(${d.x},${d.y})`);

                //update link positions 
                //simply tells one end of the line to follow one node around
                //and the other end of the line to follow the other node around
                    link
                        .attr("x1", function(d) { return d.source.x; })
                        .attr("y1", function(d) { return d.source.y; })
                        .attr("x2", function(d) { return d.target.x; })
                        .attr("y2", function(d) { return d.target.y; });
                }  

                  simulation.on("tick", tickActions );

                //Create the link force 
                //We need the id accessor to use named sources and targets 
                var link_force =  d3.forceLink(props.linkData)
                    .id(function(d) { return d.id; })

                simulation.force("links",link_force)

                //draw lines for the links 
                var link = svg.append("g")
                    .attr("class", "links")
                    .selectAll("line")
                    .data(props.linkData)
                    .enter().append("line")
                        .attr("stroke-width", 2)
                        .style("stroke", linkColor);

                // Remove old D3 elements
                node.exit()
                    .remove();
            }
        },

        [props.data, props.linkData, /*d3Container.current*/])

    return (
        <svg
            className="d3-component"
            ref={d3Container}
        />
    );
}

export default BpForceDirectedGraph;

編集2: 再現可能なコード例

Mehdi

この問題は、グラフを生成する関数が更新のたびに呼び出され、既存のコンテンツを考慮しないために発生します。

この問題を解決する1つの方法は次のとおりです。

useEffect変数を(再)定義するときの各実行の開始時にSVGを空にしますsvg以下に示すよう.html('')に、既存のSVGノードを空にします。

  const svg = d3
    .select(d3Container.current)
    .html("")
    .attr("viewBox", "0 0 " + w + " " + h)
    .attr("preserveAspectRatio", "xMidYMid meet");

より洗練されたアプローチは、関数がチャートを初期化し、2番目の関数がグラフを(再)生成するようにコードを更新することです。reactについての私の理解は、これはとを使用componentDidMountして行われるということですcomponentDidUpdate

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

D3力レイアウトグラフのノードとして画像を追加するにはどうすればよいですか?

分類Dev

ApexのD3力指向グラフに動的な凡例を追加するにはどうすればよいですか?

分類Dev

力指向グラフd3のエッジにテキストを追加するにはどうすればよいですか?

分類Dev

d3の力有向グラフを拡大するにはどうすればよいですか?

分類Dev

新しいノードを追加するD3力指向グラフにより、xとyはNaNになります

分類Dev

ノードがドラッグされたときにd3jsの力指向グラフの揺れを少なくするにはどうすればよいですか?

分類Dev

d3JSの力指向グラフで強調表示されているすべてのノードの色を変更するにはどうすればよいですか?

分類Dev

新しいグラフに別のデータを追加するにはどうすればよいですか?

分類Dev

d3力指向レイアウトノードにツールチップを表示するにはどうすればよいですか?

分類Dev

d3グラフのデータを更新するにはどうすればよいですか?

分類Dev

特定のCSSクラスを持つノードのみを選択するにはどうすればよいですか?D3 / JS

分類Dev

D3jsの力指向グラフでノードのハイライトと遷移効果を実装するにはどうすればよいですか?

分類Dev

力のレイアウトグラフのデータを動的に変更するにはどうすればよいですか?D3

分類Dev

D3でマウスの動きをシミュレートして、ノードをドラッグすると他のノードが自動的に動くようにするにはどうすればよいですか?

分類Dev

ノードのD3ツリーチャートにHTMLコードを追加するにはどうすればよいですか?

分類Dev

ノードのD3ツリーチャートにHTMLコードを追加するにはどうすればよいですか?

分類Dev

D3グラフのラベルに改行を含めるにはどうすればよいですか?

分類Dev

D3で円グラフの場所を変更するにはどうすればよいですか?

分類Dev

Pythonのリストから読み取って、XMLツリーに新しいノードを追加するにはどうすればよいですか?

分類Dev

D3グラフのY軸を反転するにはどうすればよいですか?

分類Dev

Reactで新しい要素(新しいノード)を追加するにはどうすればよいですか?

分類Dev

ルートノードの円をd3.layout.packグラフの中央に配置するにはどうすればよいですか?

分類Dev

D3の棒グラフの棒にテキストの凡例を追加するにはどうすればよいですか?

分類Dev

d3を使用して作成された最初のdivの兄弟である新しいdiv要素を追加するにはどうすればよいですか?

分類Dev

d3折れ線グラフの下の領域をグラデーションにするにはどうすればよいですか?

分類Dev

networkxのグラフからfloat( 'nan')ノードを削除するにはどうすればよいですか?

分類Dev

ノードで2つの入力を次々に読み取るにはどうすればよいですか?

分類Dev

d3の値を更新するときに、円グラフでスムーズに移行するにはどうすればよいですか?

分類Dev

d3 jsでルートから選択したノードへのパスを強調表示するにはどうすればよいですか?

Related 関連記事

  1. 1

    D3力レイアウトグラフのノードとして画像を追加するにはどうすればよいですか?

  2. 2

    ApexのD3力指向グラフに動的な凡例を追加するにはどうすればよいですか?

  3. 3

    力指向グラフd3のエッジにテキストを追加するにはどうすればよいですか?

  4. 4

    d3の力有向グラフを拡大するにはどうすればよいですか?

  5. 5

    新しいノードを追加するD3力指向グラフにより、xとyはNaNになります

  6. 6

    ノードがドラッグされたときにd3jsの力指向グラフの揺れを少なくするにはどうすればよいですか?

  7. 7

    d3JSの力指向グラフで強調表示されているすべてのノードの色を変更するにはどうすればよいですか?

  8. 8

    新しいグラフに別のデータを追加するにはどうすればよいですか?

  9. 9

    d3力指向レイアウトノードにツールチップを表示するにはどうすればよいですか?

  10. 10

    d3グラフのデータを更新するにはどうすればよいですか?

  11. 11

    特定のCSSクラスを持つノードのみを選択するにはどうすればよいですか?D3 / JS

  12. 12

    D3jsの力指向グラフでノードのハイライトと遷移効果を実装するにはどうすればよいですか?

  13. 13

    力のレイアウトグラフのデータを動的に変更するにはどうすればよいですか?D3

  14. 14

    D3でマウスの動きをシミュレートして、ノードをドラッグすると他のノードが自動的に動くようにするにはどうすればよいですか?

  15. 15

    ノードのD3ツリーチャートにHTMLコードを追加するにはどうすればよいですか?

  16. 16

    ノードのD3ツリーチャートにHTMLコードを追加するにはどうすればよいですか?

  17. 17

    D3グラフのラベルに改行を含めるにはどうすればよいですか?

  18. 18

    D3で円グラフの場所を変更するにはどうすればよいですか?

  19. 19

    Pythonのリストから読み取って、XMLツリーに新しいノードを追加するにはどうすればよいですか?

  20. 20

    D3グラフのY軸を反転するにはどうすればよいですか?

  21. 21

    Reactで新しい要素(新しいノード)を追加するにはどうすればよいですか?

  22. 22

    ルートノードの円をd3.layout.packグラフの中央に配置するにはどうすればよいですか?

  23. 23

    D3の棒グラフの棒にテキストの凡例を追加するにはどうすればよいですか?

  24. 24

    d3を使用して作成された最初のdivの兄弟である新しいdiv要素を追加するにはどうすればよいですか?

  25. 25

    d3折れ線グラフの下の領域をグラデーションにするにはどうすればよいですか?

  26. 26

    networkxのグラフからfloat( 'nan')ノードを削除するにはどうすればよいですか?

  27. 27

    ノードで2つの入力を次々に読み取るにはどうすればよいですか?

  28. 28

    d3の値を更新するときに、円グラフでスムーズに移行するにはどうすればよいですか?

  29. 29

    d3 jsでルートから選択したノードへのパスを強調表示するにはどうすればよいですか?

ホットタグ

アーカイブ