The key to creating a circle with segments is finding the points in a circle that will be used as coordinates in the SVG path elements. Finding points on a circle can be easily done using trigonometric equations if we know the angles.
X Point coordinate = circle radius * Cos (angle in radians) + X Center point coordinate
Y Point coordinate = circle radius * Sin (angle in radians) + Y Center point coordinate
Angle in radians = angle in degrees * Math.PI / 180
Angles depend on no. segments we need to create. General formula (360 / no segments). Thus, to create a circle with 6 segments, the angle covered by each segment will be 60 degrees. The first segment will cover from 0 to 60 degrees, the second from 60 to 120 degrees, etc.
Demonstration of a circle with 6 segments:
The table below shows how points are calculated for a circle with 6 segments (where the radius of the circle is 50, the center point is 55.55):

Once the points are computed, encoding the path itself is simple. The path must begin and end at the center point (i.e. 50.50), from the center point, we must first draw a line from the point and from there draw an arc to the point Point. The following is an example path example:
<path d='M55,55 L105,55 A50,50 0 0,1 80,98.30z' />
svg { height: 220px; width: 220px; } path { fill: transparent; stroke: black; }
<svg viewBox='0 0 110 110'> <path d='M55,55 L105,55 A50,50 0 0,1 80,98.30z' /> <path d='M55,55 L80,98.30 A50,50 0 0,1 30,98.30z' /> <path d='M55,55 L30,98.30 A50,50 0 0,1 5,55z' /> <path d='M55,55 L5,55 A50,50 0 0,1 30,11.69z' /> <path d='M55,55 L30,11.69 A50,50 0 0,1 80,11.69z' /> <path d='M55,55 L80,11.69 A50,50 0 0,1 105,55z' /> </svg>
Demonstration of a circle with 12 segments:
For a circle with 12 segments, each segment will span 30 degrees, and therefore the points will be calculated as in the table below:

svg { height: 220px; width: 220px; } path { fill: transparent; stroke: black; }
<svg viewBox='0 0 110 110'> <path d='M55,55 L105,55 A50,50 0 0,1 98.30,80z' /> <path d='M55,55 L98.30,80 A50,50 0 0,1 80,98.30z' /> <path d='M55,55 L80,98.30 A50,50 0 0,1 55,105z' /> <path d='M55,55 L55,105 A50,50 0 0,1 30,98.30z' /> <path d='M55,55 L30,98.30 A50,50 0 0,1 11.69,80z' /> <path d='M55,55 L11.69,80 A50,50 0 0,1 5,55z' /> <path d='M55,55 L5,55 A50,50 0 0,1 11.69,30z' /> <path d='M55,55 L11.69,30 A50,50 0 0,1 30,11.69z' /> <path d='M55,55 L30,11.69 A50,50 0 0,1 55,5z' /> <path d='M55,55 L55,5 A50,50 0 0,1 80,11.69z' /> <path d='M55,55 L80,11.69 A50,50 0 0,1 98.30,30z' /> <path d='M55,55 L98.30,30 A50,50 0 0,1 105,55z' /> </svg>
Circle with a non-segmented interior:
If it looks as if the part of the circle (with a smaller radius) in the center looked unsegmented, and if this inner part should not be transparent , just add an additional circle element to the circle in the SVG.
svg { height: 220px; width: 220px; } path { fill: transparent; stroke: black; } circle { fill: yellowgreen; stroke: black; }
<svg viewBox='0 0 110 110'> <path d='M55,55 L105,55 A50,50 0 0,1 80,98.30z' /> <path d='M55,55 L80,98.30 A50,50 0 0,1 30,98.30z' /> <path d='M55,55 L30,98.30 A50,50 0 0,1 5,55z' /> <path d='M55,55 L5,55 A50,50 0 0,1 30,11.69z' /> <path d='M55,55 L30,11.69 A50,50 0 0,1 80,11.69z' /> <path d='M55,55 L80,11.69 A50,50 0 0,1 105,55z' /> <circle cx='55' cy='55' r='25' /> </svg>
Different background for each segment:
If each segment should have a different background for them, simply add the fill attribute to each path element.
svg { height: 220px; width: 220px; } path { stroke: black; } circle { fill: yellowgreen; stroke: black; }
<svg viewBox='0 0 110 110'> <path d='M55,55 L105,55 A50,50 0 0,1 80,98.30z' fill='crimson' /> <path d='M55,55 L80,98.30 A50,50 0 0,1 30,98.30z' fill='tomato' /> <path d='M55,55 L30,98.30 A50,50 0 0,1 5,55z' fill='sandybrown' /> <path d='M55,55 L5,55 A50,50 0 0,1 30,11.69z' fill='mediumseagreen' /> <path d='M55,55 L30,11.69 A50,50 0 0,1 80,11.69z' fill='chocolate' /> <path d='M55,55 L80,11.69 A50,50 0 0,1 105,55z' fill='teal' /> <circle cx='55' cy='55' r='25' /> </svg>
Demo with a transparent inner part:
If the central part cannot have a solid color, then everything becomes more complex, because we can no longer begin and end the path at the central point. In such cases, we need to find points on both the outer circle and the inner circle, as shown below:

