我目前正在处理以下d3 example,我想在弧内放置文字,类似于this example。但是,每当我尝试将文本附加到任何内容时,文本就不会显示。我查看了开发人员控制台,它似乎在那里,但它不会在屏幕上直观显示。我使用了第一个示例中提供的所有代码,除了我尝试添加以下arc元素:
("the d3 element").enter().append("svg:text").text("???")
("the d3 element").enter().append("text").text("???")
("the d3 element").append("svg:text").text("???")
("the d3 element").append("text").text("???")
除了切断一些样式更改之外,似乎无论我在哪里放置任何此代码,它都不想为我工作。我很感激和帮助!
答案 0 :(得分:2)
"每当我尝试将文本附加到任何内容时,文本都不显示":文本无法附加到大多数svg元素。您可以将文字附加到svg本身或g
,但不能将其附加到path
,rect
,circle
等。
处理此问题的最常用方法之一是使用g
元素在将数据绑定到g
时放置形状和文本。在g
上使用变换将转换形状和文本 - 非常适合圆形和矩形等。
您可以使用其他几种方法来覆盖svg元素上的文本:
path
作为文本路径放置文本(如示例所示)这些选项有助于放置,但不会确保文本落在形状的范围内 - 这是不同的复杂功能。
对于弧,一个选项是使用圆形路径作为文本路径,其中圆的半径介于弧的内半径和外半径之间 - 然后使用反映起始角的文本偏移放置文本 - 或为每段文字制作弧形。一般机制如下所示(注意它不能使用圆形元素,因为svg textPaths必须遵循路径):
var svg=d3.select("body")
.append("svg")
.attr("height",400)
.attr("width",400)
.attr("transform","translate(200,200)")
var arc = d3.arc()
.innerRadius(50)
.outerRadius(100)
.startAngle(0)
.endAngle(2);
var arcText = d3.arc()
.innerRadius(75)
.outerRadius(75)
.startAngle(0)
.endAngle(2);
var arc = svg.append("path")
.attr("d",arc)
.attr("fill","steelblue")
var textPath = svg.append("path")
.attr("d",arcText)
.attr("id","textpath")
.attr("fill","none")
.attr("stroke","black");
var text = svg.append("text")
.append("textPath")
.attr("xlink:href","#textpath")
.text("title")
.attr("startOffset", "25%") // the bottom of the arc is from 50%-100%, the top from 0 to 50%
.style("text-anchor","middle")

<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/4.10.0/d3.min.js"></script>
&#13;
上述机制与您链接的示例非常相似 - 它使用弧作为文本路径附加文本。您引用的示例使用可见弧(圆环)段自身的文本路径 - 并偏移x,y位置以将文本移动到弧本身(而不是弧形)。
请注意,我使用的是v4,而不是链接示例中的v3。