-
Notifications
You must be signed in to change notification settings - Fork 0
/
packedbubbles.jl
99 lines (80 loc) · 2.56 KB
/
packedbubbles.jl
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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
# example adapted from https://vega.github.io/editor/#/examples/vega/packed-bubble-chart
using EasyVega
cx = Signal(update= "width / 2")
cy = Signal(update= "height / 2")
gravityX = Signal(
value= 0.2,
bind= (input="range", min=0, max=1)
)
gravityY = Signal(
value= 0.1,
bind= (input="range", min=0, max=1)
)
table = Data(values=[
(category= "A", amount= 0.28),
(category= "B", amount= 0.55),
(category= "C", amount= 0.43),
(category= "D", amount= 0.91),
(category= "E", amount= 0.81),
(category= "F", amount= 0.53),
(category= "G", amount= 0.19),
(category= "H", amount= 0.87),
(category= "I", amount= 0.28),
(category= "J", amount= 0.55),
(category= "K", amount= 0.43),
(category= "L", amount= 0.91),
(category= "M", amount= 0.81),
(category= "N", amount= 0.53),
(category= "O", amount= 0.19),
(category= "P", amount= 0.87)
])
siz = LinearScale(domain= table.amount, range=[100,3000])
color = OrdinalScale(domain= table.category, range="ramp")
# The bubbles
nodes = SymbolMark(
:fill => color(table.category),
:xfocus => (signal= cx,),
:yfocus => (signal= cy,),
:update_size => siz(signal= "pow(2 * datum.amount, 2)"),
:update_stroke => "white",
:update_strokeWidth => 1,
:update_tooltip => (signal= "datum",),
# apply a force transform (both attrative toward center, and repulsive to avoid collisions)
transform= [
(
type= "force",
iterations= 100,
static= false,
forces= [
(force= "collide", iterations= 2, radius_expr= "sqrt(datum.size) / 2"),
(force= "center", x= (signal= cx,), y= (signal= cy,)),
(force= "x", x= "xfocus", strength= (signal= gravityX,)),
(force= "y", y= "yfocus", strength= (signal= gravityY,))
]
)
]
)
# Textmark to show the category name
# this textmark is not based on a Data but on another Mark : nodes.
# Mark as sources allow to modify / annotate the mark, here we are
# printing a letter at the center of the bubble.
txtmark = TextMark(
# need to be specific here for the from_data field because the source is
# another mark not data.
from_data = nodes,
:align => "center",
:baseline => "middle",
:fontSize => 15,
:fontWeight => "bold",
:fill => "white",
# 'x' and 'y' channels of the mark source appear as fields ,
# 'category' is from the data source of the mark, hence the 'datum.category'
:text => (field= "datum.category",),
:update_x => (field= :x,),
:update_y => (field= :y,),
)
VG( width= 400, height=400,
padding= 20, background= "white",
autosize= "none",
marks= [ nodes, txtmark]
)