@plotdb/chart 1.0.1 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +3 -1
- package/CHANGELOG.md +0 -29
- package/build +0 -45
- package/doc/charts.md +0 -58
- package/doc/config.md +0 -44
- package/doc/draft/chart.md +0 -146
- package/doc/draft/data.md +0 -8
- package/doc/draft/definition.md +0 -0
- package/doc/draft/events.md +0 -0
- package/doc/draft/filter.md +0 -0
- package/doc/draft/lifecycle.md +0 -89
- package/doc/spec.md +0 -89
- package/doc/todo.md +0 -27
- package/doc/utils/tip.md +0 -84
- package/src/data/en-US/category +0 -20
- package/src/data/en-US/fruit +0 -39
- package/src/data/en-US/movie +0 -125
- package/src/data/en-US/name +0 -58
- package/src/data/index.ls +0 -34
- package/src/data/zh-TW/category +0 -20
- package/src/data/zh-TW/fruits +0 -38
- package/src/data/zh-TW/movie +0 -125
- package/src/data/zh-TW/names +0 -105
- package/src/index.ls +0 -323
- package/src/index.styl +0 -6
- package/src/utils/axis.ls +0 -229
- package/src/utils/config.ls +0 -11
- package/src/utils/data.ls +0 -104
- package/src/utils/format.ls +0 -30
- package/src/utils/legend.ls +0 -134
- package/src/utils/legend.styl +0 -37
- package/src/utils/tint.ls +0 -66
- package/src/utils/tip.ls +0 -97
- package/web/src/pug/base.pug +0 -21
- package/web/src/pug/block/axis/0.0.1/index.ls +0 -32
- package/web/src/pug/block/axis/0.0.1/index.pug +0 -1
- package/web/src/pug/block/axis-bubble/0.0.1/index.ls +0 -137
- package/web/src/pug/block/axis-bubble/0.0.1/index.pug +0 -1
- package/web/src/pug/block/bar/0.0.1/index.ls +0 -270
- package/web/src/pug/block/bar/0.0.1/index.pug +0 -35
- package/web/src/pug/block/bar-list/0.0.1/index.ls +0 -81
- package/web/src/pug/block/bar-list/0.0.1/index.pug +0 -30
- package/web/src/pug/block/bar-race/0.0.1/index.ls +0 -79
- package/web/src/pug/block/bar-race/0.0.1/index.pug +0 -21
- package/web/src/pug/block/base/0.0.1/index.ls +0 -66
- package/web/src/pug/block/base/0.0.1/index.pug +0 -5
- package/web/src/pug/block/blank/0.0.1/index.ls +0 -21
- package/web/src/pug/block/blank/0.0.1/index.pug +0 -1
- package/web/src/pug/block/bubble/0.0.1/index.ls +0 -218
- package/web/src/pug/block/bubble/0.0.1/index.pug +0 -42
- package/web/src/pug/block/curve-bar/0.0.1/index.ls +0 -85
- package/web/src/pug/block/curve-bar/0.0.1/index.pug +0 -16
- package/web/src/pug/block/curve-bar/0.0.1/sample.js +0 -338
- package/web/src/pug/block/dumbbell/0.0.1/index.ls +0 -86
- package/web/src/pug/block/dumbbell/0.0.1/index.pug +0 -1
- package/web/src/pug/block/empty/0.0.1/index.ls +0 -28
- package/web/src/pug/block/empty/0.0.1/index.pug +0 -2
- package/web/src/pug/block/gauge/0.0.1/index.ls +0 -96
- package/web/src/pug/block/gauge/0.0.1/index.pug +0 -31
- package/web/src/pug/block/gauge/0.0.1/sample.js +0 -338
- package/web/src/pug/block/line/0.0.1/index.ls +0 -297
- package/web/src/pug/block/line/0.0.1/index.pug +0 -33
- package/web/src/pug/block/number/0.0.1/index.ls +0 -65
- package/web/src/pug/block/number/0.0.1/index.pug +0 -20
- package/web/src/pug/block/percent-list/0.0.1/index.ls +0 -161
- package/web/src/pug/block/percent-list/0.0.1/index.pug +0 -34
- package/web/src/pug/block/pie/0.0.1/index.ls +0 -121
- package/web/src/pug/block/pie/0.0.1/index.pug +0 -19
- package/web/src/pug/block/pie/0.0.1/sample.js +0 -338
- package/web/src/pug/block/pie-bubble/0.0.1/index.ls +0 -181
- package/web/src/pug/block/pie-bubble/0.0.1/index.pug +0 -40
- package/web/src/pug/block/radar/0.0.1/index.ls +0 -109
- package/web/src/pug/block/radar/0.0.1/index.pug +0 -1
- package/web/src/pug/block/radar/0.0.1/xx +0 -285
- package/web/src/pug/block/scatter/0.0.1/index.ls +0 -124
- package/web/src/pug/block/scatter/0.0.1/index.pug +0 -30
- package/web/src/pug/block/sheet/0.0.1/index.ls +0 -34
- package/web/src/pug/block/sheet/0.0.1/index.pug +0 -5
- package/web/src/pug/block/table/0.0.1/index.ls +0 -36
- package/web/src/pug/block/table/0.0.1/index.pug +0 -3
- package/web/src/pug/block/taiwancounty/0.0.1/index.ls +0 -70
- package/web/src/pug/block/taiwancounty/0.0.1/index.pug +0 -64
- package/web/src/pug/block/taiwantown/0.0.1/index.ls +0 -44
- package/web/src/pug/block/taiwantown/0.0.1/index.pug +0 -52
- package/web/src/pug/block/taiwanvillage/0.0.1/index.ls +0 -49
- package/web/src/pug/block/taiwanvillage/0.0.1/index.pug +0 -52
- package/web/src/pug/block/treemap/0.0.1/index.ls +0 -168
- package/web/src/pug/block/treemap/0.0.1/index.pug +0 -42
- package/web/src/pug/block/voronoi-treemap/0.0.1/index.ls +0 -170
- package/web/src/pug/block/voronoi-treemap/0.0.1/index.pug +0 -17
- package/web/src/pug/block/voronoi-treemap/0.0.1/sample.js +0 -241
- package/web/src/pug/block/wordcloud/0.0.1/index.ls +0 -57
- package/web/src/pug/block/wordcloud/0.0.1/index.pug +0 -1
- package/web/src/pug/block/worldmap/0.0.1/index.ls +0 -77
- package/web/src/pug/block/worldmap/0.0.1/index.pug +0 -12
- package/web/src/pug/index.ls +0 -72
- package/web/src/pug/index.pug +0 -51
- package/web/src/styl/index.styl +0 -6
- package/web/static/assets/block/cache.js +0 -4
- package/web/static/assets/custom-lib/d3/d3-array.v2.js +0 -1182
- package/web/static/assets/custom-lib/d3/d3-array.v2.min.js +0 -2
- package/web/static/assets/custom-lib/d3/d3-array.v3.js +0 -1273
- package/web/static/assets/custom-lib/d3/d3-array.v3.min.js +0 -1273
- package/web/static/assets/custom-lib/d3/d3-axis.v2.min.js +0 -2
- package/web/static/assets/custom-lib/d3/d3-brush.v2.min.js +0 -2
- package/web/static/assets/custom-lib/d3/d3-color.v2.min.js +0 -2
- package/web/static/assets/custom-lib/d3/d3-dispatch.v2.min.js +0 -2
- package/web/static/assets/custom-lib/d3/d3-drag.v2.min.js +0 -2
- package/web/static/assets/custom-lib/d3/d3-ease.v2.min.js +0 -2
- package/web/static/assets/custom-lib/d3/d3-force-boundary.v0.0.1.min.js +0 -2
- package/web/static/assets/custom-lib/d3/d3-force.v2.min.js +0 -2
- package/web/static/assets/custom-lib/d3/d3-format.v2.min.js +0 -2
- package/web/static/assets/custom-lib/d3/d3-geo.v2.js +0 -3127
- package/web/static/assets/custom-lib/d3/d3-geo.v2.min.js +0 -2
- package/web/static/assets/custom-lib/d3/d3-hierarchy.v2.min.js +0 -2
- package/web/static/assets/custom-lib/d3/d3-interpolate.v2.min.js +0 -2
- package/web/static/assets/custom-lib/d3/d3-path.v2.min.js +0 -2
- package/web/static/assets/custom-lib/d3/d3-quadtree.v2.min.js +0 -2
- package/web/static/assets/custom-lib/d3/d3-random.v2.min.js +0 -2
- package/web/static/assets/custom-lib/d3/d3-scale-chromatic.v1.min.js +0 -2
- package/web/static/assets/custom-lib/d3/d3-selection.v2.min.js +0 -2
- package/web/static/assets/custom-lib/d3/d3-shape.v2.min.js +0 -2
- package/web/static/assets/custom-lib/d3/d3-timer.v2.min.js +0 -2
- package/web/static/assets/custom-lib/d3/d3-transition.v2.min.js +0 -2
- package/web/static/assets/custom-lib/d3/d3.v4.js +0 -17178
- package/web/static/assets/custom-lib/d3/d3.v4.min.js +0 -2
- package/web/static/assets/custom-lib/d3/d3.v6.js +0 -19708
- package/web/static/assets/data/countrycode.json +0 -1
- package/web/static/assets/data/world-110m.json +0 -1
- package/web/static/assets/data/zh-to-alpha2.json +0 -1
- package/web/static/assets/img/fluid.svg +0 -16
- package/web/static/block/axis/0.0.1/index.html +0 -74
- package/web/static/block/axis-bubble/0.0.1/index.html +0 -217
- package/web/static/block/bar/0.0.1/index.html +0 -576
- package/web/static/block/bar-list/0.0.1/index.html +0 -226
- package/web/static/block/bar-race/0.0.1/index.html +0 -179
- package/web/static/block/base/0.0.1/index.html +0 -197
- package/web/static/block/blank/0.0.1/index.html +0 -37
- package/web/static/block/bubble/0.0.1/index.html +0 -422
- package/web/static/block/bubble/0.0.1/test.html +0 -0
- package/web/static/block/curve-bar/0.0.1/index.html +0 -143
- package/web/static/block/dumbbell/0.0.1/index.html +0 -173
- package/web/static/block/empty/0.0.1/index.html +0 -76
- package/web/static/block/gauge/0.0.1/index.html +0 -145
- package/web/static/block/line/0.0.1/index.html +0 -566
- package/web/static/block/number/0.0.1/index.html +0 -147
- package/web/static/block/percent-list/0.0.1/index.html +0 -311
- package/web/static/block/pie/0.0.1/index.html +0 -276
- package/web/static/block/pie-bubble/0.0.1/index.html +0 -353
- package/web/static/block/radar/0.0.1/index.html +0 -144
- package/web/static/block/scatter/0.0.1/index.html +0 -246
- package/web/static/block/sheet/0.0.1/index.html +0 -98
- package/web/static/block/table/0.0.1/index.html +0 -67
- package/web/static/block/taiwancounty/0.0.1/index.html +0 -197
- package/web/static/block/taiwantown/0.0.1/index.html +0 -205
- package/web/static/block/taiwanvillage/0.0.1/index.html +0 -215
- package/web/static/block/treemap/0.0.1/index.html +0 -355
- package/web/static/block/voronoi-treemap/0.0.1/index.html +0 -345
- package/web/static/block/wordcloud/0.0.1/index.html +0 -87
- package/web/static/block/worldmap/0.0.1/index.html +0 -202
- package/web/static/css/index.css +0 -6
- package/web/static/css/index.min.css +0 -1
- package/web/static/favicon.ico +0 -0
- package/web/static/index.html +0 -153
|
@@ -1,218 +0,0 @@
|
|
|
1
|
-
module.exports =
|
|
2
|
-
pkg:
|
|
3
|
-
name: 'bubble', version: '0.0.1'
|
|
4
|
-
extend: {name: "base", version: "0.0.1"}
|
|
5
|
-
dependencies: []
|
|
6
|
-
i18n:
|
|
7
|
-
"zh-TW":
|
|
8
|
-
"K": \千
|
|
9
|
-
"M": \百萬
|
|
10
|
-
init: ({root, context, pubsub, t}) ->
|
|
11
|
-
pubsub.fire \init, mod: mod {context, t} .then ~> it.0
|
|
12
|
-
|
|
13
|
-
mod = ({context, t}) ->
|
|
14
|
-
{d3,forceBoundary,ldcolor,chart} = context
|
|
15
|
-
sample: ->
|
|
16
|
-
raw: [0 to 100].map (val) ~> {val: val, cat: Math.floor(Math.random! * 5), name: val}
|
|
17
|
-
binding:
|
|
18
|
-
group: {key: \cat}
|
|
19
|
-
name: {key: \name}
|
|
20
|
-
color: {key: \cat}
|
|
21
|
-
area: {key: \val}
|
|
22
|
-
config: {} <<< chart.utils.config.preset.default
|
|
23
|
-
dimension:
|
|
24
|
-
group: {type: \C, name: "group", priority: 2}
|
|
25
|
-
color: {type: \NR, name: "color", priority: 4}
|
|
26
|
-
area: {type: \R, name: "area", priority: 1}
|
|
27
|
-
name: {type: \NC, name: "name", priority: 3}
|
|
28
|
-
init: ->
|
|
29
|
-
@tint = tint = new chart.utils.tint!
|
|
30
|
-
@parsed = @parsed or []
|
|
31
|
-
@g = Object.fromEntries <[view unit legend]>.map ~> [it, d3.select(@layout.get-group it)]
|
|
32
|
-
node = @root.querySelector '[ld=tip]'
|
|
33
|
-
@tip = new chart.utils.tip {
|
|
34
|
-
root: @root
|
|
35
|
-
accessor: ({evt}) ~>
|
|
36
|
-
if !(evt.target and data = d3.select(evt.target).datum!) => return null
|
|
37
|
-
return {name: data.name, value: "#{data.area}#{@binding.area.unit or ''}"}
|
|
38
|
-
range: ~> return @layout.get-node \view .getBoundingClientRect!
|
|
39
|
-
}
|
|
40
|
-
@legend = new chart.utils.legend do
|
|
41
|
-
layout: @layout
|
|
42
|
-
name: \legend
|
|
43
|
-
root: @root
|
|
44
|
-
shape: (d) -> d3.select(@).attr \fill, tint.get d.key
|
|
45
|
-
direction: if @cfg.{}legend.position == \bottom => \horizontal else \vertical
|
|
46
|
-
cfg: selectable: true
|
|
47
|
-
@legend.on \select, ~> @bind!; @resize!; @render!
|
|
48
|
-
|
|
49
|
-
destroy: -> @tip.destroy!
|
|
50
|
-
|
|
51
|
-
parse: ->
|
|
52
|
-
@valid = @data.filter -> !isNaN(it.area)
|
|
53
|
-
@groups = Array.from(new Set(@valid.map -> it.group)).filter -> it
|
|
54
|
-
@sim = null
|
|
55
|
-
@legend.data @groups.map -> {key: it, text: it}
|
|
56
|
-
resize: ->
|
|
57
|
-
@root.querySelector('.pdl-layout').classList.toggle \legend-bottom, @cfg.{}legend.position == \bottom
|
|
58
|
-
@tip.toggle(if @cfg.{}tip.enabled? => @cfg.tip.enabled else true)
|
|
59
|
-
@cfg.{}legend
|
|
60
|
-
@random = d3.randomUniform.source(d3.randomLcg(+Date.now!))(0, 1)
|
|
61
|
-
list = (
|
|
62
|
-
[{key: 'root', root: true}] ++
|
|
63
|
-
@groups.map(->{key: "group-#it"}) ++
|
|
64
|
-
@valid.filter(~> !@cfg.legend.enabled or @legend.is-selected it.group)
|
|
65
|
-
)
|
|
66
|
-
if @legend.enabled! => list = list.filter ~> !it._raw or @legend.is-selected it.group
|
|
67
|
-
|
|
68
|
-
@legend.config @cfg.legend
|
|
69
|
-
@legend.update!
|
|
70
|
-
@layout.update false
|
|
71
|
-
|
|
72
|
-
ret = d3.hierarchy(
|
|
73
|
-
d3.stratify!
|
|
74
|
-
.id(->if it._idx? => it._idx else it.key)
|
|
75
|
-
# no group-based position
|
|
76
|
-
#.parentId(-> if it.root => '' else 'root' ) list
|
|
77
|
-
# group-based position
|
|
78
|
-
.parentId(-> if it.root => '' else if it.group => "group-#that" else \root) list
|
|
79
|
-
)
|
|
80
|
-
.sum -> it.data.area
|
|
81
|
-
.sort (a,b) -> b.value - a.value # sort or not
|
|
82
|
-
|
|
83
|
-
box = @vbox = @layout.get-box \view
|
|
84
|
-
pack = d3.pack!size([box.width, box.height]) ret
|
|
85
|
-
@parsed = ret.leaves!
|
|
86
|
-
.map (d) ~>
|
|
87
|
-
d._raw = d.data.data._raw
|
|
88
|
-
ddata = d.data.data
|
|
89
|
-
pos = if (!(@cfg.grouping?) and @cfg.grouping) => d else
|
|
90
|
-
# randomized position regardless of grouping
|
|
91
|
-
x: Math.random! * box.width * 0.8 + box.width * 0.1
|
|
92
|
-
y: Math.random! * box.height * 0.8 + box.height * 0.1
|
|
93
|
-
|
|
94
|
-
# if @parsed exists, then this is a data / size / config update.
|
|
95
|
-
# we use the old data position for a smooth transition effect.
|
|
96
|
-
od = if @parsed =>
|
|
97
|
-
p = @parsed
|
|
98
|
-
.filter (p) ->
|
|
99
|
-
if (p.name? or ddata.name?) => (p.name == ddata.name)
|
|
100
|
-
else (p._idx == ddata._idx)
|
|
101
|
-
.0
|
|
102
|
-
if p => p else d
|
|
103
|
-
else d
|
|
104
|
-
{x,y} = d
|
|
105
|
-
d <<< {radius: ddata.area ** 0.5, x, y}
|
|
106
|
-
d <<< ddata{_idx, name, color, group, area}
|
|
107
|
-
if od._x => d._x = od._x else if !d._x => d._x = d.x
|
|
108
|
-
if od._y => d._y = od._y else if !d._y => d._y = d.y
|
|
109
|
-
d
|
|
110
|
-
.filter -> it.area?
|
|
111
|
-
@sim = null
|
|
112
|
-
@start!
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
render: ->
|
|
116
|
-
{binding, tint} = @
|
|
117
|
-
box = @vbox
|
|
118
|
-
# automatically adjust circle size based on canvas size.
|
|
119
|
-
@rate = rate = 0.85 * # make it slightly smaller. adjust as your wish
|
|
120
|
-
Math.PI / (2 * Math.sqrt(3)) * # wasted space from exterior hexagon to circle
|
|
121
|
-
Math.sqrt(box.width * box.height / @parsed.map(-> Math.PI * (it.r ** 2)).reduce(((a,b) -> a + b),0))
|
|
122
|
-
@parsed.map (d,i) ~> d.rr = (d.r * @rate) >? 2
|
|
123
|
-
tint.set(@cfg.palette)
|
|
124
|
-
@g.view.selectAll \circle.bubble .data @parsed, (->it.name or it._idx)
|
|
125
|
-
..exit!remove!
|
|
126
|
-
..enter!append \circle
|
|
127
|
-
.attr \class, 'bubble data'
|
|
128
|
-
.attr \r, (d,i) ~> 0
|
|
129
|
-
.attr \fill, (d,i) ~> tint.get(d.color or d.group or d.name)
|
|
130
|
-
.attr \cx, (d,i) -> d._x
|
|
131
|
-
.attr \cy, (d,i) -> d._y
|
|
132
|
-
|
|
133
|
-
@g.view.selectAll \circle.bubble
|
|
134
|
-
.attr \cx, (d,i) -> d._x
|
|
135
|
-
.attr \cy, (d,i) -> d._y
|
|
136
|
-
.transition!duration 350
|
|
137
|
-
.attr \fill, (d,i) ~> tint.get(d.color or d.group or d.name)
|
|
138
|
-
.attr \r, (d,i) ~> d.rr
|
|
139
|
-
|
|
140
|
-
@g.view.selectAll \g.label .data @parsed, (->it.name or it._idx)
|
|
141
|
-
..exit!remove!
|
|
142
|
-
..enter!append \g
|
|
143
|
-
.attr \class, 'label data'
|
|
144
|
-
.attr \transform, (d,i) -> "translate(#{d.x},#{d.y})"
|
|
145
|
-
.attr \opacity, 0
|
|
146
|
-
.style \pointer-events, \none
|
|
147
|
-
.style \cursor, \pointer
|
|
148
|
-
.each (d,i) ->
|
|
149
|
-
[0,1]
|
|
150
|
-
.map ~> d3.select(@).append \text
|
|
151
|
-
.map ->
|
|
152
|
-
it
|
|
153
|
-
.attr \dy, \-.28em
|
|
154
|
-
.attr \text-anchor, \middle
|
|
155
|
-
.style \pointer-event, \none
|
|
156
|
-
@g.view.selectAll \g.label
|
|
157
|
-
.attr \transform, (d,i) -> "translate(#{d._x},#{d._y})"
|
|
158
|
-
.each (d,i) ->
|
|
159
|
-
d3.select(@).selectAll \text
|
|
160
|
-
.attr \dy, (e,i) -> if i == 0 => '-.28em' else '.88em'
|
|
161
|
-
.text (e,i) ->
|
|
162
|
-
if i == 0 =>
|
|
163
|
-
area = d3.format('.3s')(d.area)
|
|
164
|
-
/*
|
|
165
|
-
ret = if area > 1000000 => (area/1000000).toFixed(1) + t(\M)
|
|
166
|
-
else if area > 1000 => (area/1000).toFixed(1) + t(\K)
|
|
167
|
-
else (area).toFixed(0)
|
|
168
|
-
*/
|
|
169
|
-
ret = area
|
|
170
|
-
if ret => ret = "#{ret}#{binding.area.unit or ''}"
|
|
171
|
-
return ret
|
|
172
|
-
else return d.name or ''
|
|
173
|
-
.attr \font-size, (d,i) -> return if i => '0.9em' else '1.1em'
|
|
174
|
-
|
|
175
|
-
.transition!duration 350
|
|
176
|
-
.attr \fill, ->
|
|
177
|
-
hcl = ldcolor.hcl(tint.get d.color or d.group or d.name)
|
|
178
|
-
if hcl.l < 50 => \#fff else \#000
|
|
179
|
-
@g.view.selectAll \g.label
|
|
180
|
-
.transition!duration 350
|
|
181
|
-
.attr \opacity, (d,i) ->
|
|
182
|
-
box = @getBoundingClientRect!
|
|
183
|
-
[w,h] = [box.width, box.height]
|
|
184
|
-
if (2 * d.rr) < w or (2 * d.rr) < h => 0 else 1
|
|
185
|
-
@legend.render!
|
|
186
|
-
|
|
187
|
-
tick: ->
|
|
188
|
-
cfg = @cfg
|
|
189
|
-
pad = cfg.pad or 5
|
|
190
|
-
box = @vbox
|
|
191
|
-
if !@sim =>
|
|
192
|
-
kickoff = true
|
|
193
|
-
@fc = fc = d3.forceCollide!strength 0.5 .iterations 20 .radius ~> @rate * it.r
|
|
194
|
-
@fg = d3.forceCenter!strength 0.5
|
|
195
|
-
@fb = forceBoundary(
|
|
196
|
-
(~> it.rr + pad), (~> it.rr + pad),
|
|
197
|
-
(~> box.width - it.rr - pad), (~> box.height - it.rr - pad)
|
|
198
|
-
).strength 0.5
|
|
199
|
-
@sim = d3.forceSimulation!
|
|
200
|
-
# we can't make it center properly so disable it for now.
|
|
201
|
-
#.force \center, @fg
|
|
202
|
-
.force \b, @fb
|
|
203
|
-
.force \collide, @fc
|
|
204
|
-
@sim.stop!
|
|
205
|
-
@sim.alpha 0.9
|
|
206
|
-
@fg.x(box.width / 2)
|
|
207
|
-
@fg.y(box.height / 2)
|
|
208
|
-
@sim.nodes(@parsed)
|
|
209
|
-
@sim.tick if kickoff => 10 else 1
|
|
210
|
-
@parsed.map ->
|
|
211
|
-
it._x = it._x + (it.x - it._x) * 0.1
|
|
212
|
-
it._y = it._y + (it.y - it._y) * 0.1
|
|
213
|
-
|
|
214
|
-
@g.view.selectAll \circle.bubble
|
|
215
|
-
.attr \cx, (d,i) -> d._x
|
|
216
|
-
.attr \cy, (d,i) -> d._y
|
|
217
|
-
@g.view.selectAll \g.label
|
|
218
|
-
.attr \transform, (d,i) -> "translate(#{d._x},#{d._y})"
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
div
|
|
2
|
-
div(plug="layout")
|
|
3
|
-
.pdl-layout
|
|
4
|
-
div(data-type="layout")
|
|
5
|
-
.pdl-cell(data-name="view")
|
|
6
|
-
.pdl-cell(data-name="unit")
|
|
7
|
-
.pdl-cell(data-name="legend")
|
|
8
|
-
div(data-type="render")
|
|
9
|
-
style(type="text/css"): :stylus
|
|
10
|
-
/*.pdl-cell { width: 100%; height: 100% }*/
|
|
11
|
-
.pdl-layout > div[data-type=layout]
|
|
12
|
-
display: grid
|
|
13
|
-
grid-template-columns: 1fr fit-content(10em)
|
|
14
|
-
grid-template-rows: 1fr fit-content(1em)
|
|
15
|
-
& > .pdl-cell[data-name=view]
|
|
16
|
-
grid-area: 1 / 1
|
|
17
|
-
& > .pdl-cell[data-name=legend]
|
|
18
|
-
grid-column: 2
|
|
19
|
-
grid-row: 1 / span 2
|
|
20
|
-
padding: 0 .5em 0 .5em
|
|
21
|
-
& > .pdl-cell[data-name=unit]
|
|
22
|
-
grid-column: 1
|
|
23
|
-
grid-row: 2
|
|
24
|
-
line-height: 1em
|
|
25
|
-
text-align: right
|
|
26
|
-
padding: .25em 0
|
|
27
|
-
.pdl-layout.legend-bottom > div[data-type=layout]
|
|
28
|
-
grid-template-columns: 1fr fit-content(1em)
|
|
29
|
-
grid-template-rows: 1fr fit-content(3em)
|
|
30
|
-
.pdl-cell[data-name=view]
|
|
31
|
-
grid-column: 1 / span 2
|
|
32
|
-
grid-row: 1
|
|
33
|
-
.pdl-cell[data-name=legend]
|
|
34
|
-
padding-top: 1em
|
|
35
|
-
grid-column: 1
|
|
36
|
-
grid-row: 2
|
|
37
|
-
.pdl-cell[data-name=unit]
|
|
38
|
-
padding-top: 1em
|
|
39
|
-
grid-column: 2
|
|
40
|
-
grid-row: 2
|
|
41
|
-
|
|
42
|
-
script(type="@plotdb/block"): include:lsc index.ls
|
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
module.exports =
|
|
2
|
-
pkg:
|
|
3
|
-
name: 'curve-bar', version: '0.0.1'
|
|
4
|
-
extend: {name: "base", version: "0.0.1"}
|
|
5
|
-
dependencies: []
|
|
6
|
-
|
|
7
|
-
init: ({root, context, pubsub}) ->
|
|
8
|
-
pubsub.fire \init, mod: mod {context}
|
|
9
|
-
|
|
10
|
-
mod = ({context}) ->
|
|
11
|
-
{d3,legend,chart} = context
|
|
12
|
-
sample: ->
|
|
13
|
-
raw: [1 to 5].map (val) ~> {val: Math.random!, name: val}
|
|
14
|
-
binding:
|
|
15
|
-
name: {key: \name}
|
|
16
|
-
value: {key: \val}
|
|
17
|
-
config: {}
|
|
18
|
-
dimension:
|
|
19
|
-
value: {type: \R, name: "value"}
|
|
20
|
-
name: {type: \N, name: "name"}
|
|
21
|
-
init: ->
|
|
22
|
-
|
|
23
|
-
@gview = d3.select @layout.get-group \view
|
|
24
|
-
@g = @gview.append \g
|
|
25
|
-
@tint = tint = new chart.utils.tint!
|
|
26
|
-
|
|
27
|
-
@arc = d3.arc!
|
|
28
|
-
.innerRadius 0
|
|
29
|
-
.outerRadius 100
|
|
30
|
-
.startAngle 0
|
|
31
|
-
.endAngle(Math.PI / 2)
|
|
32
|
-
|
|
33
|
-
@legend = new chart.utils.legend do
|
|
34
|
-
root: @root
|
|
35
|
-
name: 'legend'
|
|
36
|
-
shape: (d) -> d3.select(@).attr \fill, tint.get d.text
|
|
37
|
-
layout: @layout
|
|
38
|
-
|
|
39
|
-
parse: ->
|
|
40
|
-
@tint.reset!
|
|
41
|
-
@extent =
|
|
42
|
-
v: d3.extent @data.map -> it.value
|
|
43
|
-
@data.sort (a,b) -> a.value - b.value
|
|
44
|
-
@legend.data @data.map -> {key: it.name, text: it.name}
|
|
45
|
-
|
|
46
|
-
resize: ->
|
|
47
|
-
box = @layout.get-box \view
|
|
48
|
-
@layout.get-node \view .style.width = "#{box.height}px"
|
|
49
|
-
@layout.update false
|
|
50
|
-
[w,h] = [box.width, box.height]
|
|
51
|
-
size = Math.min(w,h)
|
|
52
|
-
@scale =
|
|
53
|
-
v: d3.scaleLinear!domain [0, @extent.v.1] .range [0, Math.PI * 3 / 2]
|
|
54
|
-
r: d3.scaleBand!domain (@data.map (d,i) -> i) .range [24, size/2]
|
|
55
|
-
render: ->
|
|
56
|
-
{scale} = @
|
|
57
|
-
bw = @scale.r.bandwidth!
|
|
58
|
-
@arc.cornerRadius bw/2
|
|
59
|
-
if @cfg? and @cfg.palette => @tint.set(@cfg.palette.colors.map -> it.value or it)
|
|
60
|
-
@legend.render!
|
|
61
|
-
|
|
62
|
-
box = @layout.get-box \view
|
|
63
|
-
@g.attr \transform, "translate(#{box.width / 2},#{box.height / 2})"
|
|
64
|
-
@g.selectAll \path.data .data @data
|
|
65
|
-
..exit!remove!
|
|
66
|
-
..enter!append \path .attr \class, \data
|
|
67
|
-
@g.selectAll \path.data
|
|
68
|
-
.attr \d, (d,i) ~>
|
|
69
|
-
@arc
|
|
70
|
-
.startAngle 0
|
|
71
|
-
.endAngle scale.v d.value
|
|
72
|
-
.innerRadius scale.r(i)
|
|
73
|
-
.outerRadius scale.r(i) + bw - 2
|
|
74
|
-
@arc!
|
|
75
|
-
.attr \fill, (d,i) ~> @tint.get d.name or d._idx
|
|
76
|
-
@g.selectAll \text.label .data @data
|
|
77
|
-
..exit!remove!
|
|
78
|
-
..enter!append \text .attr \class, \label
|
|
79
|
-
@g.selectAll \text.label
|
|
80
|
-
.attr \dominant-baseline, \center
|
|
81
|
-
.attr \text-anchor, \end
|
|
82
|
-
.attr \x, \-.5em
|
|
83
|
-
.attr \y, (d,i) -> -scale.r(i)
|
|
84
|
-
.attr \dy, -bw * 1/4
|
|
85
|
-
.text (d,i) -> d.name
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
div
|
|
2
|
-
div(plug="layout")
|
|
3
|
-
.pdl-layout
|
|
4
|
-
div(data-type="layout")
|
|
5
|
-
.pdl-cell(data-name="view")
|
|
6
|
-
.pdl-cell(data-name="legend")
|
|
7
|
-
div(data-type="render")
|
|
8
|
-
style(type="text/css"): :stylus
|
|
9
|
-
.pdl-layout > div[data-type=layout]
|
|
10
|
-
display: flex
|
|
11
|
-
justify-content: center
|
|
12
|
-
align-items: center
|
|
13
|
-
[data-name=view]
|
|
14
|
-
height: 100%
|
|
15
|
-
margin-right: 1em
|
|
16
|
-
script(type="@plotdb/block"): include:lsc index.ls
|