javascript - 如何使用下面的示例将文本添加到 D3 中的 SVG 元素

标签 javascript html css d3.js svg

使用 D3 版本 3,我试图让文本(在本例中为来自 json 的名称)出现在气泡图中圆圈的中心。

我遵循了各种教程。在 Chrome Developer Tools Elements 窗口中,我的文本元素作为 SVG 圆圈的子元素可见,但在屏幕上仍然不可见。

我在 Codepen 上整理了一个示例。

https://codepen.io/_d_v_/pen/MQyONV

const json = { companyA: 500, companyB: 200, companyC: 150, companyD: 100, companyE: 50 };
const colors = [ '#FF0000', '#03900F', '#0000FF', '#FF00FF', '#00FF00' ];
const diameter = 400;

const processData = data => {
  const obj = data;

  const newDataSet = [];
  for(let prop in obj) {
    newDataSet.push({name: prop, size: obj[prop]});
  }
  return {children: newDataSet};
}

const svg = d3.select('#graph').append('svg')
.attr('width', diameter)
.attr('height', diameter);

const bubble = d3.layout.pack()
.size([diameter, diameter])
.value( d => d.size )
.padding(30);

// generate data with calculated layout values
const nodes = bubble.nodes(processData(json)).filter(function(d) { return !d.children; }); // filter out the outer bubble
const vis = svg.selectAll('circle').data(nodes);

vis.enter().append('circle')
  .attr('transform', d => 'translate(' + d.x + ',' + d.y + ')')
  .attr('r', d => d.r)
  .attr('fill', (d, i) => `${colors[i]}`);
vis.append('text')
  .attr('dx', d => -20)
  .attr('text-anchor', 'middle')
  .attr('font-size', d => d.r / ((d.r * 10) / 100))
  .attr('dy', d => d.r / ((d.r * 25) / 100))
  .text(d => d.name)

谁能告诉我哪里出错了?我只想让文本出现在 SVG 圆圈的中心。

提前致谢

最佳答案

正如我评论的那样。 <text>应该在<svg>里面不在里面<circle> ..然后相应地定位它.. 我已经像你改变了圆圈一样改变了文本......制作内圈。给定颜色红色。您现在可以根据需要编辑代码。 修改js代码。

const json = { companyA: 500, companyB: 200, companyC: 150, companyD: 100, companyE: 50 };
const colors = [ '#FF0000', '#03900F', '#0000FF', '#FF00FF', '#00FF00' ];
const diameter = 400;

const processData = data => {
  const obj = data;

  const newDataSet = [];
  for(let prop in obj) {
    newDataSet.push({name: prop, size: obj[prop]});
  }
  return {children: newDataSet};
}

const svg = d3.select('#graph').append('svg')
.attr('width', diameter)
.attr('height', diameter);

const bubble = d3.layout.pack()
.size([diameter, diameter])
.value( d => d.size )
.padding(30);

// generate data with calculated layout values
const nodes = bubble.nodes(processData(json)).filter(function(d) { return !d.children; }); // filter out the outer bubble
const vis = svg.selectAll('circle').data(nodes);

vis.enter().append('circle')
  .attr('transform', d => 'translate(' + d.x + ',' + d.y + ')')
  .attr('r', d => d.r)
  .attr('fill', (d, i) => `${colors[i]}`);
vis.enter().append('text')
  .attr('dx', d => 20)
.attr('transform', d => 'translate(' + d.x + ',' + d.y + ')')
.attr('fill',"red")
  .attr('text-anchor', 'middle')
  .attr('font-size', d => d.r / ((d.r * 10) / 100))
  .attr('dy', d => d.r / ((d.r * 25) / 100))
  .text(d => d.name)

关于javascript - 如何使用下面的示例将文本添加到 D3 中的 SVG 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48610843/

相关文章:

php - jQuery AJAX 调用两次

javascript - 悬停在子嵌套元素上不应影响父元素

html - 当小于父表时居中表,否则滚动 - 没有固定宽度

html - CSS正确定位伪元素

javascript - javaScript, CSS , HTML , jQuery 测试工具

Javascript 简单计时器无法正常工作

javascript - 如何将 "filter"JSON 用于唯一的键名称/值对?

javascript - 在网站的新页面上保持 jquery 下拉菜单打开

javascript - 尝试添加 div 类,但它不适用于我的 Javascript

javascript - 是否可以流动子 div 并使用水平溢出使它们填充主 div?