复杂圆图

2024-04-09

我花了很多时间尝试在 SVG/D3.js 中复制所附的图表。我最接近的是使用附加的代码。我已经探索过使用树函数,但只能创建一组圆圈。

所附代码的问题是,通过手动输入每个圆圈必须位于的像素坐标,很难使其看起来平滑且智能。

作为信息,数据集只会为这些圆圈着色,因此它的形状可以完全静态。代码只需要生成形状,然后我可以根据数据集驱动颜色。

我正在尝试创建的图像:

这是我的代码:

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="utf-8">
  <title>D3 Test</title>
  <style type="text/css">

  </style>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>
</head>

<body>
  <script type="text/javascript">
    //Width and height
    var w = 1000;
    var h = 1000;
    var dataset = [6, 2, 5, 4, 5, 5, 5, 5, 3, 4, 5, 6];
    var svg = d3.select("body")
      .append("svg")
      .attr("width", w)
      .attr("height", h);
    var circles = svg.selectAll("circle")
      .data(dataset)
      .enter()
      .append("circle");


    circles.attr("cx", function(d, i) {
      var Xaxis;
      if (i === 0) {
        Xaxis = "500";
      } else if (i === 1) {
        Xaxis = "400";
      } else if (i === 2) {
        Xaxis = "420";
      } else if (i === 3) {
        Xaxis = "452.5";
      } else if (i === 4) {
        Xaxis = "485";
      } else if (i === 5) {
        Xaxis = "515";
      } else if (i === 6) {
        Xaxis = "547.5";
      } else if (i === 7) {
        Xaxis = "580";
      } else if (i === 8) {
        Xaxis = "600";
      } else if (i === 9) {
        Xaxis = "600";
      } else if (i === 10) {
        Xaxis = "650";
      } else if (i === 11) {
        Xaxis = "700";
      } else if (i === 12) {
        Xaxis = "750";
      } else if (i === 13) {
        Xaxis = "750";
      } else if (i === 14) {
        Xaxis = "750";
      } else if (i === 15) {
        Xaxis = "750";
      } else if (i === 16) {
        Xaxis = "750";
      }
      return Xaxis;
    })
    circles.attr("cy", function(d, i) {
        var Yaxis;
        if (i === 0) {
          Yaxis = "500";
        } else if (i === 1) {
          Yaxis = "500";
        } else if (i === 2) {
          Yaxis = "535";
        } else if (i === 3) {
          Yaxis = "560";
        } else if (i === 4) {
          Yaxis = "585";
        } else if (i === 5) {
          Yaxis = "585";
        } else if (i === 6) {
          Yaxis = "560";
        } else if (i === 7) {
          Yaxis = "535";
        } else if (i === 8) {
          Yaxis = "500";
        } else if (i === 9) {
          Yaxis = "600";
        } else if (i === 10) {
          Yaxis = "550";
        } else if (i === 11) {
          Yaxis = "500";
        } else if (i === 12) {
          Yaxis = "450";
        } else if (i === 13) {
          Yaxis = "600";
        } else if (i === 14) {
          Yaxis = "550";
        } else if (i === 15) {
          Yaxis = "500";
        } else if (i === 16) {
          Yaxis = "450";
        }
        return Yaxis;
      })
      .attr("r", function(d, i) {
        var size;
        if (i === 0) {
          size = "30";
        } else if (i > 0) {
          size = "20";
        }
        return size;
      })
      .attr("fill", function(d, i) {
        var returnColor;
        if (d === 1) {
          returnColor = "green";
        } else if (d === 2) {
          returnColor = "lightgreen";
        } else if (d === 3) {
          returnColor = "gold";
        } else if (d === 4) {
          returnColor = "darkorange";
        } else if (d === 5) {
          returnColor = "red";
        } else if (d === 6) {
          returnColor = "lightgrey";
        }
        return returnColor;
      });
  </script>

</body>

</html>

您可以使用一些三角学来定位圆。这就是您所需要的:

要将圆定位在 x 轴上:

x 中心 + (距离 * sin(角度))

并将其定位在 y 轴上:

y 中心 + (距离 * cos(角度))

Where distance是圆到中心的距离,angle是以弧度表示的角度。要计算它,请使用:

rad = deg * Math.PI/180;

在下面的代码片段中,我使用组来绘制圆圈层,并使用每组中圆圈的索引来计算角度。我正在使用设置圆圈数d3.range()以及同一阵列中设置距中心距离的层数。核实:

var width = height = 500;
var svg = d3.select("body")
  .append("svg")
  .attr("width", width)
  .attr("height", height);

var color = d3.scaleOrdinal(d3.schemeCategory10)
  .domain(d3.range(16));

var data1 = d3.range(16);
var dataRadius = [70, 110, 150, 190, 230];

svg.append("circle").attr("cx", width / 2)
  .attr("cy", height / 2)
  .attr("r", 20)
  .attr("fill", "yellow");

var groups = svg.selectAll(".groups")
  .data(dataRadius)
  .enter()
  .append("g");

var circles = groups.selectAll(".circles")
  .data(data1)
  .enter()
  .append("circle");

circles.attr("cx", function(d, i) {
    var radius = this.parentNode.__data__;
    return width / 2 + (radius * Math.sin(i * (360 / (data1.length) * Math.PI / 180)))
  })
  .attr("cy", function(d, i) {
    var radius = this.parentNode.__data__;
    return height / 2 + (radius * Math.cos(i * (360 / (data1.length) * Math.PI / 180)))
  })
  .attr("r", function() {
    return this.parentNode.__data__ == 230 ? 24 : 14
  })
  .attr("fill", function(d, i) {
    return i == 13 || i == 14 ? color(i - 2) : "#ccc"
  });
