如何在 D3.js 中的网络图的矩形节点内添加文本?

how to add text inside a rectangular nodes for a network graph in D3.js?

我无法在 D3.js 网络图中的矩形节点内显示文本。

我首先为每个数组元素创建了组,并附加了矩形节点,但没有白白显示。 任何人都可以查看我的代码并提出任何更改以使代码正常工作吗?

我问这个问题是因为我已经实现了之前在 Whosebug 中发布的大部分答案,但是根本没有显示节点。

Network.html:

<!DOCTYPE html>

<meta charset="utf-8">
<!-- Load d3.js -->
<script src="https://d3js.org/d3.v6.js"></script>

<body>
    <!-- Create a div where the graph will take place -->
    <div id="my_dataviz"></div>
    <script>

                                                         // set the dimensions and margins of the graph
        const margin = {top: 20, right: 20, bottom: 40, left: 100},
          width = 2000 - margin.left - margin.right,
          height = 1000 - margin.top - margin.bottom;
        
                                                        // append the svg object to the body of the page
        const svg = d3.select("#my_dataviz")
        .append("svg")
          .attr("width", width + margin.left + margin.right)
          .attr("height", height + margin.top + margin.bottom)
                                                                //THe SVG-g aelement is used ot group SVG shapes together. Once grouped you can transform the whole group as if it was a single shape.
        .append("g")                                         //This mainly appends a 'g' element to the SVG.
          .attr("transform",
                `translate(${margin.left}, ${margin.top})`);    //this is used to move it to the top left position.
        
        d3.json("sample_input.json").then( function( data) {
        
                                  // Initialize the links
            const link = svg      // we have appended the LINE for each LINK in the data. 
                .append("g")
                .selectAll("line")
                .data(data.links)
                .enter()
                .append("line")
                .style("stroke", "#000000");

            const simulation = d3.forceSimulation(data.nodes)
                .force("link", d3.forceLink()                               
                    .id(function(d) { return d.id; })                     
                    .links(data.links)                                    
                )
                .force("charge", d3.forceManyBody().strength(-25000))         
                .force("center", d3.forceCenter(width/2, height/3))     
                .on("tick", ticked); 
                
            var textNodes= svg.append("g") // this is for the second <g> 
                            .selectAll("g")
                            .data(data.nodes)
                            .enter().append("g");

            var rects= textNodes.join("rect").attr("width",300)
                                    .attr("height",90)
                                    .style("fill", "#69b3a2")
                                    .attr("stroke","black");
            
            var texts= textNodes.append("text")
                .text(function(d){
                d.label;
                });
        
            function ticked() {
                    textNodes.attr("transform",function (d) {return "translate("+d.x+", "+d.y+")";});


            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; });
                }

    });
    </script>
</body>

输入json文件:

{
    "nodes": [
        {"id": 0, "label":"Donald Trump"},
        {"id": 1, "label": "https://www.politifact.com"},
        {"id": 2, "label": "https://www.washingtonpost.com"},
        {"id": 3, "label": "https://www.thedailybeast.com"},
        {"id": 4, "label": "https://www.daytondailynews.com"},
        {"id": 5, "label": "https://centurylink.net"},
        {"id":6, "label": "https://www.businessinsider.com"},
        {"id":7, "label": "https://thehill.com"},
        {"id":8, "label": "https://www.texasstandard.org"}
    ],
    "links": [
        {"source": 1, "target": 0},
        {"source": 2, "target": 0},
        {"source": 3, "target": 1},
        {"source": 4, "target": 0},
        {"source": 5, "target": 0} 
    ]
}

结果似乎只是没有节点的链接:

我认为您可能不小心附加了 g 个元素,然后将它们更改为 rect,然后附加了 text。我不确定这会解决所有问题,但在这里你想要 'append' 而不是 'join':

        var rects= textNodes.append("rect")
            .attr("width",300)
            .attr("height",90)
            .style("fill", "#69b3a2")
            .attr("stroke","black");