Skip to content

Commit 10d9377

Browse files
committed
Add support for coloring by an independent scalar array
1 parent 88243e0 commit 10d9377

File tree

4 files changed

+51
-21
lines changed

4 files changed

+51
-21
lines changed

src/traces/quiver/attributes.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,13 @@ var attrs = {
3333
anim: true,
3434
description: 'Sets the y components of the arrow vectors.'
3535
},
36+
// Optional scalar field used for colorscale mapping. If omitted, |(u,v)| is used.
37+
c: {
38+
valType: 'data_array',
39+
editType: 'calc',
40+
anim: true,
41+
description: 'Sets the scalar values used to map colors via the colorscale. If not provided, the magnitude sqrt(u^2 + v^2) is used.'
42+
},
3643
sizemode: {
3744
valType: 'enumerated',
3845
values: ['scaled', 'absolute', 'raw'],

src/traces/quiver/calc.js

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ var Axes = require('../../plots/cartesian/axes');
55
var isNumeric = require('fast-isnumeric');
66
var BADNUM = require('../../constants/numerical').BADNUM;
77
var scatterCalc = require('../scatter/calc');
8+
var colorscaleCalc = require('../../components/colorscale/calc');
89

910
/**
1011
* Main calculation function for quiver trace
@@ -24,6 +25,12 @@ module.exports = function calc(gd, trace) {
2425
trace._length = len;
2526
var cd = new Array(len);
2627

28+
var normMin = Infinity;
29+
var normMax = -Infinity;
30+
var cMin = Infinity;
31+
var cMax = -Infinity;
32+
var hasC = Array.isArray(trace.c);
33+
2734
for(var i = 0; i < len; i++) {
2835
var cdi = cd[i] = { i: i };
2936
var xValid = isNumeric(xVals[i]);
@@ -36,11 +43,36 @@ module.exports = function calc(gd, trace) {
3643
cdi.x = BADNUM;
3744
cdi.y = BADNUM;
3845
}
46+
47+
// track ranges for colorscale
48+
if(hasC) {
49+
var ci = trace.c[i];
50+
if(isNumeric(ci)) {
51+
if(ci < cMin) cMin = ci;
52+
if(ci > cMax) cMax = ci;
53+
}
54+
} else {
55+
var ui = (trace.u && trace.u[i]) || 0;
56+
var vi = (trace.v && trace.v[i]) || 0;
57+
var n = Math.sqrt(ui * ui + vi * vi);
58+
if(isFinite(n)) {
59+
if(n < normMin) normMin = n;
60+
if(n > normMax) normMax = n;
61+
}
62+
}
3963
}
4064

4165
// Ensure axes are expanded and categories registered like scatter traces do
4266
scatterCalc.calcAxisExpansion(gd, trace, xa, ya, xVals, yVals);
4367

68+
// Colorscale cmin/cmax computation: prefer provided c, else magnitude
69+
var vals = hasC ? [cMin, cMax] : [normMin, normMax];
70+
colorscaleCalc(gd, trace, {
71+
vals: vals,
72+
containerStr: '',
73+
cLetter: 'c'
74+
});
75+
4476
return cd;
4577
};
4678

src/traces/quiver/defaults.js

Lines changed: 2 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -64,23 +64,8 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout
6464
// traceOut.hoverinfo will be set by Lib.coerceHoverinfo in plots.js
6565
traceOut.hovertemplate = traceIn.hovertemplate;
6666

67-
// Colorscale for magnitude coloring: compute cmin/cmax from |(u,v)|
68-
var cmin = Infinity;
69-
var cmax = -Infinity;
70-
for (var k = 0; k < len; k++) {
71-
var uu = (traceOut.u && traceOut.u[k]) || (traceIn.u && traceIn.u[k]) || 0;
72-
var vv = (traceOut.v && traceOut.v[k]) || (traceIn.v && traceIn.v[k]) || 0;
73-
var nrm = Math.sqrt(uu * uu + vv * vv);
74-
if (isFinite(nrm)) {
75-
if (nrm < cmin) cmin = nrm;
76-
if (nrm > cmax) cmax = nrm;
77-
}
78-
}
79-
if (!isFinite(cmin)) cmin = 0;
80-
if (!isFinite(cmax)) cmax = 1;
81-
if (traceIn.cmin === undefined && traceOut.cmin === undefined) traceOut.cmin = cmin;
82-
if (traceIn.cmax === undefined && traceOut.cmax === undefined) traceOut.cmax = cmax;
83-
// Flag colorscale and apply defaults (adds colorscale, showscale, colorbar, etc.)
67+
// Colorscale defaults (adds colorscale, showscale, colorbar, etc.)
68+
// Keep colorscale enabled by default for quiver
8469
traceOut._hasColorscale = hasColorscale(traceIn) || true;
8570
colorscaleDefaults(traceIn, traceOut, layout, coerce, { prefix: '', cLetter: 'c' });
8671

src/traces/quiver/plot.js

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -189,10 +189,16 @@ function plotOne(gd, idx, plotinfo, cdscatter, cdscatterAll, element, transition
189189
if (trace._hasColorscale) {
190190
var colorFunc = Colorscale.makeColorScaleFuncFromTrace(trace);
191191
lineSegments.style('stroke', function(cdi) {
192-
var uVal = (trace.u && trace.u[cdi.i]) || 0;
193-
var vVal = (trace.v && trace.v[cdi.i]) || 0;
194-
var nVal = Math.sqrt(uVal * uVal + vVal * vVal);
195-
return colorFunc(nVal);
192+
var cArr = trace.c;
193+
var value;
194+
if (Array.isArray(cArr) && cArr.length > cdi.i && isFinite(cArr[cdi.i])) {
195+
value = cArr[cdi.i];
196+
} else {
197+
var uVal = (trace.u && trace.u[cdi.i]) || 0;
198+
var vVal = (trace.v && trace.v[cdi.i]) || 0;
199+
value = Math.sqrt(uVal * uVal + vVal * vVal);
200+
}
201+
return colorFunc(value);
196202
});
197203
}
198204

0 commit comments

Comments
 (0)