<script src="https://d3js.org/d3.v4.min.js"></script>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

复杂圆图 的相关文章

随机推荐

  • 如何在C#中获得一组枚举值?

    假设我有一个枚举 http msdn microsoft com en us library system windows forms dialogresult aspx namespace System Windows Forms pub
  • 从 Firebase 检索的自定义对象始终具有 Null 属性

    我正在尝试检索自定义User来自 Firebase 的对象如下 getUserFromDB loggedInUserEmail viewModel new ViewModelProvider this get UserViewModel c
  • 无法将 SelectedIndex 设置为 0

    当尝试将 ComboBox SelectedIndex 设置为 0 以便我将第一个值作为默认值时 不起作用 组合框默认为空 如果我尝试将其设置为任何其他有效的数字 我会将所选索引作为默认值 有人知道为什么我不能从 xaml 将其设置为 0
  • 从 Ansible 中的自定义模块访问 playbook 变量[重复]

    这个问题在这里已经有答案了 我正在 Ansible 中编写一个特定于 Playbook 的自定义模块 是否可以直接访问剧本变量 而不需要将其作为参数传递给任务 这是不可能的 因为模块是远程执行的 除非显式传递 否则所有变量都不可用 我有同样
  • 从 X 和 Y 坐标获取纬度和经度

    看起来从经度和纬度到X和Y坐标的转换有丰富的知识 但反过来却没有 这是我根据 Kavrayskiy 的数学计算得出的函数 float xp kavraX radians pv x radians pv y FACTOR float yp k
  • 用字典重新映射 pandas 列中的值,保留 NaN

    我有一本字典 如下所示 di 1 A 2 B 我想将其应用到col1数据框的列类似于 col1 col2 0 w a 1 1 2 2 2 NaN to get col1 col2 0 w a 1 A 2 2 B NaN 我怎样才能最好地做到
  • C# 编组回调

    我正在尝试对结构中的 c 回调进行编组 我很确定我的一切都是正确的 但是当使用我的 C 示例时 我没有收到事件 而当使用 C 时 我确实收到了事件 这是 C class Program DllImport Some dll CharSet
  • django S3 - 修剪图像字段文件名但不修剪 url 路径

    这是我的问题的后续 ImageField FileField Django 表单当前无法修剪文件名的路径 https stackoverflow com questions 47887158 imagefield filefield dja
  • 将焦点设置回其父级?

    来自帖子WPF 如何以编程方式从文本框中删除焦点 https stackoverflow com questions 2914495 wpf how to programmatically remove focus from a textb
  • Number 类型的 DynamoDB 属性中可以存储多少位整数数据?

    DynamoDB 的Number https docs aws amazon com amazondynamodb latest developerguide HowItWorks NamingRulesDataTypes html How
  • 如何向 heroku 添加 API 密钥和其他安全内容?

    我在某处读过 但似乎无法找到将密钥添加到 Heroku 中的位置 而不需要将其放入源代码 git 存储库中 我想当我推送到 github 时这有助于保证它的安全 我该怎么做 这样做有意义吗 http docs heroku com conf
  • 如何在CKEditor中动态切换文本方向

    在我当前的项目中 用户可以用英语和希伯来语输入文本 根据当前文本自动定义方向会很棒 例如 如果文本包含希伯来语符号 则方向应为 RTL 但如果文本不包含希伯来语 则方向为 LTR 文本可以随时更改 我认为最好的解决方案是动态切换方向 就像在
  • 有没有办法强制 NHTMLUNIT 忽略页面 JavaScript 错误并继续脚本执行?

    我是 ASP NET 和 C 项目的一部分 我们正在努力使我们的 asp net 门户对 Google 搜索引擎友好 https developers google com webmasters ajax crawling https de
  • 将事件日志组织到文件夹中

    我想要创建多个服务 并且希望它们将每个服务记录在我指定的同一目录 文件夹下的日志条目中 这样当我打开 Windows 事件查看器时 我可以看到它们全部放置在一个文件夹中 例如 service1 将登录到 service1 log servi
  • jQuery 禁用/启用提交按钮

    我有这个 HTML
  • 在cmake中设置boost的最低版本

    我想定义系统上可用的最低增强版本 我尝试了以下方法 不幸的是 这不起作用 因为它尝试在系统上仅提供 boost 1 40 0 的情况下进行编译 SET Boost USE STATIC LIBS OFF SET Boost USE MULT
  • WPF/控制台混合应用程序

    我编写了一个可以在命令行上运行或使用 WPF UI 运行的应用程序 STAThread static void Main string args Does magic parse args and sets IsCommandLine to
  • C++ 多重定义错误

    我的 Headers h 文件包含基本的 C 标头 include
  • 在 Sequelize 迁移中创建关联

    节点js 续集4 41 尝试通过另一个表制作两个多对多关系的模型 跑步与续集 cli 例如 sequelize model generate name Camera attributes name string sn string 这里是模
  • 复杂圆图

    我花了很多时间尝试在 SVG D3 js 中复制所附的图表 我最接近的是使用附加的代码 我已经探索过使用树函数 但只能创建一组圆圈 所附代码的问题是 通过手动输入每个圆圈必须位于的像素坐标 很难使其看起来平滑且智能 作为信息 数据集只会为这