@@ -89,7 +89,8 @@ exports.quadrature = function quadrature(dx, dy) {
8989 *
9090 * @param {object } pointData : point data object (gets mutated here)
9191 * @param {object } trace : full trace object
92- * @param {number } pointNumber : point number
92+ * @param {number|Array(number) } pointNumber : point number. May be a length-2 array
93+ * [row, col] to dig into 2D arrays
9394 */
9495exports . appendArrayPointValue = function ( pointData , trace , pointNumber ) {
9596 var arrayAttrs = trace . _arrayAttrs ;
@@ -100,22 +101,68 @@ exports.appendArrayPointValue = function(pointData, trace, pointNumber) {
100101
101102 for ( var i = 0 ; i < arrayAttrs . length ; i ++ ) {
102103 var astr = arrayAttrs [ i ] ;
103- var key ;
104+ var key = getPointKey ( astr ) ;
104105
105- if ( astr === 'ids' ) key = 'id' ;
106- else if ( astr === 'locations' ) key = 'location' ;
107- else key = astr ;
106+ if ( pointData [ key ] === undefined ) {
107+ var val = Lib . nestedProperty ( trace , astr ) . get ( ) ;
108+ var pointVal = getPointData ( val , pointNumber ) ;
109+
110+ if ( pointVal !== undefined ) pointData [ key ] = pointVal ;
111+ }
112+ }
113+ } ;
114+
115+ /**
116+ * Appends values inside array attributes corresponding to given point number array
117+ * For use when pointData references a plot entity that arose (or potentially arose)
118+ * from multiple points in the input data
119+ *
120+ * @param {object } pointData : point data object (gets mutated here)
121+ * @param {object } trace : full trace object
122+ * @param {Array(number)|Array(Array(number)) } pointNumbers : Array of point numbers.
123+ * Each entry in the array may itself be a length-2 array [row, col] to dig into 2D arrays
124+ */
125+ exports . appendArrayMultiPointValues = function ( pointData , trace , pointNumbers ) {
126+ var arrayAttrs = trace . _arrayAttrs ;
127+
128+ if ( ! arrayAttrs ) {
129+ return ;
130+ }
131+
132+ for ( var i = 0 ; i < arrayAttrs . length ; i ++ ) {
133+ var astr = arrayAttrs [ i ] ;
134+ var key = getPointKey ( astr ) ;
108135
109136 if ( pointData [ key ] === undefined ) {
110137 var val = Lib . nestedProperty ( trace , astr ) . get ( ) ;
138+ var keyVal = new Array ( pointNumbers . length ) ;
111139
112- if ( Array . isArray ( pointNumber ) ) {
113- if ( Array . isArray ( val ) && Array . isArray ( val [ pointNumber [ 0 ] ] ) ) {
114- pointData [ key ] = val [ pointNumber [ 0 ] ] [ pointNumber [ 1 ] ] ;
115- }
116- } else {
117- pointData [ key ] = val [ pointNumber ] ;
140+ for ( var j = 0 ; j < pointNumbers . length ; j ++ ) {
141+ keyVal [ j ] = getPointData ( val , pointNumbers [ j ] ) ;
118142 }
143+ pointData [ key ] = keyVal ;
119144 }
120145 }
121146} ;
147+
148+ var pointKeyMap = {
149+ ids : 'id' ,
150+ locations : 'location' ,
151+ labels : 'label' ,
152+ values : 'value' ,
153+ 'marker.colors' : 'color'
154+ } ;
155+
156+ function getPointKey ( astr ) {
157+ return pointKeyMap [ astr ] || astr ;
158+ }
159+
160+ function getPointData ( val , pointNumber ) {
161+ if ( Array . isArray ( pointNumber ) ) {
162+ if ( Array . isArray ( val ) && Array . isArray ( val [ pointNumber [ 0 ] ] ) ) {
163+ return val [ pointNumber [ 0 ] ] [ pointNumber [ 1 ] ] ;
164+ }
165+ } else {
166+ return val [ pointNumber ] ;
167+ }
168+ }
0 commit comments