Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Half filled circle with d3.js

Tags:

svg

d3.js

I am trying to create a half filled circle with d3.js to be like this. I didn't find any example of how to do it. How can this be done with d3.js?

like image 788
baba-dev Avatar asked Jul 07 '13 11:07

baba-dev


2 Answers

Yes, you can do that with an SVG gradient. All you have to do is define it and then use it as fill for the circle.

var grad = svg.append("defs").append("linearGradient").attr("id", "grad")
              .attr("x1", "0%").attr("x2", "0%").attr("y1", "100%").attr("y2", "0%");
grad.append("stop").attr("offset", "50%").style("stop-color", "lightblue");
grad.append("stop").attr("offset", "50%").style("stop-color", "white");

svg.append("circle")
   .attr("fill", "url(#grad)");

JSfiddle here.

like image 131
Lars Kotthoff Avatar answered Nov 08 '22 14:11

Lars Kotthoff


You may not even require d3 for this simple task. You may use this simple technique, Using Clippath on a circle, I have written it in details in my blog http://anilmaharjan.com.np/blog/2013/11/create-filled-circle-to-visualize-data-using-svg

Use Two circles one above another in a tag. Fill one with the color you wish and another with white or may be your background color just to make it look like its empty in there. Then clip the later one using with rectangle in it, assign radius few pixel less than the earlier circle. Place clip path at the top left .. assign width equal to the diameter of the circle and height will be defined by your data. The data will act reversible to the filling so you may subtract the actual data from your max. EG: if data is 20/100 do 100-20 so u ll get 80 in this way the empty part will be 80 and filled will be 20.

You may switch between height or width to switch between vertical or horizontal filling axis.

The HTML should look like this.

<svg height="200"> <a transform="translate(100,100)">
    <g>
      <circle fill="#f60" r="50"></circle>
    </g>
    <g>
      <clippath id="g-clip">
       <rect height="50" id="g-clip-rect" width="100" x="-50" y="-50">
       </rect>
      </clippath>
      <circle clip-path="url(#g-clip)" fill="#fff" r="47"></circle>
    </g>
  </a>
</svg>

I have created a jsfiddle to illustrate this at: http://jsfiddle.net/neqeT/2/

like image 42
Anil Maharjan Avatar answered Nov 08 '22 14:11

Anil Maharjan