d3 js - 将气泡聚集到分段

2024-03-15

**** 最新小提琴 ---https://jsfiddle.net/tk5xog0g/8/ https://jsfiddle.net/tk5xog0g/8/

-- 第二次摆弄自定义图表 -- 随机将气泡放置在靠近区域的区域,但不能考虑重叠或从中心图表区域脱落的情况。http://jsfiddle.net/NYEaX/1484/ http://jsfiddle.net/NYEaX/1484/

我想结合甜甜圈饼图和气泡图来产生像这样的精确结果

我最接近的地方 - 就在这里。

https://jsfiddle.net/tk5xog0g/10/ https://jsfiddle.net/tk5xog0g/10/

/* ------- ANIMATE BUBBLES -------*/


// generate data with calculated layout values

var data = bubbledata(data);

var nodes = bubble.nodes(data)
  .filter(function(d) {
    return !d.children;
  }); // filter out the outer bubble


var bubbles = bubs.selectAll('circle')
  .data(nodes);



bubbles.enter()
  .insert("circle")
  .attr('transform', function(d) {
    return 'translate(' + d.x + ',' + d.y + ')';
  })
  .attr('r', function(d) {
    return d.r;
  })
  .style("fill", function(d) {
    return color(d.group);
  });


bubbles = bubbles.transition()
  .transition()
  .duration(250)
  .attr('transform', function(d) {
    return 'translate(' + d.x + ',' + d.y + ')';
  })
  .attr('r', function(d) {
    //console.log("dr", d.r)
    return d.r;
  })
  .ease('sine');

/* ------- ANIMATE BUBBLES -------*/

我还考虑过尝试对气泡图进行聚类,以至少始终将颜色分组在一起 - 但这仍然与所需的图表不匹配 - 需要颜色气泡靠近匹配的饼图部分。

-- this is a clustered variant but the orange bubbles may sit sandwiched in the middle and once I try and merge it with the pie - won't correspond. I have considered trying to add a charge/gravity to try and get the bubbles to repel. https://jsfiddle.net/tk5xog0g/20/ https://jsfiddle.net/tk5xog0g/20/ enter image description here

  • D3 强制布局,较大的节点聚集在中心 https://stackoverflow.com/questions/32274775/d3-force-layout-where-larger-nodes-cluster-in-center
  • d3 集群力布局,集群中心之间的距离 https://stackoverflow.com/questions/16465719/d3-clustered-force-layout-distance-between-cluster-center
  • 将新节点添加到集群力布局 https://stackoverflow.com/questions/22712913/adding-new-nodes-to-a-clustered-force-layout
  • d3.js:如何创建“力导向图集群” https://stackoverflow.com/questions/10731008/d3-js-how-to-create-force-directed-graph-clusters

https://bl.ocks.org/mbostock/7881887 https://bl.ocks.org/mbostock/7881887

var width = 960,
    height = 500,
    radius = Math.min(width, height) / 2;

var color = d3.scale.ordinal()
    .range(["#98abc5", "#8a89a6", "#7b6888", "#6b486b", "#a05d56", "#d0743c", "#ff8c00"]);

var arc = d3.svg.arc()
    .outerRadius(radius - 60)
    .innerRadius(radius - 70);

var pie = d3.layout.pie()
    .sort(null)
    .value(function(d) { return d.value; });

var svg = d3.select("body").append("svg")
    .attr("width", width)
    .attr("height", height)
  .append("g")
    .attr("transform", "translate(" + width / 2 + "," + height / 2 + ")");


  var data = [
    {
      "group": "<5",
      "value": 1000,
      "children": [
        {
          "group": "<5",     
          "label": "Mel",
          "value": 1000,
          "totalGroupValue": 1000
        }
      ]
    },
    {
      "group": "5-13",
      "value": 1000,
      "children": [
        {
          "group": "5-13",        
          "label": "Erica",
          "value": 1000,
          "totalGroupValue": 1000
        }
      ]
    },
    {
      "group": "14-17",
      "value": 2000,
      "children": [
        {
          "group": "14-17",
          "label": "Jessica",
          "value": 1500,
          "totalGroupValue": 2000  
        },
        {
          "group": "14-17",
          "label": "Jill",
          "value": 500,
          "totalGroupValue": 2000  
        }
      ]
    },
    {
      "group": "18-24",
      "value": 1300,
      "children": [
        {
          "group": "18-24",
          "label": "Jerry",
          "value": 500,          
          "totalGroupValue": 1300 
        },
        {
          "group": "18-24",
          "label": "Ben",
          "value": 500,
          "totalGroupValue": 1300  
        },
        {
          "group": "18-24",
          "label": "Billy",
          "value": 300,
          "totalGroupValue": 1300  
        }
      ]
    },
    {
      "group": "25-44",
      "value": 1000,
      "children": [
        {
          "group": "25-44",
          "label": "Kelly",
          "value": 1000,
          "totalGroupValue": 1000
        }
      ]
    }
  ];  


  var g = svg.selectAll(".arc")
      .data(pie(data))
    .enter().append("g")
      .attr("class", "arc");

  g.append("path")
      .attr("d", arc)
      .style("fill", function(d) {
        return color(d.data.group); 
      });

  arc
    .outerRadius(radius - 10)
    .innerRadius(0);
	  

