【发布时间】:2023-03-14 10:19:01
【问题描述】:
我正在尝试制作一个如下所示的圆环图
我将使用 angularJS、SVG 和 D3.js
我不知道如何得到那些圆形的末端,请帮助。谢谢。
【问题讨论】:
标签: angularjs svg d3.js charts frontend
我正在尝试制作一个如下所示的圆环图
我将使用 angularJS、SVG 和 D3.js
我不知道如何得到那些圆形的末端,请帮助。谢谢。
【问题讨论】:
标签: angularjs svg d3.js charts frontend
简单的答案:你使用面具。
我们使用遮罩来绘制边框的内部。还有一个可以在中间挖洞的面具。
孔掩码并不是必需的。你可以用粗线形成甜甜圈。但对我来说,画扇形然后打洞似乎更容易。
这里是 SVG 格式。我将把转换为 D3 留给你。
<svg width="600" height="600">
<defs>
<!-- masks out the area outside and inside the inner bevel region -->
<mask id="innerbevel">
<rect width="100%" height="100%" fill="black"/>
<circle cx="0" cy="0" r="235" fill="white"/>
</mask>
<!-- cuts hole in centre of graph -->
<mask id="centrehole">
<rect x="-100%" y="-100%" width="200%" height="200%" fill="white"/>
<circle cx="0" cy="0" r="195" fill="black"/>
</mask>
</defs>
<!-- Graph is drawn centred at (0,0). The transform moves it into middle of SVG. -->
<!-- The mask forms the hole in the centre. -->
<g transform="translate(300,300)" mask="url(#centrehole)">
<!-- outer bevel -->
<g>
<!-- light blue segment -->
<path d="M0 0 0 -275 A 275 275 0 0 1 0 275" fill="#89e4d2"/>
<!-- red segment -->
<path d="M0 0 0 275 A 275 275 0 0 1 -275 0" fill="#f394a2"/>
<!-- blue segment -->
<path d="M0 0 -275 0 A 275 275 0 0 1 0 -275" fill="#a3a4ff"/>
<!-- light blue rounded end -->
<circle cx="0" cy="235" r="40" fill="#89e4d2"/>
<!-- red rounded end -->
<circle cx="-235" cy="0" r="40" fill="#f394a2"/>
<!-- blue rounded end -->
<circle cx="0" cy="-235" r="40" fill="#a3a4ff"/>
</g>
<!-- inner bevel - same as above but with different colours and is masked -->
<g mask="url(#innerbevel)">
<!-- light blue segment -->
<path d="M0 0 0 -275 A 275 275 0 0 1 0 275" fill="#5bc8b7"/>
<!-- red segment -->
<path d="M0 0 0 275 A 275 275 0 0 1 -275 0" fill="#ef6974"/>
<!-- blue segment -->
<path d="M0 0 -275 0 A 275 275 0 0 1 0 -275" fill="#6b5dff"/>
<!-- light blue rounded end -->
<circle cx="0" cy="235" r="40" fill="#5bc8b7"/>
<!-- red rounded end -->
<circle cx="-235" cy="0" r="40" fill="#ef6974"/>
<!-- blue rounded end -->
<circle cx="0" cy="-235" r="40" fill="#6b5dff"/>
</g>
</g>
</svg>
【讨论】:
text-anchor="end" 将左侧的标签右对齐(> 180 度)
stroke-linecap 属性可以大大简化事情。