d3js 在饼图周围重新分布标签

2024-03-17

我正在使用 d3.js 创建一个外部带有标签的圆环图。我使用基于饼图每片质心的三角函数来定位标签。

g.append("g")
        .attr("class", "percentage")
        .append("text")
            .attr("transform", function(d)
                { 
                    var c = arc.centroid(d);
                    var x = c[0];
                    var y = c[1];
                    var h = Math.sqrt(x*x + y*y);
                    return "translate(" + (x/h * obj.labelRadius) +  ',' + (y/h * obj.labelRadius) +  ")"; 
                }
            ) 
            .attr("dy", ".4em")
            .attr("text-anchor", function(d) 
                {
                    return (d.endAngle + d.startAngle)/2 > Math.PI ? "end" : "start";
                }
            )
            .text(function(d) { return d.data.percentage+"%"; });

我最终想要完成的是重新排列饼图边缘之外的标签,以防止重叠。

我尝试解决该问题的方法之一是定义一组“锚点”,可以在其中放置标签,保证它们不会重叠。问题是将质心映射到锚点并保留切片和标签之间的一些视觉对应感(当切片很薄时特别困难)。

上图显示了锚点的可能位置(所示切片的质心)。这些位置不可能有重叠。

使问题更加复杂的是,当标签(它们是水平的)靠近饼图的顶部或底部时,它们比位于饼图的右侧或左侧时更容易重叠。

关于如何解决这个问题有什么想法吗?

[编辑] 根据 meetamit 的建议,我实现了以下内容:

.attr("dy", function(d)
{
    var c = arc.centroid(d);
        var x = c[0];
        var y = c[1];
        var h = Math.sqrt(x*x + y*y);
        var dy = y/h * obj.labelRadius; 
    dy=dy*fontSizeParam*.14/heightParam);
    return (dy)+"em";
})

它有一点帮助,并为标签提供了一些空间,但仍在寻找涵盖所有情况的解决方案......


不能创建两条弧线吗?一张用于图表,一张用于标签?

// first arc used for drawing the pie chart
var arc = d3.svg.arc()
  .outerRadius(radius - 10)
  .innerRadius(0);

// label attached to first arc
g.append("text")
  .attr("transform", function(d) { return "translate(" + arc.centroid(d) + ")"; })
  .attr("dy", ".35em")
  .style("text-anchor", "middle")
  .text(function(d) { return d.data.age; });

// second arc for labels
var arc2 = d3.svg.arc()
  .outerRadius(radius + 20)
  .innerRadius(radius + 20);

// label attached to second arc
g.append("text")
  .attr("transform", function(d) { return "translate(" + arc2.centroid(d) + ")"; })
  .attr("dy", ".35em")
  .style("text-anchor", "middle")
  .text(function(d) { return d.data.age; });
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

d3js 在饼图周围重新分布标签 的相关文章

