forked from cetz-package/cetz
-
Notifications
You must be signed in to change notification settings - Fork 0
/
pie-chart.typ
58 lines (43 loc) · 1.31 KB
/
pie-chart.typ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#import "@preview/cetz:0.1.2"
#set page(width: auto, height: auto, margin: .5cm)
#cetz.canvas({
import cetz.draw: *
let chart(..values, name: none) = {
let values = values.pos()
let offset = 0
let total = values.fold(0, (s, v) => s + v.at(0))
let segment(from, to) = {
merge-path(close: true, {
line((0, 0), (rel: (360deg * from, 1)))
arc((), start: from * 360deg, stop: to * 360deg, radius: 1)
})
}
group(name: name, {
stroke((paint: black, join: "round"))
let i = 0
for v in values {
fill(v.at(1))
let value = v.at(0) / total
// Draw the segment
segment(offset, offset + value)
// Place an anchor for each segment
anchor(v.at(2), (offset * 360deg + value * 180deg, .75))
offset += value
}
})
}
// Draw the chart
chart((10, red, "red"),
(3, blue, "blue"),
(1, green, "green"),
name: "chart")
set-style(mark: (fill: white, start: "o", stroke: black),
content: (padding: .1))
// Draw annotations
line("chart.red", ((), "-|", (2, 0)))
content((), [Red], anchor: "left")
line("chart.blue", (1, -1), ((), "-|", (2,0)))
content((), [Blue], anchor: "left")
line("chart.green", ((), "-|", (2,0)))
content((), [Green], anchor: "left")
})