d3js:如何在圆弧的末端放置圆圈

布鲁特蒂

我正在尝试在d3js中创建一个甜甜圈图,其中每个弧的末端都有一个圆。圆的边缘必须适合圆弧的边缘。

我尝试通过附加一个圆和一个用标记包裹但没有成功的圆来进行尝试。

尝试附加标记似乎是最接近所需标记的解决方案,但我无法帮助标记溢出弧形边缘。

码:

var data = [
  {
    name: "punti",
    count: 3,
    color: "#fff000"
  },
  {
    name: "max",
    count: 7,
    color: "#f8b70a"
  }
];
var totalCount = data.reduce((acc, el) => el.count + acc, 0);
var image_width = 32;
var image_height = 32;
var width = 540,
  height = 540,
  radius = 200,
  outerRadius = radius - 10,
  innerRadius = 100;
var cornerRadius = innerRadius;
var markerRadius = (outerRadius - innerRadius) / 2;
var arc = d3
  .arc()
  .outerRadius(outerRadius)
  .innerRadius(innerRadius)
  .cornerRadius(cornerRadius);

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

var svg = d3
  .select("body")
  .append("svg")
  .attr("width", width)
  .attr("height", height)
  .append("g")
  .attr("transform", "translate(" + width / 2 + "," + height / 2 + ")");
var pieData = pie(data);
var g = svg
  .selectAll(".arc")
  .data(pieData)
  .enter()
  .append("g");

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

var marker = svg
  .append("defs")
  .append("marker")
  .attr("id", "endmarker")
  .attr("overflow", "visible")
  .append("circle")
  .attr("cy", 0)
  .attr("cx", 0)
  .attr("r", markerRadius)
  .attr("fill", "red");
g.attr("marker-end", "url(#endmarker)");

g
  .append("circle")
  .attr("cx", function(d) {
    let path = d3.select(this.parentNode);
    var x = arc.centroid(d)[0];
    return x;
  })
  .attr("cy", function(d) {
    var y = arc.centroid(d)[1];
    console.log(d3.select(this).attr("cx"));
    return y;
  })
  .attr("fill", d => d.data.color)
  .attr("stroke", "black")
  .attr("r", (outerRadius - innerRadius) / 2);

Codepen在这里

感谢任何人的帮助!

假设您希望输出如下: 在此处输入图片说明

我从Mike Bostock的Block中找到了一些代码,代码显示了如何向圆角Arcs添加圆

我为您改编了以下代码,该代码执行了很多复杂的数学运算。

var cornerRadius = (outerRadius - innerRadius)/2;
svg.append("g")
    .style("stroke", "#555")
    .style("fill", "none")
    .attr("class", "corner")
  .selectAll("circle")
    .data(d3.merge(pieData.map(function(d) {
      return [
        {angle: d.startAngle + d.padAngle / 2, radius: outerRadius - cornerRadius, start: +1},
        {angle:   d.endAngle - d.padAngle / 2, radius: outerRadius - cornerRadius, start: -1},
      ];
    })))
  .enter().append("circle")
    .attr("cx", function(d) { return d.start * cornerRadius * Math.cos(d.angle) + Math.sqrt(d.radius * d.radius - cornerRadius * cornerRadius) * Math.sin(d.angle); })
    .attr("cy", function(d) { return d.start * cornerRadius * Math.sin(d.angle) - Math.sqrt(d.radius * d.radius - cornerRadius * cornerRadius) * Math.cos(d.angle); })
    .attr("r", cornerRadius);

完整的片段显示输出:

<div id="chart"></div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.12.0/d3.min.js"></script>
<script>
var data = [
  {
    name: "punti",
    count: 3,
    color: "#fff000"
  },
  {
    name: "max",
    count: 7,
    color: "#f8b70a"
  },
];
var totalCount = data.reduce((acc, el) => el.count + acc, 0);
var image_width = 32;
var image_height = 32;
var width = 540,
  height = 540,
  radius = 200,
  outerRadius = radius - 10,
  innerRadius = 100;
var cornerRadius = innerRadius;
var markerRadius = (outerRadius - innerRadius) / 2;
var arc = d3
  .arc()
  .outerRadius(outerRadius)
  .innerRadius(innerRadius)
  .cornerRadius(cornerRadius);

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

var svg = d3
  .select("body")
  .append("svg")
  .attr("width", width)
  .attr("height", height)
  .append("g")
  .attr("transform", "translate(" + width / 2 + "," + height / 2 + ")");
var pieData = pie(data);
var g = svg
  .selectAll(".arc")
  .data(pieData)
  .enter()
  .append("g");

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

var cornerRadius = (outerRadius - innerRadius)/2;
svg.append("g")
    .style("stroke", "#555")
    .style("fill", "none")
    .attr("class", "corner")
  .selectAll("circle")
    .data(d3.merge(pieData.map(function(d) {
      return [
        {angle: d.startAngle + d.padAngle / 2, radius: outerRadius - cornerRadius, start: +1},
        {angle:   d.endAngle - d.padAngle / 2, radius: outerRadius - cornerRadius, start: -1},
      ];
    })))
  .enter().append("circle")
    .attr("cx", function(d) { return d.start * cornerRadius * Math.cos(d.angle) + Math.sqrt(d.radius * d.radius - cornerRadius * cornerRadius) * Math.sin(d.angle); })
    .attr("cy", function(d) { return d.start * cornerRadius * Math.sin(d.angle) - Math.sqrt(d.radius * d.radius - cornerRadius * cornerRadius) * Math.cos(d.angle); })
    .attr("r", cornerRadius);
  
  
</script>

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

(d3.js)如何在圆弧外创建标签?

来自分类Dev

使用D3JS在圆弧内旋转文本

来自分类Dev

使用D3JS在圆弧内旋转文本

来自分类Dev

d3js在每个轴的末端显示箭头

来自分类Dev

D3.js在圆环图中的圆弧上放置文本

来自分类Dev

如何使用D3js在不同时间绘制圆圈?

来自分类Dev

如何在d3js中垂直树

来自分类Dev

如何在d3js中垂直树

来自分类Dev

如何仅过渡圆弧d3.js的radius属性

来自分类Dev

D3.js:将文字放置在甜甜圈图的圆弧上

来自分类Dev

在带有d3js的螺旋图中添加圆圈,并以直线连接到中心

来自分类Dev

d3js使最后一个圆圈成为超链接

来自分类Dev

D3js 将圆圈附加到力导向布局

来自分类Dev

如何在d3js中控制地图上图层的顺序

来自分类Dev

d3js:如何在单击元素后切换CSS类

来自分类Dev

如何在D3js的数月/日进行本地化?

来自分类Dev

如何在我的d3js示例中添加if条件

来自分类Dev

如何在D3js上更改符号类型的颜色?

来自分类Dev

如何在时分中心对齐d3js工具提示?

来自分类Dev

如何在d3js中用背景图像填充六边形?

来自分类Dev

如何在d3js图形中更改图例的文本颜色?

来自分类Dev

如何在d3js中将字符串转换为数字

来自分类Dev

如何在d3js中控制地图上图层的顺序

来自分类Dev

d3js:如何在单击元素后切换CSS类

来自分类Dev

如何在给定示例d3js中填充条之间的区域

来自分类Dev

如何在D3js中动态添加图像到圈子

来自分类Dev

如何在 D3js 中为不同的图表显示不同的标题?

来自分类Dev

如何在 d3js 中向条形字符添加垂直线?

来自分类Dev

在多折线图中,在每条线的末端,我想要一个小圆圈,并使用d3.js作为终点的值

Related 相关文章

热门标签

归档