//create zone regions
var zones = [];
g.append("circle")
  .attr("transform", function(d) {

    zones[d.data.group] = arc.centroid(d);
    //zones.push(obj);

    return "translate(" + arc.centroid(d) + ")"; 
  })
  .attr("r", "1px")
  .style("fill", function(d) { 
    return "black"//color(d.data.group); 
  });
//create zone regions


//custom bubble chart
function makeBubbles(transform, group, radius){
    g.append("circle")
    .attr("transform", function(d) {
      return "translate("+transform+")"; 
    })
    .attr("r", radius)
    .style("stroke", function(d) { 
      return "black";//color(group); 
    })
    .style("fill", function(d) { 
      return color(group); 
    });
}

//loop through data and for EACH children array paint dots.
$.each(data, function( index, value ) {

  $.each(value.children, function( i, v ) {
      var randomX = Math.floor(Math.random() * 101) - 50;
      var randomY = Math.floor(Math.random() * 101) - 50;      

      var zoneregion = zones[v.group];
      var transform = (zoneregion[0] - randomX)+","+(zoneregion[1]+randomY);
      var group = v.group;
      var radius = ((v.value/v.totalGroupValue)*100) *0.5;
      makeBubbles(transform, group, radius);

  });    
});    
//custom bubble chart    
   

function type(d) {
  d.value = +d.value;
  return d;
}
.arc text {
  font: 10px sans-serif;
  text-anchor: middle;
}