随机推荐

  • 使用 XSLT 更改 XML 文件中的一个标签名称

    我是否可以在 XSLT 中设置条件 以便仅查找并替换特定标记名称的第一个标记 例如 我有一个 XML 文件 其中包含许多内容
  • 使用 php artisanserve 无法加载公共文件夹中的任何 js / css?

    我有xampp控制面板v3 2 2 php版本5 6 24 我的laravel版本是5 4 32 在 Windows 7 32 位中 我正在使用 Laravel 创建项目composer create project laravel lar
  • 是否使用JTA事务?

    我正在开发一个部署在 JBoss 应用程序服务器上的 J2EE 应用程序 该应用程序由 EJB 2 x 组件和 Web 组件组成 运行在本地计算机或远程服务器上 数据库是 Oracle 或 SQL Server 并且不处于分布式环境中 我使
  • 通过 Istio 入口网关的 TLS 握手失败 (tlsMode=passthrough)

    从外部客户端到 Kubernetes 集群内服务器的 TLS 握手失败 这是关于理解原因 我已将 Istio 入口网关配置为通过端口 15433 上收到的 TLS 并将其路由到端口 433 上的服务器 入口网关日志显示客户端尝试 TLS 握
  • 在 VSTS 中执行运行功能测试任务时出错

    在 VSTS 2015 中 我们在使用 NUnit 测试框架的项目中构建和发布管道设置 我们正在尝试使用 运行功能任务 配置集成测试用例执行 任务配置如下面的屏幕截图所示 可视化测试代理部署任务用于在目标计算机中部署 NUnit 测试代理
  • 每 5 秒使用 jquery/javascript 读取 XML

    我有一个html 索引 html Tasks span 0 span Messages span 0 span Notifications span 0 span
  • Spring Rest 客户端异常处理

    我正在使用弹簧RestTemplate消耗休息服务 在春季休息中暴露 我能够消费成功场景 但对于负面情况 服务会返回错误消息和错误代码 我需要在我的网页中显示这些错误消息 例如对于无效请求 服务抛出异常HttpStatus BAD REQU
  • 如何根据 X509Certificate2Collection 链验证 X509Certificate2

    我正在编写一个 SAML 2 0 响应解析器来处理 ASP Net 中的 POST 身份验证 在 C 和 MVC 中 但这不太相关 所以我有一个 p7b要验证的文件并且可以读入X509Certificate2Collection以及示例断言
  • 像any.do一样弹出窗口

    我正在编写一个应用程序 在弹出窗口中显示未接来电和未读短信 它还具有提醒功能 关闭弹出窗口并在指定时间后打开它 它类似于any do的弹出窗口 我能够使用 WindowManger 创建这样一个窗口 但由于某些我到目前为止不明白的原因 弹出
  • 如何在 ClickOnce 安装中仅更新一个 DLL?

    我正在开发一个大型单击一次应用程序 150MB gt 200 个 DLL 作为交互式调试过程的一部分 我想仅更新 1 个 DLL 并重新启动应用程序 而无需重建和重新部署整个应用程序 那可能吗 如果是这样 怎么办 问题澄清 2009年9月2
  • ImageButton标题标签

    在 ImageButton 上使用 AlternateText 属性向浏览器呈现 alt 标签
  • SQL Server 触发器隔离/范围文档

    我一直在寻找确定的有关 SQL Server 中触发器的隔离级别 或并发性或范围 我不确定确切的称呼它 的文档 我发现以下来源表明我认为是正确的 也就是说 两个用户对同一个表 甚至是相同的行 执行更新 然后将执行独立且隔离的触发器 http
  • Thymeleaf 中 th:each 语句中的 If-Else

    我想要的是 Thymeleaf 中 th each 语句中的 if else If currentSkill null 然后显示包含内容的表格 否则 您没有任何技能 这是没有 if else 的代码 div table tr td td t
  • 递归函数 vs setInterval vs setTimeout javascript

    我正在使用 NodeJs 并需要调用无限函数 但我不知道什么是最佳性能 递归函数 function test my code test 设置时间间隔 setInterval function my code 60 设置超时时间 functi
  • 如何在 Android 中从网络浏览器 (Chrome) 打开任何应用程序?我与 A Href 链接有什么关系?

    我想从我的网络浏览器打开第三方应用程序 所以 我没有任何清单文件或任何东西 我有一个网页 我想要一个可以打开第三方应用程序的链接 例如 Twitter 或 Opera 如何构建锚链接来打开该应用程序 谢谢 基于意图的 URI 的基本语法如下
  • 如何在 PHP 中设置自定义标头

    JAVA 开发人员在标头中向我发送数据 我这样认为 SESSION HTTP COUNTRYNAME 如何使用标头返回响应 它尝试过header countryname USA 但是PHPfunction headers list没有显示它
  • mysql根据之前的记录增加值

    我有一张桌子 Id Parent Counter 1 A NULL 2 A NULL 3 A NULL 4 B NULL 5 B NULL 6 C NULL 7 D NULL 8 D NULL 我想更新表 使计数器列更新 1 与之前的一样长
  • 如何避免在具有许多实例变量的类中使用 getter/setter

    我会尽量保持简短 我的类有很多实例变量 30 因此有很多 getter setter 这些类本身很简单 但由于 getter setter LOC 爆炸了 而且还有太多的代码重复 所以我删除了属性并将它们存储在地图中 如下所示 public
  • 定期轮询 Go 中的 REST 端点

    我正在尝试编写一个 Go 应用程序 定期轮询 PHP 应用程序公开的 REST 端点 Go 轮询应用程序将有效负载读取到结构中并进行进一步处理 我正在寻找一些关于开始实施的建议 最简单的方法是使用 Ticker ticker time Ne
  • d3js 在饼图周围重新分布标签

    我正在使用 d3 js 创建一个外部带有标签的圆环图 我使用基于饼图每片质心的三角函数来定位标签 g append g attr class percentage append text attr transform function d