In this case, the path should begin with "From (Inner)" and end at the same point, draw the line "From (Outer)" from the very beginning, then the arc to "To (Outer)", the line "To (Inner)" and an arc on "From (Inner)".
svg { height: 220px; width: 220px; } path { fill: transparent; stroke: black; }
<svg viewBox='0 0 110 110'> <path d='M80,55 L105,55 A50,50 0 0,1 80,98.30 L67.5,76.65 A25,25 0 0,0 80,55z' /> <path d='M67.5,76.65 L80,98.30 A50,50 0 0,1 30,98.30 L42.5,76.65 A25,25 0 0,0 67.5,76.65z' /> <path d='M42.5,76.65 L30,98.30 A50,50 0 0,1 5,55 L30,55 A25,25 0 0,0 42.5,76.65z' /> <path d='M30,55 L5,55 A50,50 0 0,1 30,11.69 L42.5,33.34 A25,25 0 0,0 30,55z' /> <path d='M42.5,33.34 L30,11.69 A50,50 0 0,1 80,11.69 L67.5,33.34 A25,25 0 0,0 42.5,33.34z' /> <path d='M67.5,33.34 L80,11.69 A50,50 0 0,1 105,55 L80,55 A25,25 0 0,0 67.5,33.4z' /> </svg>
Create each segment with a clickable link:
This is pretty easy to do when the form itself has been created. As with the chipChocolate.py post, just wrap each path in an SVG anchor tag ( <a xlink:href="#"> , where # should be replaced with the URL of the linked page).
svg { height: 220px; width: 220px; } path { fill: transparent; stroke: black; }
<svg viewBox='0 0 110 110'> <a xlink:href="#"><path d='M55,55 L105,55 A50,50 0 0,1 80,98.30z' /></a> <a xlink:href="#"><path d='M55,55 L80,98.30 A50,50 0 0,1 30,98.30z' /></a> <a xlink:href="#"><path d='M55,55 L30,98.30 A50,50 0 0,1 5,55z' /></a> <a xlink:href="#"><path d='M55,55 L5,55 A50,50 0 0,1 30,11.69z' /></a> <a xlink:href="#"><path d='M55,55 L30,11.69 A50,50 0 0,1 80,11.69z' /></a> <a xlink:href="#"><path d='M55,55 L80,11.69 A50,50 0 0,1 105,55z' /></a> </svg>
Adding text to the form:
Adding text to SVG is a bit more complicated, because again we have to specify the point where the text should be placed. If the text is small enough (say, a few characters), then again we can find the points on the circle so that the angle is exactly in the middle of the segment and uses it. The radius can be set so that it is equal to half the radius of the parent circle (if there is no non-segmented part) or such that it is halfway between the inner circle and the outer circle. Parameters text-anchor , dominant-baseline , which are added via CSS, must be sure that the text is positioned so that both the horizontal and vertical center of the text coincide with the specified point.
If the text is large (and needs to be wrapped), then additional processing is necessary, because the content in the SVG text tag will not be automatically wrapped.
Point calculation for a circle with 6 segments and without a central non-segmented area:

Point calculation for a circle with 6 segments and a central non-segmented area:

svg { height: 220px; width: 220px; } path { fill: transparent; stroke: black; } text { text-anchor: middle; dominant-baseline: middle; font: 12px Calibri, Arial; }
<svg viewBox='0 0 110 110'> <path d='M55,55 L105,55 A50,50 0 0,1 80,98.30z' /> <text x='76.65' y='67.5'>1</text> <path d='M55,55 L80,98.30 A50,50 0 0,1 30,98.30z' /> <text x='55' y='80'>2</text> <path d='M55,55 L30,98.30 A50,50 0 0,1 5,55z' /> <text x='33.4' y='67.5'>3</text> <path d='M55,55 L5,55 A50,50 0 0,1 30,11.69z' /> <text x='33.4' y='42.5'>4</text> <path d='M55,55 L30,11.69 A50,50 0 0,1 80,11.69z' /> <text x='55' y='30'>5</text> <path d='M55,55 L80,11.69 A50,50 0 0,1 105,55z' /> <text x='76.65' y='42.5'>6</text> </svg> <svg viewBox='0 0 110 110'> <path d='M55,55 L105,55 A50,50 0 0,1 80,98.30z' /> <text x='87.47' y='73.75'>1</text> <path d='M55,55 L80,98.30 A50,50 0 0,1 30,98.30z' /> <text x='55' y='92.5'>2</text> <path d='M55,55 L30,98.30 A50,50 0 0,1 5,55z' /> <text x='22.52' y='73.75'>3</text> <path d='M55,55 L5,55 A50,50 0 0,1 30,11.69z' /> <text x='22.52' y='36.25'>4</text> <path d='M55,55 L30,11.69 A50,50 0 0,1 80,11.69z' /> <text x='55' y='17.5'>5</text> <path d='M55,55 L80,11.69 A50,50 0 0,1 105,55z' /> <text x='87.47' y='36.25'>6</text> <circle cx='55' cy='55' r='25' /> </svg>
Dynamic creation using JavaScript:
The following is a crude JS implementation to dynamically create segments. The function takes four arguments - the X coordinate of the center of the circle, the Y coordinate of its center, the radius of the circle, and the number. segments / slices.
var fromAngle, toAngle, fromCoordX, fromCoordY, toCoordX, toCoordY, path, d; function createPie(cx, cy, r, slices) { for (var i = 0; i < slices; i++) { path = document.createElementNS("http://www.w3.org/2000/svg", "path"); fromAngle = i * 360 / slices; toAngle = (i + 1) * 360 / slices; fromCoordX = cx + (r * Math.cos(fromAngle * Math.PI / 180)); fromCoordY = cy + (r * Math.sin(fromAngle * Math.PI / 180)); toCoordX = cx + (r * Math.cos(toAngle * Math.PI / 180)); toCoordY = cy + (r * Math.sin(toAngle * Math.PI / 180)); d = 'M' + cx + ',' + cy + ' L' + fromCoordX + ',' + fromCoordY + ' A' + r + ',' + r + ' 0 0,1 ' + toCoordX + ',' + toCoordY + 'z'; path.setAttributeNS(null, "d", d); document.getElementById('pie').appendChild(path); } } createPie(55, 55, 50, 6);
svg { height: 220px; width: 220px; } path { fill: transparent; stroke: black; }
<svg viewBox="0 0 110 110" id="pie"></svg>
The JS sample does not cover examples with a non-segmented inner circle, but this can be achieved by expanding this.