.arc path {
  stroke: #fff;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>
<body>

希望这可以帮助。

var width = 960,
    height = 500,
    radius = Math.min(width, height) / 2;

var color = d3.scale.ordinal()
    .range(["#98abc5", "#8a89a6", "#7b6888", "#6b486b", "#a05d56", "#d0743c", "#ff8c00"]);

var arc = d3.svg.arc()
    .outerRadius(radius - 60)
    .innerRadius(radius - 70);

var pie = d3.layout.pie()
    .sort(null)
    .value(function(d) { return d.population; });

var svg = d3.select("body").append("svg")
    .attr("width", width)
    .attr("height", height)
  .append("g")
    .attr("transform", "translate(" + width / 2 + "," + height / 2 + ")");

var data = [
	{"age":"<5", "population":"2704659"},
{"age":"5-13", "population":"4499890"},
{"age":"14-17", "population":"2159981"},
{"age":"18-24", "population":"3853788"},
{"age":"25-44", "population":"14106543"},
{"age":"45-64", "population":"8819342"},
{"age":"≥65", "population":"612463"}
];

  var g = svg.selectAll(".arc")
      .data(pie(data))
    .enter().append("g")
      .attr("class", "arc");

  g.append("path")
      .attr("d", arc)
      .style("fill", function(d) { return color(d.data.age); });

  arc
    .outerRadius(radius - 10)
    .innerRadius(0);
	  
  g.append("circle")
      .attr("transform", function(d) { return "translate(" + arc.centroid(d) + ")"; })
      .attr("r", "15px")
	  .style("fill", function(d) { return color(d.data.age); });

function type(d) {
  d.population = +d.population;
  return d;
}
.arc text {
  font: 10px sans-serif;
  text-anchor: middle;
}

.arc path {
  stroke: #fff;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

d3 js - 将气泡聚集到分段 的相关文章

随机推荐

  • RxJs - forkJoin 与空数组

    我目前正在使用forkJoin等待数组Observable s 之前完成pipe 英 和tap ping 我注意到如果数组为空 则不会发出任何信号 我什至不能tap 我该如何解决这种问题 我应该检查数组是否为空吗 myFirstFuncti
  • AspNetCore 2.0 声明始终为空

    我正在努力将 DotNet 4 5 MVC WebAPI 应用程序转换为 AspNetCore 2 0 但在让 Cookie 身份验证再次工作时遇到一些问题 当我设置 cookie 并尝试访问安全方法时 我无法到达那里 当我进入匿名方法并检
  • 空比较

    有一个查询 UPDATE MyTable SET nvarchar1 blahblah WHERE Id 096fe792 7313 416f b3c8 327f46be73b6 AND nvarchar1 lt gt blablah 当
  • 使用 Delphi 检测互联网连接激活

    我使用 3G 无线卡已经有一段时间了 每次连接时 我的防病毒软件都会启动更新 我想知道我可以使用哪些 Win32 API 函数集来获取通知或查询即将出现的 Internet 连接事件 Delphi 已经有一组移植的标头了吗 我参与了一个项目
  • 如何将无边框表单对齐到屏幕边缘?

    当我将窗体的边框样式设置为无时 我无法再将窗口捕捉到屏幕边缘 我怎样才能两者兼得 Aero Snap 需要一个有边框的窗口 没有后门 您可以使用以下代码来模拟捕捉这个帖子 https stackoverflow com a 591734 1
  • ruby/ruby on Rails 内存泄漏检测

    我使用 ruby on Rails 编写了一个小型 Web 应用程序 其主要目的是上传 存储和显示 xml 文件最多可达几 MB 文件的结果 运行大约 2 个月后 我注意到杂种进程使用了 大约 4GB 内存 我做了一些关于调试 ruby 内
  • 单页网站上复杂的活动状态导航

    HTML div class logo ribbon a href top a div
  • 为什么用 p.then(resolve) 比用resolve(p) 更早地解决新的 Promise?

    Code 1 和 Code 2 之间的区别是 Code 1 使用resolve p 和代码 2 使用p then gt resolve 我希望输出的序列是不变的 但它们会生成不同的序列 我不明白为什么 代码 1 resolve p cons
  • javac 类路径顺序与 Oracle 文档相矛盾?

    In 塞拉 贝茨 SCJP https rads stackoverflow com amzn click com 0071591060本书第 797 页 java 和 javac 首先查看包含 Java SE 标准类的目录 然后他们查看类
  • AJAX 按钮提交的 HTML5 表单验证

    我有以下表格 我喜欢新的 HTML5 表单验证 并且更愿意保留它 然而 我不喜欢按下按钮时刷新页面 表单提交 的方式 相反 我更愿意使用按钮触发一些 AJAX 来刷新页面元素 而不刷新整个页面 然而 当我设置type button 发生的情
  • Android - 使用 LocationManager.requestLocationUpdates 时,我需要 WakeLock 吗?

    我的应用程序使用警报定期检查位置BroastcastReceiver启动一个服务 我知道我应该在启动服务之前获取唤醒锁 但我的问题是我什么时候可以释放它 如果我在调用后释放唤醒锁requestLocationUpdates 设备是否可以进入
  • 将一次性代码交换为刷新令牌时出现 Google OAuth redirect_uri_mismatch

    我正在实现 Google OAuth2 服务器一次性代码流程 如下所述 https developers google com identity sign in web server side flow https developers g
  • 如何处理 iOS 中的 Firebase 数据库错误? #AskFirebase

    我需要以不同于所有其他错误的方式处理 权限被拒绝 错误 在 Android 中我已经做到了 Kotlin override fun onCancelled error DatabaseError if error code Database
  • AVAudioPlayer 声音未播放

    在 iOS 8 Xcode 6 中 我有一个包含声音效果的功能 多次更改代码后 它在 iOS 9 中不再起作用 这是我尝试过的 原来的 let bangSoundEffect SKAction playSoundFileNamed Bang
  • Android Studio 2 错误:app:compileDebugJavaWithJack

    这是 Android Studio 2 1 1 的完整错误 我知道这段代码可以编译 因为在其他 PC 上它可以编译 但在 Windows 10 x64 的这台 PC 上却不行 所有其他项目都以类似的结果失败 Error Execution
  • php代码到mysql数据库导出[重复]

    这个问题在这里已经有答案了 可能的重复 最佳实践 在 PHP 中导入 mySQL 文件 分割查询 https stackoverflow com questions 1883079 best practice import mysql fi
  • hibernate 主键的原语或包装器

    我一直在查看各种 hibernate 教程和示例 对于它们的标识 主键属性 有些使用 Java 原始类型 有些使用包装类型 即 private int id vs private Integer id 为什么以及何时使用其中一个作为实体键
  • Asp.net Core 电子邮件确认有时会显示 InvalidToken

    我正在使用 asp net core Identity 2 1 我遇到了电子邮件确认的随机问题 而电子邮件确认有时会说结果 Error InvalidToken 令牌也没有过期 Note 我们正在使用多个服务器 并且我们还将密钥存储在一个地
  • 如何让顶部的大图片变小并最终粘在顶部?

    我想将我的网站分为两部分 包含大图像的标题和包含其他图像 文本等的主要部分 当我滚动页面时 标题上的大图像应该与主要部分一起滚动 在某一时刻 图像应该变得固定 并且主要部分在其后面滚动 我尝试了一些不同的方法 但我无法获得位置 显示 顶部等
  • d3 js - 将气泡聚集到分段

    最新小提琴 https jsfiddle net tk5xog0g 8 https jsfiddle net tk5xog0g 8 第二次摆弄自定义图表 随机将气泡放置在靠近区域的区域 但不能考虑重叠或从中心图表区域脱落的情况 http j