Skip to content

Commit fffc702

Browse files
committed
simplify scattergl per-symbol logic
- dynamically list -open symbols - draw -open symbol as filled unicode symbols with transparent fill so that the border width scales the same as their non-open versions -> this adds support for heaxgon2-open 🎉 - add annotation about 'x' and 'x-open' in `imagetest`
1 parent 39618de commit fffc702

File tree

4 files changed

+86
-123
lines changed

4 files changed

+86
-123
lines changed

src/constants/gl2d_markers.js

+47-109
Original file line numberDiff line numberDiff line change
@@ -9,138 +9,65 @@
99

1010
'use strict';
1111

12-
module.exports = {
12+
var extendFlat = require('../lib/extend').extendFlat;
13+
14+
var symbolsWithOpenSupport = {
1315
'circle': {
1416
unicode: '●'
1517
},
16-
'circle-open': {
17-
unicode: '○'
18-
},
1918
'square': {
2019
unicode: '■'
2120
},
22-
'square-open': {
23-
unicode: '□'
24-
},
2521
'diamond': {
2622
unicode: '◆'
2723
},
28-
'diamond-open': {
29-
unicode: '◇'
30-
},
3124
'cross': {
3225
unicode: '✚'
3326
},
34-
'cross-open': {
35-
unicode: '✚',
36-
bwFactor: 0.5,
37-
transparentFill: true
38-
},
3927
'x': {
4028
unicode: '❌'
4129
},
42-
'x-open': {
43-
unicode: '❌',
44-
bwFactor: 0.5,
45-
transparentFill: true
46-
},
4730
'triangle-up': {
4831
unicode: '▲'
4932
},
50-
'triangle-up-open': {
51-
unicode: '△'
52-
},
5333
'triangle-down': {
5434
unicode: '▼'
5535
},
56-
'triangle-down-open': {
57-
unicode: '▽'
58-
},
5936
'triangle-left': {
60-
unicode: '◄',
61-
},
62-
'triangle-left-open': {
63-
unicode: '◁',
37+
unicode: '◄'
6438
},
6539
'triangle-right': {
66-
unicode: '►',
67-
},
68-
'triangle-right-open': {
69-
unicode: '▷',
40+
unicode: '►'
7041
},
7142
'triangle-ne': {
72-
unicode: '◥',
73-
},
74-
'triangle-ne-open': {
75-
unicode: '◹',
43+
unicode: '◥'
7644
},
7745
'triangle-nw': {
78-
unicode: '◤',
79-
},
80-
'triangle-nw-open': {
81-
unicode: '◸',
46+
unicode: '◤'
8247
},
8348
'triangle-se': {
84-
unicode: '◢',
85-
},
86-
'triangle-se-open': {
87-
unicode: '◿',
49+
unicode: '◢'
8850
},
8951
'triangle-sw': {
90-
unicode: '◣',
91-
},
92-
'triangle-sw-open': {
93-
unicode: '◺',
52+
unicode: '◣'
9453
},
9554
'pentagon': {
96-
unicode: '⬟',
97-
},
98-
'pentagon-open': {
99-
unicode: '⬠',
55+
unicode: '⬟'
10056
},
10157
'hexagon': {
102-
unicode: '⬢',
103-
},
104-
'hexagon-open': {
105-
unicode: '⬡',
58+
unicode: '⬢'
10659
},
10760
'hexagon2': {
108-
unicode: '⬣',
61+
unicode: '⬣'
10962
},
11063
'star': {
111-
unicode: '★',
112-
},
113-
'star-open': {
114-
unicode: '☆',
64+
unicode: '★'
11565
},
11666
'diamond-tall': {
117-
unicode: '♦',
118-
},
119-
'diamond-tall-open': {
120-
unicode: '♢',
67+
unicode: '♦'
12168
},
12269
'bowtie': {
123-
unicode: '⧓',
124-
},
125-
'bowtie-open': {
126-
unicode: '⋈',
127-
bwFactor: 0.2
128-
},
129-
'circle-cross-open': {
130-
unicode: '⨁',
131-
bwFactor: 0.2
132-
},
133-
'circle-x-open': {
134-
unicode: '⨂',
135-
bwFactor: 0.2
136-
},
137-
'square-cross-open': {
138-
unicode: '⊞',
139-
bwFactor: 0.2
140-
},
141-
'square-x-open': {
142-
unicode: '⊠',
143-
bwFactor: 0.2
70+
unicode: '⧓'
14471
},
14572
'diamond-x': {
14673
unicode: '❖',
@@ -150,46 +77,57 @@ module.exports = {
15077
unicode: '+',
15178
noBorder: true
15279
},
153-
'cross-thin-open': {
154-
unicode: '+',
155-
},
15680
'asterisk': {
15781
unicode: '✳',
15882
noBorder: true
15983
},
160-
'asterisk-open': {
161-
unicode: '✳',
162-
},
16384
'y-up': {
16485
unicode: '⅄',
16586
noBorder: true
16687
},
167-
'y-up-open': {
168-
unicode: '⅄',
169-
noBorder: true
170-
},
17188
'y-down': {
17289
unicode: 'Y',
17390
noBorder: true
17491
},
175-
'y-down-open': {
176-
unicode: 'Y',
177-
noBorder: true
178-
},
17992
'line-ew': {
18093
unicode: '─',
18194
noBorder: true
18295
},
183-
'line-ew-open': {
184-
unicode: '─',
185-
noBorder: true
186-
},
18796
'line-ns': {
18897
unicode: '│',
18998
noBorder: true
99+
}
100+
};
101+
102+
var openSymbols = {};
103+
var keys = Object.keys(symbolsWithOpenSupport);
104+
105+
for(var i = 0; i < keys.length; i++) {
106+
var k = keys[i];
107+
openSymbols[k + '-open'] = extendFlat({}, symbolsWithOpenSupport[k]);
108+
}
109+
110+
var otherSymbols = {
111+
'circle-cross-open': {
112+
unicode: '⨁',
113+
noFill: true
190114
},
191-
'line-ns-open': {
192-
unicode: '│',
193-
noBorder: true
115+
'circle-x-open': {
116+
unicode: '⨂',
117+
noFill: true
118+
},
119+
'square-cross-open': {
120+
unicode: '⊞',
121+
noFill: true
122+
},
123+
'square-x-open': {
124+
unicode: '⊠',
125+
noFill: true
194126
}
195127
};
128+
129+
module.exports = extendFlat({},
130+
symbolsWithOpenSupport,
131+
openSymbols,
132+
otherSymbols
133+
);

src/traces/scattergl/convert.js

+19-10
Original file line numberDiff line numberDiff line change
@@ -508,34 +508,43 @@ proto.updateFancy = function(options) {
508508
var colors = convertColorScale(markerOpts, markerOpacity, traceOpacity, len);
509509
var borderWidths = convertNumber(markerOpts.line.width, len);
510510
var borderColors = convertColorScale(markerOpts.line, markerOpacity, traceOpacity, len);
511-
var index, symbol, symbolSpec, _colors, _borderColors, bwFactor;
511+
var index, symbol, symbolSpec, _colors, _borderColors, bwFactor, isOpen;
512512

513513
sizes = convertArray(markerSizeFunc, markerOpts.size, len);
514514

515515
for(i = 0; i < pId; ++i) {
516516
index = idToIndex[i];
517517
symbol = symbols[index];
518518
symbolSpec = MARKER_SYMBOLS[symbol];
519+
isOpen = isSymbolOpen(symbol);
519520

520-
if(isSymbolOpen(symbol)) {
521-
_colors = colors;
522-
_borderColors = colors;
523-
bwFactor = symbolSpec.bwFactor || 0.25;
524-
} else if(symbolSpec.noBorder) {
521+
if(symbolSpec.noBorder && !isOpen) {
525522
_colors = borderColors;
526-
_borderColors = borderColors;
527-
bwFactor = symbolSpec.bwFactor || 0.25;
528523
} else {
529524
_colors = colors;
525+
}
526+
527+
if(isOpen) {
528+
_borderColors = colors;
529+
} else {
530530
_borderColors = borderColors;
531-
bwFactor = symbolSpec.bwFactor || 0.5;
531+
}
532+
533+
if(symbolSpec.bwFactor) {
534+
bwFactor = symbolSpec.bwFactor;
535+
} else if(symbolSpec.noBorder) {
536+
bwFactor = 0.25;
537+
} else if(symbolSpec.noFill) {
538+
bwFactor = 0.1;
539+
} else {
540+
bwFactor = 0.5;
532541
}
533542

534543
this.scatter.options.sizes[i] = 4.0 * sizes[index];
535544
this.scatter.options.glyphs[i] = symbolSpec.unicode;
536545
this.scatter.options.borderWidths[i] = bwFactor * borderWidths[index];
537546

538-
if(symbolSpec.transparentFill) {
547+
if(isOpen && !symbolSpec.noBorder && !symbolSpec.noFill) {
539548
fillColor(this.scatter.options.colors, transparent, i, 0);
540549
} else {
541550
fillColor(this.scatter.options.colors, _colors, i, index);
9.74 KB
Loading

test/image/mocks/gl2d_marker_symbols.json

+20-4
Original file line numberDiff line numberDiff line change
@@ -409,7 +409,7 @@
409409
20,
410410
20,
411411
20,
412-
1,
412+
20,
413413
1,
414414
20,
415415
1,
@@ -461,7 +461,7 @@
461461
"marker symbol: triangle-nw-open",
462462
"marker symbol: pentagon-open",
463463
"marker symbol: hexagon-open",
464-
"marker symbol: hexagon2-open<br>NOT AVAILABLE",
464+
"marker symbol: hexagon2-open",
465465
"marker symbol: octagon-open<br>NOT AVAILABLE",
466466
"marker symbol: star-open",
467467
"marker symbol: hexagram-open<br>NOT AVAILABLE",
@@ -1008,6 +1008,22 @@
10081008
},
10091009
"showlegend": false,
10101010
"hovermode": "closest",
1011-
"plot_bgcolor": "#d3d3d3"
1011+
"plot_bgcolor": "#d3d3d3",
1012+
"annotations": [
1013+
{
1014+
"showarrow": false,
1015+
"xref": "paper",
1016+
"yref": "paper",
1017+
"x": 1,
1018+
"xanchor": "right",
1019+
"y": 0.5,
1020+
"yanchor": "middle",
1021+
"xshift": -15,
1022+
"text": "<b>IMPORTANT</b>: marker symbol 'x' and 'x-open'<br>do not render in the imagetest container",
1023+
"font": {
1024+
"size": 16
1025+
}
1026+
}
1027+
]
10121028
}
1013-
}
1029+
}

0 commit comments

Comments
 (0)