Skip to content

Commit 69516db

Browse files
committed
Implement visual text label rendering for quiver using shared Drawing.textPointStyle utility
1 parent b19cce2 commit 69516db

File tree

3 files changed

+45
-0
lines changed

3 files changed

+45
-0
lines changed

src/traces/quiver/calc.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,18 @@ module.exports = function calc(gd, trace) {
121121
trace._extremes[xa._id] = Axes.findExtremes(xa, allX, {padded: true});
122122
trace._extremes[ya._id] = Axes.findExtremes(ya, allY, {padded: true});
123123

124+
// Merge text arrays into calcdata for Drawing.textPointStyle
125+
Lib.mergeArray(trace.text, cd, 'tx');
126+
Lib.mergeArray(trace.textposition, cd, 'tp');
127+
if(trace.textfont) {
128+
Lib.mergeArrayCastPositive(trace.textfont.size, cd, 'ts');
129+
Lib.mergeArray(trace.textfont.color, cd, 'tc');
130+
Lib.mergeArray(trace.textfont.family, cd, 'tf');
131+
Lib.mergeArray(trace.textfont.weight, cd, 'tw');
132+
Lib.mergeArray(trace.textfont.style, cd, 'ty');
133+
Lib.mergeArray(trace.textfont.variant, cd, 'tv');
134+
}
135+
124136
// Colorscale cmin/cmax computation: prefer provided marker.color, else magnitude
125137
if(trace._hasColorscale) {
126138
var vals = hasMarkerColorArray ? [cMin, cMax] : [normMin, normMax];

src/traces/quiver/plot.js

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,36 @@ function plotOne(gd, idx, plotinfo, cdscatter, cdscatterAll, element, transition
193193
});
194194
}
195195

196+
// Render text labels at data points
197+
var textGroup = d3.select(element).selectAll('g.text')
198+
.data([cdscatter]);
199+
200+
textGroup.enter().append('g').classed('text', true);
201+
202+
Drawing.setClipUrl(textGroup, plotinfo.layerClipId, gd);
203+
204+
var textJoin = textGroup.selectAll('g.textpoint')
205+
.data(cdscatter);
206+
207+
textJoin.enter().append('g').classed('textpoint', true).append('text');
208+
textJoin.exit().remove();
209+
210+
textJoin.each(function(d) {
211+
var g = d3.select(this);
212+
var hasNode = Drawing.translatePoint(d, g.select('text'), xa, ya);
213+
if(!hasNode) g.remove();
214+
});
215+
216+
textJoin.selectAll('text')
217+
.call(Drawing.textPointStyle, trace, gd)
218+
.each(function(d) {
219+
var x = xa.c2p(d.x);
220+
var y = ya.c2p(d.y);
221+
d3.select(this).selectAll('tspan.line').each(function() {
222+
d3.select(this).attr({x: x, y: y});
223+
});
224+
});
225+
196226
// Handle transitions
197227
if(transitionOpts && transitionOpts.duration > 0) {
198228
var transition = d3.transition()

test/image/mocks/quiver_simple.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@
66
"y": [0, 0, 0, 1, 1, 1, 2, 2, 2],
77
"u": [1, 0, -1, 1, 0, -1, 1, 0, -1],
88
"v": [0, 1, 0, 0, 1, 0, 0, 1, 0],
9+
"text": ["A", "B", "C", "D", "E", "F", "G", "H", "I"],
10+
"textposition": "top center",
11+
"textfont": { "size": 12 },
912
"sizemode": "scaled",
1013
"sizeref": 0.5,
1114
"anchor": "tail",

0 commit comments

Comments
 (0)