【问题标题】:Doughnut graph using SVG使用 SVG 的甜甜圈图
【发布时间】:2016-01-15 04:27:11
【问题描述】:

我需要复制这个甜甜圈图:

我看到this 的问题并尝试了给出的解决方案,但由于我在 SVG 方面没有任何经验,因此我无法取得良好的进展。但这显示了我到目前为止所做的事情。 (link here to fiddle)

<svg width="600" height="600">
    <defs>
        <mask id="innerbevel">
            <rect width="100%" height="100%" fill="black"/>
            <circle cx="0" cy="0" r="235" fill="white"/>
        </mask>

        <mask id="centrehole">
            <rect x="-100%" y="-100%" width="200%" height="200%" fill="white"/>
            <circle cx="0" cy="0" r="195" fill="black"/>
        </mask>

        <linearGradient id="grad1">
            <stop offset="0%" stop-color="#2188cb"/>
            <stop offset="100%" stop-color="##2188cb" stop-opacity="0" />
            </linearGradient>
    </defs>

    <g transform="translate(300,300)" mask="url(#centrehole)">
        <g>
            <path d="M0 0 0 -275 A 275 275 0 0 1 0 275" fill="url(#grad1)"/>
            <path d="M0 0 0 275 A 275 275 0 0 1 -275 0" fill="#a6a6a6"/>
            <path d="M0 0 -275 0 A 275 275 0 0 1 0 -275" fill="#a6a6a6"/>

            <circle cx="0" cy="235" r="40" fill="#2188cb"/>
            <circle cx="-235" cy="0" r="40" fill="#a6a6a6"/>
            <circle cx="0" cy="-235" r="40" fill="#a6a6a6"/>
        </g>
    </g>
</svg>

该图最初分为三个,由于我无法解决它,所以我想为第二条和最后一条路径设置相同的颜色..渐变也不是很好..我做不到轻松更改图表的“百分比”。

PS:文本只是一个虚拟文本,我知道它不是图像上的 75%。是的,我的工作一团糟。

帮忙,有人吗?

编辑: 问题是如何让它只有两条路径最接近,就像我正在复制的图像一样?我不太明白路径是如何设置的,以及如何正确设置渐变以跟随路径,因为现在它是线性的。

【问题讨论】:

  • 这里的问题是什么?如果是关于改进代码,那么这是错误的地方。
  • 这与我刚刚链接的原始 stackoverflow 链接有何不同?我正在尝试复制一个设计,我进行了研究,提供了我迄今为止的工作,并寻求帮助。 ://
  • 你没有明确说明你的问题是什么。您所说的只是“我正在尝试复制此图表,这就是我到目前为止所做的”。你有什么问题?
  • 至于那个原始的 llnk,很幸运能得到答案……它应该已经关闭了……它甚至没有接近达到 SO 的问题标准。
  • 是的,我现在遇到了问题,错误的举动将我的问题建立在错误的例子上。如果有帮助,我现在编辑了我的问题

标签: javascript css svg


【解决方案1】:

一个更简单的版本:

<svg width="500" height="500">
  <defs>
    <linearGradient id="linear" x1="0%" y1="0%" x2="100%" y2="0%">
      <stop offset="0%"   stop-color="#05a"/>
      <stop offset="100%" stop-color="#0a5"/>
    </linearGradient>
  </defs>
  <circle cx="250" cy="250" r="200" stroke="grey" stroke-width="50" fill="none"/>
  <path d="M 250,50 A 200 200 0 1 1 250 450 A 200 200 0 1 1 250 50"
        stroke="url(#linear)" stroke-linecap="round" stroke-width="50"
        fill="none" stroke-dasharray="750,1256" />
</svg>

jsFiddle:https://jsfiddle.net/jacquesc/ywus1z14/2/

唯一需要改变以使其“增长”的是stroke-dasharray 的第一个值,它应该是x * circumference。这里,circumference 大约是 1256 (2 * radius=200 * pi)。

编辑

只是为了好玩,另一个版本使用stroke-dasharraystroke-dashoffset 的组合,通过 CSS 设置和动画:

https://jsfiddle.net/jacquesc/ywus1z14/1/

【讨论】:

  • 哇,这真的很有帮助,谢谢。尽管我不得不问,我怎样才能使路径的边缘成为圆形?我知道在我的代码上,它与路径分开绘制,但在您的代码上却不是这样。在您还提供的屏幕截图中,它具有圆形边缘,但在小提琴上它不是?
  • Firefox 显然在圆圈上的圆形排列方面存在问题。更新为使用路径而不是圆圈。
  • 哦,原来如此。非常感谢你做的这些!我真的很感激你救了我的命。无论如何,我找到了有关如何重新缩放/调整 svg 尺寸的技巧,但想知道是否可以通过修改此处的一些代码而不是 css 来更简单?
  • 只需更改 SVG 中的坐标/大小。它们很少,因此您应该能够弄清楚它们是什么以及如何调整它们。或者,您可以在 SVG 中或通过 CSS 添加一个变换来缩放它。
  • 使用变换来缩小它,这是最终输出:jsfiddle.net/suika/ywus1z14/4再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多