【问题标题】:How to Build this Rounded Two Tone Donut Chart?如何构建这个圆形的两色调甜甜圈图?
【发布时间】:2023-03-14 10:19:01
【问题描述】:

我正在尝试制作一个如下所示的圆环图

我将使用 angularJS、SVG 和 D3.js

我不知道如何得到那些圆形的末端,请帮助。谢谢。

【问题讨论】:

    标签: angularjs svg d3.js charts frontend


    【解决方案1】:

    简单的答案:你使用面具。

    我们使用遮罩来绘制边框的内部。还有一个可以在中间挖洞的面具。

    孔掩码并不是必需的。你可以用粗线形成甜甜圈。但对我来说,画扇形然后打洞似乎更容易。

    这里是 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>

    【讨论】:

    • 老兄,你成就了我的一天。我已经将它翻译成 d3,它可以工作。关于如何制作传奇的任何想法?
    • 您是指“数学”/“物理”标签吗?应该不会太难。只需使用标准三角在每个段的中途选择一个点,然后从该位置开始定位线条和文本。您可以使用属性text-anchor="end" 将左侧的标签右对齐(> 180 度)
    • 我觉得有一种更简单的方法可以做到这一点,我们有 stroke-linecap 属性可以大大简化事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-07
    • 1970-01-01
    • 2013-04-11
    • 2019-07-19
    • 2012-12-02
    • 1970-01-01
    • 2016-08-24
    相关资源
    最近更新 更多