首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用d3.js将不重叠的多边形和文本标签添加到3D饼图中?

如何使用d3.js将不重叠的多边形和文本标签添加到3D饼图中?
EN

Stack Overflow用户
提问于 2022-02-14 04:14:51
回答 1查看 170关注 0票数 0

我已经对DavidB编写的现有代码进行了注释,并创建了示例,仅提取一个3d饼图。我想添加多行(不重叠)和文本标签到饼图。任何建议都是非常感谢的。预期的结果应该是这样的。

EN

回答 1

Stack Overflow用户

发布于 2022-02-14 04:30:18

如何防止SVG文本的重叠

由于文本是绝对定位的,所以没有一个很好的方法来处理重叠标签。SVGstspan元素,允许您使用单词包装,但仅此而已。

在我的一个数据可视化项目中,我们不得不处理许多标签,这些标签需要在图形缩小时调整大小。我们处理这个问题的方法是通过计算可用的空间。然后使用以下方法“模拟”文本标签的总大小(在给定的字体大小下):

代码语言:javascript
复制
selection.node().getBBox().width
selection.node().getBBox().height

如果新标签的尺寸可能重叠,那么您将再次尝试使用较小的字体大小,直到标签的尺寸小于可用空间为止。这不是一个很好的解决方案。

生成SVG元素(为了度量它们的大小)的一个问题是,考虑到迭代的次数,它会触发重呈现,这是非常昂贵的。

通过使用<canvas>计算给定标签的大小,您可以改进这种“蛮力”方法的性能,而无需呈现任何内容:

代码语言:javascript
复制
  let canvasEl = document.createElement('canvas');
  let canvas = canvasEl.getContext('2d').font('12px sans-serif');
  const getWidthHeightOfLabel = (label) => {
    return { 
      width: canvas.measureText(label).width, 
      height: canvas.measureText(label).height
    };
  } 

在某些情况下,我们完全避免了SVG标签,而选择了普通的旧HTML文本,我们将动态地将其放置在SVG的顶部。

如果我的建议不明确,或者你需要更多的信息,请告诉我!谢谢。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71107103

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档