| 1 | pie-chart: make rebface [
|
|---|
| 2 | tip: {
|
|---|
| 3 | USAGE:
|
|---|
| 4 | pie-chart data ["Red" red 60 "Green" green 30 "Blue" blue 10]
|
|---|
| 5 |
|
|---|
| 6 | DESCRIPTION:
|
|---|
| 7 | A pie-chart.
|
|---|
| 8 |
|
|---|
| 9 | OPTIONS:
|
|---|
| 10 | 'no-label to turn labels off
|
|---|
| 11 | [start n] where n is the degrees value
|
|---|
| 12 | [explode n] when n is the number of pixels
|
|---|
| 13 | }
|
|---|
| 14 | size: 50x50
|
|---|
| 15 | feel: make default-feel [
|
|---|
| 16 | redraw: make function! [face act pos /local plot total angle pie-size label-offset label-distance label-size] [
|
|---|
| 17 | if act = 'show [
|
|---|
| 18 | clear plot: skip last face/effect 4
|
|---|
| 19 | total: face/degrees
|
|---|
| 20 | pie-size: face/size / 2 - 1x1 - as-pair face/explode face/explode
|
|---|
| 21 | label-distance: pie-size * .75
|
|---|
| 22 | foreach [label color val] face/data [
|
|---|
| 23 | angle: 360 * val / face/sum
|
|---|
| 24 | insert plot reduce [
|
|---|
| 25 | 'fill-pen color
|
|---|
| 26 | 'arc face/size / 2 + as-pair face/explode * (cosine (total + (angle / 2))) - 1 face/explode * (sine (total + (angle / 2))) - 1 pie-size total angle
|
|---|
| 27 | 'closed
|
|---|
| 28 | ]
|
|---|
| 29 | ; insert text label at tail so it appears on top of pie slices
|
|---|
| 30 | unless find face/options 'no-label [
|
|---|
| 31 | default-text/text: label
|
|---|
| 32 | label-size: size-text default-text
|
|---|
| 33 | label-offset: as-pair label-distance/x * (cosine (total + (angle / 2))) face/explode + label-distance/y * (sine (total + (angle / 2)))
|
|---|
| 34 | ; adjust text offset
|
|---|
| 35 | label-offset/x: label-offset/x - (label-size/x / 2)
|
|---|
| 36 | label-offset/y: label-offset/y - (label-size/y / 2)
|
|---|
| 37 | insert tail plot reduce ['text 'anti-aliased form label face/size / 2 + label-offset]
|
|---|
| 38 | ]
|
|---|
| 39 | total: total + angle
|
|---|
| 40 | if total >= 360 [total: total - 360]
|
|---|
| 41 | ]
|
|---|
| 42 | ]
|
|---|
| 43 | ]
|
|---|
| 44 | ]
|
|---|
| 45 | effect: [draw [pen black font default-font]]
|
|---|
| 46 | sum: 0 ; sum of values
|
|---|
| 47 | explode: 0 ; explode distance
|
|---|
| 48 | degrees: 270 ; default start angle (note that 0 is horizontal)
|
|---|
| 49 | init: make function! [] [
|
|---|
| 50 | data: reduce data
|
|---|
| 51 | explode: any [select options 'explode 0]
|
|---|
| 52 | if select options 'start [
|
|---|
| 53 | degrees: 270 + select options 'start
|
|---|
| 54 | if degrees >= 360 [degrees: degrees - 360]
|
|---|
| 55 | if degrees < 0 [degrees: degrees + 360]
|
|---|
| 56 | ]
|
|---|
| 57 | foreach [label color val] data [sum: sum + val]
|
|---|
| 58 | ]
|
|---|
| 59 | ] |
|---|