From 7c74abe893a18d0b53989d7db90b9f2cd2a92815 Mon Sep 17 00:00:00 2001 From: John Degner Date: Tue, 21 Oct 2025 13:56:52 -0700 Subject: [PATCH 01/46] Add scatterquiver trace type --- lib/index-strict.js | 1 + lib/index.js | 1 + lib/scatterquiver.js | 3 + src/traces/scatterquiver/attributes.js | 207 +++ src/traces/scatterquiver/calc.js | 55 + src/traces/scatterquiver/defaults.js | 68 + src/traces/scatterquiver/event_data.js | 10 + src/traces/scatterquiver/hover.js | 75 + src/traces/scatterquiver/index.js | 31 + src/traces/scatterquiver/plot.js | 120 ++ src/traces/scatterquiver/select_points.js | 39 + src/traces/scatterquiver/style.js | 16 + test/plot-schema.json | 1563 +++++++++++++++++++++ 13 files changed, 2189 insertions(+) create mode 100644 lib/scatterquiver.js create mode 100644 src/traces/scatterquiver/attributes.js create mode 100644 src/traces/scatterquiver/calc.js create mode 100644 src/traces/scatterquiver/defaults.js create mode 100644 src/traces/scatterquiver/event_data.js create mode 100644 src/traces/scatterquiver/hover.js create mode 100644 src/traces/scatterquiver/index.js create mode 100644 src/traces/scatterquiver/plot.js create mode 100644 src/traces/scatterquiver/select_points.js create mode 100644 src/traces/scatterquiver/style.js diff --git a/lib/index-strict.js b/lib/index-strict.js index cac9738bff8..8e332c3b56d 100644 --- a/lib/index-strict.js +++ b/lib/index-strict.js @@ -52,6 +52,7 @@ Plotly.register([ require('../src/traces/scatterpolargl/strict'), require('./barpolar'), require('./scattersmith'), + require('./scatterquiver'), // components require('./calendars'), diff --git a/lib/index.js b/lib/index.js index d4cb5bdcc87..d234cfca3ea 100644 --- a/lib/index.js +++ b/lib/index.js @@ -52,6 +52,7 @@ Plotly.register([ require('./scatterpolargl'), require('./barpolar'), require('./scattersmith'), + require('./scatterquiver'), // components require('./calendars'), diff --git a/lib/scatterquiver.js b/lib/scatterquiver.js new file mode 100644 index 00000000000..f3d08677cc2 --- /dev/null +++ b/lib/scatterquiver.js @@ -0,0 +1,3 @@ +'use strict'; + +module.exports = require('../src/traces/scatterquiver'); diff --git a/src/traces/scatterquiver/attributes.js b/src/traces/scatterquiver/attributes.js new file mode 100644 index 00000000000..6a72329cee5 --- /dev/null +++ b/src/traces/scatterquiver/attributes.js @@ -0,0 +1,207 @@ +'use strict'; + +var baseAttrs = require('../../plots/attributes'); +var hovertemplateAttrs = require('../../plots/template_attributes').hovertemplateAttrs; +var fontAttrs = require('../../plots/font_attributes'); +var dash = require('../../components/drawing/attributes').dash; + +var extendFlat = require('../../lib/extend').extendFlat; + +var attrs = { + x: { + valType: 'data_array', + editType: 'calc+clearAxisTypes', + anim: true, + description: 'Sets the x coordinates of the arrow locations.' + }, + y: { + valType: 'data_array', + editType: 'calc+clearAxisTypes', + anim: true, + description: 'Sets the y coordinates of the arrow locations.' + }, + u: { + valType: 'data_array', + editType: 'calc', + anim: true, + description: 'Sets the x components of the arrow vectors.' + }, + v: { + valType: 'data_array', + editType: 'calc', + anim: true, + description: 'Sets the y components of the arrow vectors.' + }, + scale: { + valType: 'number', + dflt: 0.1, + min: 0, + max: 1, + editType: 'calc', + description: 'Scales size of the arrows (ideally to avoid overlap). Default = 0.1' + }, + arrow_scale: { + valType: 'number', + dflt: 0.3, + min: 0, + max: 1, + editType: 'calc', + description: 'Value multiplied to length of barb to get length of arrowhead. Default = 0.3' + }, + angle: { + valType: 'number', + dflt: Math.PI / 9, + min: 0, + max: Math.PI / 2, + editType: 'calc', + description: 'Angle of arrowhead in radians. Default = π/9' + }, + scaleratio: { + valType: 'number', + min: 0, + editType: 'calc', + description: 'The ratio between the scale of the y-axis and the scale of the x-axis (scale_y / scale_x). Default = null, the scale ratio is not fixed.' + }, + hoverdistance: { + valType: 'number', + min: -1, + dflt: 20, + editType: 'calc', + description: 'Maximum distance (in pixels) to look for nearby arrows on hover.' + }, + + // Line styling for arrows + line: { + color: { + valType: 'color', + dflt: '#000', + editType: 'style', + description: 'Sets the color of the arrow lines.' + }, + width: { + valType: 'number', + min: 0, + dflt: 1, + editType: 'style', + description: 'Sets the width (in px) of the arrow lines.' + }, + dash: dash, + shape: { + valType: 'enumerated', + values: ['linear', 'spline', 'hv', 'vh', 'hvh', 'vhv'], + dflt: 'linear', + editType: 'plot', + description: 'Determines the line shape.' + }, + smoothing: { + valType: 'number', + min: 0, + max: 1.3, + dflt: 1, + editType: 'plot', + description: 'Has an effect only if `shape` is set to *spline*. Sets the amount of smoothing.' + }, + simplify: { + valType: 'boolean', + dflt: true, + editType: 'plot', + description: 'Simplifies lines by removing nearly-overlapping points.' + }, + editType: 'style' + }, + + // Text and labels + text: { + valType: 'data_array', + editType: 'calc', + anim: true, + description: 'Sets text elements associated with each (x,y) pair.' + }, + textposition: { + valType: 'enumerated', + values: [ + 'top left', 'top center', 'top right', + 'middle left', 'middle center', 'middle right', + 'bottom left', 'bottom center', 'bottom right' + ], + dflt: 'middle center', + editType: 'calc', + description: 'Sets the positions of the `text` elements with respects to the (x,y) coordinates.' + }, + // Text font + textfont: fontAttrs({ + editType: 'calc', + colorEditType: 'style', + arrayOk: true, + description: 'Sets the text font.' + }), + + // Selection and styling + selected: { + line: { + color: { + valType: 'color', + editType: 'style', + description: 'Sets the line color of selected points.' + }, + width: { + valType: 'number', + min: 0, + editType: 'style', + description: 'Sets the line width of selected points.' + }, + editType: 'style' + }, + textfont: { + color: { + valType: 'color', + editType: 'style', + description: 'Sets the text font color of selected points, applied only when a selection exists.' + }, + editType: 'style' + }, + editType: 'style' + }, + unselected: { + line: { + color: { + valType: 'color', + editType: 'style', + description: 'Sets the line color of unselected points.' + }, + width: { + valType: 'number', + min: 0, + editType: 'style', + description: 'Sets the line width of unselected points.' + }, + editType: 'style' + }, + textfont: { + color: { + valType: 'color', + editType: 'style', + description: 'Sets the text font color of unselected points, applied only when a selection exists.' + }, + editType: 'style' + }, + editType: 'style' + } +}; + +// Extend with base attributes (includes hoverinfo, etc.) +extendFlat(attrs, baseAttrs); + +// Add hoverinfo with proper flags for quiver +// We need to create a new object to avoid mutating the shared base attributes +attrs.hoverinfo = extendFlat({}, baseAttrs.hoverinfo, { + flags: ['x', 'y', 'u', 'v', 'text', 'name'], + dflt: 'all' +}); + +// Add hovertemplate +attrs.hovertemplate = extendFlat({}, hovertemplateAttrs({}, { + keys: ['x', 'y', 'u', 'v', 'text', 'name'] +})); + +module.exports = attrs; \ No newline at end of file diff --git a/src/traces/scatterquiver/calc.js b/src/traces/scatterquiver/calc.js new file mode 100644 index 00000000000..f502d19bc4c --- /dev/null +++ b/src/traces/scatterquiver/calc.js @@ -0,0 +1,55 @@ +'use strict'; + +var Lib = require('../../lib'); + +/** + * Main calculation function for scatterquiver trace + * Creates calcdata with arrow path data for each vector + */ +module.exports = function calc(gd, trace) { + var x = trace.x; + var y = trace.y; + var u = trace.u; + var v = trace.v; + var scale = trace.scale; + var arrowScale = trace.arrow_scale; + var angle = trace.angle; + var scaleRatio = trace.scaleratio; + + // Create calcdata - one complete arrow per entry + var calcdata = []; + var len = x.length; + + for(var i = 0; i < len; i++) { + // Calculate arrow components + var dx = u[i] * scale * (scaleRatio || 1); + var dy = v[i] * scale; + var barbLen = Math.sqrt(dx * dx / (scaleRatio || 1) + dy * dy); + var arrowLen = barbLen * arrowScale; + var barbAng = Math.atan2(dy, dx / (scaleRatio || 1)); + + var ang1 = barbAng + angle; + var ang2 = barbAng - angle; + + var endX = x[i] + dx; + var endY = y[i] + dy; + + var point1X = endX - arrowLen * Math.cos(ang1) * (scaleRatio || 1); + var point1Y = endY - arrowLen * Math.sin(ang1); + var point2X = endX - arrowLen * Math.cos(ang2) * (scaleRatio || 1); + var point2Y = endY - arrowLen * Math.sin(ang2); + + // Create complete arrow as one path: shaft + arrow head + var arrowPath = [ + { x: x[i], y: y[i], i: i }, // Start point + { x: endX, y: endY, i: i }, // End of shaft + { x: point1X, y: point1Y, i: i }, // Arrow head point 1 + { x: endX, y: endY, i: i }, // Back to end + { x: point2X, y: point2Y, i: i } // Arrow head point 2 + ]; + + calcdata.push(arrowPath); + } + + return calcdata; +}; \ No newline at end of file diff --git a/src/traces/scatterquiver/defaults.js b/src/traces/scatterquiver/defaults.js new file mode 100644 index 00000000000..651e6dd2775 --- /dev/null +++ b/src/traces/scatterquiver/defaults.js @@ -0,0 +1,68 @@ +'use strict'; + +var Lib = require('../../lib'); +var attributes = require('./attributes'); + +module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout) { + // Selection styling - use coerce to set proper defaults + function coerce(attr, dflt) { + return Lib.coerce(traceIn, traceOut, attributes, attr, dflt); + } + + // Coerce x and y data arrays (this ensures proper data structure for category ordering) + var x = coerce('x'); + var y = coerce('y'); + var u = coerce('u'); + var v = coerce('v'); + + // Simple validation - check if we have the required arrays + if(!x || !Array.isArray(x) || x.length === 0 || + !y || !Array.isArray(y) || y.length === 0 || + !u || !Array.isArray(u) || u.length === 0 || + !v || !Array.isArray(v) || v.length === 0) { + traceOut.visible = false; + return; + } + + // Set basic properties + traceOut.type = 'scatterquiver'; + traceOut.visible = true; + + // Set default values using coerce + coerce('scale', 0.1); + coerce('arrow_scale', 0.3); + coerce('angle', Math.PI / 9); + coerce('scaleratio'); + coerce('hoverdistance', 20); + + // Line styling + traceOut.line = { + color: traceIn.line && traceIn.line.color ? traceIn.line.color : defaultColor, + width: traceIn.line && traceIn.line.width ? traceIn.line.width : 1, + dash: traceIn.line && traceIn.line.dash ? traceIn.line.dash : 'solid', + shape: traceIn.line && traceIn.line.shape ? traceIn.line.shape : 'linear', + smoothing: traceIn.line && traceIn.line.smoothing ? traceIn.line.smoothing : 1, + simplify: traceIn.line && traceIn.line.simplify !== undefined ? traceIn.line.simplify : true + }; + + // Hover and interaction - let the plots module handle hoverinfo defaults + // traceOut.hoverinfo will be set by Lib.coerceHoverinfo in plots.js + traceOut.hovertemplate = traceIn.hovertemplate; + + // Text + traceOut.text = traceIn.text; + traceOut.textposition = traceIn.textposition || 'middle center'; + + // Use Lib.coerceFont to set textfont properly + Lib.coerceFont(coerce, 'textfont', layout.font); + + coerce('selected.line.color'); + coerce('selected.line.width'); + coerce('selected.textfont.color'); + coerce('unselected.line.color'); + coerce('unselected.line.width'); + coerce('unselected.textfont.color'); + + // Set the data length + traceOut._length = x.length; +}; \ No newline at end of file diff --git a/src/traces/scatterquiver/event_data.js b/src/traces/scatterquiver/event_data.js new file mode 100644 index 00000000000..faecde95abb --- /dev/null +++ b/src/traces/scatterquiver/event_data.js @@ -0,0 +1,10 @@ +'use strict'; + +module.exports = function eventData(out, pt, trace, cd, pointNumber) { + out.x = pt.x; + out.y = pt.y; + out.u = trace.u[pointNumber]; + out.v = trace.v[pointNumber]; + out.pointNumber = pointNumber; + out.trace = trace; +}; diff --git a/src/traces/scatterquiver/hover.js b/src/traces/scatterquiver/hover.js new file mode 100644 index 00000000000..e5502dcbc0a --- /dev/null +++ b/src/traces/scatterquiver/hover.js @@ -0,0 +1,75 @@ +'use strict'; + +var Lib = require('../../lib'); +var Fx = require('../../components/fx'); +var Registry = require('../../registry'); + +module.exports = function hoverPoints(pointData, xval, yval, hovermode) { + var cd = pointData.cd; + var trace = cd[0].trace; + var xa = pointData.xa; + var ya = pointData.ya; + var xpx = xa.c2p(xval); + var ypx = ya.c2p(yval); + + // Find the closest arrow to the hover point + var minDistance = Infinity; + var closestPoint = null; + var closestIndex = -1; + + // Check each arrow segment + for(var i = 0; i < cd.length; i++) { + var segment = cd[i]; + if(segment.length < 2) continue; + + // Calculate distance to the start point of the arrow + var x1 = xa.c2p(segment[0].x); + var y1 = ya.c2p(segment[0].y); + + var distance = Math.sqrt((xpx - x1) * (xpx - x1) + (ypx - y1) * (ypx - y1)); + + if(distance < minDistance) { + minDistance = distance; + closestPoint = segment[0]; // Use the start point for hover data + closestIndex = i; + } + } + + if(!closestPoint || minDistance > (trace.hoverdistance || 20)) return; + + // Create hover point data with proper label values and spikeline support + var hoverPoint = { + x: closestPoint.x, + y: closestPoint.y, + u: trace.u[closestIndex], + v: trace.v[closestIndex], + text: trace.text ? trace.text[closestIndex] : '', + name: trace.name || '', + trace: trace, + index: closestIndex, + // Set label values for proper hover formatting + xLabelVal: closestPoint.x, + yLabelVal: closestPoint.y, + uLabelVal: trace.u[closestIndex], + vLabelVal: trace.v[closestIndex], + // Add spikeline support + xa: pointData.xa, + ya: pointData.ya, + x0: closestPoint.x, + x1: closestPoint.x, + y0: closestPoint.y, + y1: closestPoint.y, + distance: minDistance, + spikeDistance: minDistance, + curveNumber: trace.index, + color: trace.line ? trace.line.color : 'blue' + }; + + // Set hover text + var hovertext = trace.hovertext || trace.text; + if(hovertext && hovertext[closestIndex]) { + hoverPoint.hovertext = hovertext[closestIndex]; + } + + return [hoverPoint]; +}; \ No newline at end of file diff --git a/src/traces/scatterquiver/index.js b/src/traces/scatterquiver/index.js new file mode 100644 index 00000000000..b476090cc53 --- /dev/null +++ b/src/traces/scatterquiver/index.js @@ -0,0 +1,31 @@ +'use strict'; + +module.exports = { + moduleType: 'trace', + name: 'scatterquiver', + basePlotModule: require('../../plots/cartesian'), + categories: [ + 'cartesian', 'svg', 'showLegend', 'scatter-like', 'zoomScale' + ], + + attributes: require('./attributes'), + supplyDefaults: require('./defaults'), + calc: require('./calc'), + plot: require('./plot'), + style: require('./style'), + styleOnSelect: require('../scatter/style').styleOnSelect, + hoverPoints: require('./hover'), + eventData: require('./event_data'), + selectPoints: require('./select_points'), + animatable: true, + + meta: { + description: [ + 'The scatterquiver trace type visualizes vector fields using arrows.', + 'Specify a vector field using 4 1D arrays:', + '2 position arrays `x`, `y` and 2 vector component arrays `u`, `v`.', + 'The arrows are drawn exactly at the positions given by `x` and `y`.', + 'Arrow length and direction are determined by `u` and `v` components.' + ].join(' ') + } +}; diff --git a/src/traces/scatterquiver/plot.js b/src/traces/scatterquiver/plot.js new file mode 100644 index 00000000000..36a9bb4cb7e --- /dev/null +++ b/src/traces/scatterquiver/plot.js @@ -0,0 +1,120 @@ +'use strict'; + +var d3 = require('@plotly/d3'); + +var Registry = require('../../registry'); +var Lib = require('../../lib'); +var Drawing = require('../../components/drawing'); + +module.exports = function plot(gd, plotinfo, cdscatter, scatterLayer, transitionOpts, makeOnCompleteCallback) { + var join, onComplete; + + // If transition config is provided, then it is only a partial replot and traces not + // updated are removed. + var isFullReplot = !transitionOpts; + var hasTransition = !!transitionOpts && transitionOpts.duration > 0; + + join = scatterLayer.selectAll('g.trace') + .data(cdscatter, function(d) { return d[0].trace.uid; }); + + // Append new traces: + join.enter().append('g') + .attr('class', function(d) { + return 'trace scatterquiver trace' + d[0].trace.uid; + }) + .style('stroke-miterlimit', 2); + join.order(); + + if(hasTransition) { + if(makeOnCompleteCallback) { + onComplete = makeOnCompleteCallback(); + } + + var transition = d3.transition() + .duration(transitionOpts.duration) + .ease(transitionOpts.easing) + .each('end', function() { + onComplete && onComplete(); + }) + .each('interrupt', function() { + onComplete && onComplete(); + }); + + transition.each(function() { + scatterLayer.selectAll('g.trace').each(function(d, i) { + plotOne(gd, i, plotinfo, d, cdscatter, this, transitionOpts); + }); + }); + } else { + join.each(function(d, i) { + plotOne(gd, i, plotinfo, d, cdscatter, this, transitionOpts); + }); + } + + if(isFullReplot) { + join.exit().remove(); + } +}; + +function plotOne(gd, idx, plotinfo, cdscatter, cdscatterAll, element, transitionOpts) { + var trace = cdscatter[0].trace; + var xa = plotinfo.xaxis; + var ya = plotinfo.yaxis; + var fullLayout = gd._fullLayout; + + // Create line group for arrows + var lines = d3.select(element).selectAll('g.lines') + .data([cdscatter]); + + lines.enter().append('g') + .classed('lines', true); + + Drawing.setClipUrl(lines, plotinfo.layerClipId, gd); + + // Create line segments for each arrow + var lineSegments = lines.selectAll('path.js-line') + .data(cdscatter); + + lineSegments.enter().append('path') + .classed('js-line', true) + .style('vector-effect', 'non-scaling-stroke'); + + lineSegments.exit().remove(); + + // Update line segments + lineSegments.each(function(d) { + var path = d3.select(this); + var segment = d; + + if(segment.length === 0) return; + + // Convert data coordinates to pixel coordinates + var pixelCoords = segment.map(function(point) { + return { + x: xa.c2p(point.x), + y: ya.c2p(point.y) + }; + }); + + // Create SVG path from pixel coordinates + var pathData = 'M' + pixelCoords[0].x + ',' + pixelCoords[0].y; + for(var i = 1; i < pixelCoords.length; i++) { + pathData += 'L' + pixelCoords[i].x + ',' + pixelCoords[i].y; + } + + path.attr('d', pathData); + }); + + // Apply styling using Plotly's standard styling system + Drawing.lineGroupStyle(lineSegments, trace.line && trace.line.width, trace.line && trace.line.color, trace.line && trace.line.dash); + + // Handle transitions + if(transitionOpts && transitionOpts.duration > 0) { + var transition = d3.transition() + .duration(transitionOpts.duration) + .ease(transitionOpts.easing); + + lineSegments.transition(transition) + .style('opacity', 1); + } +} \ No newline at end of file diff --git a/src/traces/scatterquiver/select_points.js b/src/traces/scatterquiver/select_points.js new file mode 100644 index 00000000000..e169b1b9517 --- /dev/null +++ b/src/traces/scatterquiver/select_points.js @@ -0,0 +1,39 @@ +'use strict'; + +module.exports = function selectPoints(searchInfo, selectionTester) { + var cd = searchInfo.cd; + var xa = searchInfo.xaxis; + var ya = searchInfo.yaxis; + var selection = []; + var trace = cd[0].trace; + var i; + var segment; + var x; + var y; + + if(selectionTester === false) { // clear selection + for(i = 0; i < cd.length; i++) { + cd[i].selected = 0; + } + } else { + for(i = 0; i < cd.length; i++) { + segment = cd[i]; + // Use the start point of the arrow for selection testing + x = xa.c2p(segment[0].x); + y = ya.c2p(segment[0].y); + + if((segment[0].i !== null) && selectionTester.contains([x, y], false, i, searchInfo)) { + selection.push({ + pointNumber: segment[0].i, + x: xa.c2d(segment[0].x), + y: ya.c2d(segment[0].y) + }); + segment.selected = 1; + } else { + segment.selected = 0; + } + } + } + + return selection; +}; diff --git a/src/traces/scatterquiver/style.js b/src/traces/scatterquiver/style.js new file mode 100644 index 00000000000..deb72e21718 --- /dev/null +++ b/src/traces/scatterquiver/style.js @@ -0,0 +1,16 @@ +'use strict'; + +var d3 = require('@plotly/d3'); + +var Drawing = require('../../components/drawing'); +var Lib = require('../../lib'); + +module.exports = function style(gd, calcTrace) { + if(!calcTrace || !calcTrace.length || !calcTrace[0]) return; + + var trace = calcTrace[0].trace; + var s = d3.select(gd).selectAll('g.trace' + trace.uid); + + s.selectAll('path.js-line') + .call(Drawing.lineGroupStyle, trace.line || {}); +}; diff --git a/test/plot-schema.json b/test/plot-schema.json index 78614b86693..c869e669c43 100644 --- a/test/plot-schema.json +++ b/test/plot-schema.json @@ -57621,6 +57621,1569 @@ }, "type": "pie" }, + "quiver": { + "animatable": true, + "attributes": { + "anchor": { + "description": "Sets the arrows' anchor with respect to their (x,y) positions. Use *tail* to place (x,y) at the base, *tip* to place (x,y) at the head, or *cm*/*center*/*middle* to center the arrow on (x,y).", + "dflt": "tail", + "editType": "calc", + "valType": "enumerated", + "values": [ + "tip", + "tail", + "cm", + "center", + "middle" + ] + }, + "arrow_scale": { + "description": "Deprecated alias for `arrowsize`-based sizing. Prefer using `arrowsize`.", + "editType": "calc", + "max": 1, + "min": 0, + "valType": "number" + }, + "arrowsize": { + "description": "Scales the size of the arrow head relative to a base size. Higher values produce larger heads.", + "dflt": 1, + "editType": "calc", + "min": 0.3, + "valType": "number" + }, + "arrowwidth": { + "description": "Sets the width (in px) of the arrow line (alias of `line.width`).", + "editType": "style", + "min": 0.1, + "valType": "number" + }, + "autocolorscale": { + "description": "Determines whether the colorscale is a default palette (`autocolorscale: true`) or the palette determined by `colorscale`. In case `colorscale` is unspecified or `autocolorscale` is true, the default palette will be chosen according to whether numbers in the `color` array are all positive, all negative or mixed.", + "dflt": true, + "editType": "calc", + "impliedEdits": {}, + "valType": "boolean" + }, + "c": { + "anim": true, + "description": "Sets the scalar values used to map colors via the colorscale. If not provided, the magnitude sqrt(u^2 + v^2) is used.", + "editType": "calc", + "valType": "data_array" + }, + "cauto": { + "description": "Determines whether or not the color domain is computed with respect to the input data (here u/v norm) or the bounds set in `cmin` and `cmax` Defaults to `false` when `cmin` and `cmax` are set by the user.", + "dflt": true, + "editType": "calc", + "impliedEdits": {}, + "valType": "boolean" + }, + "cmax": { + "description": "Sets the upper bound of the color domain. Value should have the same units as u/v norm and if set, `cmin` must be set as well.", + "dflt": null, + "editType": "calc", + "impliedEdits": { + "cauto": false + }, + "valType": "number" + }, + "cmid": { + "description": "Sets the mid-point of the color domain by scaling `cmin` and/or `cmax` to be equidistant to this point. Value should have the same units as u/v norm. Has no effect when `cauto` is `false`.", + "dflt": null, + "editType": "calc", + "impliedEdits": {}, + "valType": "number" + }, + "cmin": { + "description": "Sets the lower bound of the color domain. Value should have the same units as u/v norm and if set, `cmax` must be set as well.", + "dflt": null, + "editType": "calc", + "impliedEdits": { + "cauto": false + }, + "valType": "number" + }, + "coloraxis": { + "description": "Sets a reference to a shared color axis. References to these shared color axes are *coloraxis*, *coloraxis2*, *coloraxis3*, etc. Settings for these shared color axes are set in the layout, under `layout.coloraxis`, `layout.coloraxis2`, etc. Note that multiple color scales can be linked to the same color axis.", + "dflt": null, + "editType": "calc", + "regex": "/^coloraxis([2-9]|[1-9][0-9]+)?$/", + "valType": "subplotid" + }, + "colorbar": { + "bgcolor": { + "description": "Sets the color of padded area.", + "dflt": "rgba(0,0,0,0)", + "editType": "colorbars", + "valType": "color" + }, + "bordercolor": { + "description": "Sets the axis line color.", + "dflt": "#444", + "editType": "colorbars", + "valType": "color" + }, + "borderwidth": { + "description": "Sets the width (in px) or the border enclosing this color bar.", + "dflt": 0, + "editType": "colorbars", + "min": 0, + "valType": "number" + }, + "dtick": { + "description": "Sets the step in-between ticks on this axis. Use with `tick0`. Must be a positive number, or special strings available to *log* and *date* axes. If the axis `type` is *log*, then ticks are set every 10^(n*dtick) where n is the tick number. For example, to set a tick mark at 1, 10, 100, 1000, ... set dtick to 1. To set tick marks at 1, 100, 10000, ... set dtick to 2. To set tick marks at 1, 5, 25, 125, 625, 3125, ... set dtick to log_10(5), or 0.69897000433. *log* has several special values; *L*, where `f` is a positive number, gives ticks linearly spaced in value (but not position). For example `tick0` = 0.1, `dtick` = *L0.5* will put ticks at 0.1, 0.6, 1.1, 1.6 etc. To show powers of 10 plus small digits between, use *D1* (all digits) or *D2* (only 2 and 5). `tick0` is ignored for *D1* and *D2*. If the axis `type` is *date*, then you must convert the time to milliseconds. For example, to set the interval between ticks to one day, set `dtick` to 86400000.0. *date* also has special values *M* gives ticks spaced by a number of months. `n` must be a positive integer. To set ticks on the 15th of every third month, set `tick0` to *2000-01-15* and `dtick` to *M3*. To set ticks every 4 years, set `dtick` to *M48*", + "editType": "colorbars", + "impliedEdits": { + "tickmode": "linear" + }, + "valType": "any" + }, + "editType": "colorbars", + "exponentformat": { + "description": "Determines a formatting rule for the tick exponents. For example, consider the number 1,000,000,000. If *none*, it appears as 1,000,000,000. If *e*, 1e+9. If *E*, 1E+9. If *power*, 1x10^9 (with 9 in a super script). If *SI*, 1G. If *B*, 1B. *SI* uses prefixes from \"femto\" f (10^-15) to \"tera\" T (10^12). *SI extended* covers instead the full SI range from \"quecto\" q (10^-30) to \"quetta\" Q (10^30). If *SI* or *SI extended* is used and the exponent is beyond the above ranges, the formatting rule will automatically be switched to the power notation.", + "dflt": "B", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "none", + "e", + "E", + "power", + "SI", + "B", + "SI extended" + ] + }, + "labelalias": { + "description": "Replacement text for specific tick or hover labels. For example using {US: 'USA', CA: 'Canada'} changes US to USA and CA to Canada. The labels we would have shown must match the keys exactly, after adding any tickprefix or ticksuffix. For negative numbers the minus sign symbol used (U+2212) is wider than the regular ascii dash. That means you need to use −1 instead of -1. labelalias can be used with any axis type, and both keys (if needed) and values (if desired) can include html-like tags or MathJax.", + "dflt": false, + "editType": "colorbars", + "valType": "any" + }, + "len": { + "description": "Sets the length of the color bar This measure excludes the padding of both ends. That is, the color bar length is this length minus the padding on both ends.", + "dflt": 1, + "editType": "colorbars", + "min": 0, + "valType": "number" + }, + "lenmode": { + "description": "Determines whether this color bar's length (i.e. the measure in the color variation direction) is set in units of plot *fraction* or in *pixels. Use `len` to set the value.", + "dflt": "fraction", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "fraction", + "pixels" + ] + }, + "minexponent": { + "description": "Hide SI prefix for 10^n if |n| is below this number. This only has an effect when `tickformat` is *SI* or *B*.", + "dflt": 3, + "editType": "colorbars", + "min": 0, + "valType": "number" + }, + "nticks": { + "description": "Specifies the maximum number of ticks for the particular axis. The actual number of ticks will be chosen automatically to be less than or equal to `nticks`. Has an effect only if `tickmode` is set to *auto*.", + "dflt": 0, + "editType": "colorbars", + "min": 0, + "valType": "integer" + }, + "orientation": { + "description": "Sets the orientation of the colorbar.", + "dflt": "v", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "h", + "v" + ] + }, + "outlinecolor": { + "description": "Sets the axis line color.", + "dflt": "#444", + "editType": "colorbars", + "valType": "color" + }, + "outlinewidth": { + "description": "Sets the width (in px) of the axis line.", + "dflt": 1, + "editType": "colorbars", + "min": 0, + "valType": "number" + }, + "role": "object", + "separatethousands": { + "description": "If \"true\", even 4-digit integers are separated", + "dflt": false, + "editType": "colorbars", + "valType": "boolean" + }, + "showexponent": { + "description": "If *all*, all exponents are shown besides their significands. If *first*, only the exponent of the first tick is shown. If *last*, only the exponent of the last tick is shown. If *none*, no exponents appear.", + "dflt": "all", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "all", + "first", + "last", + "none" + ] + }, + "showticklabels": { + "description": "Determines whether or not the tick labels are drawn.", + "dflt": true, + "editType": "colorbars", + "valType": "boolean" + }, + "showtickprefix": { + "description": "If *all*, all tick labels are displayed with a prefix. If *first*, only the first tick is displayed with a prefix. If *last*, only the last tick is displayed with a suffix. If *none*, tick prefixes are hidden.", + "dflt": "all", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "all", + "first", + "last", + "none" + ] + }, + "showticksuffix": { + "description": "Same as `showtickprefix` but for tick suffixes.", + "dflt": "all", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "all", + "first", + "last", + "none" + ] + }, + "thickness": { + "description": "Sets the thickness of the color bar This measure excludes the size of the padding, ticks and labels.", + "dflt": 30, + "editType": "colorbars", + "min": 0, + "valType": "number" + }, + "thicknessmode": { + "description": "Determines whether this color bar's thickness (i.e. the measure in the constant color direction) is set in units of plot *fraction* or in *pixels*. Use `thickness` to set the value.", + "dflt": "pixels", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "fraction", + "pixels" + ] + }, + "tick0": { + "description": "Sets the placement of the first tick on this axis. Use with `dtick`. If the axis `type` is *log*, then you must take the log of your starting tick (e.g. to set the starting tick to 100, set the `tick0` to 2) except when `dtick`=*L* (see `dtick` for more info). If the axis `type` is *date*, it should be a date string, like date data. If the axis `type` is *category*, it should be a number, using the scale where each category is assigned a serial number from zero in the order it appears.", + "editType": "colorbars", + "impliedEdits": { + "tickmode": "linear" + }, + "valType": "any" + }, + "tickangle": { + "description": "Sets the angle of the tick labels with respect to the horizontal. For example, a `tickangle` of -90 draws the tick labels vertically.", + "dflt": "auto", + "editType": "colorbars", + "valType": "angle" + }, + "tickcolor": { + "description": "Sets the tick color.", + "dflt": "#444", + "editType": "colorbars", + "valType": "color" + }, + "tickfont": { + "color": { + "editType": "colorbars", + "valType": "color" + }, + "description": "Sets the color bar's tick label font", + "editType": "colorbars", + "family": { + "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", + "editType": "colorbars", + "noBlank": true, + "strict": true, + "valType": "string" + }, + "lineposition": { + "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", + "dflt": "none", + "editType": "colorbars", + "extras": [ + "none" + ], + "flags": [ + "under", + "over", + "through" + ], + "valType": "flaglist" + }, + "role": "object", + "shadow": { + "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", + "dflt": "none", + "editType": "colorbars", + "valType": "string" + }, + "size": { + "editType": "colorbars", + "min": 1, + "valType": "number" + }, + "style": { + "description": "Sets whether a font should be styled with a normal or italic face from its family.", + "dflt": "normal", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "normal", + "italic" + ] + }, + "textcase": { + "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", + "dflt": "normal", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "normal", + "word caps", + "upper", + "lower" + ] + }, + "variant": { + "description": "Sets the variant of the font.", + "dflt": "normal", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "normal", + "small-caps", + "all-small-caps", + "all-petite-caps", + "petite-caps", + "unicase" + ] + }, + "weight": { + "description": "Sets the weight (or boldness) of the font.", + "dflt": "normal", + "editType": "colorbars", + "extras": [ + "normal", + "bold" + ], + "max": 1000, + "min": 1, + "valType": "integer" + } + }, + "tickformat": { + "description": "Sets the tick label formatting rule using d3 formatting mini-languages which are very similar to those in Python. For numbers, see: https://github.com/d3/d3-format/tree/v1.4.5#d3-format. And for dates see: https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format. We add two items to d3's date formatter: *%h* for half of the year as a decimal number as well as *%{n}f* for fractional seconds with n digits. For example, *2016-10-13 09:15:23.456* with tickformat *%H~%M~%S.%2f* would display *09~15~23.46*", + "dflt": "", + "editType": "colorbars", + "valType": "string" + }, + "tickformatstops": { + "items": { + "tickformatstop": { + "dtickrange": { + "description": "range [*min*, *max*], where *min*, *max* - dtick values which describe some zoom level, it is possible to omit *min* or *max* value by passing *null*", + "editType": "colorbars", + "items": [ + { + "editType": "colorbars", + "valType": "any" + }, + { + "editType": "colorbars", + "valType": "any" + } + ], + "valType": "info_array" + }, + "editType": "colorbars", + "enabled": { + "description": "Determines whether or not this stop is used. If `false`, this stop is ignored even within its `dtickrange`.", + "dflt": true, + "editType": "colorbars", + "valType": "boolean" + }, + "name": { + "description": "When used in a template, named items are created in the output figure in addition to any items the figure already has in this array. You can modify these items in the output figure by making your own item with `templateitemname` matching this `name` alongside your modifications (including `visible: false` or `enabled: false` to hide it). Has no effect outside of a template.", + "editType": "colorbars", + "valType": "string" + }, + "role": "object", + "templateitemname": { + "description": "Used to refer to a named item in this array in the template. Named items from the template will be created even without a matching item in the input figure, but you can modify one by making an item with `templateitemname` matching its `name`, alongside your modifications (including `visible: false` or `enabled: false` to hide it). If there is no template or no matching item, this item will be hidden unless you explicitly show it with `visible: true`.", + "editType": "colorbars", + "valType": "string" + }, + "value": { + "description": "string - dtickformat for described zoom level, the same as *tickformat*", + "dflt": "", + "editType": "colorbars", + "valType": "string" + } + } + }, + "role": "object" + }, + "ticklabeloverflow": { + "description": "Determines how we handle tick labels that would overflow either the graph div or the domain of the axis. The default value for inside tick labels is *hide past domain*. In other cases the default is *hide past div*.", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "allow", + "hide past div", + "hide past domain" + ] + }, + "ticklabelposition": { + "description": "Determines where tick labels are drawn relative to the ticks. Left and right options are used when `orientation` is *h*, top and bottom when `orientation` is *v*.", + "dflt": "outside", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "outside", + "inside", + "outside top", + "inside top", + "outside left", + "inside left", + "outside right", + "inside right", + "outside bottom", + "inside bottom" + ] + }, + "ticklabelstep": { + "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", + "dflt": 1, + "editType": "colorbars", + "min": 1, + "valType": "integer" + }, + "ticklen": { + "description": "Sets the tick length (in px).", + "dflt": 5, + "editType": "colorbars", + "min": 0, + "valType": "number" + }, + "tickmode": { + "description": "Sets the tick mode for this axis. If *auto*, the number of ticks is set via `nticks`. If *linear*, the placement of the ticks is determined by a starting position `tick0` and a tick step `dtick` (*linear* is the default value if `tick0` and `dtick` are provided). If *array*, the placement of the ticks is set via `tickvals` and the tick text is `ticktext`. (*array* is the default value if `tickvals` is provided).", + "editType": "colorbars", + "impliedEdits": {}, + "valType": "enumerated", + "values": [ + "auto", + "linear", + "array" + ] + }, + "tickprefix": { + "description": "Sets a tick label prefix.", + "dflt": "", + "editType": "colorbars", + "valType": "string" + }, + "ticks": { + "description": "Determines whether ticks are drawn or not. If **, this axis' ticks are not drawn. If *outside* (*inside*), this axis' are drawn outside (inside) the axis lines.", + "dflt": "", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "outside", + "inside", + "" + ] + }, + "ticksuffix": { + "description": "Sets a tick label suffix.", + "dflt": "", + "editType": "colorbars", + "valType": "string" + }, + "ticktext": { + "description": "Sets the text displayed at the ticks position via `tickvals`. Only has an effect if `tickmode` is set to *array*. Used with `tickvals`.", + "editType": "colorbars", + "valType": "data_array" + }, + "ticktextsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `ticktext`.", + "editType": "none", + "valType": "string" + }, + "tickvals": { + "description": "Sets the values at which ticks on this axis appear. Only has an effect if `tickmode` is set to *array*. Used with `ticktext`.", + "editType": "colorbars", + "valType": "data_array" + }, + "tickvalssrc": { + "description": "Sets the source reference on Chart Studio Cloud for `tickvals`.", + "editType": "none", + "valType": "string" + }, + "tickwidth": { + "description": "Sets the tick width (in px).", + "dflt": 1, + "editType": "colorbars", + "min": 0, + "valType": "number" + }, + "title": { + "editType": "colorbars", + "font": { + "color": { + "editType": "colorbars", + "valType": "color" + }, + "description": "Sets this color bar's title font.", + "editType": "colorbars", + "family": { + "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", + "editType": "colorbars", + "noBlank": true, + "strict": true, + "valType": "string" + }, + "lineposition": { + "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", + "dflt": "none", + "editType": "colorbars", + "extras": [ + "none" + ], + "flags": [ + "under", + "over", + "through" + ], + "valType": "flaglist" + }, + "role": "object", + "shadow": { + "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", + "dflt": "none", + "editType": "colorbars", + "valType": "string" + }, + "size": { + "editType": "colorbars", + "min": 1, + "valType": "number" + }, + "style": { + "description": "Sets whether a font should be styled with a normal or italic face from its family.", + "dflt": "normal", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "normal", + "italic" + ] + }, + "textcase": { + "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", + "dflt": "normal", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "normal", + "word caps", + "upper", + "lower" + ] + }, + "variant": { + "description": "Sets the variant of the font.", + "dflt": "normal", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "normal", + "small-caps", + "all-small-caps", + "all-petite-caps", + "petite-caps", + "unicase" + ] + }, + "weight": { + "description": "Sets the weight (or boldness) of the font.", + "dflt": "normal", + "editType": "colorbars", + "extras": [ + "normal", + "bold" + ], + "max": 1000, + "min": 1, + "valType": "integer" + } + }, + "role": "object", + "side": { + "description": "Determines the location of color bar's title with respect to the color bar. Defaults to *top* when `orientation` if *v* and defaults to *right* when `orientation` if *h*.", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "right", + "top", + "bottom" + ] + }, + "text": { + "description": "Sets the title of the color bar.", + "editType": "colorbars", + "valType": "string" + } + }, + "x": { + "description": "Sets the x position with respect to `xref` of the color bar (in plot fraction). When `xref` is *paper*, defaults to 1.02 when `orientation` is *v* and 0.5 when `orientation` is *h*. When `xref` is *container*, defaults to *1* when `orientation` is *v* and 0.5 when `orientation` is *h*. Must be between *0* and *1* if `xref` is *container* and between *-2* and *3* if `xref` is *paper*.", + "editType": "colorbars", + "valType": "number" + }, + "xanchor": { + "description": "Sets this color bar's horizontal position anchor. This anchor binds the `x` position to the *left*, *center* or *right* of the color bar. Defaults to *left* when `orientation` is *v* and *center* when `orientation` is *h*.", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "left", + "center", + "right" + ] + }, + "xpad": { + "description": "Sets the amount of padding (in px) along the x direction.", + "dflt": 10, + "editType": "colorbars", + "min": 0, + "valType": "number" + }, + "xref": { + "description": "Sets the container `x` refers to. *container* spans the entire `width` of the plot. *paper* refers to the width of the plotting area only.", + "dflt": "paper", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "container", + "paper" + ] + }, + "y": { + "description": "Sets the y position with respect to `yref` of the color bar (in plot fraction). When `yref` is *paper*, defaults to 0.5 when `orientation` is *v* and 1.02 when `orientation` is *h*. When `yref` is *container*, defaults to 0.5 when `orientation` is *v* and 1 when `orientation` is *h*. Must be between *0* and *1* if `yref` is *container* and between *-2* and *3* if `yref` is *paper*.", + "editType": "colorbars", + "valType": "number" + }, + "yanchor": { + "description": "Sets this color bar's vertical position anchor This anchor binds the `y` position to the *top*, *middle* or *bottom* of the color bar. Defaults to *middle* when `orientation` is *v* and *bottom* when `orientation` is *h*.", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "top", + "middle", + "bottom" + ] + }, + "ypad": { + "description": "Sets the amount of padding (in px) along the y direction.", + "dflt": 10, + "editType": "colorbars", + "min": 0, + "valType": "number" + }, + "yref": { + "description": "Sets the container `y` refers to. *container* spans the entire `height` of the plot. *paper* refers to the height of the plotting area only.", + "dflt": "paper", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "container", + "paper" + ] + } + }, + "colorscale": { + "description": "Sets the colorscale. The colorscale must be an array containing arrays mapping a normalized value to an rgb, rgba, hex, hsl, hsv, or named color string. At minimum, a mapping for the lowest (0) and highest (1) values are required. For example, `[[0, 'rgb(0,0,255)'], [1, 'rgb(255,0,0)']]`. To control the bounds of the colorscale in color space, use `cmin` and `cmax`. Alternatively, `colorscale` may be a palette name string of the following list: Blackbody,Bluered,Blues,Cividis,Earth,Electric,Greens,Greys,Hot,Jet,Picnic,Portland,Rainbow,RdBu,Reds,Viridis,YlGnBu,YlOrRd.", + "dflt": null, + "editType": "calc", + "impliedEdits": { + "autocolorscale": false + }, + "valType": "colorscale" + }, + "csrc": { + "description": "Sets the source reference on Chart Studio Cloud for `c`.", + "editType": "none", + "valType": "string" + }, + "customdata": { + "description": "Assigns extra data each datum. This may be useful when listening to hover, click and selection events. Note that, *scatter* traces also appends customdata items in the markers DOM elements", + "editType": "calc", + "valType": "data_array" + }, + "customdatasrc": { + "description": "Sets the source reference on Chart Studio Cloud for `customdata`.", + "editType": "none", + "valType": "string" + }, + "hoverdistance": { + "description": "Maximum distance (in pixels) to look for nearby arrows on hover.", + "dflt": 20, + "editType": "calc", + "min": -1, + "valType": "number" + }, + "hoverinfo": { + "arrayOk": true, + "description": "Determines which trace information appear on hover. If `none` or `skip` are set, no information is displayed upon hovering. But, if `none` is set, click and hover events are still fired.", + "dflt": "all", + "editType": "none", + "extras": [ + "all", + "none", + "skip" + ], + "flags": [ + "x", + "y", + "u", + "v", + "text", + "name" + ], + "valType": "flaglist" + }, + "hoverinfosrc": { + "description": "Sets the source reference on Chart Studio Cloud for `hoverinfo`.", + "editType": "none", + "valType": "string" + }, + "hoverlabel": { + "align": { + "arrayOk": true, + "description": "Sets the horizontal alignment of the text content within hover label box. Has an effect only if the hover label text spans more two or more lines", + "dflt": "auto", + "editType": "none", + "valType": "enumerated", + "values": [ + "left", + "right", + "auto" + ] + }, + "alignsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `align`.", + "editType": "none", + "valType": "string" + }, + "bgcolor": { + "arrayOk": true, + "description": "Sets the background color of the hover labels for this trace", + "editType": "none", + "valType": "color" + }, + "bgcolorsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `bgcolor`.", + "editType": "none", + "valType": "string" + }, + "bordercolor": { + "arrayOk": true, + "description": "Sets the border color of the hover labels for this trace.", + "editType": "none", + "valType": "color" + }, + "bordercolorsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `bordercolor`.", + "editType": "none", + "valType": "string" + }, + "editType": "none", + "font": { + "color": { + "arrayOk": true, + "editType": "none", + "valType": "color" + }, + "colorsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `color`.", + "editType": "none", + "valType": "string" + }, + "description": "Sets the font used in hover labels.", + "editType": "none", + "family": { + "arrayOk": true, + "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", + "editType": "none", + "noBlank": true, + "strict": true, + "valType": "string" + }, + "familysrc": { + "description": "Sets the source reference on Chart Studio Cloud for `family`.", + "editType": "none", + "valType": "string" + }, + "lineposition": { + "arrayOk": true, + "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", + "dflt": "none", + "editType": "none", + "extras": [ + "none" + ], + "flags": [ + "under", + "over", + "through" + ], + "valType": "flaglist" + }, + "linepositionsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `lineposition`.", + "editType": "none", + "valType": "string" + }, + "role": "object", + "shadow": { + "arrayOk": true, + "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", + "dflt": "none", + "editType": "none", + "valType": "string" + }, + "shadowsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `shadow`.", + "editType": "none", + "valType": "string" + }, + "size": { + "arrayOk": true, + "editType": "none", + "min": 1, + "valType": "number" + }, + "sizesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `size`.", + "editType": "none", + "valType": "string" + }, + "style": { + "arrayOk": true, + "description": "Sets whether a font should be styled with a normal or italic face from its family.", + "dflt": "normal", + "editType": "none", + "valType": "enumerated", + "values": [ + "normal", + "italic" + ] + }, + "stylesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `style`.", + "editType": "none", + "valType": "string" + }, + "textcase": { + "arrayOk": true, + "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", + "dflt": "normal", + "editType": "none", + "valType": "enumerated", + "values": [ + "normal", + "word caps", + "upper", + "lower" + ] + }, + "textcasesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `textcase`.", + "editType": "none", + "valType": "string" + }, + "variant": { + "arrayOk": true, + "description": "Sets the variant of the font.", + "dflt": "normal", + "editType": "none", + "valType": "enumerated", + "values": [ + "normal", + "small-caps", + "all-small-caps", + "all-petite-caps", + "petite-caps", + "unicase" + ] + }, + "variantsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `variant`.", + "editType": "none", + "valType": "string" + }, + "weight": { + "arrayOk": true, + "description": "Sets the weight (or boldness) of the font.", + "dflt": "normal", + "editType": "none", + "extras": [ + "normal", + "bold" + ], + "max": 1000, + "min": 1, + "valType": "integer" + }, + "weightsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `weight`.", + "editType": "none", + "valType": "string" + } + }, + "namelength": { + "arrayOk": true, + "description": "Sets the default length (in number of characters) of the trace name in the hover labels for all traces. -1 shows the whole name regardless of length. 0-3 shows the first 0-3 characters, and an integer >3 will show the whole name if it is less than that many characters, but if it is longer, will truncate to `namelength - 3` characters and add an ellipsis.", + "dflt": 15, + "editType": "none", + "min": -1, + "valType": "integer" + }, + "namelengthsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `namelength`.", + "editType": "none", + "valType": "string" + }, + "role": "object", + "showarrow": { + "description": "Sets whether or not to show the hover label arrow/triangle pointing to the data point.", + "dflt": true, + "editType": "none", + "valType": "boolean" + } + }, + "hovertemplate": { + "arrayOk": true, + "description": "Template string used for rendering the information that appear on hover box. Note that this will override `hoverinfo`. Variables are inserted using %{variable}, for example \"y: %{y}\" as well as %{xother}, {%_xother}, {%_xother_}, {%xother_}. When showing info for several points, *xother* will be added to those with different x positions from the first point. An underscore before or after *(x|y)other* will add a space on that side, only when this field is shown. Numbers are formatted using d3-format's syntax %{variable:d3-format}, for example \"Price: %{y:$.2f}\". https://github.com/d3/d3-format/tree/v1.4.5#d3-format for details on the formatting syntax. Dates are formatted using d3-time-format's syntax %{variable|d3-time-format}, for example \"Day: %{2019-01-01|%A}\". https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format for details on the date formatting syntax. Variables that can't be found will be replaced with the specifier. For example, a template of \"data: %{x}, %{y}\" will result in a value of \"data: 1, %{y}\" if x is 1 and y is missing. Variables with an undefined value will be replaced with the fallback value. The variables available in `hovertemplate` are the ones emitted as event data described at this link https://plotly.com/javascript/plotlyjs-events/#event-data. Additionally, all attributes that can be specified per-point (the ones that are `arrayOk: true`) are available. Finally, the template string has access to variables `x`, `y`, `u`, `v`, `text` and `name`. Anything contained in tag `` is displayed in the secondary box, for example `%{fullData.name}`. To hide the secondary box completely, use an empty tag ``.", + "dflt": "", + "editType": "none", + "valType": "string" + }, + "hovertemplatesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `hovertemplate`.", + "editType": "none", + "valType": "string" + }, + "ids": { + "anim": true, + "description": "Assigns id labels to each datum. These ids for object constancy of data points during animation. Should be an array of strings, not numbers or any other type.", + "editType": "calc", + "valType": "data_array" + }, + "idssrc": { + "description": "Sets the source reference on Chart Studio Cloud for `ids`.", + "editType": "none", + "valType": "string" + }, + "legend": { + "description": "Sets the reference to a legend to show this trace in. References to these legends are *legend*, *legend2*, *legend3*, etc. Settings for these legends are set in the layout, under `layout.legend`, `layout.legend2`, etc.", + "dflt": "legend", + "editType": "style", + "valType": "subplotid" + }, + "legendgroup": { + "description": "Sets the legend group for this trace. Traces and shapes part of the same legend group hide/show at the same time when toggling legend items.", + "dflt": "", + "editType": "style", + "valType": "string" + }, + "legendgrouptitle": { + "editType": "style", + "font": { + "color": { + "editType": "style", + "valType": "color" + }, + "description": "Sets this legend group's title font.", + "editType": "style", + "family": { + "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", + "editType": "style", + "noBlank": true, + "strict": true, + "valType": "string" + }, + "lineposition": { + "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", + "dflt": "none", + "editType": "style", + "extras": [ + "none" + ], + "flags": [ + "under", + "over", + "through" + ], + "valType": "flaglist" + }, + "role": "object", + "shadow": { + "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", + "dflt": "none", + "editType": "style", + "valType": "string" + }, + "size": { + "editType": "style", + "min": 1, + "valType": "number" + }, + "style": { + "description": "Sets whether a font should be styled with a normal or italic face from its family.", + "dflt": "normal", + "editType": "style", + "valType": "enumerated", + "values": [ + "normal", + "italic" + ] + }, + "textcase": { + "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", + "dflt": "normal", + "editType": "style", + "valType": "enumerated", + "values": [ + "normal", + "word caps", + "upper", + "lower" + ] + }, + "variant": { + "description": "Sets the variant of the font.", + "dflt": "normal", + "editType": "style", + "valType": "enumerated", + "values": [ + "normal", + "small-caps", + "all-small-caps", + "all-petite-caps", + "petite-caps", + "unicase" + ] + }, + "weight": { + "description": "Sets the weight (or boldness) of the font.", + "dflt": "normal", + "editType": "style", + "extras": [ + "normal", + "bold" + ], + "max": 1000, + "min": 1, + "valType": "integer" + } + }, + "role": "object", + "text": { + "description": "Sets the title of the legend group.", + "dflt": "", + "editType": "style", + "valType": "string" + } + }, + "legendrank": { + "description": "Sets the legend rank for this trace. Items and groups with smaller ranks are presented on top/left side while with *reversed* `legend.traceorder` they are on bottom/right side. The default legendrank is 1000, so that you can use ranks less than 1000 to place certain items before all unranked items, and ranks greater than 1000 to go after all unranked items. When having unranked or equal rank items shapes would be displayed after traces i.e. according to their order in data and layout.", + "dflt": 1000, + "editType": "style", + "valType": "number" + }, + "legendwidth": { + "description": "Sets the width (in px or fraction) of the legend for this trace.", + "editType": "style", + "min": 0, + "valType": "number" + }, + "line": { + "color": { + "description": "Sets the color of the arrow lines.", + "dflt": "#000", + "editType": "style", + "valType": "color" + }, + "dash": { + "description": "Sets the dash style of lines. Set to a dash type string (*solid*, *dot*, *dash*, *longdash*, *dashdot*, or *longdashdot*) or a dash length list in px (eg *5px,10px,2px,2px*).", + "dflt": "solid", + "editType": "style", + "valType": "string", + "values": [ + "solid", + "dot", + "dash", + "longdash", + "dashdot", + "longdashdot" + ] + }, + "editType": "style", + "role": "object", + "shape": { + "description": "Determines the line shape.", + "dflt": "linear", + "editType": "plot", + "valType": "enumerated", + "values": [ + "linear", + "spline", + "hv", + "vh", + "hvh", + "vhv" + ] + }, + "simplify": { + "description": "Simplifies lines by removing nearly-overlapping points.", + "dflt": true, + "editType": "plot", + "valType": "boolean" + }, + "smoothing": { + "description": "Has an effect only if `shape` is set to *spline*. Sets the amount of smoothing.", + "dflt": 1, + "editType": "plot", + "max": 1.3, + "min": 0, + "valType": "number" + }, + "width": { + "description": "Sets the width (in px) of the arrow lines.", + "dflt": 1, + "editType": "style", + "min": 0, + "valType": "number" + } + }, + "meta": { + "arrayOk": true, + "description": "Assigns extra meta information associated with this trace that can be used in various text attributes. Attributes such as trace `name`, graph, axis and colorbar `title.text`, annotation `text` `rangeselector`, `updatemenues` and `sliders` `label` text all support `meta`. To access the trace `meta` values in an attribute in the same trace, simply use `%{meta[i]}` where `i` is the index or key of the `meta` item in question. To access trace `meta` in layout attributes, use `%{data[n[.meta[i]}` where `i` is the index or key of the `meta` and `n` is the trace index.", + "editType": "plot", + "valType": "any" + }, + "metasrc": { + "description": "Sets the source reference on Chart Studio Cloud for `meta`.", + "editType": "none", + "valType": "string" + }, + "name": { + "description": "Sets the trace name. The trace name appears as the legend item and on hover.", + "editType": "style", + "valType": "string" + }, + "opacity": { + "description": "Sets the opacity of the trace.", + "dflt": 1, + "editType": "style", + "max": 1, + "min": 0, + "valType": "number" + }, + "reversescale": { + "description": "Reverses the color mapping if true. If true, `cmin` will correspond to the last color in the array and `cmax` will correspond to the first color.", + "dflt": false, + "editType": "plot", + "valType": "boolean" + }, + "selected": { + "editType": "style", + "line": { + "color": { + "description": "Sets the line color of selected points.", + "editType": "style", + "valType": "color" + }, + "editType": "style", + "role": "object", + "width": { + "description": "Sets the line width of selected points.", + "editType": "style", + "min": 0, + "valType": "number" + } + }, + "role": "object", + "textfont": { + "color": { + "description": "Sets the text font color of selected points, applied only when a selection exists.", + "editType": "style", + "valType": "color" + }, + "editType": "style", + "role": "object" + } + }, + "selectedpoints": { + "description": "Array containing integer indices of selected points. Has an effect only for traces that support selections. Note that an empty array means an empty selection where the `unselected` are turned on for all points, whereas, any other non-array values means no selection all where the `selected` and `unselected` styles have no effect.", + "editType": "calc", + "valType": "any" + }, + "showlegend": { + "description": "Determines whether or not an item corresponding to this trace is shown in the legend.", + "dflt": true, + "editType": "style", + "valType": "boolean" + }, + "showscale": { + "description": "Determines whether or not a colorbar is displayed for this trace.", + "dflt": true, + "editType": "calc", + "valType": "boolean" + }, + "sizemode": { + "description": "Determines whether `sizeref` is set as a *scaled* (unitless) scalar (normalized by the max u/v norm in the vector field), as an *absolute* value (in the same units as the vector field), or *raw* to use the raw vector lengths.", + "dflt": "scaled", + "editType": "calc", + "valType": "enumerated", + "values": [ + "scaled", + "absolute", + "raw" + ] + }, + "sizeref": { + "description": "Adjusts the arrow size scaling. The arrow length is determined by the vector norm multiplied by `sizeref`, optionally normalized when `sizemode` is *scaled*.", + "editType": "calc", + "min": 0, + "valType": "number" + }, + "stream": { + "editType": "calc", + "maxpoints": { + "description": "Sets the maximum number of points to keep on the plots from an incoming stream. If `maxpoints` is set to *50*, only the newest 50 points will be displayed on the plot.", + "dflt": 500, + "editType": "calc", + "max": 10000, + "min": 0, + "valType": "number" + }, + "role": "object", + "token": { + "description": "The stream id number links a data trace on a plot with a stream. See https://chart-studio.plotly.com/settings for more details.", + "editType": "calc", + "noBlank": true, + "strict": true, + "valType": "string" + } + }, + "text": { + "anim": true, + "description": "Sets text elements associated with each (x,y) pair.", + "editType": "calc", + "valType": "data_array" + }, + "textfont": { + "color": { + "arrayOk": true, + "editType": "style", + "valType": "color" + }, + "colorsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `color`.", + "editType": "none", + "valType": "string" + }, + "description": "Sets the text font.", + "editType": "calc", + "family": { + "arrayOk": true, + "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", + "editType": "calc", + "noBlank": true, + "strict": true, + "valType": "string" + }, + "familysrc": { + "description": "Sets the source reference on Chart Studio Cloud for `family`.", + "editType": "none", + "valType": "string" + }, + "lineposition": { + "arrayOk": true, + "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", + "dflt": "none", + "editType": "calc", + "extras": [ + "none" + ], + "flags": [ + "under", + "over", + "through" + ], + "valType": "flaglist" + }, + "linepositionsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `lineposition`.", + "editType": "none", + "valType": "string" + }, + "role": "object", + "shadow": { + "arrayOk": true, + "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", + "dflt": "none", + "editType": "calc", + "valType": "string" + }, + "shadowsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `shadow`.", + "editType": "none", + "valType": "string" + }, + "size": { + "arrayOk": true, + "editType": "calc", + "min": 1, + "valType": "number" + }, + "sizesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `size`.", + "editType": "none", + "valType": "string" + }, + "style": { + "arrayOk": true, + "description": "Sets whether a font should be styled with a normal or italic face from its family.", + "dflt": "normal", + "editType": "calc", + "valType": "enumerated", + "values": [ + "normal", + "italic" + ] + }, + "stylesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `style`.", + "editType": "none", + "valType": "string" + }, + "textcase": { + "arrayOk": true, + "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", + "dflt": "normal", + "editType": "calc", + "valType": "enumerated", + "values": [ + "normal", + "word caps", + "upper", + "lower" + ] + }, + "textcasesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `textcase`.", + "editType": "none", + "valType": "string" + }, + "variant": { + "arrayOk": true, + "description": "Sets the variant of the font.", + "dflt": "normal", + "editType": "calc", + "valType": "enumerated", + "values": [ + "normal", + "small-caps", + "all-small-caps", + "all-petite-caps", + "petite-caps", + "unicase" + ] + }, + "variantsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `variant`.", + "editType": "none", + "valType": "string" + }, + "weight": { + "arrayOk": true, + "description": "Sets the weight (or boldness) of the font.", + "dflt": "normal", + "editType": "calc", + "extras": [ + "normal", + "bold" + ], + "max": 1000, + "min": 1, + "valType": "integer" + }, + "weightsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `weight`.", + "editType": "none", + "valType": "string" + } + }, + "textposition": { + "description": "Sets the positions of the `text` elements with respects to the (x,y) coordinates.", + "dflt": "middle center", + "editType": "calc", + "valType": "enumerated", + "values": [ + "top left", + "top center", + "top right", + "middle left", + "middle center", + "middle right", + "bottom left", + "bottom center", + "bottom right" + ] + }, + "textsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `text`.", + "editType": "none", + "valType": "string" + }, + "type": "quiver", + "u": { + "anim": true, + "description": "Sets the x components of the arrow vectors.", + "editType": "calc", + "valType": "data_array" + }, + "uid": { + "anim": true, + "description": "Assign an id to this trace, Use this to provide object constancy between traces during animations and transitions.", + "editType": "plot", + "valType": "string" + }, + "uirevision": { + "description": "Controls persistence of some user-driven changes to the trace: `constraintrange` in `parcoords` traces, as well as some `editable: true` modifications such as `name` and `colorbar.title`. Defaults to `layout.uirevision`. Note that other user-driven trace attribute changes are controlled by `layout` attributes: `trace.visible` is controlled by `layout.legend.uirevision`, `selectedpoints` is controlled by `layout.selectionrevision`, and `colorbar.(x|y)` (accessible with `config: {editable: true}`) is controlled by `layout.editrevision`. Trace changes are tracked by `uid`, which only falls back on trace index if no `uid` is provided. So if your app can add/remove traces before the end of the `data` array, such that the same trace has a different index, you can still preserve user-driven changes if you give each trace a `uid` that stays with it as it moves.", + "editType": "none", + "valType": "any" + }, + "unselected": { + "editType": "style", + "line": { + "color": { + "description": "Sets the line color of unselected points.", + "editType": "style", + "valType": "color" + }, + "editType": "style", + "role": "object", + "width": { + "description": "Sets the line width of unselected points.", + "editType": "style", + "min": 0, + "valType": "number" + } + }, + "role": "object", + "textfont": { + "color": { + "description": "Sets the text font color of unselected points, applied only when a selection exists.", + "editType": "style", + "valType": "color" + }, + "editType": "style", + "role": "object" + } + }, + "usrc": { + "description": "Sets the source reference on Chart Studio Cloud for `u`.", + "editType": "none", + "valType": "string" + }, + "v": { + "anim": true, + "description": "Sets the y components of the arrow vectors.", + "editType": "calc", + "valType": "data_array" + }, + "visible": { + "description": "Determines whether or not this trace is visible. If *legendonly*, the trace is not drawn, but can appear as a legend item (provided that the legend itself is visible).", + "dflt": true, + "editType": "calc", + "valType": "enumerated", + "values": [ + true, + false, + "legendonly" + ] + }, + "vsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `v`.", + "editType": "none", + "valType": "string" + }, + "x": { + "anim": true, + "description": "Sets the x coordinates of the arrow locations.", + "editType": "calc+clearAxisTypes", + "valType": "data_array" + }, + "xaxis": { + "description": "Sets a reference between this trace's x coordinates and a 2D cartesian x axis. If *x* (the default value), the x coordinates refer to `layout.xaxis`. If *x2*, the x coordinates refer to `layout.xaxis2`, and so on.", + "dflt": "x", + "editType": "calc+clearAxisTypes", + "valType": "subplotid" + }, + "xsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `x`.", + "editType": "none", + "valType": "string" + }, + "y": { + "anim": true, + "description": "Sets the y coordinates of the arrow locations.", + "editType": "calc+clearAxisTypes", + "valType": "data_array" + }, + "yaxis": { + "description": "Sets a reference between this trace's y coordinates and a 2D cartesian y axis. If *y* (the default value), the y coordinates refer to `layout.yaxis`. If *y2*, the y coordinates refer to `layout.yaxis2`, and so on.", + "dflt": "y", + "editType": "calc+clearAxisTypes", + "valType": "subplotid" + }, + "ysrc": { + "description": "Sets the source reference on Chart Studio Cloud for `y`.", + "editType": "none", + "valType": "string" + } + }, + "categories": [ + "cartesian", + "svg", + "showLegend", + "scatter-like", + "zoomScale" + ], + "meta": { + "description": "The quiver trace type visualizes vector fields using arrows. Specify a vector field using 4 1D arrays: 2 position arrays `x`, `y` and 2 vector component arrays `u`, `v`. The arrows are drawn exactly at the positions given by `x` and `y`. Arrow length and direction are determined by `u` and `v` components." + }, + "type": "quiver" + }, "sankey": { "animatable": false, "attributes": { From 100bd88d81aa237e28e522c28635298a26399782 Mon Sep 17 00:00:00 2001 From: John Degner Date: Wed, 22 Oct 2025 08:43:35 -0700 Subject: [PATCH 02/46] Ensure no-gl-jasmine tests pass --- src/traces/scatterquiver/calc.js | 76 +++++++++++++--------------- src/traces/scatterquiver/defaults.js | 18 +++++-- src/traces/scatterquiver/hover.js | 38 +++++++------- src/traces/scatterquiver/plot.js | 62 ++++++++++++++++------- 4 files changed, 111 insertions(+), 83 deletions(-) diff --git a/src/traces/scatterquiver/calc.js b/src/traces/scatterquiver/calc.js index f502d19bc4c..28e11e95116 100644 --- a/src/traces/scatterquiver/calc.js +++ b/src/traces/scatterquiver/calc.js @@ -1,55 +1,47 @@ 'use strict'; var Lib = require('../../lib'); +var Axes = require('../../plots/cartesian/axes'); +var isNumeric = require('fast-isnumeric'); +var BADNUM = require('../../constants/numerical').BADNUM; +var scatterCalc = require('../scatter/calc'); /** * Main calculation function for scatterquiver trace * Creates calcdata with arrow path data for each vector */ module.exports = function calc(gd, trace) { - var x = trace.x; - var y = trace.y; - var u = trace.u; - var v = trace.v; - var scale = trace.scale; - var arrowScale = trace.arrow_scale; - var angle = trace.angle; - var scaleRatio = trace.scaleratio; - - // Create calcdata - one complete arrow per entry - var calcdata = []; - var len = x.length; - + // Map x/y through axes so category/date values become numeric calcdata + var xa = trace._xA = Axes.getFromId(gd, trace.xaxis || 'x', 'x'); + var ya = trace._yA = Axes.getFromId(gd, trace.yaxis || 'y', 'y'); + + var xVals = xa.makeCalcdata(trace, 'x'); + var yVals = ya.makeCalcdata(trace, 'y'); + + // u/v are read in plot using the original trace arrays via cdi.i + + var len = Math.min(xVals.length, yVals.length); + trace._length = len; + var cd = new Array(len); + for(var i = 0; i < len; i++) { - // Calculate arrow components - var dx = u[i] * scale * (scaleRatio || 1); - var dy = v[i] * scale; - var barbLen = Math.sqrt(dx * dx / (scaleRatio || 1) + dy * dy); - var arrowLen = barbLen * arrowScale; - var barbAng = Math.atan2(dy, dx / (scaleRatio || 1)); - - var ang1 = barbAng + angle; - var ang2 = barbAng - angle; - - var endX = x[i] + dx; - var endY = y[i] + dy; - - var point1X = endX - arrowLen * Math.cos(ang1) * (scaleRatio || 1); - var point1Y = endY - arrowLen * Math.sin(ang1); - var point2X = endX - arrowLen * Math.cos(ang2) * (scaleRatio || 1); - var point2Y = endY - arrowLen * Math.sin(ang2); - - // Create complete arrow as one path: shaft + arrow head - var arrowPath = [ - { x: x[i], y: y[i], i: i }, // Start point - { x: endX, y: endY, i: i }, // End of shaft - { x: point1X, y: point1Y, i: i }, // Arrow head point 1 - { x: endX, y: endY, i: i }, // Back to end - { x: point2X, y: point2Y, i: i } // Arrow head point 2 - ]; - - calcdata.push(arrowPath); + var cdi = cd[i] = { i: i }; + var xValid = isNumeric(xVals[i]); + var yValid = isNumeric(yVals[i]); + + if(xValid && yValid) { + cdi.x = xVals[i]; + cdi.y = yVals[i]; + } else { + cdi.x = BADNUM; + cdi.y = BADNUM; + } + + // No additional props; keep minimal to avoid collisions with generic fields (e.g. `v`) } - return calcdata; + // Ensure axes are expanded and categories registered like scatter traces do + scatterCalc.calcAxisExpansion(gd, trace, xa, ya, xVals, yVals); + + return cd; }; \ No newline at end of file diff --git a/src/traces/scatterquiver/defaults.js b/src/traces/scatterquiver/defaults.js index 651e6dd2775..1992c520baf 100644 --- a/src/traces/scatterquiver/defaults.js +++ b/src/traces/scatterquiver/defaults.js @@ -17,16 +17,24 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout // Simple validation - check if we have the required arrays if(!x || !Array.isArray(x) || x.length === 0 || - !y || !Array.isArray(y) || y.length === 0 || - !u || !Array.isArray(u) || u.length === 0 || - !v || !Array.isArray(v) || v.length === 0) { + !y || !Array.isArray(y) || y.length === 0) { traceOut.visible = false; return; } + // If u/v are missing, default to zeros so the trace participates in calc/category logic + var len = Math.min(x.length, y.length); + if(!Array.isArray(u) || u.length === 0) { + traceOut.u = new Array(len); + for(var i = 0; i < len; i++) traceOut.u[i] = 0; + } + if(!Array.isArray(v) || v.length === 0) { + traceOut.v = new Array(len); + for(var j = 0; j < len; j++) traceOut.v[j] = 0; + } + // Set basic properties traceOut.type = 'scatterquiver'; - traceOut.visible = true; // Set default values using coerce coerce('scale', 0.1); @@ -64,5 +72,5 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout coerce('unselected.textfont.color'); // Set the data length - traceOut._length = x.length; + traceOut._length = len; }; \ No newline at end of file diff --git a/src/traces/scatterquiver/hover.js b/src/traces/scatterquiver/hover.js index e5502dcbc0a..d786ea3afc3 100644 --- a/src/traces/scatterquiver/hover.js +++ b/src/traces/scatterquiver/hover.js @@ -12,47 +12,47 @@ module.exports = function hoverPoints(pointData, xval, yval, hovermode) { var xpx = xa.c2p(xval); var ypx = ya.c2p(yval); - // Find the closest arrow to the hover point + // Find the closest arrow base point to the hover point var minDistance = Infinity; var closestPoint = null; var closestIndex = -1; - // Check each arrow segment + // Each cd[i] is a calcdata point object with x/y for(var i = 0; i < cd.length; i++) { - var segment = cd[i]; - if(segment.length < 2) continue; + var cdi = cd[i]; + if(cdi.x === undefined || cdi.y === undefined) continue; + + var px = xa.c2p(cdi.x); + var py = ya.c2p(cdi.y); + + var distance = Math.sqrt((xpx - px) * (xpx - px) + (ypx - py) * (ypx - py)); - // Calculate distance to the start point of the arrow - var x1 = xa.c2p(segment[0].x); - var y1 = ya.c2p(segment[0].y); - - var distance = Math.sqrt((xpx - x1) * (xpx - x1) + (ypx - y1) * (ypx - y1)); - if(distance < minDistance) { minDistance = distance; - closestPoint = segment[0]; // Use the start point for hover data + closestPoint = cdi; closestIndex = i; } } - if(!closestPoint || minDistance > (trace.hoverdistance || 20)) return; + var maxHoverDist = pointData.distance === Infinity ? Infinity : (trace.hoverdistance || 20); + if(!closestPoint || minDistance > maxHoverDist) return; // Create hover point data with proper label values and spikeline support var hoverPoint = { x: closestPoint.x, y: closestPoint.y, - u: trace.u[closestIndex], - v: trace.v[closestIndex], - text: trace.text ? trace.text[closestIndex] : '', + u: trace.u ? trace.u[closestIndex] : undefined, + v: trace.v ? trace.v[closestIndex] : undefined, + text: Array.isArray(trace.text) ? trace.text[closestIndex] : trace.text, name: trace.name || '', trace: trace, index: closestIndex, - // Set label values for proper hover formatting + // Label values for formatting xLabelVal: closestPoint.x, yLabelVal: closestPoint.y, - uLabelVal: trace.u[closestIndex], - vLabelVal: trace.v[closestIndex], - // Add spikeline support + uLabelVal: trace.u ? trace.u[closestIndex] : undefined, + vLabelVal: trace.v ? trace.v[closestIndex] : undefined, + // Spikeline support xa: pointData.xa, ya: pointData.ya, x0: closestPoint.x, diff --git a/src/traces/scatterquiver/plot.js b/src/traces/scatterquiver/plot.js index 36a9bb4cb7e..87e2d754926 100644 --- a/src/traces/scatterquiver/plot.js +++ b/src/traces/scatterquiver/plot.js @@ -71,7 +71,7 @@ function plotOne(gd, idx, plotinfo, cdscatter, cdscatterAll, element, transition Drawing.setClipUrl(lines, plotinfo.layerClipId, gd); - // Create line segments for each arrow + // Create one path per data point (arrow) var lineSegments = lines.selectAll('path.js-line') .data(cdscatter); @@ -82,26 +82,54 @@ function plotOne(gd, idx, plotinfo, cdscatter, cdscatterAll, element, transition lineSegments.exit().remove(); // Update line segments - lineSegments.each(function(d) { + lineSegments.each(function(cdi) { var path = d3.select(this); - var segment = d; - - if(segment.length === 0) return; - - // Convert data coordinates to pixel coordinates - var pixelCoords = segment.map(function(point) { - return { - x: xa.c2p(point.x), - y: ya.c2p(point.y) - }; - }); - // Create SVG path from pixel coordinates - var pathData = 'M' + pixelCoords[0].x + ',' + pixelCoords[0].y; - for(var i = 1; i < pixelCoords.length; i++) { - pathData += 'L' + pixelCoords[i].x + ',' + pixelCoords[i].y; + // Skip invalid points + if(cdi.x === undefined || cdi.y === undefined) { + path.attr('d', null); + return; } + // Compute arrow in data space + var scale = trace.scale || 1; + var scaleRatio = trace.scaleratio || 1; + var arrowScale = trace.arrow_scale || 0.2; + var angle = trace.angle || Math.PI / 12; // small default + + var u = (trace.u && trace.u[cdi.i]) || 0; + var v = (trace.v && trace.v[cdi.i]) || 0; + + var dx = u * scale * scaleRatio; + var dy = v * scale; + var barbLen = Math.sqrt((dx * dx) / scaleRatio + dy * dy); + var arrowLen = barbLen * arrowScale; + var barbAng = Math.atan2(dy, dx / scaleRatio); + + var ang1 = barbAng + angle; + var ang2 = barbAng - angle; + + var x0 = cdi.x; + var y0 = cdi.y; + var x1 = x0 + dx; + var y1 = y0 + dy; + + var xh1 = x1 - arrowLen * Math.cos(ang1) * scaleRatio; + var yh1 = y1 - arrowLen * Math.sin(ang1); + var xh2 = x1 - arrowLen * Math.cos(ang2) * scaleRatio; + var yh2 = y1 - arrowLen * Math.sin(ang2); + + // Convert to pixels + var p0x = xa.c2p(x0); + var p0y = ya.c2p(y0); + var p1x = xa.c2p(x1); + var p1y = ya.c2p(y1); + var ph1x = xa.c2p(xh1); + var ph1y = ya.c2p(yh1); + var ph2x = xa.c2p(xh2); + var ph2y = ya.c2p(yh2); + + var pathData = 'M' + p0x + ',' + p0y + 'L' + p1x + ',' + p1y + 'L' + ph1x + ',' + ph1y + 'L' + p1x + ',' + p1y + 'L' + ph2x + ',' + ph2y; path.attr('d', pathData); }); From 3f24d4a9d453061e1e23558da93c608b94a6f24a Mon Sep 17 00:00:00 2001 From: John Degner Date: Sun, 2 Nov 2025 09:59:30 -0800 Subject: [PATCH 03/46] Name plot type quiver not scatterquiver --- lib/index-strict.js | 2 +- lib/index.js | 2 +- lib/quiver.js | 5 + lib/scatterquiver.js | 3 - .../{scatterquiver => quiver}/attributes.js | 4 +- src/traces/{scatterquiver => quiver}/calc.js | 8 +- .../{scatterquiver => quiver}/defaults.js | 6 +- .../{scatterquiver => quiver}/event_data.js | 2 + src/traces/{scatterquiver => quiver}/hover.js | 4 +- src/traces/{scatterquiver => quiver}/index.js | 6 +- src/traces/{scatterquiver => quiver}/plot.js | 6 +- .../select_points.js | 2 + src/traces/{scatterquiver => quiver}/style.js | 2 + test/plot-schema.json | 12055 ++++++++++++++++ 14 files changed, 12090 insertions(+), 17 deletions(-) create mode 100644 lib/quiver.js delete mode 100644 lib/scatterquiver.js rename src/traces/{scatterquiver => quiver}/attributes.js (99%) rename src/traces/{scatterquiver => quiver}/calc.js (89%) rename src/traces/{scatterquiver => quiver}/defaults.js (98%) rename src/traces/{scatterquiver => quiver}/event_data.js (99%) rename src/traces/{scatterquiver => quiver}/hover.js (99%) rename src/traces/{scatterquiver => quiver}/index.js (89%) rename src/traces/{scatterquiver => quiver}/plot.js (98%) rename src/traces/{scatterquiver => quiver}/select_points.js (99%) rename src/traces/{scatterquiver => quiver}/style.js (99%) diff --git a/lib/index-strict.js b/lib/index-strict.js index 8e332c3b56d..c5d1c092056 100644 --- a/lib/index-strict.js +++ b/lib/index-strict.js @@ -52,7 +52,7 @@ Plotly.register([ require('../src/traces/scatterpolargl/strict'), require('./barpolar'), require('./scattersmith'), - require('./scatterquiver'), + require('./quiver'), // components require('./calendars'), diff --git a/lib/index.js b/lib/index.js index d234cfca3ea..73f4f0a29b8 100644 --- a/lib/index.js +++ b/lib/index.js @@ -52,7 +52,7 @@ Plotly.register([ require('./scatterpolargl'), require('./barpolar'), require('./scattersmith'), - require('./scatterquiver'), + require('./quiver'), // components require('./calendars'), diff --git a/lib/quiver.js b/lib/quiver.js new file mode 100644 index 00000000000..0368a75e500 --- /dev/null +++ b/lib/quiver.js @@ -0,0 +1,5 @@ +'use strict'; + +module.exports = require('../src/traces/quiver'); + + diff --git a/lib/scatterquiver.js b/lib/scatterquiver.js deleted file mode 100644 index f3d08677cc2..00000000000 --- a/lib/scatterquiver.js +++ /dev/null @@ -1,3 +0,0 @@ -'use strict'; - -module.exports = require('../src/traces/scatterquiver'); diff --git a/src/traces/scatterquiver/attributes.js b/src/traces/quiver/attributes.js similarity index 99% rename from src/traces/scatterquiver/attributes.js rename to src/traces/quiver/attributes.js index 6a72329cee5..5586bc37783 100644 --- a/src/traces/scatterquiver/attributes.js +++ b/src/traces/quiver/attributes.js @@ -204,4 +204,6 @@ attrs.hovertemplate = extendFlat({}, hovertemplateAttrs({}, { keys: ['x', 'y', 'u', 'v', 'text', 'name'] })); -module.exports = attrs; \ No newline at end of file +module.exports = attrs; + + diff --git a/src/traces/scatterquiver/calc.js b/src/traces/quiver/calc.js similarity index 89% rename from src/traces/scatterquiver/calc.js rename to src/traces/quiver/calc.js index 28e11e95116..1fd8877bef7 100644 --- a/src/traces/scatterquiver/calc.js +++ b/src/traces/quiver/calc.js @@ -7,7 +7,7 @@ var BADNUM = require('../../constants/numerical').BADNUM; var scatterCalc = require('../scatter/calc'); /** - * Main calculation function for scatterquiver trace + * Main calculation function for quiver trace * Creates calcdata with arrow path data for each vector */ module.exports = function calc(gd, trace) { @@ -36,12 +36,12 @@ module.exports = function calc(gd, trace) { cdi.x = BADNUM; cdi.y = BADNUM; } - - // No additional props; keep minimal to avoid collisions with generic fields (e.g. `v`) } // Ensure axes are expanded and categories registered like scatter traces do scatterCalc.calcAxisExpansion(gd, trace, xa, ya, xVals, yVals); return cd; -}; \ No newline at end of file +}; + + diff --git a/src/traces/scatterquiver/defaults.js b/src/traces/quiver/defaults.js similarity index 98% rename from src/traces/scatterquiver/defaults.js rename to src/traces/quiver/defaults.js index 1992c520baf..2584e758286 100644 --- a/src/traces/scatterquiver/defaults.js +++ b/src/traces/quiver/defaults.js @@ -34,7 +34,7 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout } // Set basic properties - traceOut.type = 'scatterquiver'; + traceOut.type = 'quiver'; // Set default values using coerce coerce('scale', 0.1); @@ -73,4 +73,6 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout // Set the data length traceOut._length = len; -}; \ No newline at end of file +}; + + diff --git a/src/traces/scatterquiver/event_data.js b/src/traces/quiver/event_data.js similarity index 99% rename from src/traces/scatterquiver/event_data.js rename to src/traces/quiver/event_data.js index faecde95abb..c744a23a152 100644 --- a/src/traces/scatterquiver/event_data.js +++ b/src/traces/quiver/event_data.js @@ -8,3 +8,5 @@ module.exports = function eventData(out, pt, trace, cd, pointNumber) { out.pointNumber = pointNumber; out.trace = trace; }; + + diff --git a/src/traces/scatterquiver/hover.js b/src/traces/quiver/hover.js similarity index 99% rename from src/traces/scatterquiver/hover.js rename to src/traces/quiver/hover.js index d786ea3afc3..d9a3d4573fb 100644 --- a/src/traces/scatterquiver/hover.js +++ b/src/traces/quiver/hover.js @@ -72,4 +72,6 @@ module.exports = function hoverPoints(pointData, xval, yval, hovermode) { } return [hoverPoint]; -}; \ No newline at end of file +}; + + diff --git a/src/traces/scatterquiver/index.js b/src/traces/quiver/index.js similarity index 89% rename from src/traces/scatterquiver/index.js rename to src/traces/quiver/index.js index b476090cc53..82850f0840b 100644 --- a/src/traces/scatterquiver/index.js +++ b/src/traces/quiver/index.js @@ -2,7 +2,7 @@ module.exports = { moduleType: 'trace', - name: 'scatterquiver', + name: 'quiver', basePlotModule: require('../../plots/cartesian'), categories: [ 'cartesian', 'svg', 'showLegend', 'scatter-like', 'zoomScale' @@ -21,7 +21,7 @@ module.exports = { meta: { description: [ - 'The scatterquiver trace type visualizes vector fields using arrows.', + 'The quiver trace type visualizes vector fields using arrows.', 'Specify a vector field using 4 1D arrays:', '2 position arrays `x`, `y` and 2 vector component arrays `u`, `v`.', 'The arrows are drawn exactly at the positions given by `x` and `y`.', @@ -29,3 +29,5 @@ module.exports = { ].join(' ') } }; + + diff --git a/src/traces/scatterquiver/plot.js b/src/traces/quiver/plot.js similarity index 98% rename from src/traces/scatterquiver/plot.js rename to src/traces/quiver/plot.js index 87e2d754926..c1f67b156df 100644 --- a/src/traces/scatterquiver/plot.js +++ b/src/traces/quiver/plot.js @@ -20,7 +20,7 @@ module.exports = function plot(gd, plotinfo, cdscatter, scatterLayer, transition // Append new traces: join.enter().append('g') .attr('class', function(d) { - return 'trace scatterquiver trace' + d[0].trace.uid; + return 'trace quiver trace' + d[0].trace.uid; }) .style('stroke-miterlimit', 2); join.order(); @@ -145,4 +145,6 @@ function plotOne(gd, idx, plotinfo, cdscatter, cdscatterAll, element, transition lineSegments.transition(transition) .style('opacity', 1); } -} \ No newline at end of file +} + + diff --git a/src/traces/scatterquiver/select_points.js b/src/traces/quiver/select_points.js similarity index 99% rename from src/traces/scatterquiver/select_points.js rename to src/traces/quiver/select_points.js index e169b1b9517..d2dfa2d1dab 100644 --- a/src/traces/scatterquiver/select_points.js +++ b/src/traces/quiver/select_points.js @@ -37,3 +37,5 @@ module.exports = function selectPoints(searchInfo, selectionTester) { return selection; }; + + diff --git a/src/traces/scatterquiver/style.js b/src/traces/quiver/style.js similarity index 99% rename from src/traces/scatterquiver/style.js rename to src/traces/quiver/style.js index deb72e21718..30da22034c9 100644 --- a/src/traces/scatterquiver/style.js +++ b/src/traces/quiver/style.js @@ -14,3 +14,5 @@ module.exports = function style(gd, calcTrace) { s.selectAll('path.js-line') .call(Drawing.lineGroupStyle, trace.line || {}); }; + + diff --git a/test/plot-schema.json b/test/plot-schema.json index c869e669c43..79d1efd658a 100644 --- a/test/plot-schema.json +++ b/test/plot-schema.json @@ -15067,6 +15067,12061 @@ "valType": "string" } }, +<<<<<<< HEAD +======= + "role": "object", + "shadow": { + "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", + "dflt": "none", + "editType": "calc", + "valType": "string" + }, + "size": { + "editType": "calc", + "min": 1, + "valType": "number" + }, + "style": { + "description": "Sets whether a font should be styled with a normal or italic face from its family.", + "dflt": "normal", + "editType": "calc", + "valType": "enumerated", + "values": [ + "normal", + "italic" + ] + }, + "textcase": { + "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", + "dflt": "normal", + "editType": "calc", + "valType": "enumerated", + "values": [ + "normal", + "word caps", + "upper", + "lower" + ] + }, + "variant": { + "description": "Sets the variant of the font.", + "dflt": "normal", + "editType": "calc", + "valType": "enumerated", + "values": [ + "normal", + "small-caps", + "all-small-caps", + "all-petite-caps", + "petite-caps", + "unicase" + ] + }, + "weight": { + "description": "Sets the weight (or boldness) of the font.", + "dflt": "normal", + "editType": "calc", + "extras": [ + "normal", + "bold" + ], + "max": 1000, + "min": 1, + "valType": "integer" + } + }, + "role": "object", + "side": { + "description": "Determines the location of color bar's title with respect to the color bar. Defaults to *top* when `orientation` if *v* and defaults to *right* when `orientation` if *h*.", + "editType": "calc", + "valType": "enumerated", + "values": [ + "right", + "top", + "bottom" + ] + }, + "text": { + "description": "Sets the title of the color bar.", + "editType": "calc", + "valType": "string" + } + }, + "x": { + "description": "Sets the x position with respect to `xref` of the color bar (in plot fraction). When `xref` is *paper*, defaults to 1.02 when `orientation` is *v* and 0.5 when `orientation` is *h*. When `xref` is *container*, defaults to *1* when `orientation` is *v* and 0.5 when `orientation` is *h*. Must be between *0* and *1* if `xref` is *container* and between *-2* and *3* if `xref` is *paper*.", + "editType": "calc", + "valType": "number" + }, + "xanchor": { + "description": "Sets this color bar's horizontal position anchor. This anchor binds the `x` position to the *left*, *center* or *right* of the color bar. Defaults to *left* when `orientation` is *v* and *center* when `orientation` is *h*.", + "editType": "calc", + "valType": "enumerated", + "values": [ + "left", + "center", + "right" + ] + }, + "xpad": { + "description": "Sets the amount of padding (in px) along the x direction.", + "dflt": 10, + "editType": "calc", + "min": 0, + "valType": "number" + }, + "xref": { + "description": "Sets the container `x` refers to. *container* spans the entire `width` of the plot. *paper* refers to the width of the plotting area only.", + "dflt": "paper", + "editType": "calc", + "valType": "enumerated", + "values": [ + "container", + "paper" + ] + }, + "y": { + "description": "Sets the y position with respect to `yref` of the color bar (in plot fraction). When `yref` is *paper*, defaults to 0.5 when `orientation` is *v* and 1.02 when `orientation` is *h*. When `yref` is *container*, defaults to 0.5 when `orientation` is *v* and 1 when `orientation` is *h*. Must be between *0* and *1* if `yref` is *container* and between *-2* and *3* if `yref` is *paper*.", + "editType": "calc", + "valType": "number" + }, + "yanchor": { + "description": "Sets this color bar's vertical position anchor This anchor binds the `y` position to the *top*, *middle* or *bottom* of the color bar. Defaults to *middle* when `orientation` is *v* and *bottom* when `orientation` is *h*.", + "editType": "calc", + "valType": "enumerated", + "values": [ + "top", + "middle", + "bottom" + ] + }, + "ypad": { + "description": "Sets the amount of padding (in px) along the y direction.", + "dflt": 10, + "editType": "calc", + "min": 0, + "valType": "number" + }, + "yref": { + "description": "Sets the container `y` refers to. *container* spans the entire `height` of the plot. *paper* refers to the height of the plotting area only.", + "dflt": "paper", + "editType": "calc", + "valType": "enumerated", + "values": [ + "container", + "paper" + ] + } + }, + "colorscale": { + "description": "Sets the colorscale. Has an effect only if in `marker.color` is set to a numerical array. The colorscale must be an array containing arrays mapping a normalized value to an rgb, rgba, hex, hsl, hsv, or named color string. At minimum, a mapping for the lowest (0) and highest (1) values are required. For example, `[[0, 'rgb(0,0,255)'], [1, 'rgb(255,0,0)']]`. To control the bounds of the colorscale in color space, use `marker.cmin` and `marker.cmax`. Alternatively, `colorscale` may be a palette name string of the following list: Blackbody,Bluered,Blues,Cividis,Earth,Electric,Greens,Greys,Hot,Jet,Picnic,Portland,Rainbow,RdBu,Reds,Viridis,YlGnBu,YlOrRd.", + "dflt": null, + "editType": "calc", + "impliedEdits": { + "autocolorscale": false + }, + "valType": "colorscale" + }, + "colorsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `color`.", + "editType": "none", + "valType": "string" + }, + "editType": "calc", + "opacity": { + "arrayOk": true, + "description": "Sets the marker opacity.", + "editType": "calc", + "max": 1, + "min": 0, + "valType": "number" + }, + "opacitysrc": { + "description": "Sets the source reference on Chart Studio Cloud for `opacity`.", + "editType": "none", + "valType": "string" + }, + "reversescale": { + "description": "Reverses the color mapping if true. Has an effect only if in `marker.color` is set to a numerical array. If true, `marker.cmin` will correspond to the last color in the array and `marker.cmax` will correspond to the first color.", + "dflt": false, + "editType": "calc", + "valType": "boolean" + }, + "role": "object", + "showscale": { + "description": "Determines whether or not a colorbar is displayed for this trace. Has an effect only if in `marker.color` is set to a numerical array.", + "dflt": false, + "editType": "calc", + "valType": "boolean" + }, + "size": { + "arrayOk": true, + "description": "Sets the marker size (in px).", + "dflt": 6, + "editType": "calc", + "min": 0, + "valType": "number" + }, + "sizemin": { + "description": "Has an effect only if `marker.size` is set to a numerical array. Sets the minimum size (in px) of the rendered marker points.", + "dflt": 0, + "editType": "calc", + "min": 0, + "valType": "number" + }, + "sizemode": { + "description": "Has an effect only if `marker.size` is set to a numerical array. Sets the rule for which the data in `size` is converted to pixels.", + "dflt": "diameter", + "editType": "calc", + "valType": "enumerated", + "values": [ + "diameter", + "area" + ] + }, + "sizeref": { + "description": "Has an effect only if `marker.size` is set to a numerical array. Sets the scale factor used to determine the rendered size of marker points. Use with `sizemin` and `sizemode`.", + "dflt": 1, + "editType": "calc", + "valType": "number" + }, + "sizesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `size`.", + "editType": "none", + "valType": "string" + }, + "symbol": { + "arrayOk": true, + "description": "Sets the marker symbol. Full list: https://www.mapbox.com/maki-icons/ Note that the array `marker.color` and `marker.size` are only available for *circle* symbols.", + "dflt": "circle", + "editType": "calc", + "valType": "string" + }, + "symbolsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `symbol`.", + "editType": "none", + "valType": "string" + } + }, + "meta": { + "arrayOk": true, + "description": "Assigns extra meta information associated with this trace that can be used in various text attributes. Attributes such as trace `name`, graph, axis and colorbar `title.text`, annotation `text` `rangeselector`, `updatemenues` and `sliders` `label` text all support `meta`. To access the trace `meta` values in an attribute in the same trace, simply use `%{meta[i]}` where `i` is the index or key of the `meta` item in question. To access trace `meta` in layout attributes, use `%{data[n[.meta[i]}` where `i` is the index or key of the `meta` and `n` is the trace index.", + "editType": "plot", + "valType": "any" + }, + "metasrc": { + "description": "Sets the source reference on Chart Studio Cloud for `meta`.", + "editType": "none", + "valType": "string" + }, + "mode": { + "description": "Determines the drawing mode for this scatter trace. If the provided `mode` includes *text* then the `text` elements appear at the coordinates. Otherwise, the `text` elements appear on hover.", + "dflt": "markers", + "editType": "calc", + "extras": [ + "none" + ], + "flags": [ + "lines", + "markers", + "text" + ], + "valType": "flaglist" + }, + "name": { + "description": "Sets the trace name. The trace name appears as the legend item and on hover.", + "editType": "style", + "valType": "string" + }, + "opacity": { + "description": "Sets the opacity of the trace.", + "dflt": 1, + "editType": "style", + "max": 1, + "min": 0, + "valType": "number" + }, + "selected": { + "editType": "calc", + "marker": { + "color": { + "description": "Sets the marker color of selected points.", + "editType": "calc", + "valType": "color" + }, + "editType": "calc", + "opacity": { + "description": "Sets the marker opacity of selected points.", + "editType": "calc", + "max": 1, + "min": 0, + "valType": "number" + }, + "role": "object", + "size": { + "description": "Sets the marker size of selected points.", + "editType": "calc", + "min": 0, + "valType": "number" + } + }, + "role": "object" + }, + "selectedpoints": { + "description": "Array containing integer indices of selected points. Has an effect only for traces that support selections. Note that an empty array means an empty selection where the `unselected` are turned on for all points, whereas, any other non-array values means no selection all where the `selected` and `unselected` styles have no effect.", + "editType": "calc", + "valType": "any" + }, + "showlegend": { + "description": "Determines whether or not an item corresponding to this trace is shown in the legend.", + "dflt": true, + "editType": "style", + "valType": "boolean" + }, + "stream": { + "editType": "calc", + "maxpoints": { + "description": "Sets the maximum number of points to keep on the plots from an incoming stream. If `maxpoints` is set to *50*, only the newest 50 points will be displayed on the plot.", + "dflt": 500, + "editType": "calc", + "max": 10000, + "min": 0, + "valType": "number" + }, + "role": "object", + "token": { + "description": "The stream id number links a data trace on a plot with a stream. See https://chart-studio.plotly.com/settings for more details.", + "editType": "calc", + "noBlank": true, + "strict": true, + "valType": "string" + } + }, + "subplot": { + "description": "Sets a reference between this trace's data coordinates and a map subplot. If *map* (the default value), the data refer to `layout.map`. If *map2*, the data refer to `layout.map2`, and so on.", + "dflt": "map", + "editType": "calc", + "valType": "subplotid" + }, + "text": { + "arrayOk": true, + "description": "Sets text elements associated with each (lon,lat) pair If a single string, the same string appears over all the data points. If an array of string, the items are mapped in order to the this trace's (lon,lat) coordinates. If trace `hoverinfo` contains a *text* flag and *hovertext* is not set, these elements will be seen in the hover labels.", + "dflt": "", + "editType": "calc", + "valType": "string" + }, + "textfont": { + "color": { + "editType": "calc", + "valType": "color" + }, + "description": "Sets the icon text font (color=map.layer.paint.text-color, size=map.layer.layout.text-size). Has an effect only when `type` is set to *symbol*.", + "editType": "calc", + "family": { + "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", + "dflt": "Open Sans Regular, Arial Unicode MS Regular", + "editType": "calc", + "noBlank": true, + "strict": true, + "valType": "string" + }, + "role": "object", + "size": { + "editType": "calc", + "min": 1, + "valType": "number" + }, + "style": { + "description": "Sets whether a font should be styled with a normal or italic face from its family.", + "dflt": "normal", + "editType": "calc", + "valType": "enumerated", + "values": [ + "normal", + "italic" + ] + }, + "weight": { + "description": "Sets the weight (or boldness) of the font.", + "dflt": "normal", + "editType": "calc", + "extras": [ + "normal", + "bold" + ], + "max": 1000, + "min": 1, + "valType": "integer" + } + }, + "textposition": { + "arrayOk": false, + "description": "Sets the positions of the `text` elements with respects to the (x,y) coordinates.", + "dflt": "middle center", + "editType": "calc", + "valType": "enumerated", + "values": [ + "top left", + "top center", + "top right", + "middle left", + "middle center", + "middle right", + "bottom left", + "bottom center", + "bottom right" + ] + }, + "textsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `text`.", + "editType": "none", + "valType": "string" + }, + "texttemplate": { + "arrayOk": true, + "description": "Template string used for rendering the information text that appears on points. Note that this will override `textinfo`. Variables are inserted using %{variable}, for example \"y: %{y}\". Numbers are formatted using d3-format's syntax %{variable:d3-format}, for example \"Price: %{y:$.2f}\". https://github.com/d3/d3-format/tree/v1.4.5#d3-format for details on the formatting syntax. Dates are formatted using d3-time-format's syntax %{variable|d3-time-format}, for example \"Day: %{2019-01-01|%A}\". https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format for details on the date formatting syntax. Variables that can't be found will be replaced with the specifier. For example, a template of \"data: %{x}, %{y}\" will result in a value of \"data: 1, %{y}\" if x is 1 and y is missing. Variables with an undefined value will be replaced with the fallback value. All attributes that can be specified per-point (the ones that are `arrayOk: true`) are available. Finally, the template string has access to variables `lat`, `lon` and `text`.", + "dflt": "", + "editType": "calc", + "valType": "string" + }, + "texttemplatefallback": { + "description": "Fallback string that's displayed when a variable referenced in a template is missing. If the boolean value 'false' is passed in, the specifier with the missing variable will be displayed.", + "dflt": "-", + "editType": "calc", + "valType": "any" + }, + "texttemplatesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `texttemplate`.", + "editType": "none", + "valType": "string" + }, + "type": "scattermap", + "uid": { + "description": "Assign an id to this trace, Use this to provide object constancy between traces during animations and transitions.", + "editType": "plot", + "valType": "string" + }, + "uirevision": { + "description": "Controls persistence of some user-driven changes to the trace: `constraintrange` in `parcoords` traces, as well as some `editable: true` modifications such as `name` and `colorbar.title`. Defaults to `layout.uirevision`. Note that other user-driven trace attribute changes are controlled by `layout` attributes: `trace.visible` is controlled by `layout.legend.uirevision`, `selectedpoints` is controlled by `layout.selectionrevision`, and `colorbar.(x|y)` (accessible with `config: {editable: true}`) is controlled by `layout.editrevision`. Trace changes are tracked by `uid`, which only falls back on trace index if no `uid` is provided. So if your app can add/remove traces before the end of the `data` array, such that the same trace has a different index, you can still preserve user-driven changes if you give each trace a `uid` that stays with it as it moves.", + "editType": "none", + "valType": "any" + }, + "unselected": { + "editType": "calc", + "marker": { + "color": { + "description": "Sets the marker color of unselected points, applied only when a selection exists.", + "editType": "calc", + "valType": "color" + }, + "editType": "calc", + "opacity": { + "description": "Sets the marker opacity of unselected points, applied only when a selection exists.", + "editType": "calc", + "max": 1, + "min": 0, + "valType": "number" + }, + "role": "object", + "size": { + "description": "Sets the marker size of unselected points, applied only when a selection exists.", + "editType": "calc", + "min": 0, + "valType": "number" + } + }, + "role": "object" + }, + "visible": { + "description": "Determines whether or not this trace is visible. If *legendonly*, the trace is not drawn, but can appear as a legend item (provided that the legend itself is visible).", + "dflt": true, + "editType": "calc", + "valType": "enumerated", + "values": [ + true, + false, + "legendonly" + ] + } + }, + "categories": [ + "map", + "gl", + "symbols", + "showLegend", + "scatter-like" + ], + "meta": { + "description": "The data visualized as scatter point, lines or marker symbols on a MapLibre GL geographic map is provided by longitude/latitude pairs in `lon` and `lat`.", + "hrName": "scatter_map" + }, + "type": "scattermap" + }, + "scattermapbox": { + "animatable": false, + "attributes": { + "below": { + "description": "Determines if this scattermapbox trace's layers are to be inserted before the layer with the specified ID. By default, scattermapbox layers are inserted above all the base layers. To place the scattermapbox layers above every other layer, set `below` to *''*.", + "editType": "calc", + "valType": "string" + }, + "cluster": { + "color": { + "arrayOk": true, + "description": "Sets the color for each cluster step.", + "editType": "calc", + "valType": "color" + }, + "colorsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `color`.", + "editType": "none", + "valType": "string" + }, + "editType": "calc", + "enabled": { + "description": "Determines whether clustering is enabled or disabled.", + "editType": "calc", + "valType": "boolean" + }, + "maxzoom": { + "description": "Sets the maximum zoom level. At zoom levels equal to or greater than this, points will never be clustered.", + "dflt": 24, + "editType": "calc", + "max": 24, + "min": 0, + "valType": "number" + }, + "opacity": { + "arrayOk": true, + "description": "Sets the marker opacity.", + "dflt": 1, + "editType": "calc", + "max": 1, + "min": 0, + "valType": "number" + }, + "opacitysrc": { + "description": "Sets the source reference on Chart Studio Cloud for `opacity`.", + "editType": "none", + "valType": "string" + }, + "role": "object", + "size": { + "arrayOk": true, + "description": "Sets the size for each cluster step.", + "dflt": 20, + "editType": "calc", + "min": 0, + "valType": "number" + }, + "sizesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `size`.", + "editType": "none", + "valType": "string" + }, + "step": { + "arrayOk": true, + "description": "Sets how many points it takes to create a cluster or advance to the next cluster step. Use this in conjunction with arrays for `size` and / or `color`. If an integer, steps start at multiples of this number. If an array, each step extends from the given value until one less than the next value.", + "dflt": -1, + "editType": "calc", + "min": -1, + "valType": "number" + }, + "stepsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `step`.", + "editType": "none", + "valType": "string" + } + }, + "connectgaps": { + "description": "Determines whether or not gaps (i.e. {nan} or missing values) in the provided data arrays are connected.", + "dflt": false, + "editType": "calc", + "valType": "boolean" + }, + "customdata": { + "description": "Assigns extra data each datum. This may be useful when listening to hover, click and selection events. Note that, *scatter* traces also appends customdata items in the markers DOM elements", + "editType": "calc", + "valType": "data_array" + }, + "customdatasrc": { + "description": "Sets the source reference on Chart Studio Cloud for `customdata`.", + "editType": "none", + "valType": "string" + }, + "fill": { + "description": "Sets the area to fill with a solid color. Use with `fillcolor` if not *none*. *toself* connects the endpoints of the trace (or each segment of the trace if it has gaps) into a closed shape.", + "dflt": "none", + "editType": "calc", + "valType": "enumerated", + "values": [ + "none", + "toself" + ] + }, + "fillcolor": { + "description": "Sets the fill color. Defaults to a half-transparent variant of the line color, marker color, or marker line color, whichever is available.", + "editType": "calc", + "valType": "color" + }, + "hoverinfo": { + "arrayOk": true, + "description": "Determines which trace information appear on hover. If `none` or `skip` are set, no information is displayed upon hovering. But, if `none` is set, click and hover events are still fired.", + "dflt": "all", + "editType": "calc", + "extras": [ + "all", + "none", + "skip" + ], + "flags": [ + "lon", + "lat", + "text", + "name" + ], + "valType": "flaglist" + }, + "hoverinfosrc": { + "description": "Sets the source reference on Chart Studio Cloud for `hoverinfo`.", + "editType": "none", + "valType": "string" + }, + "hoverlabel": { + "align": { + "arrayOk": true, + "description": "Sets the horizontal alignment of the text content within hover label box. Has an effect only if the hover label text spans more two or more lines", + "dflt": "auto", + "editType": "none", + "valType": "enumerated", + "values": [ + "left", + "right", + "auto" + ] + }, + "alignsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `align`.", + "editType": "none", + "valType": "string" + }, + "bgcolor": { + "arrayOk": true, + "description": "Sets the background color of the hover labels for this trace", + "editType": "none", + "valType": "color" + }, + "bgcolorsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `bgcolor`.", + "editType": "none", + "valType": "string" + }, + "bordercolor": { + "arrayOk": true, + "description": "Sets the border color of the hover labels for this trace.", + "editType": "none", + "valType": "color" + }, + "bordercolorsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `bordercolor`.", + "editType": "none", + "valType": "string" + }, + "editType": "none", + "font": { + "color": { + "arrayOk": true, + "editType": "none", + "valType": "color" + }, + "colorsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `color`.", + "editType": "none", + "valType": "string" + }, + "description": "Sets the font used in hover labels.", + "editType": "none", + "family": { + "arrayOk": true, + "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", + "editType": "none", + "noBlank": true, + "strict": true, + "valType": "string" + }, + "familysrc": { + "description": "Sets the source reference on Chart Studio Cloud for `family`.", + "editType": "none", + "valType": "string" + }, + "lineposition": { + "arrayOk": true, + "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", + "dflt": "none", + "editType": "none", + "extras": [ + "none" + ], + "flags": [ + "under", + "over", + "through" + ], + "valType": "flaglist" + }, + "linepositionsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `lineposition`.", + "editType": "none", + "valType": "string" + }, + "role": "object", + "shadow": { + "arrayOk": true, + "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", + "dflt": "none", + "editType": "none", + "valType": "string" + }, + "shadowsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `shadow`.", + "editType": "none", + "valType": "string" + }, + "size": { + "arrayOk": true, + "editType": "none", + "min": 1, + "valType": "number" + }, + "sizesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `size`.", + "editType": "none", + "valType": "string" + }, + "style": { + "arrayOk": true, + "description": "Sets whether a font should be styled with a normal or italic face from its family.", + "dflt": "normal", + "editType": "none", + "valType": "enumerated", + "values": [ + "normal", + "italic" + ] + }, + "stylesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `style`.", + "editType": "none", + "valType": "string" + }, + "textcase": { + "arrayOk": true, + "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", + "dflt": "normal", + "editType": "none", + "valType": "enumerated", + "values": [ + "normal", + "word caps", + "upper", + "lower" + ] + }, + "textcasesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `textcase`.", + "editType": "none", + "valType": "string" + }, + "variant": { + "arrayOk": true, + "description": "Sets the variant of the font.", + "dflt": "normal", + "editType": "none", + "valType": "enumerated", + "values": [ + "normal", + "small-caps", + "all-small-caps", + "all-petite-caps", + "petite-caps", + "unicase" + ] + }, + "variantsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `variant`.", + "editType": "none", + "valType": "string" + }, + "weight": { + "arrayOk": true, + "description": "Sets the weight (or boldness) of the font.", + "dflt": "normal", + "editType": "none", + "extras": [ + "normal", + "bold" + ], + "max": 1000, + "min": 1, + "valType": "integer" + }, + "weightsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `weight`.", + "editType": "none", + "valType": "string" + } + }, + "namelength": { + "arrayOk": true, + "description": "Sets the default length (in number of characters) of the trace name in the hover labels for all traces. -1 shows the whole name regardless of length. 0-3 shows the first 0-3 characters, and an integer >3 will show the whole name if it is less than that many characters, but if it is longer, will truncate to `namelength - 3` characters and add an ellipsis.", + "dflt": 15, + "editType": "none", + "min": -1, + "valType": "integer" + }, + "namelengthsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `namelength`.", + "editType": "none", + "valType": "string" + }, + "role": "object", + "showarrow": { + "description": "Sets whether or not to show the hover label arrow/triangle pointing to the data point.", + "dflt": true, + "editType": "none", + "valType": "boolean" + } + }, + "hovertemplate": { + "arrayOk": true, + "description": "Template string used for rendering the information that appear on hover box. Note that this will override `hoverinfo`. Variables are inserted using %{variable}, for example \"y: %{y}\" as well as %{xother}, {%_xother}, {%_xother_}, {%xother_}. When showing info for several points, *xother* will be added to those with different x positions from the first point. An underscore before or after *(x|y)other* will add a space on that side, only when this field is shown. Numbers are formatted using d3-format's syntax %{variable:d3-format}, for example \"Price: %{y:$.2f}\". https://github.com/d3/d3-format/tree/v1.4.5#d3-format for details on the formatting syntax. Dates are formatted using d3-time-format's syntax %{variable|d3-time-format}, for example \"Day: %{2019-01-01|%A}\". https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format for details on the date formatting syntax. Variables that can't be found will be replaced with the specifier. For example, a template of \"data: %{x}, %{y}\" will result in a value of \"data: 1, %{y}\" if x is 1 and y is missing. Variables with an undefined value will be replaced with the fallback value. The variables available in `hovertemplate` are the ones emitted as event data described at this link https://plotly.com/javascript/plotlyjs-events/#event-data. Additionally, all attributes that can be specified per-point (the ones that are `arrayOk: true`) are available. Anything contained in tag `` is displayed in the secondary box, for example `%{fullData.name}`. To hide the secondary box completely, use an empty tag ``.", + "dflt": "", + "editType": "calc", + "valType": "string" + }, + "hovertemplatefallback": { + "description": "Fallback string that's displayed when a variable referenced in a template is missing. If the boolean value 'false' is passed in, the specifier with the missing variable will be displayed.", + "dflt": "-", + "editType": "calc", + "valType": "any" + }, + "hovertemplatesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `hovertemplate`.", + "editType": "none", + "valType": "string" + }, + "hovertext": { + "arrayOk": true, + "description": "Sets hover text elements associated with each (lon,lat) pair If a single string, the same string appears over all the data points. If an array of string, the items are mapped in order to the this trace's (lon,lat) coordinates. To be seen, trace `hoverinfo` must contain a *text* flag.", + "dflt": "", + "editType": "calc", + "valType": "string" + }, + "hovertextsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `hovertext`.", + "editType": "none", + "valType": "string" + }, + "ids": { + "description": "Assigns id labels to each datum. These ids for object constancy of data points during animation. Should be an array of strings, not numbers or any other type.", + "editType": "calc", + "valType": "data_array" + }, + "idssrc": { + "description": "Sets the source reference on Chart Studio Cloud for `ids`.", + "editType": "none", + "valType": "string" + }, + "lat": { + "description": "Sets the latitude coordinates (in degrees North).", + "editType": "calc", + "valType": "data_array" + }, + "latsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `lat`.", + "editType": "none", + "valType": "string" + }, + "legend": { + "description": "Sets the reference to a legend to show this trace in. References to these legends are *legend*, *legend2*, *legend3*, etc. Settings for these legends are set in the layout, under `layout.legend`, `layout.legend2`, etc.", + "dflt": "legend", + "editType": "style", + "valType": "subplotid" + }, + "legendgroup": { + "description": "Sets the legend group for this trace. Traces and shapes part of the same legend group hide/show at the same time when toggling legend items.", + "dflt": "", + "editType": "style", + "valType": "string" + }, + "legendgrouptitle": { + "editType": "style", + "font": { + "color": { + "editType": "style", + "valType": "color" + }, + "description": "Sets this legend group's title font.", + "editType": "style", + "family": { + "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", + "editType": "style", + "noBlank": true, + "strict": true, + "valType": "string" + }, + "lineposition": { + "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", + "dflt": "none", + "editType": "style", + "extras": [ + "none" + ], + "flags": [ + "under", + "over", + "through" + ], + "valType": "flaglist" + }, + "role": "object", + "shadow": { + "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", + "dflt": "none", + "editType": "style", + "valType": "string" + }, + "size": { + "editType": "style", + "min": 1, + "valType": "number" + }, + "style": { + "description": "Sets whether a font should be styled with a normal or italic face from its family.", + "dflt": "normal", + "editType": "style", + "valType": "enumerated", + "values": [ + "normal", + "italic" + ] + }, + "textcase": { + "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", + "dflt": "normal", + "editType": "style", + "valType": "enumerated", + "values": [ + "normal", + "word caps", + "upper", + "lower" + ] + }, + "variant": { + "description": "Sets the variant of the font.", + "dflt": "normal", + "editType": "style", + "valType": "enumerated", + "values": [ + "normal", + "small-caps", + "all-small-caps", + "all-petite-caps", + "petite-caps", + "unicase" + ] + }, + "weight": { + "description": "Sets the weight (or boldness) of the font.", + "dflt": "normal", + "editType": "style", + "extras": [ + "normal", + "bold" + ], + "max": 1000, + "min": 1, + "valType": "integer" + } + }, + "role": "object", + "text": { + "description": "Sets the title of the legend group.", + "dflt": "", + "editType": "style", + "valType": "string" + } + }, + "legendrank": { + "description": "Sets the legend rank for this trace. Items and groups with smaller ranks are presented on top/left side while with *reversed* `legend.traceorder` they are on bottom/right side. The default legendrank is 1000, so that you can use ranks less than 1000 to place certain items before all unranked items, and ranks greater than 1000 to go after all unranked items. When having unranked or equal rank items shapes would be displayed after traces i.e. according to their order in data and layout.", + "dflt": 1000, + "editType": "style", + "valType": "number" + }, + "legendwidth": { + "description": "Sets the width (in px or fraction) of the legend for this trace.", + "editType": "style", + "min": 0, + "valType": "number" + }, + "line": { + "color": { + "description": "Sets the line color.", + "editType": "calc", + "valType": "color" + }, + "editType": "calc", + "role": "object", + "width": { + "description": "Sets the line width (in px).", + "dflt": 2, + "editType": "calc", + "min": 0, + "valType": "number" + } + }, + "lon": { + "description": "Sets the longitude coordinates (in degrees East).", + "editType": "calc", + "valType": "data_array" + }, + "lonsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `lon`.", + "editType": "none", + "valType": "string" + }, + "marker": { + "allowoverlap": { + "description": "Flag to draw all symbols, even if they overlap.", + "dflt": false, + "editType": "calc", + "valType": "boolean" + }, + "angle": { + "arrayOk": true, + "description": "Sets the marker orientation from true North, in degrees clockwise. When using the *auto* default, no rotation would be applied in perspective views which is different from using a zero angle.", + "dflt": "auto", + "editType": "calc", + "valType": "number" + }, + "anglesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `angle`.", + "editType": "none", + "valType": "string" + }, + "autocolorscale": { + "description": "Determines whether the colorscale is a default palette (`autocolorscale: true`) or the palette determined by `marker.colorscale`. Has an effect only if in `marker.color` is set to a numerical array. In case `colorscale` is unspecified or `autocolorscale` is true, the default palette will be chosen according to whether numbers in the `color` array are all positive, all negative or mixed.", + "dflt": true, + "editType": "calc", + "impliedEdits": {}, + "valType": "boolean" + }, + "cauto": { + "description": "Determines whether or not the color domain is computed with respect to the input data (here in `marker.color`) or the bounds set in `marker.cmin` and `marker.cmax` Has an effect only if in `marker.color` is set to a numerical array. Defaults to `false` when `marker.cmin` and `marker.cmax` are set by the user.", + "dflt": true, + "editType": "calc", + "impliedEdits": {}, + "valType": "boolean" + }, + "cmax": { + "description": "Sets the upper bound of the color domain. Has an effect only if in `marker.color` is set to a numerical array. Value should have the same units as in `marker.color` and if set, `marker.cmin` must be set as well.", + "dflt": null, + "editType": "calc", + "impliedEdits": { + "cauto": false + }, + "valType": "number" + }, + "cmid": { + "description": "Sets the mid-point of the color domain by scaling `marker.cmin` and/or `marker.cmax` to be equidistant to this point. Has an effect only if in `marker.color` is set to a numerical array. Value should have the same units as in `marker.color`. Has no effect when `marker.cauto` is `false`.", + "dflt": null, + "editType": "calc", + "impliedEdits": {}, + "valType": "number" + }, + "cmin": { + "description": "Sets the lower bound of the color domain. Has an effect only if in `marker.color` is set to a numerical array. Value should have the same units as in `marker.color` and if set, `marker.cmax` must be set as well.", + "dflt": null, + "editType": "calc", + "impliedEdits": { + "cauto": false + }, + "valType": "number" + }, + "color": { + "arrayOk": true, + "description": "Sets the marker color. It accepts either a specific color or an array of numbers that are mapped to the colorscale relative to the max and min values of the array or relative to `marker.cmin` and `marker.cmax` if set.", + "editType": "calc", + "valType": "color" + }, + "coloraxis": { + "description": "Sets a reference to a shared color axis. References to these shared color axes are *coloraxis*, *coloraxis2*, *coloraxis3*, etc. Settings for these shared color axes are set in the layout, under `layout.coloraxis`, `layout.coloraxis2`, etc. Note that multiple color scales can be linked to the same color axis.", + "dflt": null, + "editType": "calc", + "regex": "/^coloraxis([2-9]|[1-9][0-9]+)?$/", + "valType": "subplotid" + }, + "colorbar": { + "bgcolor": { + "description": "Sets the color of padded area.", + "dflt": "rgba(0,0,0,0)", + "editType": "calc", + "valType": "color" + }, + "bordercolor": { + "description": "Sets the axis line color.", + "dflt": "#444", + "editType": "calc", + "valType": "color" + }, + "borderwidth": { + "description": "Sets the width (in px) or the border enclosing this color bar.", + "dflt": 0, + "editType": "calc", + "min": 0, + "valType": "number" + }, + "dtick": { + "description": "Sets the step in-between ticks on this axis. Use with `tick0`. Must be a positive number, or special strings available to *log* and *date* axes. If the axis `type` is *log*, then ticks are set every 10^(n*dtick) where n is the tick number. For example, to set a tick mark at 1, 10, 100, 1000, ... set dtick to 1. To set tick marks at 1, 100, 10000, ... set dtick to 2. To set tick marks at 1, 5, 25, 125, 625, 3125, ... set dtick to log_10(5), or 0.69897000433. *log* has several special values; *L*, where `f` is a positive number, gives ticks linearly spaced in value (but not position). For example `tick0` = 0.1, `dtick` = *L0.5* will put ticks at 0.1, 0.6, 1.1, 1.6 etc. To show powers of 10 plus small digits between, use *D1* (all digits) or *D2* (only 2 and 5). `tick0` is ignored for *D1* and *D2*. If the axis `type` is *date*, then you must convert the time to milliseconds. For example, to set the interval between ticks to one day, set `dtick` to 86400000.0. *date* also has special values *M* gives ticks spaced by a number of months. `n` must be a positive integer. To set ticks on the 15th of every third month, set `tick0` to *2000-01-15* and `dtick` to *M3*. To set ticks every 4 years, set `dtick` to *M48*", + "editType": "calc", + "impliedEdits": { + "tickmode": "linear" + }, + "valType": "any" + }, + "editType": "calc", + "exponentformat": { + "description": "Determines a formatting rule for the tick exponents. For example, consider the number 1,000,000,000. If *none*, it appears as 1,000,000,000. If *e*, 1e+9. If *E*, 1E+9. If *power*, 1x10^9 (with 9 in a super script). If *SI*, 1G. If *B*, 1B. *SI* uses prefixes from \"femto\" f (10^-15) to \"tera\" T (10^12). *SI extended* covers instead the full SI range from \"quecto\" q (10^-30) to \"quetta\" Q (10^30). If *SI* or *SI extended* is used and the exponent is beyond the above ranges, the formatting rule will automatically be switched to the power notation.", + "dflt": "B", + "editType": "calc", + "valType": "enumerated", + "values": [ + "none", + "e", + "E", + "power", + "SI", + "B", + "SI extended" + ] + }, + "labelalias": { + "description": "Replacement text for specific tick or hover labels. For example using {US: 'USA', CA: 'Canada'} changes US to USA and CA to Canada. The labels we would have shown must match the keys exactly, after adding any tickprefix or ticksuffix. For negative numbers the minus sign symbol used (U+2212) is wider than the regular ascii dash. That means you need to use −1 instead of -1. labelalias can be used with any axis type, and both keys (if needed) and values (if desired) can include html-like tags or MathJax.", + "dflt": false, + "editType": "calc", + "valType": "any" + }, + "len": { + "description": "Sets the length of the color bar This measure excludes the padding of both ends. That is, the color bar length is this length minus the padding on both ends.", + "dflt": 1, + "editType": "calc", + "min": 0, + "valType": "number" + }, + "lenmode": { + "description": "Determines whether this color bar's length (i.e. the measure in the color variation direction) is set in units of plot *fraction* or in *pixels. Use `len` to set the value.", + "dflt": "fraction", + "editType": "calc", + "valType": "enumerated", + "values": [ + "fraction", + "pixels" + ] + }, + "minexponent": { + "description": "Hide SI prefix for 10^n if |n| is below this number. This only has an effect when `tickformat` is *SI* or *B*.", + "dflt": 3, + "editType": "calc", + "min": 0, + "valType": "number" + }, + "nticks": { + "description": "Specifies the maximum number of ticks for the particular axis. The actual number of ticks will be chosen automatically to be less than or equal to `nticks`. Has an effect only if `tickmode` is set to *auto*.", + "dflt": 0, + "editType": "calc", + "min": 0, + "valType": "integer" + }, + "orientation": { + "description": "Sets the orientation of the colorbar.", + "dflt": "v", + "editType": "calc", + "valType": "enumerated", + "values": [ + "h", + "v" + ] + }, + "outlinecolor": { + "description": "Sets the axis line color.", + "dflt": "#444", + "editType": "calc", + "valType": "color" + }, + "outlinewidth": { + "description": "Sets the width (in px) of the axis line.", + "dflt": 1, + "editType": "calc", + "min": 0, + "valType": "number" + }, + "role": "object", + "separatethousands": { + "description": "If \"true\", even 4-digit integers are separated", + "dflt": false, + "editType": "calc", + "valType": "boolean" + }, + "showexponent": { + "description": "If *all*, all exponents are shown besides their significands. If *first*, only the exponent of the first tick is shown. If *last*, only the exponent of the last tick is shown. If *none*, no exponents appear.", + "dflt": "all", + "editType": "calc", + "valType": "enumerated", + "values": [ + "all", + "first", + "last", + "none" + ] + }, + "showticklabels": { + "description": "Determines whether or not the tick labels are drawn.", + "dflt": true, + "editType": "calc", + "valType": "boolean" + }, + "showtickprefix": { + "description": "If *all*, all tick labels are displayed with a prefix. If *first*, only the first tick is displayed with a prefix. If *last*, only the last tick is displayed with a suffix. If *none*, tick prefixes are hidden.", + "dflt": "all", + "editType": "calc", + "valType": "enumerated", + "values": [ + "all", + "first", + "last", + "none" + ] + }, + "showticksuffix": { + "description": "Same as `showtickprefix` but for tick suffixes.", + "dflt": "all", + "editType": "calc", + "valType": "enumerated", + "values": [ + "all", + "first", + "last", + "none" + ] + }, + "thickness": { + "description": "Sets the thickness of the color bar This measure excludes the size of the padding, ticks and labels.", + "dflt": 30, + "editType": "calc", + "min": 0, + "valType": "number" + }, + "thicknessmode": { + "description": "Determines whether this color bar's thickness (i.e. the measure in the constant color direction) is set in units of plot *fraction* or in *pixels*. Use `thickness` to set the value.", + "dflt": "pixels", + "editType": "calc", + "valType": "enumerated", + "values": [ + "fraction", + "pixels" + ] + }, + "tick0": { + "description": "Sets the placement of the first tick on this axis. Use with `dtick`. If the axis `type` is *log*, then you must take the log of your starting tick (e.g. to set the starting tick to 100, set the `tick0` to 2) except when `dtick`=*L* (see `dtick` for more info). If the axis `type` is *date*, it should be a date string, like date data. If the axis `type` is *category*, it should be a number, using the scale where each category is assigned a serial number from zero in the order it appears.", + "editType": "calc", + "impliedEdits": { + "tickmode": "linear" + }, + "valType": "any" + }, + "tickangle": { + "description": "Sets the angle of the tick labels with respect to the horizontal. For example, a `tickangle` of -90 draws the tick labels vertically.", + "dflt": "auto", + "editType": "calc", + "valType": "angle" + }, + "tickcolor": { + "description": "Sets the tick color.", + "dflt": "#444", + "editType": "calc", + "valType": "color" + }, + "tickfont": { + "color": { + "editType": "calc", + "valType": "color" + }, + "description": "Sets the color bar's tick label font", + "editType": "calc", + "family": { + "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", + "editType": "calc", + "noBlank": true, + "strict": true, + "valType": "string" + }, + "lineposition": { + "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", + "dflt": "none", + "editType": "calc", + "extras": [ + "none" + ], + "flags": [ + "under", + "over", + "through" + ], + "valType": "flaglist" + }, + "role": "object", + "shadow": { + "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", + "dflt": "none", + "editType": "calc", + "valType": "string" + }, + "size": { + "editType": "calc", + "min": 1, + "valType": "number" + }, + "style": { + "description": "Sets whether a font should be styled with a normal or italic face from its family.", + "dflt": "normal", + "editType": "calc", + "valType": "enumerated", + "values": [ + "normal", + "italic" + ] + }, + "textcase": { + "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", + "dflt": "normal", + "editType": "calc", + "valType": "enumerated", + "values": [ + "normal", + "word caps", + "upper", + "lower" + ] + }, + "variant": { + "description": "Sets the variant of the font.", + "dflt": "normal", + "editType": "calc", + "valType": "enumerated", + "values": [ + "normal", + "small-caps", + "all-small-caps", + "all-petite-caps", + "petite-caps", + "unicase" + ] + }, + "weight": { + "description": "Sets the weight (or boldness) of the font.", + "dflt": "normal", + "editType": "calc", + "extras": [ + "normal", + "bold" + ], + "max": 1000, + "min": 1, + "valType": "integer" + } + }, + "tickformat": { + "description": "Sets the tick label formatting rule using d3 formatting mini-languages which are very similar to those in Python. For numbers, see: https://github.com/d3/d3-format/tree/v1.4.5#d3-format. And for dates see: https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format. We add two items to d3's date formatter: *%h* for half of the year as a decimal number as well as *%{n}f* for fractional seconds with n digits. For example, *2016-10-13 09:15:23.456* with tickformat *%H~%M~%S.%2f* would display *09~15~23.46*", + "dflt": "", + "editType": "calc", + "valType": "string" + }, + "tickformatstops": { + "items": { + "tickformatstop": { + "dtickrange": { + "description": "range [*min*, *max*], where *min*, *max* - dtick values which describe some zoom level, it is possible to omit *min* or *max* value by passing *null*", + "editType": "calc", + "items": [ + { + "editType": "calc", + "valType": "any" + }, + { + "editType": "calc", + "valType": "any" + } + ], + "valType": "info_array" + }, + "editType": "calc", + "enabled": { + "description": "Determines whether or not this stop is used. If `false`, this stop is ignored even within its `dtickrange`.", + "dflt": true, + "editType": "calc", + "valType": "boolean" + }, + "name": { + "description": "When used in a template, named items are created in the output figure in addition to any items the figure already has in this array. You can modify these items in the output figure by making your own item with `templateitemname` matching this `name` alongside your modifications (including `visible: false` or `enabled: false` to hide it). Has no effect outside of a template.", + "editType": "calc", + "valType": "string" + }, + "role": "object", + "templateitemname": { + "description": "Used to refer to a named item in this array in the template. Named items from the template will be created even without a matching item in the input figure, but you can modify one by making an item with `templateitemname` matching its `name`, alongside your modifications (including `visible: false` or `enabled: false` to hide it). If there is no template or no matching item, this item will be hidden unless you explicitly show it with `visible: true`.", + "editType": "calc", + "valType": "string" + }, + "value": { + "description": "string - dtickformat for described zoom level, the same as *tickformat*", + "dflt": "", + "editType": "calc", + "valType": "string" + } + } + }, + "role": "object" + }, + "ticklabeloverflow": { + "description": "Determines how we handle tick labels that would overflow either the graph div or the domain of the axis. The default value for inside tick labels is *hide past domain*. In other cases the default is *hide past div*.", + "editType": "calc", + "valType": "enumerated", + "values": [ + "allow", + "hide past div", + "hide past domain" + ] + }, + "ticklabelposition": { + "description": "Determines where tick labels are drawn relative to the ticks. Left and right options are used when `orientation` is *h*, top and bottom when `orientation` is *v*.", + "dflt": "outside", + "editType": "calc", + "valType": "enumerated", + "values": [ + "outside", + "inside", + "outside top", + "inside top", + "outside left", + "inside left", + "outside right", + "inside right", + "outside bottom", + "inside bottom" + ] + }, + "ticklabelstep": { + "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", + "dflt": 1, + "editType": "calc", + "min": 1, + "valType": "integer" + }, + "ticklen": { + "description": "Sets the tick length (in px).", + "dflt": 5, + "editType": "calc", + "min": 0, + "valType": "number" + }, + "tickmode": { + "description": "Sets the tick mode for this axis. If *auto*, the number of ticks is set via `nticks`. If *linear*, the placement of the ticks is determined by a starting position `tick0` and a tick step `dtick` (*linear* is the default value if `tick0` and `dtick` are provided). If *array*, the placement of the ticks is set via `tickvals` and the tick text is `ticktext`. (*array* is the default value if `tickvals` is provided).", + "editType": "calc", + "impliedEdits": {}, + "valType": "enumerated", + "values": [ + "auto", + "linear", + "array" + ] + }, + "tickprefix": { + "description": "Sets a tick label prefix.", + "dflt": "", + "editType": "calc", + "valType": "string" + }, + "ticks": { + "description": "Determines whether ticks are drawn or not. If **, this axis' ticks are not drawn. If *outside* (*inside*), this axis' are drawn outside (inside) the axis lines.", + "dflt": "", + "editType": "calc", + "valType": "enumerated", + "values": [ + "outside", + "inside", + "" + ] + }, + "ticksuffix": { + "description": "Sets a tick label suffix.", + "dflt": "", + "editType": "calc", + "valType": "string" + }, + "ticktext": { + "description": "Sets the text displayed at the ticks position via `tickvals`. Only has an effect if `tickmode` is set to *array*. Used with `tickvals`.", + "editType": "calc", + "valType": "data_array" + }, + "ticktextsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `ticktext`.", + "editType": "none", + "valType": "string" + }, + "tickvals": { + "description": "Sets the values at which ticks on this axis appear. Only has an effect if `tickmode` is set to *array*. Used with `ticktext`.", + "editType": "calc", + "valType": "data_array" + }, + "tickvalssrc": { + "description": "Sets the source reference on Chart Studio Cloud for `tickvals`.", + "editType": "none", + "valType": "string" + }, + "tickwidth": { + "description": "Sets the tick width (in px).", + "dflt": 1, + "editType": "calc", + "min": 0, + "valType": "number" + }, + "title": { + "editType": "calc", + "font": { + "color": { + "editType": "calc", + "valType": "color" + }, + "description": "Sets this color bar's title font.", + "editType": "calc", + "family": { + "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", + "editType": "calc", + "noBlank": true, + "strict": true, + "valType": "string" + }, + "lineposition": { + "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", + "dflt": "none", + "editType": "calc", + "extras": [ + "none" + ], + "flags": [ + "under", + "over", + "through" + ], + "valType": "flaglist" + }, + "role": "object", + "shadow": { + "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", + "dflt": "none", + "editType": "calc", + "valType": "string" + }, + "size": { + "editType": "calc", + "min": 1, + "valType": "number" + }, + "style": { + "description": "Sets whether a font should be styled with a normal or italic face from its family.", + "dflt": "normal", + "editType": "calc", + "valType": "enumerated", + "values": [ + "normal", + "italic" + ] + }, + "textcase": { + "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", + "dflt": "normal", + "editType": "calc", + "valType": "enumerated", + "values": [ + "normal", + "word caps", + "upper", + "lower" + ] + }, + "variant": { + "description": "Sets the variant of the font.", + "dflt": "normal", + "editType": "calc", + "valType": "enumerated", + "values": [ + "normal", + "small-caps", + "all-small-caps", + "all-petite-caps", + "petite-caps", + "unicase" + ] + }, + "weight": { + "description": "Sets the weight (or boldness) of the font.", + "dflt": "normal", + "editType": "calc", + "extras": [ + "normal", + "bold" + ], + "max": 1000, + "min": 1, + "valType": "integer" + } + }, + "role": "object", + "side": { + "description": "Determines the location of color bar's title with respect to the color bar. Defaults to *top* when `orientation` if *v* and defaults to *right* when `orientation` if *h*.", + "editType": "calc", + "valType": "enumerated", + "values": [ + "right", + "top", + "bottom" + ] + }, + "text": { + "description": "Sets the title of the color bar.", + "editType": "calc", + "valType": "string" + } + }, + "x": { + "description": "Sets the x position with respect to `xref` of the color bar (in plot fraction). When `xref` is *paper*, defaults to 1.02 when `orientation` is *v* and 0.5 when `orientation` is *h*. When `xref` is *container*, defaults to *1* when `orientation` is *v* and 0.5 when `orientation` is *h*. Must be between *0* and *1* if `xref` is *container* and between *-2* and *3* if `xref` is *paper*.", + "editType": "calc", + "valType": "number" + }, + "xanchor": { + "description": "Sets this color bar's horizontal position anchor. This anchor binds the `x` position to the *left*, *center* or *right* of the color bar. Defaults to *left* when `orientation` is *v* and *center* when `orientation` is *h*.", + "editType": "calc", + "valType": "enumerated", + "values": [ + "left", + "center", + "right" + ] + }, + "xpad": { + "description": "Sets the amount of padding (in px) along the x direction.", + "dflt": 10, + "editType": "calc", + "min": 0, + "valType": "number" + }, + "xref": { + "description": "Sets the container `x` refers to. *container* spans the entire `width` of the plot. *paper* refers to the width of the plotting area only.", + "dflt": "paper", + "editType": "calc", + "valType": "enumerated", + "values": [ + "container", + "paper" + ] + }, + "y": { + "description": "Sets the y position with respect to `yref` of the color bar (in plot fraction). When `yref` is *paper*, defaults to 0.5 when `orientation` is *v* and 1.02 when `orientation` is *h*. When `yref` is *container*, defaults to 0.5 when `orientation` is *v* and 1 when `orientation` is *h*. Must be between *0* and *1* if `yref` is *container* and between *-2* and *3* if `yref` is *paper*.", + "editType": "calc", + "valType": "number" + }, + "yanchor": { + "description": "Sets this color bar's vertical position anchor This anchor binds the `y` position to the *top*, *middle* or *bottom* of the color bar. Defaults to *middle* when `orientation` is *v* and *bottom* when `orientation` is *h*.", + "editType": "calc", + "valType": "enumerated", + "values": [ + "top", + "middle", + "bottom" + ] + }, + "ypad": { + "description": "Sets the amount of padding (in px) along the y direction.", + "dflt": 10, + "editType": "calc", + "min": 0, + "valType": "number" + }, + "yref": { + "description": "Sets the container `y` refers to. *container* spans the entire `height` of the plot. *paper* refers to the height of the plotting area only.", + "dflt": "paper", + "editType": "calc", + "valType": "enumerated", + "values": [ + "container", + "paper" + ] + } + }, + "colorscale": { + "description": "Sets the colorscale. Has an effect only if in `marker.color` is set to a numerical array. The colorscale must be an array containing arrays mapping a normalized value to an rgb, rgba, hex, hsl, hsv, or named color string. At minimum, a mapping for the lowest (0) and highest (1) values are required. For example, `[[0, 'rgb(0,0,255)'], [1, 'rgb(255,0,0)']]`. To control the bounds of the colorscale in color space, use `marker.cmin` and `marker.cmax`. Alternatively, `colorscale` may be a palette name string of the following list: Blackbody,Bluered,Blues,Cividis,Earth,Electric,Greens,Greys,Hot,Jet,Picnic,Portland,Rainbow,RdBu,Reds,Viridis,YlGnBu,YlOrRd.", + "dflt": null, + "editType": "calc", + "impliedEdits": { + "autocolorscale": false + }, + "valType": "colorscale" + }, + "colorsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `color`.", + "editType": "none", + "valType": "string" + }, + "editType": "calc", + "opacity": { + "arrayOk": true, + "description": "Sets the marker opacity.", + "editType": "calc", + "max": 1, + "min": 0, + "valType": "number" + }, + "opacitysrc": { + "description": "Sets the source reference on Chart Studio Cloud for `opacity`.", + "editType": "none", + "valType": "string" + }, + "reversescale": { + "description": "Reverses the color mapping if true. Has an effect only if in `marker.color` is set to a numerical array. If true, `marker.cmin` will correspond to the last color in the array and `marker.cmax` will correspond to the first color.", + "dflt": false, + "editType": "calc", + "valType": "boolean" + }, + "role": "object", + "showscale": { + "description": "Determines whether or not a colorbar is displayed for this trace. Has an effect only if in `marker.color` is set to a numerical array.", + "dflt": false, + "editType": "calc", + "valType": "boolean" + }, + "size": { + "arrayOk": true, + "description": "Sets the marker size (in px).", + "dflt": 6, + "editType": "calc", + "min": 0, + "valType": "number" + }, + "sizemin": { + "description": "Has an effect only if `marker.size` is set to a numerical array. Sets the minimum size (in px) of the rendered marker points.", + "dflt": 0, + "editType": "calc", + "min": 0, + "valType": "number" + }, + "sizemode": { + "description": "Has an effect only if `marker.size` is set to a numerical array. Sets the rule for which the data in `size` is converted to pixels.", + "dflt": "diameter", + "editType": "calc", + "valType": "enumerated", + "values": [ + "diameter", + "area" + ] + }, + "sizeref": { + "description": "Has an effect only if `marker.size` is set to a numerical array. Sets the scale factor used to determine the rendered size of marker points. Use with `sizemin` and `sizemode`.", + "dflt": 1, + "editType": "calc", + "valType": "number" + }, + "sizesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `size`.", + "editType": "none", + "valType": "string" + }, + "symbol": { + "arrayOk": true, + "description": "Sets the marker symbol. Full list: https://www.mapbox.com/maki-icons/ Note that the array `marker.color` and `marker.size` are only available for *circle* symbols.", + "dflt": "circle", + "editType": "calc", + "valType": "string" + }, + "symbolsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `symbol`.", + "editType": "none", + "valType": "string" + } + }, + "meta": { + "arrayOk": true, + "description": "Assigns extra meta information associated with this trace that can be used in various text attributes. Attributes such as trace `name`, graph, axis and colorbar `title.text`, annotation `text` `rangeselector`, `updatemenues` and `sliders` `label` text all support `meta`. To access the trace `meta` values in an attribute in the same trace, simply use `%{meta[i]}` where `i` is the index or key of the `meta` item in question. To access trace `meta` in layout attributes, use `%{data[n[.meta[i]}` where `i` is the index or key of the `meta` and `n` is the trace index.", + "editType": "plot", + "valType": "any" + }, + "metasrc": { + "description": "Sets the source reference on Chart Studio Cloud for `meta`.", + "editType": "none", + "valType": "string" + }, + "mode": { + "description": "Determines the drawing mode for this scatter trace. If the provided `mode` includes *text* then the `text` elements appear at the coordinates. Otherwise, the `text` elements appear on hover.", + "dflt": "markers", + "editType": "calc", + "extras": [ + "none" + ], + "flags": [ + "lines", + "markers", + "text" + ], + "valType": "flaglist" + }, + "name": { + "description": "Sets the trace name. The trace name appears as the legend item and on hover.", + "editType": "style", + "valType": "string" + }, + "opacity": { + "description": "Sets the opacity of the trace.", + "dflt": 1, + "editType": "style", + "max": 1, + "min": 0, + "valType": "number" + }, + "selected": { + "editType": "calc", + "marker": { + "color": { + "description": "Sets the marker color of selected points.", + "editType": "calc", + "valType": "color" + }, + "editType": "calc", + "opacity": { + "description": "Sets the marker opacity of selected points.", + "editType": "calc", + "max": 1, + "min": 0, + "valType": "number" + }, + "role": "object", + "size": { + "description": "Sets the marker size of selected points.", + "editType": "calc", + "min": 0, + "valType": "number" + } + }, + "role": "object" + }, + "selectedpoints": { + "description": "Array containing integer indices of selected points. Has an effect only for traces that support selections. Note that an empty array means an empty selection where the `unselected` are turned on for all points, whereas, any other non-array values means no selection all where the `selected` and `unselected` styles have no effect.", + "editType": "calc", + "valType": "any" + }, + "showlegend": { + "description": "Determines whether or not an item corresponding to this trace is shown in the legend.", + "dflt": true, + "editType": "style", + "valType": "boolean" + }, + "stream": { + "editType": "calc", + "maxpoints": { + "description": "Sets the maximum number of points to keep on the plots from an incoming stream. If `maxpoints` is set to *50*, only the newest 50 points will be displayed on the plot.", + "dflt": 500, + "editType": "calc", + "max": 10000, + "min": 0, + "valType": "number" + }, + "role": "object", + "token": { + "description": "The stream id number links a data trace on a plot with a stream. See https://chart-studio.plotly.com/settings for more details.", + "editType": "calc", + "noBlank": true, + "strict": true, + "valType": "string" + } + }, + "subplot": { + "description": "mapbox subplots and traces are deprecated! Please consider switching to `map` subplots and traces. Learn more at: https://plotly.com/python/maplibre-migration/ as well as https://plotly.com/javascript/maplibre-migration/ Sets a reference between this trace's data coordinates and a mapbox subplot. If *mapbox* (the default value), the data refer to `layout.mapbox`. If *mapbox2*, the data refer to `layout.mapbox2`, and so on.", + "dflt": "mapbox", + "editType": "calc", + "valType": "subplotid" + }, + "text": { + "arrayOk": true, + "description": "Sets text elements associated with each (lon,lat) pair If a single string, the same string appears over all the data points. If an array of string, the items are mapped in order to the this trace's (lon,lat) coordinates. If trace `hoverinfo` contains a *text* flag and *hovertext* is not set, these elements will be seen in the hover labels.", + "dflt": "", + "editType": "calc", + "valType": "string" + }, + "textfont": { + "color": { + "editType": "calc", + "valType": "color" + }, + "description": "Sets the icon text font (color=mapbox.layer.paint.text-color, size=mapbox.layer.layout.text-size). Has an effect only when `type` is set to *symbol*.", + "editType": "calc", + "family": { + "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", + "dflt": "Open Sans Regular, Arial Unicode MS Regular", + "editType": "calc", + "noBlank": true, + "strict": true, + "valType": "string" + }, + "role": "object", + "size": { + "editType": "calc", + "min": 1, + "valType": "number" + }, + "style": { + "description": "Sets whether a font should be styled with a normal or italic face from its family.", + "dflt": "normal", + "editType": "calc", + "valType": "enumerated", + "values": [ + "normal", + "italic" + ] + }, + "weight": { + "description": "Sets the weight (or boldness) of the font.", + "dflt": "normal", + "editType": "calc", + "extras": [ + "normal", + "bold" + ], + "max": 1000, + "min": 1, + "valType": "integer" + } + }, + "textposition": { + "arrayOk": false, + "description": "Sets the positions of the `text` elements with respects to the (x,y) coordinates.", + "dflt": "middle center", + "editType": "calc", + "valType": "enumerated", + "values": [ + "top left", + "top center", + "top right", + "middle left", + "middle center", + "middle right", + "bottom left", + "bottom center", + "bottom right" + ] + }, + "textsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `text`.", + "editType": "none", + "valType": "string" + }, + "texttemplate": { + "arrayOk": true, + "description": "Template string used for rendering the information text that appears on points. Note that this will override `textinfo`. Variables are inserted using %{variable}, for example \"y: %{y}\". Numbers are formatted using d3-format's syntax %{variable:d3-format}, for example \"Price: %{y:$.2f}\". https://github.com/d3/d3-format/tree/v1.4.5#d3-format for details on the formatting syntax. Dates are formatted using d3-time-format's syntax %{variable|d3-time-format}, for example \"Day: %{2019-01-01|%A}\". https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format for details on the date formatting syntax. Variables that can't be found will be replaced with the specifier. For example, a template of \"data: %{x}, %{y}\" will result in a value of \"data: 1, %{y}\" if x is 1 and y is missing. Variables with an undefined value will be replaced with the fallback value. All attributes that can be specified per-point (the ones that are `arrayOk: true`) are available. Finally, the template string has access to variables `lat`, `lon` and `text`.", + "dflt": "", + "editType": "calc", + "valType": "string" + }, + "texttemplatefallback": { + "description": "Fallback string that's displayed when a variable referenced in a template is missing. If the boolean value 'false' is passed in, the specifier with the missing variable will be displayed.", + "dflt": "-", + "editType": "calc", + "valType": "any" + }, + "texttemplatesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `texttemplate`.", + "editType": "none", + "valType": "string" + }, + "type": "scattermapbox", + "uid": { + "description": "Assign an id to this trace, Use this to provide object constancy between traces during animations and transitions.", + "editType": "plot", + "valType": "string" + }, + "uirevision": { + "description": "Controls persistence of some user-driven changes to the trace: `constraintrange` in `parcoords` traces, as well as some `editable: true` modifications such as `name` and `colorbar.title`. Defaults to `layout.uirevision`. Note that other user-driven trace attribute changes are controlled by `layout` attributes: `trace.visible` is controlled by `layout.legend.uirevision`, `selectedpoints` is controlled by `layout.selectionrevision`, and `colorbar.(x|y)` (accessible with `config: {editable: true}`) is controlled by `layout.editrevision`. Trace changes are tracked by `uid`, which only falls back on trace index if no `uid` is provided. So if your app can add/remove traces before the end of the `data` array, such that the same trace has a different index, you can still preserve user-driven changes if you give each trace a `uid` that stays with it as it moves.", + "editType": "none", + "valType": "any" + }, + "unselected": { + "editType": "calc", + "marker": { + "color": { + "description": "Sets the marker color of unselected points, applied only when a selection exists.", + "editType": "calc", + "valType": "color" + }, + "editType": "calc", + "opacity": { + "description": "Sets the marker opacity of unselected points, applied only when a selection exists.", + "editType": "calc", + "max": 1, + "min": 0, + "valType": "number" + }, + "role": "object", + "size": { + "description": "Sets the marker size of unselected points, applied only when a selection exists.", + "editType": "calc", + "min": 0, + "valType": "number" + } + }, + "role": "object" + }, + "visible": { + "description": "Determines whether or not this trace is visible. If *legendonly*, the trace is not drawn, but can appear as a legend item (provided that the legend itself is visible).", + "dflt": true, + "editType": "calc", + "valType": "enumerated", + "values": [ + true, + false, + "legendonly" + ] + } + }, + "categories": [ + "mapbox", + "gl", + "symbols", + "showLegend", + "scatter-like" + ], + "meta": { + "description": "*scattermapbox* trace is deprecated! Please consider switching to the *scattermap* trace type and `map` subplots. Learn more at: https://plotly.com/python/maplibre-migration/ as well as https://plotly.com/javascript/maplibre-migration/ The data visualized as scatter point, lines or marker symbols on a Mapbox GL geographic map is provided by longitude/latitude pairs in `lon` and `lat`.", + "hrName": "scatter_mapbox" + }, + "type": "scattermapbox" + }, + "scatterpolar": { + "animatable": false, + "attributes": { + "cliponaxis": { + "description": "Determines whether or not markers and text nodes are clipped about the subplot axes. To show markers and text nodes above axis lines and tick labels, make sure to set `xaxis.layer` and `yaxis.layer` to *below traces*.", + "dflt": false, + "editType": "plot", + "valType": "boolean" + }, + "connectgaps": { + "description": "Determines whether or not gaps (i.e. {nan} or missing values) in the provided data arrays are connected.", + "dflt": false, + "editType": "calc", + "valType": "boolean" + }, + "customdata": { + "description": "Assigns extra data each datum. This may be useful when listening to hover, click and selection events. Note that, *scatter* traces also appends customdata items in the markers DOM elements", + "editType": "calc", + "valType": "data_array" + }, + "customdatasrc": { + "description": "Sets the source reference on Chart Studio Cloud for `customdata`.", + "editType": "none", + "valType": "string" + }, + "dr": { + "description": "Sets the r coordinate step.", + "dflt": 1, + "editType": "calc", + "valType": "number" + }, + "dtheta": { + "description": "Sets the theta coordinate step. By default, the `dtheta` step equals the subplot's period divided by the length of the `r` coordinates.", + "editType": "calc", + "valType": "number" + }, + "fill": { + "description": "Sets the area to fill with a solid color. Use with `fillcolor` if not *none*. scatterpolar has a subset of the options available to scatter. *toself* connects the endpoints of the trace (or each segment of the trace if it has gaps) into a closed shape. *tonext* fills the space between two traces if one completely encloses the other (eg consecutive contour lines), and behaves like *toself* if there is no trace before it. *tonext* should not be used if one trace does not enclose the other.", + "dflt": "none", + "editType": "calc", + "valType": "enumerated", + "values": [ + "none", + "toself", + "tonext" + ] + }, + "fillcolor": { + "description": "Sets the fill color. Defaults to a half-transparent variant of the line color, marker color, or marker line color, whichever is available.", + "editType": "style", + "valType": "color" + }, + "hoverinfo": { + "arrayOk": true, + "description": "Determines which trace information appear on hover. If `none` or `skip` are set, no information is displayed upon hovering. But, if `none` is set, click and hover events are still fired.", + "dflt": "all", + "editType": "none", + "extras": [ + "all", + "none", + "skip" + ], + "flags": [ + "r", + "theta", + "text", + "name" + ], + "valType": "flaglist" + }, + "hoverinfosrc": { + "description": "Sets the source reference on Chart Studio Cloud for `hoverinfo`.", + "editType": "none", + "valType": "string" + }, + "hoverlabel": { + "align": { + "arrayOk": true, + "description": "Sets the horizontal alignment of the text content within hover label box. Has an effect only if the hover label text spans more two or more lines", + "dflt": "auto", + "editType": "none", + "valType": "enumerated", + "values": [ + "left", + "right", + "auto" + ] + }, + "alignsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `align`.", + "editType": "none", + "valType": "string" + }, + "bgcolor": { + "arrayOk": true, + "description": "Sets the background color of the hover labels for this trace", + "editType": "none", + "valType": "color" + }, + "bgcolorsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `bgcolor`.", + "editType": "none", + "valType": "string" + }, + "bordercolor": { + "arrayOk": true, + "description": "Sets the border color of the hover labels for this trace.", + "editType": "none", + "valType": "color" + }, + "bordercolorsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `bordercolor`.", + "editType": "none", + "valType": "string" + }, + "editType": "none", + "font": { + "color": { + "arrayOk": true, + "editType": "none", + "valType": "color" + }, + "colorsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `color`.", + "editType": "none", + "valType": "string" + }, + "description": "Sets the font used in hover labels.", + "editType": "none", + "family": { + "arrayOk": true, + "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", + "editType": "none", + "noBlank": true, + "strict": true, + "valType": "string" + }, + "familysrc": { + "description": "Sets the source reference on Chart Studio Cloud for `family`.", + "editType": "none", + "valType": "string" + }, + "lineposition": { + "arrayOk": true, + "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", + "dflt": "none", + "editType": "none", + "extras": [ + "none" + ], + "flags": [ + "under", + "over", + "through" + ], + "valType": "flaglist" + }, + "linepositionsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `lineposition`.", + "editType": "none", + "valType": "string" + }, + "role": "object", + "shadow": { + "arrayOk": true, + "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", + "dflt": "none", + "editType": "none", + "valType": "string" + }, + "shadowsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `shadow`.", + "editType": "none", + "valType": "string" + }, + "size": { + "arrayOk": true, + "editType": "none", + "min": 1, + "valType": "number" + }, + "sizesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `size`.", + "editType": "none", + "valType": "string" + }, + "style": { + "arrayOk": true, + "description": "Sets whether a font should be styled with a normal or italic face from its family.", + "dflt": "normal", + "editType": "none", + "valType": "enumerated", + "values": [ + "normal", + "italic" + ] + }, + "stylesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `style`.", + "editType": "none", + "valType": "string" + }, + "textcase": { + "arrayOk": true, + "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", + "dflt": "normal", + "editType": "none", + "valType": "enumerated", + "values": [ + "normal", + "word caps", + "upper", + "lower" + ] + }, + "textcasesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `textcase`.", + "editType": "none", + "valType": "string" + }, + "variant": { + "arrayOk": true, + "description": "Sets the variant of the font.", + "dflt": "normal", + "editType": "none", + "valType": "enumerated", + "values": [ + "normal", + "small-caps", + "all-small-caps", + "all-petite-caps", + "petite-caps", + "unicase" + ] + }, + "variantsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `variant`.", + "editType": "none", + "valType": "string" + }, + "weight": { + "arrayOk": true, + "description": "Sets the weight (or boldness) of the font.", + "dflt": "normal", + "editType": "none", + "extras": [ + "normal", + "bold" + ], + "max": 1000, + "min": 1, + "valType": "integer" + }, + "weightsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `weight`.", + "editType": "none", + "valType": "string" + } + }, + "namelength": { + "arrayOk": true, + "description": "Sets the default length (in number of characters) of the trace name in the hover labels for all traces. -1 shows the whole name regardless of length. 0-3 shows the first 0-3 characters, and an integer >3 will show the whole name if it is less than that many characters, but if it is longer, will truncate to `namelength - 3` characters and add an ellipsis.", + "dflt": 15, + "editType": "none", + "min": -1, + "valType": "integer" + }, + "namelengthsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `namelength`.", + "editType": "none", + "valType": "string" + }, + "role": "object", + "showarrow": { + "description": "Sets whether or not to show the hover label arrow/triangle pointing to the data point.", + "dflt": true, + "editType": "none", + "valType": "boolean" + } + }, + "hoveron": { + "description": "Do the hover effects highlight individual points (markers or line points) or do they highlight filled regions? If the fill is *toself* or *tonext* and there are no markers or text, then the default is *fills*, otherwise it is *points*.", + "editType": "style", + "flags": [ + "points", + "fills" + ], + "valType": "flaglist" + }, + "hovertemplate": { + "arrayOk": true, + "description": "Template string used for rendering the information that appear on hover box. Note that this will override `hoverinfo`. Variables are inserted using %{variable}, for example \"y: %{y}\" as well as %{xother}, {%_xother}, {%_xother_}, {%xother_}. When showing info for several points, *xother* will be added to those with different x positions from the first point. An underscore before or after *(x|y)other* will add a space on that side, only when this field is shown. Numbers are formatted using d3-format's syntax %{variable:d3-format}, for example \"Price: %{y:$.2f}\". https://github.com/d3/d3-format/tree/v1.4.5#d3-format for details on the formatting syntax. Dates are formatted using d3-time-format's syntax %{variable|d3-time-format}, for example \"Day: %{2019-01-01|%A}\". https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format for details on the date formatting syntax. Variables that can't be found will be replaced with the specifier. For example, a template of \"data: %{x}, %{y}\" will result in a value of \"data: 1, %{y}\" if x is 1 and y is missing. Variables with an undefined value will be replaced with the fallback value. The variables available in `hovertemplate` are the ones emitted as event data described at this link https://plotly.com/javascript/plotlyjs-events/#event-data. Additionally, all attributes that can be specified per-point (the ones that are `arrayOk: true`) are available. Anything contained in tag `` is displayed in the secondary box, for example `%{fullData.name}`. To hide the secondary box completely, use an empty tag ``.", + "dflt": "", + "editType": "none", + "valType": "string" + }, + "hovertemplatefallback": { + "description": "Fallback string that's displayed when a variable referenced in a template is missing. If the boolean value 'false' is passed in, the specifier with the missing variable will be displayed.", + "dflt": "-", + "editType": "none", + "valType": "any" + }, + "hovertemplatesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `hovertemplate`.", + "editType": "none", + "valType": "string" + }, + "hovertext": { + "arrayOk": true, + "description": "Sets hover text elements associated with each (x,y) pair. If a single string, the same string appears over all the data points. If an array of string, the items are mapped in order to the this trace's (x,y) coordinates. To be seen, trace `hoverinfo` must contain a *text* flag.", + "dflt": "", + "editType": "style", + "valType": "string" + }, + "hovertextsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `hovertext`.", + "editType": "none", + "valType": "string" + }, + "ids": { + "description": "Assigns id labels to each datum. These ids for object constancy of data points during animation. Should be an array of strings, not numbers or any other type.", + "editType": "calc", + "valType": "data_array" + }, + "idssrc": { + "description": "Sets the source reference on Chart Studio Cloud for `ids`.", + "editType": "none", + "valType": "string" + }, + "legend": { + "description": "Sets the reference to a legend to show this trace in. References to these legends are *legend*, *legend2*, *legend3*, etc. Settings for these legends are set in the layout, under `layout.legend`, `layout.legend2`, etc.", + "dflt": "legend", + "editType": "style", + "valType": "subplotid" + }, + "legendgroup": { + "description": "Sets the legend group for this trace. Traces and shapes part of the same legend group hide/show at the same time when toggling legend items.", + "dflt": "", + "editType": "style", + "valType": "string" + }, + "legendgrouptitle": { + "editType": "style", + "font": { + "color": { + "editType": "style", + "valType": "color" + }, + "description": "Sets this legend group's title font.", + "editType": "style", + "family": { + "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", + "editType": "style", + "noBlank": true, + "strict": true, + "valType": "string" + }, + "lineposition": { + "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", + "dflt": "none", + "editType": "style", + "extras": [ + "none" + ], + "flags": [ + "under", + "over", + "through" + ], + "valType": "flaglist" + }, + "role": "object", + "shadow": { + "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", + "dflt": "none", + "editType": "style", + "valType": "string" + }, + "size": { + "editType": "style", + "min": 1, + "valType": "number" + }, + "style": { + "description": "Sets whether a font should be styled with a normal or italic face from its family.", + "dflt": "normal", + "editType": "style", + "valType": "enumerated", + "values": [ + "normal", + "italic" + ] + }, + "textcase": { + "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", + "dflt": "normal", + "editType": "style", + "valType": "enumerated", + "values": [ + "normal", + "word caps", + "upper", + "lower" + ] + }, + "variant": { + "description": "Sets the variant of the font.", + "dflt": "normal", + "editType": "style", + "valType": "enumerated", + "values": [ + "normal", + "small-caps", + "all-small-caps", + "all-petite-caps", + "petite-caps", + "unicase" + ] + }, + "weight": { + "description": "Sets the weight (or boldness) of the font.", + "dflt": "normal", + "editType": "style", + "extras": [ + "normal", + "bold" + ], + "max": 1000, + "min": 1, + "valType": "integer" + } + }, + "role": "object", + "text": { + "description": "Sets the title of the legend group.", + "dflt": "", + "editType": "style", + "valType": "string" + } + }, + "legendrank": { + "description": "Sets the legend rank for this trace. Items and groups with smaller ranks are presented on top/left side while with *reversed* `legend.traceorder` they are on bottom/right side. The default legendrank is 1000, so that you can use ranks less than 1000 to place certain items before all unranked items, and ranks greater than 1000 to go after all unranked items. When having unranked or equal rank items shapes would be displayed after traces i.e. according to their order in data and layout.", + "dflt": 1000, + "editType": "style", + "valType": "number" + }, + "legendwidth": { + "description": "Sets the width (in px or fraction) of the legend for this trace.", + "editType": "style", + "min": 0, + "valType": "number" + }, + "line": { + "backoff": { + "arrayOk": true, + "description": "Sets the line back off from the end point of the nth line segment (in px). This option is useful e.g. to avoid overlap with arrowhead markers. With *auto* the lines would trim before markers if `marker.angleref` is set to *previous*.", + "dflt": "auto", + "editType": "plot", + "min": 0, + "valType": "number" + }, + "backoffsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `backoff`.", + "editType": "none", + "valType": "string" + }, + "color": { + "description": "Sets the line color.", + "editType": "style", + "valType": "color" + }, + "dash": { + "description": "Sets the dash style of lines. Set to a dash type string (*solid*, *dot*, *dash*, *longdash*, *dashdot*, or *longdashdot*) or a dash length list in px (eg *5px,10px,2px,2px*).", + "dflt": "solid", + "editType": "style", + "valType": "string", + "values": [ + "solid", + "dot", + "dash", + "longdash", + "dashdot", + "longdashdot" + ] + }, + "editType": "calc", + "role": "object", + "shape": { + "description": "Determines the line shape. With *spline* the lines are drawn using spline interpolation. The other available values correspond to step-wise line shapes.", + "dflt": "linear", + "editType": "plot", + "valType": "enumerated", + "values": [ + "linear", + "spline" + ] + }, + "smoothing": { + "description": "Has an effect only if `shape` is set to *spline* Sets the amount of smoothing. *0* corresponds to no smoothing (equivalent to a *linear* shape).", + "dflt": 1, + "editType": "plot", + "max": 1.3, + "min": 0, + "valType": "number" + }, + "width": { + "description": "Sets the line width (in px).", + "dflt": 2, + "editType": "style", + "min": 0, + "valType": "number" + } + }, + "marker": { + "angle": { + "arrayOk": true, + "description": "Sets the marker angle in respect to `angleref`.", + "dflt": 0, + "editType": "plot", + "valType": "angle" + }, + "angleref": { + "description": "Sets the reference for marker angle. With *previous*, angle 0 points along the line from the previous point to this one. With *up*, angle 0 points toward the top of the screen.", + "dflt": "up", + "editType": "plot", + "valType": "enumerated", + "values": [ + "previous", + "up" + ] + }, + "anglesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `angle`.", + "editType": "none", + "valType": "string" + }, + "autocolorscale": { + "description": "Determines whether the colorscale is a default palette (`autocolorscale: true`) or the palette determined by `marker.colorscale`. Has an effect only if in `marker.color` is set to a numerical array. In case `colorscale` is unspecified or `autocolorscale` is true, the default palette will be chosen according to whether numbers in the `color` array are all positive, all negative or mixed.", + "dflt": true, + "editType": "calc", + "impliedEdits": {}, + "valType": "boolean" + }, + "cauto": { + "description": "Determines whether or not the color domain is computed with respect to the input data (here in `marker.color`) or the bounds set in `marker.cmin` and `marker.cmax` Has an effect only if in `marker.color` is set to a numerical array. Defaults to `false` when `marker.cmin` and `marker.cmax` are set by the user.", + "dflt": true, + "editType": "calc", + "impliedEdits": {}, + "valType": "boolean" + }, + "cmax": { + "description": "Sets the upper bound of the color domain. Has an effect only if in `marker.color` is set to a numerical array. Value should have the same units as in `marker.color` and if set, `marker.cmin` must be set as well.", + "dflt": null, + "editType": "plot", + "impliedEdits": { + "cauto": false + }, + "valType": "number" + }, + "cmid": { + "description": "Sets the mid-point of the color domain by scaling `marker.cmin` and/or `marker.cmax` to be equidistant to this point. Has an effect only if in `marker.color` is set to a numerical array. Value should have the same units as in `marker.color`. Has no effect when `marker.cauto` is `false`.", + "dflt": null, + "editType": "calc", + "impliedEdits": {}, + "valType": "number" + }, + "cmin": { + "description": "Sets the lower bound of the color domain. Has an effect only if in `marker.color` is set to a numerical array. Value should have the same units as in `marker.color` and if set, `marker.cmax` must be set as well.", + "dflt": null, + "editType": "plot", + "impliedEdits": { + "cauto": false + }, + "valType": "number" + }, + "color": { + "arrayOk": true, + "description": "Sets the marker color. It accepts either a specific color or an array of numbers that are mapped to the colorscale relative to the max and min values of the array or relative to `marker.cmin` and `marker.cmax` if set.", + "editType": "style", + "valType": "color" + }, + "coloraxis": { + "description": "Sets a reference to a shared color axis. References to these shared color axes are *coloraxis*, *coloraxis2*, *coloraxis3*, etc. Settings for these shared color axes are set in the layout, under `layout.coloraxis`, `layout.coloraxis2`, etc. Note that multiple color scales can be linked to the same color axis.", + "dflt": null, + "editType": "calc", + "regex": "/^coloraxis([2-9]|[1-9][0-9]+)?$/", + "valType": "subplotid" + }, + "colorbar": { + "bgcolor": { + "description": "Sets the color of padded area.", + "dflt": "rgba(0,0,0,0)", + "editType": "colorbars", + "valType": "color" + }, + "bordercolor": { + "description": "Sets the axis line color.", + "dflt": "#444", + "editType": "colorbars", + "valType": "color" + }, + "borderwidth": { + "description": "Sets the width (in px) or the border enclosing this color bar.", + "dflt": 0, + "editType": "colorbars", + "min": 0, + "valType": "number" + }, + "dtick": { + "description": "Sets the step in-between ticks on this axis. Use with `tick0`. Must be a positive number, or special strings available to *log* and *date* axes. If the axis `type` is *log*, then ticks are set every 10^(n*dtick) where n is the tick number. For example, to set a tick mark at 1, 10, 100, 1000, ... set dtick to 1. To set tick marks at 1, 100, 10000, ... set dtick to 2. To set tick marks at 1, 5, 25, 125, 625, 3125, ... set dtick to log_10(5), or 0.69897000433. *log* has several special values; *L*, where `f` is a positive number, gives ticks linearly spaced in value (but not position). For example `tick0` = 0.1, `dtick` = *L0.5* will put ticks at 0.1, 0.6, 1.1, 1.6 etc. To show powers of 10 plus small digits between, use *D1* (all digits) or *D2* (only 2 and 5). `tick0` is ignored for *D1* and *D2*. If the axis `type` is *date*, then you must convert the time to milliseconds. For example, to set the interval between ticks to one day, set `dtick` to 86400000.0. *date* also has special values *M* gives ticks spaced by a number of months. `n` must be a positive integer. To set ticks on the 15th of every third month, set `tick0` to *2000-01-15* and `dtick` to *M3*. To set ticks every 4 years, set `dtick` to *M48*", + "editType": "colorbars", + "impliedEdits": { + "tickmode": "linear" + }, + "valType": "any" + }, + "editType": "colorbars", + "exponentformat": { + "description": "Determines a formatting rule for the tick exponents. For example, consider the number 1,000,000,000. If *none*, it appears as 1,000,000,000. If *e*, 1e+9. If *E*, 1E+9. If *power*, 1x10^9 (with 9 in a super script). If *SI*, 1G. If *B*, 1B. *SI* uses prefixes from \"femto\" f (10^-15) to \"tera\" T (10^12). *SI extended* covers instead the full SI range from \"quecto\" q (10^-30) to \"quetta\" Q (10^30). If *SI* or *SI extended* is used and the exponent is beyond the above ranges, the formatting rule will automatically be switched to the power notation.", + "dflt": "B", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "none", + "e", + "E", + "power", + "SI", + "B", + "SI extended" + ] + }, + "labelalias": { + "description": "Replacement text for specific tick or hover labels. For example using {US: 'USA', CA: 'Canada'} changes US to USA and CA to Canada. The labels we would have shown must match the keys exactly, after adding any tickprefix or ticksuffix. For negative numbers the minus sign symbol used (U+2212) is wider than the regular ascii dash. That means you need to use −1 instead of -1. labelalias can be used with any axis type, and both keys (if needed) and values (if desired) can include html-like tags or MathJax.", + "dflt": false, + "editType": "colorbars", + "valType": "any" + }, + "len": { + "description": "Sets the length of the color bar This measure excludes the padding of both ends. That is, the color bar length is this length minus the padding on both ends.", + "dflt": 1, + "editType": "colorbars", + "min": 0, + "valType": "number" + }, + "lenmode": { + "description": "Determines whether this color bar's length (i.e. the measure in the color variation direction) is set in units of plot *fraction* or in *pixels. Use `len` to set the value.", + "dflt": "fraction", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "fraction", + "pixels" + ] + }, + "minexponent": { + "description": "Hide SI prefix for 10^n if |n| is below this number. This only has an effect when `tickformat` is *SI* or *B*.", + "dflt": 3, + "editType": "colorbars", + "min": 0, + "valType": "number" + }, + "nticks": { + "description": "Specifies the maximum number of ticks for the particular axis. The actual number of ticks will be chosen automatically to be less than or equal to `nticks`. Has an effect only if `tickmode` is set to *auto*.", + "dflt": 0, + "editType": "colorbars", + "min": 0, + "valType": "integer" + }, + "orientation": { + "description": "Sets the orientation of the colorbar.", + "dflt": "v", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "h", + "v" + ] + }, + "outlinecolor": { + "description": "Sets the axis line color.", + "dflt": "#444", + "editType": "colorbars", + "valType": "color" + }, + "outlinewidth": { + "description": "Sets the width (in px) of the axis line.", + "dflt": 1, + "editType": "colorbars", + "min": 0, + "valType": "number" + }, + "role": "object", + "separatethousands": { + "description": "If \"true\", even 4-digit integers are separated", + "dflt": false, + "editType": "colorbars", + "valType": "boolean" + }, + "showexponent": { + "description": "If *all*, all exponents are shown besides their significands. If *first*, only the exponent of the first tick is shown. If *last*, only the exponent of the last tick is shown. If *none*, no exponents appear.", + "dflt": "all", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "all", + "first", + "last", + "none" + ] + }, + "showticklabels": { + "description": "Determines whether or not the tick labels are drawn.", + "dflt": true, + "editType": "colorbars", + "valType": "boolean" + }, + "showtickprefix": { + "description": "If *all*, all tick labels are displayed with a prefix. If *first*, only the first tick is displayed with a prefix. If *last*, only the last tick is displayed with a suffix. If *none*, tick prefixes are hidden.", + "dflt": "all", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "all", + "first", + "last", + "none" + ] + }, + "showticksuffix": { + "description": "Same as `showtickprefix` but for tick suffixes.", + "dflt": "all", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "all", + "first", + "last", + "none" + ] + }, + "thickness": { + "description": "Sets the thickness of the color bar This measure excludes the size of the padding, ticks and labels.", + "dflt": 30, + "editType": "colorbars", + "min": 0, + "valType": "number" + }, + "thicknessmode": { + "description": "Determines whether this color bar's thickness (i.e. the measure in the constant color direction) is set in units of plot *fraction* or in *pixels*. Use `thickness` to set the value.", + "dflt": "pixels", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "fraction", + "pixels" + ] + }, + "tick0": { + "description": "Sets the placement of the first tick on this axis. Use with `dtick`. If the axis `type` is *log*, then you must take the log of your starting tick (e.g. to set the starting tick to 100, set the `tick0` to 2) except when `dtick`=*L* (see `dtick` for more info). If the axis `type` is *date*, it should be a date string, like date data. If the axis `type` is *category*, it should be a number, using the scale where each category is assigned a serial number from zero in the order it appears.", + "editType": "colorbars", + "impliedEdits": { + "tickmode": "linear" + }, + "valType": "any" + }, + "tickangle": { + "description": "Sets the angle of the tick labels with respect to the horizontal. For example, a `tickangle` of -90 draws the tick labels vertically.", + "dflt": "auto", + "editType": "colorbars", + "valType": "angle" + }, + "tickcolor": { + "description": "Sets the tick color.", + "dflt": "#444", + "editType": "colorbars", + "valType": "color" + }, + "tickfont": { + "color": { + "editType": "colorbars", + "valType": "color" + }, + "description": "Sets the color bar's tick label font", + "editType": "colorbars", + "family": { + "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", + "editType": "colorbars", + "noBlank": true, + "strict": true, + "valType": "string" + }, + "lineposition": { + "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", + "dflt": "none", + "editType": "colorbars", + "extras": [ + "none" + ], + "flags": [ + "under", + "over", + "through" + ], + "valType": "flaglist" + }, + "role": "object", + "shadow": { + "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", + "dflt": "none", + "editType": "colorbars", + "valType": "string" + }, + "size": { + "editType": "colorbars", + "min": 1, + "valType": "number" + }, + "style": { + "description": "Sets whether a font should be styled with a normal or italic face from its family.", + "dflt": "normal", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "normal", + "italic" + ] + }, + "textcase": { + "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", + "dflt": "normal", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "normal", + "word caps", + "upper", + "lower" + ] + }, + "variant": { + "description": "Sets the variant of the font.", + "dflt": "normal", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "normal", + "small-caps", + "all-small-caps", + "all-petite-caps", + "petite-caps", + "unicase" + ] + }, + "weight": { + "description": "Sets the weight (or boldness) of the font.", + "dflt": "normal", + "editType": "colorbars", + "extras": [ + "normal", + "bold" + ], + "max": 1000, + "min": 1, + "valType": "integer" + } + }, + "tickformat": { + "description": "Sets the tick label formatting rule using d3 formatting mini-languages which are very similar to those in Python. For numbers, see: https://github.com/d3/d3-format/tree/v1.4.5#d3-format. And for dates see: https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format. We add two items to d3's date formatter: *%h* for half of the year as a decimal number as well as *%{n}f* for fractional seconds with n digits. For example, *2016-10-13 09:15:23.456* with tickformat *%H~%M~%S.%2f* would display *09~15~23.46*", + "dflt": "", + "editType": "colorbars", + "valType": "string" + }, + "tickformatstops": { + "items": { + "tickformatstop": { + "dtickrange": { + "description": "range [*min*, *max*], where *min*, *max* - dtick values which describe some zoom level, it is possible to omit *min* or *max* value by passing *null*", + "editType": "colorbars", + "items": [ + { + "editType": "colorbars", + "valType": "any" + }, + { + "editType": "colorbars", + "valType": "any" + } + ], + "valType": "info_array" + }, + "editType": "colorbars", + "enabled": { + "description": "Determines whether or not this stop is used. If `false`, this stop is ignored even within its `dtickrange`.", + "dflt": true, + "editType": "colorbars", + "valType": "boolean" + }, + "name": { + "description": "When used in a template, named items are created in the output figure in addition to any items the figure already has in this array. You can modify these items in the output figure by making your own item with `templateitemname` matching this `name` alongside your modifications (including `visible: false` or `enabled: false` to hide it). Has no effect outside of a template.", + "editType": "colorbars", + "valType": "string" + }, + "role": "object", + "templateitemname": { + "description": "Used to refer to a named item in this array in the template. Named items from the template will be created even without a matching item in the input figure, but you can modify one by making an item with `templateitemname` matching its `name`, alongside your modifications (including `visible: false` or `enabled: false` to hide it). If there is no template or no matching item, this item will be hidden unless you explicitly show it with `visible: true`.", + "editType": "colorbars", + "valType": "string" + }, + "value": { + "description": "string - dtickformat for described zoom level, the same as *tickformat*", + "dflt": "", + "editType": "colorbars", + "valType": "string" + } + } + }, + "role": "object" + }, + "ticklabeloverflow": { + "description": "Determines how we handle tick labels that would overflow either the graph div or the domain of the axis. The default value for inside tick labels is *hide past domain*. In other cases the default is *hide past div*.", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "allow", + "hide past div", + "hide past domain" + ] + }, + "ticklabelposition": { + "description": "Determines where tick labels are drawn relative to the ticks. Left and right options are used when `orientation` is *h*, top and bottom when `orientation` is *v*.", + "dflt": "outside", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "outside", + "inside", + "outside top", + "inside top", + "outside left", + "inside left", + "outside right", + "inside right", + "outside bottom", + "inside bottom" + ] + }, + "ticklabelstep": { + "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", + "dflt": 1, + "editType": "colorbars", + "min": 1, + "valType": "integer" + }, + "ticklen": { + "description": "Sets the tick length (in px).", + "dflt": 5, + "editType": "colorbars", + "min": 0, + "valType": "number" + }, + "tickmode": { + "description": "Sets the tick mode for this axis. If *auto*, the number of ticks is set via `nticks`. If *linear*, the placement of the ticks is determined by a starting position `tick0` and a tick step `dtick` (*linear* is the default value if `tick0` and `dtick` are provided). If *array*, the placement of the ticks is set via `tickvals` and the tick text is `ticktext`. (*array* is the default value if `tickvals` is provided).", + "editType": "colorbars", + "impliedEdits": {}, + "valType": "enumerated", + "values": [ + "auto", + "linear", + "array" + ] + }, + "tickprefix": { + "description": "Sets a tick label prefix.", + "dflt": "", + "editType": "colorbars", + "valType": "string" + }, + "ticks": { + "description": "Determines whether ticks are drawn or not. If **, this axis' ticks are not drawn. If *outside* (*inside*), this axis' are drawn outside (inside) the axis lines.", + "dflt": "", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "outside", + "inside", + "" + ] + }, + "ticksuffix": { + "description": "Sets a tick label suffix.", + "dflt": "", + "editType": "colorbars", + "valType": "string" + }, + "ticktext": { + "description": "Sets the text displayed at the ticks position via `tickvals`. Only has an effect if `tickmode` is set to *array*. Used with `tickvals`.", + "editType": "colorbars", + "valType": "data_array" + }, + "ticktextsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `ticktext`.", + "editType": "none", + "valType": "string" + }, + "tickvals": { + "description": "Sets the values at which ticks on this axis appear. Only has an effect if `tickmode` is set to *array*. Used with `ticktext`.", + "editType": "colorbars", + "valType": "data_array" + }, + "tickvalssrc": { + "description": "Sets the source reference on Chart Studio Cloud for `tickvals`.", + "editType": "none", + "valType": "string" + }, + "tickwidth": { + "description": "Sets the tick width (in px).", + "dflt": 1, + "editType": "colorbars", + "min": 0, + "valType": "number" + }, + "title": { + "editType": "colorbars", + "font": { + "color": { + "editType": "colorbars", + "valType": "color" + }, + "description": "Sets this color bar's title font.", + "editType": "colorbars", + "family": { + "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", + "editType": "colorbars", + "noBlank": true, + "strict": true, + "valType": "string" + }, + "lineposition": { + "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", + "dflt": "none", + "editType": "colorbars", + "extras": [ + "none" + ], + "flags": [ + "under", + "over", + "through" + ], + "valType": "flaglist" + }, + "role": "object", + "shadow": { + "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", + "dflt": "none", + "editType": "colorbars", + "valType": "string" + }, + "size": { + "editType": "colorbars", + "min": 1, + "valType": "number" + }, + "style": { + "description": "Sets whether a font should be styled with a normal or italic face from its family.", + "dflt": "normal", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "normal", + "italic" + ] + }, + "textcase": { + "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", + "dflt": "normal", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "normal", + "word caps", + "upper", + "lower" + ] + }, + "variant": { + "description": "Sets the variant of the font.", + "dflt": "normal", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "normal", + "small-caps", + "all-small-caps", + "all-petite-caps", + "petite-caps", + "unicase" + ] + }, + "weight": { + "description": "Sets the weight (or boldness) of the font.", + "dflt": "normal", + "editType": "colorbars", + "extras": [ + "normal", + "bold" + ], + "max": 1000, + "min": 1, + "valType": "integer" + } + }, + "role": "object", + "side": { + "description": "Determines the location of color bar's title with respect to the color bar. Defaults to *top* when `orientation` if *v* and defaults to *right* when `orientation` if *h*.", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "right", + "top", + "bottom" + ] + }, + "text": { + "description": "Sets the title of the color bar.", + "editType": "colorbars", + "valType": "string" + } + }, + "x": { + "description": "Sets the x position with respect to `xref` of the color bar (in plot fraction). When `xref` is *paper*, defaults to 1.02 when `orientation` is *v* and 0.5 when `orientation` is *h*. When `xref` is *container*, defaults to *1* when `orientation` is *v* and 0.5 when `orientation` is *h*. Must be between *0* and *1* if `xref` is *container* and between *-2* and *3* if `xref` is *paper*.", + "editType": "colorbars", + "valType": "number" + }, + "xanchor": { + "description": "Sets this color bar's horizontal position anchor. This anchor binds the `x` position to the *left*, *center* or *right* of the color bar. Defaults to *left* when `orientation` is *v* and *center* when `orientation` is *h*.", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "left", + "center", + "right" + ] + }, + "xpad": { + "description": "Sets the amount of padding (in px) along the x direction.", + "dflt": 10, + "editType": "colorbars", + "min": 0, + "valType": "number" + }, + "xref": { + "description": "Sets the container `x` refers to. *container* spans the entire `width` of the plot. *paper* refers to the width of the plotting area only.", + "dflt": "paper", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "container", + "paper" + ] + }, + "y": { + "description": "Sets the y position with respect to `yref` of the color bar (in plot fraction). When `yref` is *paper*, defaults to 0.5 when `orientation` is *v* and 1.02 when `orientation` is *h*. When `yref` is *container*, defaults to 0.5 when `orientation` is *v* and 1 when `orientation` is *h*. Must be between *0* and *1* if `yref` is *container* and between *-2* and *3* if `yref` is *paper*.", + "editType": "colorbars", + "valType": "number" + }, + "yanchor": { + "description": "Sets this color bar's vertical position anchor This anchor binds the `y` position to the *top*, *middle* or *bottom* of the color bar. Defaults to *middle* when `orientation` is *v* and *bottom* when `orientation` is *h*.", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "top", + "middle", + "bottom" + ] + }, + "ypad": { + "description": "Sets the amount of padding (in px) along the y direction.", + "dflt": 10, + "editType": "colorbars", + "min": 0, + "valType": "number" + }, + "yref": { + "description": "Sets the container `y` refers to. *container* spans the entire `height` of the plot. *paper* refers to the height of the plotting area only.", + "dflt": "paper", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "container", + "paper" + ] + } + }, + "colorscale": { + "description": "Sets the colorscale. Has an effect only if in `marker.color` is set to a numerical array. The colorscale must be an array containing arrays mapping a normalized value to an rgb, rgba, hex, hsl, hsv, or named color string. At minimum, a mapping for the lowest (0) and highest (1) values are required. For example, `[[0, 'rgb(0,0,255)'], [1, 'rgb(255,0,0)']]`. To control the bounds of the colorscale in color space, use `marker.cmin` and `marker.cmax`. Alternatively, `colorscale` may be a palette name string of the following list: Blackbody,Bluered,Blues,Cividis,Earth,Electric,Greens,Greys,Hot,Jet,Picnic,Portland,Rainbow,RdBu,Reds,Viridis,YlGnBu,YlOrRd.", + "dflt": null, + "editType": "calc", + "impliedEdits": { + "autocolorscale": false + }, + "valType": "colorscale" + }, + "colorsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `color`.", + "editType": "none", + "valType": "string" + }, + "editType": "calc", + "gradient": { + "color": { + "arrayOk": true, + "description": "Sets the final color of the gradient fill: the center color for radial, the right for horizontal, or the bottom for vertical.", + "editType": "calc", + "valType": "color" + }, + "colorsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `color`.", + "editType": "none", + "valType": "string" + }, + "editType": "calc", + "role": "object", + "type": { + "arrayOk": true, + "description": "Sets the type of gradient used to fill the markers", + "dflt": "none", + "editType": "calc", + "valType": "enumerated", + "values": [ + "radial", + "horizontal", + "vertical", + "none" + ] + }, + "typesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `type`.", + "editType": "none", + "valType": "string" + } + }, + "line": { + "autocolorscale": { + "description": "Determines whether the colorscale is a default palette (`autocolorscale: true`) or the palette determined by `marker.line.colorscale`. Has an effect only if in `marker.line.color` is set to a numerical array. In case `colorscale` is unspecified or `autocolorscale` is true, the default palette will be chosen according to whether numbers in the `color` array are all positive, all negative or mixed.", + "dflt": true, + "editType": "calc", + "impliedEdits": {}, + "valType": "boolean" + }, + "cauto": { + "description": "Determines whether or not the color domain is computed with respect to the input data (here in `marker.line.color`) or the bounds set in `marker.line.cmin` and `marker.line.cmax` Has an effect only if in `marker.line.color` is set to a numerical array. Defaults to `false` when `marker.line.cmin` and `marker.line.cmax` are set by the user.", + "dflt": true, + "editType": "calc", + "impliedEdits": {}, + "valType": "boolean" + }, + "cmax": { + "description": "Sets the upper bound of the color domain. Has an effect only if in `marker.line.color` is set to a numerical array. Value should have the same units as in `marker.line.color` and if set, `marker.line.cmin` must be set as well.", + "dflt": null, + "editType": "plot", + "impliedEdits": { + "cauto": false + }, + "valType": "number" + }, + "cmid": { + "description": "Sets the mid-point of the color domain by scaling `marker.line.cmin` and/or `marker.line.cmax` to be equidistant to this point. Has an effect only if in `marker.line.color` is set to a numerical array. Value should have the same units as in `marker.line.color`. Has no effect when `marker.line.cauto` is `false`.", + "dflt": null, + "editType": "calc", + "impliedEdits": {}, + "valType": "number" + }, + "cmin": { + "description": "Sets the lower bound of the color domain. Has an effect only if in `marker.line.color` is set to a numerical array. Value should have the same units as in `marker.line.color` and if set, `marker.line.cmax` must be set as well.", + "dflt": null, + "editType": "plot", + "impliedEdits": { + "cauto": false + }, + "valType": "number" + }, + "color": { + "arrayOk": true, + "description": "Sets the marker.line color. It accepts either a specific color or an array of numbers that are mapped to the colorscale relative to the max and min values of the array or relative to `marker.line.cmin` and `marker.line.cmax` if set.", + "editType": "style", + "valType": "color" + }, + "coloraxis": { + "description": "Sets a reference to a shared color axis. References to these shared color axes are *coloraxis*, *coloraxis2*, *coloraxis3*, etc. Settings for these shared color axes are set in the layout, under `layout.coloraxis`, `layout.coloraxis2`, etc. Note that multiple color scales can be linked to the same color axis.", + "dflt": null, + "editType": "calc", + "regex": "/^coloraxis([2-9]|[1-9][0-9]+)?$/", + "valType": "subplotid" + }, + "colorscale": { + "description": "Sets the colorscale. Has an effect only if in `marker.line.color` is set to a numerical array. The colorscale must be an array containing arrays mapping a normalized value to an rgb, rgba, hex, hsl, hsv, or named color string. At minimum, a mapping for the lowest (0) and highest (1) values are required. For example, `[[0, 'rgb(0,0,255)'], [1, 'rgb(255,0,0)']]`. To control the bounds of the colorscale in color space, use `marker.line.cmin` and `marker.line.cmax`. Alternatively, `colorscale` may be a palette name string of the following list: Blackbody,Bluered,Blues,Cividis,Earth,Electric,Greens,Greys,Hot,Jet,Picnic,Portland,Rainbow,RdBu,Reds,Viridis,YlGnBu,YlOrRd.", + "dflt": null, + "editType": "calc", + "impliedEdits": { + "autocolorscale": false + }, + "valType": "colorscale" + }, + "colorsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `color`.", + "editType": "none", + "valType": "string" + }, + "editType": "calc", + "reversescale": { + "description": "Reverses the color mapping if true. Has an effect only if in `marker.line.color` is set to a numerical array. If true, `marker.line.cmin` will correspond to the last color in the array and `marker.line.cmax` will correspond to the first color.", + "dflt": false, + "editType": "plot", + "valType": "boolean" + }, + "role": "object", + "width": { + "arrayOk": true, + "description": "Sets the width (in px) of the lines bounding the marker points.", + "editType": "style", + "min": 0, + "valType": "number" + }, + "widthsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `width`.", + "editType": "none", + "valType": "string" + } + }, + "maxdisplayed": { + "description": "Sets a maximum number of points to be drawn on the graph. *0* corresponds to no limit.", + "dflt": 0, + "editType": "plot", + "min": 0, + "valType": "number" + }, + "opacity": { + "arrayOk": true, + "description": "Sets the marker opacity.", + "editType": "style", + "max": 1, + "min": 0, + "valType": "number" + }, + "opacitysrc": { + "description": "Sets the source reference on Chart Studio Cloud for `opacity`.", + "editType": "none", + "valType": "string" + }, + "reversescale": { + "description": "Reverses the color mapping if true. Has an effect only if in `marker.color` is set to a numerical array. If true, `marker.cmin` will correspond to the last color in the array and `marker.cmax` will correspond to the first color.", + "dflt": false, + "editType": "plot", + "valType": "boolean" + }, + "role": "object", + "showscale": { + "description": "Determines whether or not a colorbar is displayed for this trace. Has an effect only if in `marker.color` is set to a numerical array.", + "dflt": false, + "editType": "calc", + "valType": "boolean" + }, + "size": { + "arrayOk": true, + "description": "Sets the marker size (in px).", + "dflt": 6, + "editType": "calc", + "min": 0, + "valType": "number" + }, + "sizemin": { + "description": "Has an effect only if `marker.size` is set to a numerical array. Sets the minimum size (in px) of the rendered marker points.", + "dflt": 0, + "editType": "calc", + "min": 0, + "valType": "number" + }, + "sizemode": { + "description": "Has an effect only if `marker.size` is set to a numerical array. Sets the rule for which the data in `size` is converted to pixels.", + "dflt": "diameter", + "editType": "calc", + "valType": "enumerated", + "values": [ + "diameter", + "area" + ] + }, + "sizeref": { + "description": "Has an effect only if `marker.size` is set to a numerical array. Sets the scale factor used to determine the rendered size of marker points. Use with `sizemin` and `sizemode`.", + "dflt": 1, + "editType": "calc", + "valType": "number" + }, + "sizesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `size`.", + "editType": "none", + "valType": "string" + }, + "standoff": { + "arrayOk": true, + "description": "Moves the marker away from the data point in the direction of `angle` (in px). This can be useful for example if you have another marker at this location and you want to point an arrowhead marker at it.", + "dflt": 0, + "editType": "plot", + "min": 0, + "valType": "number" + }, + "standoffsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `standoff`.", + "editType": "none", + "valType": "string" + }, + "symbol": { + "arrayOk": true, + "description": "Sets the marker symbol type. Adding 100 is equivalent to appending *-open* to a symbol name. Adding 200 is equivalent to appending *-dot* to a symbol name. Adding 300 is equivalent to appending *-open-dot* or *dot-open* to a symbol name.", + "dflt": "circle", + "editType": "style", + "valType": "enumerated", + "values": [ + 0, + "0", + "circle", + 100, + "100", + "circle-open", + 200, + "200", + "circle-dot", + 300, + "300", + "circle-open-dot", + 1, + "1", + "square", + 101, + "101", + "square-open", + 201, + "201", + "square-dot", + 301, + "301", + "square-open-dot", + 2, + "2", + "diamond", + 102, + "102", + "diamond-open", + 202, + "202", + "diamond-dot", + 302, + "302", + "diamond-open-dot", + 3, + "3", + "cross", + 103, + "103", + "cross-open", + 203, + "203", + "cross-dot", + 303, + "303", + "cross-open-dot", + 4, + "4", + "x", + 104, + "104", + "x-open", + 204, + "204", + "x-dot", + 304, + "304", + "x-open-dot", + 5, + "5", + "triangle-up", + 105, + "105", + "triangle-up-open", + 205, + "205", + "triangle-up-dot", + 305, + "305", + "triangle-up-open-dot", + 6, + "6", + "triangle-down", + 106, + "106", + "triangle-down-open", + 206, + "206", + "triangle-down-dot", + 306, + "306", + "triangle-down-open-dot", + 7, + "7", + "triangle-left", + 107, + "107", + "triangle-left-open", + 207, + "207", + "triangle-left-dot", + 307, + "307", + "triangle-left-open-dot", + 8, + "8", + "triangle-right", + 108, + "108", + "triangle-right-open", + 208, + "208", + "triangle-right-dot", + 308, + "308", + "triangle-right-open-dot", + 9, + "9", + "triangle-ne", + 109, + "109", + "triangle-ne-open", + 209, + "209", + "triangle-ne-dot", + 309, + "309", + "triangle-ne-open-dot", + 10, + "10", + "triangle-se", + 110, + "110", + "triangle-se-open", + 210, + "210", + "triangle-se-dot", + 310, + "310", + "triangle-se-open-dot", + 11, + "11", + "triangle-sw", + 111, + "111", + "triangle-sw-open", + 211, + "211", + "triangle-sw-dot", + 311, + "311", + "triangle-sw-open-dot", + 12, + "12", + "triangle-nw", + 112, + "112", + "triangle-nw-open", + 212, + "212", + "triangle-nw-dot", + 312, + "312", + "triangle-nw-open-dot", + 13, + "13", + "pentagon", + 113, + "113", + "pentagon-open", + 213, + "213", + "pentagon-dot", + 313, + "313", + "pentagon-open-dot", + 14, + "14", + "hexagon", + 114, + "114", + "hexagon-open", + 214, + "214", + "hexagon-dot", + 314, + "314", + "hexagon-open-dot", + 15, + "15", + "hexagon2", + 115, + "115", + "hexagon2-open", + 215, + "215", + "hexagon2-dot", + 315, + "315", + "hexagon2-open-dot", + 16, + "16", + "octagon", + 116, + "116", + "octagon-open", + 216, + "216", + "octagon-dot", + 316, + "316", + "octagon-open-dot", + 17, + "17", + "star", + 117, + "117", + "star-open", + 217, + "217", + "star-dot", + 317, + "317", + "star-open-dot", + 18, + "18", + "hexagram", + 118, + "118", + "hexagram-open", + 218, + "218", + "hexagram-dot", + 318, + "318", + "hexagram-open-dot", + 19, + "19", + "star-triangle-up", + 119, + "119", + "star-triangle-up-open", + 219, + "219", + "star-triangle-up-dot", + 319, + "319", + "star-triangle-up-open-dot", + 20, + "20", + "star-triangle-down", + 120, + "120", + "star-triangle-down-open", + 220, + "220", + "star-triangle-down-dot", + 320, + "320", + "star-triangle-down-open-dot", + 21, + "21", + "star-square", + 121, + "121", + "star-square-open", + 221, + "221", + "star-square-dot", + 321, + "321", + "star-square-open-dot", + 22, + "22", + "star-diamond", + 122, + "122", + "star-diamond-open", + 222, + "222", + "star-diamond-dot", + 322, + "322", + "star-diamond-open-dot", + 23, + "23", + "diamond-tall", + 123, + "123", + "diamond-tall-open", + 223, + "223", + "diamond-tall-dot", + 323, + "323", + "diamond-tall-open-dot", + 24, + "24", + "diamond-wide", + 124, + "124", + "diamond-wide-open", + 224, + "224", + "diamond-wide-dot", + 324, + "324", + "diamond-wide-open-dot", + 25, + "25", + "hourglass", + 125, + "125", + "hourglass-open", + 26, + "26", + "bowtie", + 126, + "126", + "bowtie-open", + 27, + "27", + "circle-cross", + 127, + "127", + "circle-cross-open", + 28, + "28", + "circle-x", + 128, + "128", + "circle-x-open", + 29, + "29", + "square-cross", + 129, + "129", + "square-cross-open", + 30, + "30", + "square-x", + 130, + "130", + "square-x-open", + 31, + "31", + "diamond-cross", + 131, + "131", + "diamond-cross-open", + 32, + "32", + "diamond-x", + 132, + "132", + "diamond-x-open", + 33, + "33", + "cross-thin", + 133, + "133", + "cross-thin-open", + 34, + "34", + "x-thin", + 134, + "134", + "x-thin-open", + 35, + "35", + "asterisk", + 135, + "135", + "asterisk-open", + 36, + "36", + "hash", + 136, + "136", + "hash-open", + 236, + "236", + "hash-dot", + 336, + "336", + "hash-open-dot", + 37, + "37", + "y-up", + 137, + "137", + "y-up-open", + 38, + "38", + "y-down", + 138, + "138", + "y-down-open", + 39, + "39", + "y-left", + 139, + "139", + "y-left-open", + 40, + "40", + "y-right", + 140, + "140", + "y-right-open", + 41, + "41", + "line-ew", + 141, + "141", + "line-ew-open", + 42, + "42", + "line-ns", + 142, + "142", + "line-ns-open", + 43, + "43", + "line-ne", + 143, + "143", + "line-ne-open", + 44, + "44", + "line-nw", + 144, + "144", + "line-nw-open", + 45, + "45", + "arrow-up", + 145, + "145", + "arrow-up-open", + 46, + "46", + "arrow-down", + 146, + "146", + "arrow-down-open", + 47, + "47", + "arrow-left", + 147, + "147", + "arrow-left-open", + 48, + "48", + "arrow-right", + 148, + "148", + "arrow-right-open", + 49, + "49", + "arrow-bar-up", + 149, + "149", + "arrow-bar-up-open", + 50, + "50", + "arrow-bar-down", + 150, + "150", + "arrow-bar-down-open", + 51, + "51", + "arrow-bar-left", + 151, + "151", + "arrow-bar-left-open", + 52, + "52", + "arrow-bar-right", + 152, + "152", + "arrow-bar-right-open", + 53, + "53", + "arrow", + 153, + "153", + "arrow-open", + 54, + "54", + "arrow-wide", + 154, + "154", + "arrow-wide-open" + ] + }, + "symbolsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `symbol`.", + "editType": "none", + "valType": "string" + } + }, + "meta": { + "arrayOk": true, + "description": "Assigns extra meta information associated with this trace that can be used in various text attributes. Attributes such as trace `name`, graph, axis and colorbar `title.text`, annotation `text` `rangeselector`, `updatemenues` and `sliders` `label` text all support `meta`. To access the trace `meta` values in an attribute in the same trace, simply use `%{meta[i]}` where `i` is the index or key of the `meta` item in question. To access trace `meta` in layout attributes, use `%{data[n[.meta[i]}` where `i` is the index or key of the `meta` and `n` is the trace index.", + "editType": "plot", + "valType": "any" + }, + "metasrc": { + "description": "Sets the source reference on Chart Studio Cloud for `meta`.", + "editType": "none", + "valType": "string" + }, + "mode": { + "description": "Determines the drawing mode for this scatter trace. If the provided `mode` includes *text* then the `text` elements appear at the coordinates. Otherwise, the `text` elements appear on hover. If there are less than 20 points and the trace is not stacked then the default is *lines+markers*. Otherwise, *lines*.", + "editType": "calc", + "extras": [ + "none" + ], + "flags": [ + "lines", + "markers", + "text" + ], + "valType": "flaglist" + }, + "name": { + "description": "Sets the trace name. The trace name appears as the legend item and on hover.", + "editType": "style", + "valType": "string" + }, + "opacity": { + "description": "Sets the opacity of the trace.", + "dflt": 1, + "editType": "style", + "max": 1, + "min": 0, + "valType": "number" + }, + "r": { + "description": "Sets the radial coordinates", + "editType": "calc+clearAxisTypes", + "valType": "data_array" + }, + "r0": { + "description": "Alternate to `r`. Builds a linear space of r coordinates. Use with `dr` where `r0` is the starting coordinate and `dr` the step.", + "dflt": 0, + "editType": "calc+clearAxisTypes", + "valType": "any" + }, + "rsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `r`.", + "editType": "none", + "valType": "string" + }, + "selected": { + "editType": "style", + "marker": { + "color": { + "description": "Sets the marker color of selected points.", + "editType": "style", + "valType": "color" + }, + "editType": "style", + "opacity": { + "description": "Sets the marker opacity of selected points.", + "editType": "style", + "max": 1, + "min": 0, + "valType": "number" + }, + "role": "object", + "size": { + "description": "Sets the marker size of selected points.", + "editType": "style", + "min": 0, + "valType": "number" + } + }, + "role": "object", + "textfont": { + "color": { + "description": "Sets the text font color of selected points.", + "editType": "style", + "valType": "color" + }, + "editType": "style", + "role": "object" + } + }, + "selectedpoints": { + "description": "Array containing integer indices of selected points. Has an effect only for traces that support selections. Note that an empty array means an empty selection where the `unselected` are turned on for all points, whereas, any other non-array values means no selection all where the `selected` and `unselected` styles have no effect.", + "editType": "calc", + "valType": "any" + }, + "showlegend": { + "description": "Determines whether or not an item corresponding to this trace is shown in the legend.", + "dflt": true, + "editType": "style", + "valType": "boolean" + }, + "stream": { + "editType": "calc", + "maxpoints": { + "description": "Sets the maximum number of points to keep on the plots from an incoming stream. If `maxpoints` is set to *50*, only the newest 50 points will be displayed on the plot.", + "dflt": 500, + "editType": "calc", + "max": 10000, + "min": 0, + "valType": "number" + }, + "role": "object", + "token": { + "description": "The stream id number links a data trace on a plot with a stream. See https://chart-studio.plotly.com/settings for more details.", + "editType": "calc", + "noBlank": true, + "strict": true, + "valType": "string" + } + }, + "subplot": { + "description": "Sets a reference between this trace's data coordinates and a polar subplot. If *polar* (the default value), the data refer to `layout.polar`. If *polar2*, the data refer to `layout.polar2`, and so on.", + "dflt": "polar", + "editType": "calc", + "valType": "subplotid" + }, + "text": { + "arrayOk": true, + "description": "Sets text elements associated with each (x,y) pair. If a single string, the same string appears over all the data points. If an array of string, the items are mapped in order to the this trace's (x,y) coordinates. If trace `hoverinfo` contains a *text* flag and *hovertext* is not set, these elements will be seen in the hover labels.", + "dflt": "", + "editType": "calc", + "valType": "string" + }, + "textfont": { + "color": { + "arrayOk": true, + "editType": "style", + "valType": "color" + }, + "colorsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `color`.", + "editType": "none", + "valType": "string" + }, + "description": "Sets the text font.", + "editType": "calc", + "family": { + "arrayOk": true, + "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", + "editType": "calc", + "noBlank": true, + "strict": true, + "valType": "string" + }, + "familysrc": { + "description": "Sets the source reference on Chart Studio Cloud for `family`.", + "editType": "none", + "valType": "string" + }, + "lineposition": { + "arrayOk": true, + "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", + "dflt": "none", + "editType": "calc", + "extras": [ + "none" + ], + "flags": [ + "under", + "over", + "through" + ], + "valType": "flaglist" + }, + "linepositionsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `lineposition`.", + "editType": "none", + "valType": "string" + }, + "role": "object", + "shadow": { + "arrayOk": true, + "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", + "dflt": "none", + "editType": "calc", + "valType": "string" + }, + "shadowsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `shadow`.", + "editType": "none", + "valType": "string" + }, + "size": { + "arrayOk": true, + "editType": "calc", + "min": 1, + "valType": "number" + }, + "sizesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `size`.", + "editType": "none", + "valType": "string" + }, + "style": { + "arrayOk": true, + "description": "Sets whether a font should be styled with a normal or italic face from its family.", + "dflt": "normal", + "editType": "calc", + "valType": "enumerated", + "values": [ + "normal", + "italic" + ] + }, + "stylesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `style`.", + "editType": "none", + "valType": "string" + }, + "textcase": { + "arrayOk": true, + "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", + "dflt": "normal", + "editType": "calc", + "valType": "enumerated", + "values": [ + "normal", + "word caps", + "upper", + "lower" + ] + }, + "textcasesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `textcase`.", + "editType": "none", + "valType": "string" + }, + "variant": { + "arrayOk": true, + "description": "Sets the variant of the font.", + "dflt": "normal", + "editType": "calc", + "valType": "enumerated", + "values": [ + "normal", + "small-caps", + "all-small-caps", + "all-petite-caps", + "petite-caps", + "unicase" + ] + }, + "variantsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `variant`.", + "editType": "none", + "valType": "string" + }, + "weight": { + "arrayOk": true, + "description": "Sets the weight (or boldness) of the font.", + "dflt": "normal", + "editType": "calc", + "extras": [ + "normal", + "bold" + ], + "max": 1000, + "min": 1, + "valType": "integer" + }, + "weightsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `weight`.", + "editType": "none", + "valType": "string" + } + }, + "textposition": { + "arrayOk": true, + "description": "Sets the positions of the `text` elements with respects to the (x,y) coordinates.", + "dflt": "middle center", + "editType": "calc", + "valType": "enumerated", + "values": [ + "top left", + "top center", + "top right", + "middle left", + "middle center", + "middle right", + "bottom left", + "bottom center", + "bottom right" + ] + }, + "textpositionsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `textposition`.", + "editType": "none", + "valType": "string" + }, + "textsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `text`.", + "editType": "none", + "valType": "string" + }, + "texttemplate": { + "arrayOk": true, + "description": "Template string used for rendering the information text that appears on points. Note that this will override `textinfo`. Variables are inserted using %{variable}, for example \"y: %{y}\". Numbers are formatted using d3-format's syntax %{variable:d3-format}, for example \"Price: %{y:$.2f}\". https://github.com/d3/d3-format/tree/v1.4.5#d3-format for details on the formatting syntax. Dates are formatted using d3-time-format's syntax %{variable|d3-time-format}, for example \"Day: %{2019-01-01|%A}\". https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format for details on the date formatting syntax. Variables that can't be found will be replaced with the specifier. For example, a template of \"data: %{x}, %{y}\" will result in a value of \"data: 1, %{y}\" if x is 1 and y is missing. Variables with an undefined value will be replaced with the fallback value. All attributes that can be specified per-point (the ones that are `arrayOk: true`) are available. Finally, the template string has access to variables `r`, `theta` and `text`.", + "dflt": "", + "editType": "plot", + "valType": "string" + }, + "texttemplatefallback": { + "description": "Fallback string that's displayed when a variable referenced in a template is missing. If the boolean value 'false' is passed in, the specifier with the missing variable will be displayed.", + "dflt": "-", + "editType": "plot", + "valType": "any" + }, + "texttemplatesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `texttemplate`.", + "editType": "none", + "valType": "string" + }, + "theta": { + "description": "Sets the angular coordinates", + "editType": "calc+clearAxisTypes", + "valType": "data_array" + }, + "theta0": { + "description": "Alternate to `theta`. Builds a linear space of theta coordinates. Use with `dtheta` where `theta0` is the starting coordinate and `dtheta` the step.", + "dflt": 0, + "editType": "calc+clearAxisTypes", + "valType": "any" + }, + "thetasrc": { + "description": "Sets the source reference on Chart Studio Cloud for `theta`.", + "editType": "none", + "valType": "string" + }, + "thetaunit": { + "description": "Sets the unit of input *theta* values. Has an effect only when on *linear* angular axes.", + "dflt": "degrees", + "editType": "calc+clearAxisTypes", + "valType": "enumerated", + "values": [ + "radians", + "degrees", + "gradians" + ] + }, + "type": "scatterpolar", + "uid": { + "description": "Assign an id to this trace, Use this to provide object constancy between traces during animations and transitions.", + "editType": "plot", + "valType": "string" + }, + "uirevision": { + "description": "Controls persistence of some user-driven changes to the trace: `constraintrange` in `parcoords` traces, as well as some `editable: true` modifications such as `name` and `colorbar.title`. Defaults to `layout.uirevision`. Note that other user-driven trace attribute changes are controlled by `layout` attributes: `trace.visible` is controlled by `layout.legend.uirevision`, `selectedpoints` is controlled by `layout.selectionrevision`, and `colorbar.(x|y)` (accessible with `config: {editable: true}`) is controlled by `layout.editrevision`. Trace changes are tracked by `uid`, which only falls back on trace index if no `uid` is provided. So if your app can add/remove traces before the end of the `data` array, such that the same trace has a different index, you can still preserve user-driven changes if you give each trace a `uid` that stays with it as it moves.", + "editType": "none", + "valType": "any" + }, + "unselected": { + "editType": "style", + "marker": { + "color": { + "description": "Sets the marker color of unselected points, applied only when a selection exists.", + "editType": "style", + "valType": "color" + }, + "editType": "style", + "opacity": { + "description": "Sets the marker opacity of unselected points, applied only when a selection exists.", + "editType": "style", + "max": 1, + "min": 0, + "valType": "number" + }, + "role": "object", + "size": { + "description": "Sets the marker size of unselected points, applied only when a selection exists.", + "editType": "style", + "min": 0, + "valType": "number" + } + }, + "role": "object", + "textfont": { + "color": { + "description": "Sets the text font color of unselected points, applied only when a selection exists.", + "editType": "style", + "valType": "color" + }, + "editType": "style", + "role": "object" + } + }, + "visible": { + "description": "Determines whether or not this trace is visible. If *legendonly*, the trace is not drawn, but can appear as a legend item (provided that the legend itself is visible).", + "dflt": true, + "editType": "calc", + "valType": "enumerated", + "values": [ + true, + false, + "legendonly" + ] + } + }, + "categories": [ + "polar", + "symbols", + "showLegend", + "scatter-like" + ], + "meta": { + "description": "The scatterpolar trace type encompasses line charts, scatter charts, text charts, and bubble charts in polar coordinates. The data visualized as scatter point or lines is set in `r` (radial) and `theta` (angular) coordinates Text (appearing either on the chart or on hover only) is via `text`. Bubble charts are achieved by setting `marker.size` and/or `marker.color` to numerical arrays.", + "hrName": "scatter_polar" + }, + "type": "scatterpolar" + }, + "scatterpolargl": { + "animatable": false, + "attributes": { + "connectgaps": { + "description": "Determines whether or not gaps (i.e. {nan} or missing values) in the provided data arrays are connected.", + "dflt": false, + "editType": "calc", + "valType": "boolean" + }, + "customdata": { + "description": "Assigns extra data each datum. This may be useful when listening to hover, click and selection events. Note that, *scatter* traces also appends customdata items in the markers DOM elements", + "editType": "calc", + "valType": "data_array" + }, + "customdatasrc": { + "description": "Sets the source reference on Chart Studio Cloud for `customdata`.", + "editType": "none", + "valType": "string" + }, + "dr": { + "description": "Sets the r coordinate step.", + "dflt": 1, + "editType": "calc", + "valType": "number" + }, + "dtheta": { + "description": "Sets the theta coordinate step. By default, the `dtheta` step equals the subplot's period divided by the length of the `r` coordinates.", + "editType": "calc", + "valType": "number" + }, + "fill": { + "description": "Sets the area to fill with a solid color. Defaults to *none* unless this trace is stacked, then it gets *tonexty* (*tonextx*) if `orientation` is *v* (*h*) Use with `fillcolor` if not *none*. *tozerox* and *tozeroy* fill to x=0 and y=0 respectively. *tonextx* and *tonexty* fill between the endpoints of this trace and the endpoints of the trace before it, connecting those endpoints with straight lines (to make a stacked area graph); if there is no trace before it, they behave like *tozerox* and *tozeroy*. *toself* connects the endpoints of the trace (or each segment of the trace if it has gaps) into a closed shape. *tonext* fills the space between two traces if one completely encloses the other (eg consecutive contour lines), and behaves like *toself* if there is no trace before it. *tonext* should not be used if one trace does not enclose the other. Traces in a `stackgroup` will only fill to (or be filled to) other traces in the same group. With multiple `stackgroup`s or some traces stacked and some not, if fill-linked traces are not already consecutive, the later ones will be pushed down in the drawing order.", + "dflt": "none", + "editType": "calc", + "valType": "enumerated", + "values": [ + "none", + "tozeroy", + "tozerox", + "tonexty", + "tonextx", + "toself", + "tonext" + ] + }, + "fillcolor": { + "description": "Sets the fill color. Defaults to a half-transparent variant of the line color, marker color, or marker line color, whichever is available.", + "editType": "calc", + "valType": "color" + }, + "hoverinfo": { + "arrayOk": true, + "description": "Determines which trace information appear on hover. If `none` or `skip` are set, no information is displayed upon hovering. But, if `none` is set, click and hover events are still fired.", + "dflt": "all", + "editType": "none", + "extras": [ + "all", + "none", + "skip" + ], + "flags": [ + "r", + "theta", + "text", + "name" + ], + "valType": "flaglist" + }, + "hoverinfosrc": { + "description": "Sets the source reference on Chart Studio Cloud for `hoverinfo`.", + "editType": "none", + "valType": "string" + }, + "hoverlabel": { + "align": { + "arrayOk": true, + "description": "Sets the horizontal alignment of the text content within hover label box. Has an effect only if the hover label text spans more two or more lines", + "dflt": "auto", + "editType": "none", + "valType": "enumerated", + "values": [ + "left", + "right", + "auto" + ] + }, + "alignsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `align`.", + "editType": "none", + "valType": "string" + }, + "bgcolor": { + "arrayOk": true, + "description": "Sets the background color of the hover labels for this trace", + "editType": "none", + "valType": "color" + }, + "bgcolorsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `bgcolor`.", + "editType": "none", + "valType": "string" + }, + "bordercolor": { + "arrayOk": true, + "description": "Sets the border color of the hover labels for this trace.", + "editType": "none", + "valType": "color" + }, + "bordercolorsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `bordercolor`.", + "editType": "none", + "valType": "string" + }, + "editType": "none", + "font": { + "color": { + "arrayOk": true, + "editType": "none", + "valType": "color" + }, + "colorsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `color`.", + "editType": "none", + "valType": "string" + }, + "description": "Sets the font used in hover labels.", + "editType": "none", + "family": { + "arrayOk": true, + "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", + "editType": "none", + "noBlank": true, + "strict": true, + "valType": "string" + }, + "familysrc": { + "description": "Sets the source reference on Chart Studio Cloud for `family`.", + "editType": "none", + "valType": "string" + }, + "lineposition": { + "arrayOk": true, + "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", + "dflt": "none", + "editType": "none", + "extras": [ + "none" + ], + "flags": [ + "under", + "over", + "through" + ], + "valType": "flaglist" + }, + "linepositionsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `lineposition`.", + "editType": "none", + "valType": "string" + }, + "role": "object", + "shadow": { + "arrayOk": true, + "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", + "dflt": "none", + "editType": "none", + "valType": "string" + }, + "shadowsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `shadow`.", + "editType": "none", + "valType": "string" + }, + "size": { + "arrayOk": true, + "editType": "none", + "min": 1, + "valType": "number" + }, + "sizesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `size`.", + "editType": "none", + "valType": "string" + }, + "style": { + "arrayOk": true, + "description": "Sets whether a font should be styled with a normal or italic face from its family.", + "dflt": "normal", + "editType": "none", + "valType": "enumerated", + "values": [ + "normal", + "italic" + ] + }, + "stylesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `style`.", + "editType": "none", + "valType": "string" + }, + "textcase": { + "arrayOk": true, + "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", + "dflt": "normal", + "editType": "none", + "valType": "enumerated", + "values": [ + "normal", + "word caps", + "upper", + "lower" + ] + }, + "textcasesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `textcase`.", + "editType": "none", + "valType": "string" + }, + "variant": { + "arrayOk": true, + "description": "Sets the variant of the font.", + "dflt": "normal", + "editType": "none", + "valType": "enumerated", + "values": [ + "normal", + "small-caps", + "all-small-caps", + "all-petite-caps", + "petite-caps", + "unicase" + ] + }, + "variantsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `variant`.", + "editType": "none", + "valType": "string" + }, + "weight": { + "arrayOk": true, + "description": "Sets the weight (or boldness) of the font.", + "dflt": "normal", + "editType": "none", + "extras": [ + "normal", + "bold" + ], + "max": 1000, + "min": 1, + "valType": "integer" + }, + "weightsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `weight`.", + "editType": "none", + "valType": "string" + } + }, + "namelength": { + "arrayOk": true, + "description": "Sets the default length (in number of characters) of the trace name in the hover labels for all traces. -1 shows the whole name regardless of length. 0-3 shows the first 0-3 characters, and an integer >3 will show the whole name if it is less than that many characters, but if it is longer, will truncate to `namelength - 3` characters and add an ellipsis.", + "dflt": 15, + "editType": "none", + "min": -1, + "valType": "integer" + }, + "namelengthsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `namelength`.", + "editType": "none", + "valType": "string" + }, + "role": "object", + "showarrow": { + "description": "Sets whether or not to show the hover label arrow/triangle pointing to the data point.", + "dflt": true, + "editType": "none", + "valType": "boolean" + } + }, + "hovertemplate": { + "arrayOk": true, + "description": "Template string used for rendering the information that appear on hover box. Note that this will override `hoverinfo`. Variables are inserted using %{variable}, for example \"y: %{y}\" as well as %{xother}, {%_xother}, {%_xother_}, {%xother_}. When showing info for several points, *xother* will be added to those with different x positions from the first point. An underscore before or after *(x|y)other* will add a space on that side, only when this field is shown. Numbers are formatted using d3-format's syntax %{variable:d3-format}, for example \"Price: %{y:$.2f}\". https://github.com/d3/d3-format/tree/v1.4.5#d3-format for details on the formatting syntax. Dates are formatted using d3-time-format's syntax %{variable|d3-time-format}, for example \"Day: %{2019-01-01|%A}\". https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format for details on the date formatting syntax. Variables that can't be found will be replaced with the specifier. For example, a template of \"data: %{x}, %{y}\" will result in a value of \"data: 1, %{y}\" if x is 1 and y is missing. Variables with an undefined value will be replaced with the fallback value. The variables available in `hovertemplate` are the ones emitted as event data described at this link https://plotly.com/javascript/plotlyjs-events/#event-data. Additionally, all attributes that can be specified per-point (the ones that are `arrayOk: true`) are available. Anything contained in tag `` is displayed in the secondary box, for example `%{fullData.name}`. To hide the secondary box completely, use an empty tag ``.", + "dflt": "", + "editType": "none", + "valType": "string" + }, + "hovertemplatefallback": { + "description": "Fallback string that's displayed when a variable referenced in a template is missing. If the boolean value 'false' is passed in, the specifier with the missing variable will be displayed.", + "dflt": "-", + "editType": "none", + "valType": "any" + }, + "hovertemplatesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `hovertemplate`.", + "editType": "none", + "valType": "string" + }, + "hovertext": { + "arrayOk": true, + "description": "Sets hover text elements associated with each (x,y) pair. If a single string, the same string appears over all the data points. If an array of string, the items are mapped in order to the this trace's (x,y) coordinates. To be seen, trace `hoverinfo` must contain a *text* flag.", + "dflt": "", + "editType": "style", + "valType": "string" + }, + "hovertextsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `hovertext`.", + "editType": "none", + "valType": "string" + }, + "ids": { + "description": "Assigns id labels to each datum. These ids for object constancy of data points during animation. Should be an array of strings, not numbers or any other type.", + "editType": "calc", + "valType": "data_array" + }, + "idssrc": { + "description": "Sets the source reference on Chart Studio Cloud for `ids`.", + "editType": "none", + "valType": "string" + }, + "legend": { + "description": "Sets the reference to a legend to show this trace in. References to these legends are *legend*, *legend2*, *legend3*, etc. Settings for these legends are set in the layout, under `layout.legend`, `layout.legend2`, etc.", + "dflt": "legend", + "editType": "style", + "valType": "subplotid" + }, + "legendgroup": { + "description": "Sets the legend group for this trace. Traces and shapes part of the same legend group hide/show at the same time when toggling legend items.", + "dflt": "", + "editType": "style", + "valType": "string" + }, + "legendgrouptitle": { + "editType": "style", + "font": { + "color": { + "editType": "style", + "valType": "color" + }, + "description": "Sets this legend group's title font.", + "editType": "style", + "family": { + "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", + "editType": "style", + "noBlank": true, + "strict": true, + "valType": "string" + }, + "lineposition": { + "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", + "dflt": "none", + "editType": "style", + "extras": [ + "none" + ], + "flags": [ + "under", + "over", + "through" + ], + "valType": "flaglist" + }, + "role": "object", + "shadow": { + "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", + "dflt": "none", + "editType": "style", + "valType": "string" + }, + "size": { + "editType": "style", + "min": 1, + "valType": "number" + }, + "style": { + "description": "Sets whether a font should be styled with a normal or italic face from its family.", + "dflt": "normal", + "editType": "style", + "valType": "enumerated", + "values": [ + "normal", + "italic" + ] + }, + "textcase": { + "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", + "dflt": "normal", + "editType": "style", + "valType": "enumerated", + "values": [ + "normal", + "word caps", + "upper", + "lower" + ] + }, + "variant": { + "description": "Sets the variant of the font.", + "dflt": "normal", + "editType": "style", + "valType": "enumerated", + "values": [ + "normal", + "small-caps", + "all-small-caps", + "all-petite-caps", + "petite-caps", + "unicase" + ] + }, + "weight": { + "description": "Sets the weight (or boldness) of the font.", + "dflt": "normal", + "editType": "style", + "extras": [ + "normal", + "bold" + ], + "max": 1000, + "min": 1, + "valType": "integer" + } + }, + "role": "object", + "text": { + "description": "Sets the title of the legend group.", + "dflt": "", + "editType": "style", + "valType": "string" + } + }, + "legendrank": { + "description": "Sets the legend rank for this trace. Items and groups with smaller ranks are presented on top/left side while with *reversed* `legend.traceorder` they are on bottom/right side. The default legendrank is 1000, so that you can use ranks less than 1000 to place certain items before all unranked items, and ranks greater than 1000 to go after all unranked items. When having unranked or equal rank items shapes would be displayed after traces i.e. according to their order in data and layout.", + "dflt": 1000, + "editType": "style", + "valType": "number" + }, + "legendwidth": { + "description": "Sets the width (in px or fraction) of the legend for this trace.", + "editType": "style", + "min": 0, + "valType": "number" + }, + "line": { + "color": { + "description": "Sets the line color.", + "editType": "calc", + "valType": "color" + }, + "dash": { + "description": "Sets the style of the lines.", + "dflt": "solid", + "editType": "calc", + "valType": "enumerated", + "values": [ + "dash", + "dashdot", + "dot", + "longdash", + "longdashdot", + "solid" + ] + }, + "editType": "calc", + "role": "object", + "width": { + "description": "Sets the line width (in px).", + "dflt": 2, + "editType": "calc", + "min": 0, + "valType": "number" + } + }, + "marker": { + "angle": { + "arrayOk": true, + "description": "Sets the marker angle in respect to `angleref`.", + "dflt": 0, + "editType": "calc", + "valType": "angle" + }, + "anglesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `angle`.", + "editType": "none", + "valType": "string" + }, + "autocolorscale": { + "description": "Determines whether the colorscale is a default palette (`autocolorscale: true`) or the palette determined by `marker.colorscale`. Has an effect only if in `marker.color` is set to a numerical array. In case `colorscale` is unspecified or `autocolorscale` is true, the default palette will be chosen according to whether numbers in the `color` array are all positive, all negative or mixed.", + "dflt": true, + "editType": "calc", + "impliedEdits": {}, + "valType": "boolean" + }, + "cauto": { + "description": "Determines whether or not the color domain is computed with respect to the input data (here in `marker.color`) or the bounds set in `marker.cmin` and `marker.cmax` Has an effect only if in `marker.color` is set to a numerical array. Defaults to `false` when `marker.cmin` and `marker.cmax` are set by the user.", + "dflt": true, + "editType": "calc", + "impliedEdits": {}, + "valType": "boolean" + }, + "cmax": { + "description": "Sets the upper bound of the color domain. Has an effect only if in `marker.color` is set to a numerical array. Value should have the same units as in `marker.color` and if set, `marker.cmin` must be set as well.", + "dflt": null, + "editType": "calc", + "impliedEdits": { + "cauto": false + }, + "valType": "number" + }, + "cmid": { + "description": "Sets the mid-point of the color domain by scaling `marker.cmin` and/or `marker.cmax` to be equidistant to this point. Has an effect only if in `marker.color` is set to a numerical array. Value should have the same units as in `marker.color`. Has no effect when `marker.cauto` is `false`.", + "dflt": null, + "editType": "calc", + "impliedEdits": {}, + "valType": "number" + }, + "cmin": { + "description": "Sets the lower bound of the color domain. Has an effect only if in `marker.color` is set to a numerical array. Value should have the same units as in `marker.color` and if set, `marker.cmax` must be set as well.", + "dflt": null, + "editType": "calc", + "impliedEdits": { + "cauto": false + }, + "valType": "number" + }, + "color": { + "arrayOk": true, + "description": "Sets the marker color. It accepts either a specific color or an array of numbers that are mapped to the colorscale relative to the max and min values of the array or relative to `marker.cmin` and `marker.cmax` if set.", + "editType": "calc", + "valType": "color" + }, + "coloraxis": { + "description": "Sets a reference to a shared color axis. References to these shared color axes are *coloraxis*, *coloraxis2*, *coloraxis3*, etc. Settings for these shared color axes are set in the layout, under `layout.coloraxis`, `layout.coloraxis2`, etc. Note that multiple color scales can be linked to the same color axis.", + "dflt": null, + "editType": "calc", + "regex": "/^coloraxis([2-9]|[1-9][0-9]+)?$/", + "valType": "subplotid" + }, + "colorbar": { + "bgcolor": { + "description": "Sets the color of padded area.", + "dflt": "rgba(0,0,0,0)", + "editType": "calc", + "valType": "color" + }, + "bordercolor": { + "description": "Sets the axis line color.", + "dflt": "#444", + "editType": "calc", + "valType": "color" + }, + "borderwidth": { + "description": "Sets the width (in px) or the border enclosing this color bar.", + "dflt": 0, + "editType": "calc", + "min": 0, + "valType": "number" + }, + "dtick": { + "description": "Sets the step in-between ticks on this axis. Use with `tick0`. Must be a positive number, or special strings available to *log* and *date* axes. If the axis `type` is *log*, then ticks are set every 10^(n*dtick) where n is the tick number. For example, to set a tick mark at 1, 10, 100, 1000, ... set dtick to 1. To set tick marks at 1, 100, 10000, ... set dtick to 2. To set tick marks at 1, 5, 25, 125, 625, 3125, ... set dtick to log_10(5), or 0.69897000433. *log* has several special values; *L*, where `f` is a positive number, gives ticks linearly spaced in value (but not position). For example `tick0` = 0.1, `dtick` = *L0.5* will put ticks at 0.1, 0.6, 1.1, 1.6 etc. To show powers of 10 plus small digits between, use *D1* (all digits) or *D2* (only 2 and 5). `tick0` is ignored for *D1* and *D2*. If the axis `type` is *date*, then you must convert the time to milliseconds. For example, to set the interval between ticks to one day, set `dtick` to 86400000.0. *date* also has special values *M* gives ticks spaced by a number of months. `n` must be a positive integer. To set ticks on the 15th of every third month, set `tick0` to *2000-01-15* and `dtick` to *M3*. To set ticks every 4 years, set `dtick` to *M48*", + "editType": "calc", + "impliedEdits": { + "tickmode": "linear" + }, + "valType": "any" + }, + "editType": "calc", + "exponentformat": { + "description": "Determines a formatting rule for the tick exponents. For example, consider the number 1,000,000,000. If *none*, it appears as 1,000,000,000. If *e*, 1e+9. If *E*, 1E+9. If *power*, 1x10^9 (with 9 in a super script). If *SI*, 1G. If *B*, 1B. *SI* uses prefixes from \"femto\" f (10^-15) to \"tera\" T (10^12). *SI extended* covers instead the full SI range from \"quecto\" q (10^-30) to \"quetta\" Q (10^30). If *SI* or *SI extended* is used and the exponent is beyond the above ranges, the formatting rule will automatically be switched to the power notation.", + "dflt": "B", + "editType": "calc", + "valType": "enumerated", + "values": [ + "none", + "e", + "E", + "power", + "SI", + "B", + "SI extended" + ] + }, + "labelalias": { + "description": "Replacement text for specific tick or hover labels. For example using {US: 'USA', CA: 'Canada'} changes US to USA and CA to Canada. The labels we would have shown must match the keys exactly, after adding any tickprefix or ticksuffix. For negative numbers the minus sign symbol used (U+2212) is wider than the regular ascii dash. That means you need to use −1 instead of -1. labelalias can be used with any axis type, and both keys (if needed) and values (if desired) can include html-like tags or MathJax.", + "dflt": false, + "editType": "calc", + "valType": "any" + }, + "len": { + "description": "Sets the length of the color bar This measure excludes the padding of both ends. That is, the color bar length is this length minus the padding on both ends.", + "dflt": 1, + "editType": "calc", + "min": 0, + "valType": "number" + }, + "lenmode": { + "description": "Determines whether this color bar's length (i.e. the measure in the color variation direction) is set in units of plot *fraction* or in *pixels. Use `len` to set the value.", + "dflt": "fraction", + "editType": "calc", + "valType": "enumerated", + "values": [ + "fraction", + "pixels" + ] + }, + "minexponent": { + "description": "Hide SI prefix for 10^n if |n| is below this number. This only has an effect when `tickformat` is *SI* or *B*.", + "dflt": 3, + "editType": "calc", + "min": 0, + "valType": "number" + }, + "nticks": { + "description": "Specifies the maximum number of ticks for the particular axis. The actual number of ticks will be chosen automatically to be less than or equal to `nticks`. Has an effect only if `tickmode` is set to *auto*.", + "dflt": 0, + "editType": "calc", + "min": 0, + "valType": "integer" + }, + "orientation": { + "description": "Sets the orientation of the colorbar.", + "dflt": "v", + "editType": "calc", + "valType": "enumerated", + "values": [ + "h", + "v" + ] + }, + "outlinecolor": { + "description": "Sets the axis line color.", + "dflt": "#444", + "editType": "calc", + "valType": "color" + }, + "outlinewidth": { + "description": "Sets the width (in px) of the axis line.", + "dflt": 1, + "editType": "calc", + "min": 0, + "valType": "number" + }, + "role": "object", + "separatethousands": { + "description": "If \"true\", even 4-digit integers are separated", + "dflt": false, + "editType": "calc", + "valType": "boolean" + }, + "showexponent": { + "description": "If *all*, all exponents are shown besides their significands. If *first*, only the exponent of the first tick is shown. If *last*, only the exponent of the last tick is shown. If *none*, no exponents appear.", + "dflt": "all", + "editType": "calc", + "valType": "enumerated", + "values": [ + "all", + "first", + "last", + "none" + ] + }, + "showticklabels": { + "description": "Determines whether or not the tick labels are drawn.", + "dflt": true, + "editType": "calc", + "valType": "boolean" + }, + "showtickprefix": { + "description": "If *all*, all tick labels are displayed with a prefix. If *first*, only the first tick is displayed with a prefix. If *last*, only the last tick is displayed with a suffix. If *none*, tick prefixes are hidden.", + "dflt": "all", + "editType": "calc", + "valType": "enumerated", + "values": [ + "all", + "first", + "last", + "none" + ] + }, + "showticksuffix": { + "description": "Same as `showtickprefix` but for tick suffixes.", + "dflt": "all", + "editType": "calc", + "valType": "enumerated", + "values": [ + "all", + "first", + "last", + "none" + ] + }, + "thickness": { + "description": "Sets the thickness of the color bar This measure excludes the size of the padding, ticks and labels.", + "dflt": 30, + "editType": "calc", + "min": 0, + "valType": "number" + }, + "thicknessmode": { + "description": "Determines whether this color bar's thickness (i.e. the measure in the constant color direction) is set in units of plot *fraction* or in *pixels*. Use `thickness` to set the value.", + "dflt": "pixels", + "editType": "calc", + "valType": "enumerated", + "values": [ + "fraction", + "pixels" + ] + }, + "tick0": { + "description": "Sets the placement of the first tick on this axis. Use with `dtick`. If the axis `type` is *log*, then you must take the log of your starting tick (e.g. to set the starting tick to 100, set the `tick0` to 2) except when `dtick`=*L* (see `dtick` for more info). If the axis `type` is *date*, it should be a date string, like date data. If the axis `type` is *category*, it should be a number, using the scale where each category is assigned a serial number from zero in the order it appears.", + "editType": "calc", + "impliedEdits": { + "tickmode": "linear" + }, + "valType": "any" + }, + "tickangle": { + "description": "Sets the angle of the tick labels with respect to the horizontal. For example, a `tickangle` of -90 draws the tick labels vertically.", + "dflt": "auto", + "editType": "calc", + "valType": "angle" + }, + "tickcolor": { + "description": "Sets the tick color.", + "dflt": "#444", + "editType": "calc", + "valType": "color" + }, + "tickfont": { + "color": { + "editType": "calc", + "valType": "color" + }, + "description": "Sets the color bar's tick label font", + "editType": "calc", + "family": { + "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", + "editType": "calc", + "noBlank": true, + "strict": true, + "valType": "string" + }, + "lineposition": { + "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", + "dflt": "none", + "editType": "calc", + "extras": [ + "none" + ], + "flags": [ + "under", + "over", + "through" + ], + "valType": "flaglist" + }, + "role": "object", + "shadow": { + "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", + "dflt": "none", + "editType": "calc", + "valType": "string" + }, + "size": { + "editType": "calc", + "min": 1, + "valType": "number" + }, + "style": { + "description": "Sets whether a font should be styled with a normal or italic face from its family.", + "dflt": "normal", + "editType": "calc", + "valType": "enumerated", + "values": [ + "normal", + "italic" + ] + }, + "textcase": { + "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", + "dflt": "normal", + "editType": "calc", + "valType": "enumerated", + "values": [ + "normal", + "word caps", + "upper", + "lower" + ] + }, + "variant": { + "description": "Sets the variant of the font.", + "dflt": "normal", + "editType": "calc", + "valType": "enumerated", + "values": [ + "normal", + "small-caps", + "all-small-caps", + "all-petite-caps", + "petite-caps", + "unicase" + ] + }, + "weight": { + "description": "Sets the weight (or boldness) of the font.", + "dflt": "normal", + "editType": "calc", + "extras": [ + "normal", + "bold" + ], + "max": 1000, + "min": 1, + "valType": "integer" + } + }, + "tickformat": { + "description": "Sets the tick label formatting rule using d3 formatting mini-languages which are very similar to those in Python. For numbers, see: https://github.com/d3/d3-format/tree/v1.4.5#d3-format. And for dates see: https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format. We add two items to d3's date formatter: *%h* for half of the year as a decimal number as well as *%{n}f* for fractional seconds with n digits. For example, *2016-10-13 09:15:23.456* with tickformat *%H~%M~%S.%2f* would display *09~15~23.46*", + "dflt": "", + "editType": "calc", + "valType": "string" + }, + "tickformatstops": { + "items": { + "tickformatstop": { + "dtickrange": { + "description": "range [*min*, *max*], where *min*, *max* - dtick values which describe some zoom level, it is possible to omit *min* or *max* value by passing *null*", + "editType": "calc", + "items": [ + { + "editType": "calc", + "valType": "any" + }, + { + "editType": "calc", + "valType": "any" + } + ], + "valType": "info_array" + }, + "editType": "calc", + "enabled": { + "description": "Determines whether or not this stop is used. If `false`, this stop is ignored even within its `dtickrange`.", + "dflt": true, + "editType": "calc", + "valType": "boolean" + }, + "name": { + "description": "When used in a template, named items are created in the output figure in addition to any items the figure already has in this array. You can modify these items in the output figure by making your own item with `templateitemname` matching this `name` alongside your modifications (including `visible: false` or `enabled: false` to hide it). Has no effect outside of a template.", + "editType": "calc", + "valType": "string" + }, + "role": "object", + "templateitemname": { + "description": "Used to refer to a named item in this array in the template. Named items from the template will be created even without a matching item in the input figure, but you can modify one by making an item with `templateitemname` matching its `name`, alongside your modifications (including `visible: false` or `enabled: false` to hide it). If there is no template or no matching item, this item will be hidden unless you explicitly show it with `visible: true`.", + "editType": "calc", + "valType": "string" + }, + "value": { + "description": "string - dtickformat for described zoom level, the same as *tickformat*", + "dflt": "", + "editType": "calc", + "valType": "string" + } + } + }, + "role": "object" + }, + "ticklabeloverflow": { + "description": "Determines how we handle tick labels that would overflow either the graph div or the domain of the axis. The default value for inside tick labels is *hide past domain*. In other cases the default is *hide past div*.", + "editType": "calc", + "valType": "enumerated", + "values": [ + "allow", + "hide past div", + "hide past domain" + ] + }, + "ticklabelposition": { + "description": "Determines where tick labels are drawn relative to the ticks. Left and right options are used when `orientation` is *h*, top and bottom when `orientation` is *v*.", + "dflt": "outside", + "editType": "calc", + "valType": "enumerated", + "values": [ + "outside", + "inside", + "outside top", + "inside top", + "outside left", + "inside left", + "outside right", + "inside right", + "outside bottom", + "inside bottom" + ] + }, + "ticklabelstep": { + "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", + "dflt": 1, + "editType": "calc", + "min": 1, + "valType": "integer" + }, + "ticklen": { + "description": "Sets the tick length (in px).", + "dflt": 5, + "editType": "calc", + "min": 0, + "valType": "number" + }, + "tickmode": { + "description": "Sets the tick mode for this axis. If *auto*, the number of ticks is set via `nticks`. If *linear*, the placement of the ticks is determined by a starting position `tick0` and a tick step `dtick` (*linear* is the default value if `tick0` and `dtick` are provided). If *array*, the placement of the ticks is set via `tickvals` and the tick text is `ticktext`. (*array* is the default value if `tickvals` is provided).", + "editType": "calc", + "impliedEdits": {}, + "valType": "enumerated", + "values": [ + "auto", + "linear", + "array" + ] + }, + "tickprefix": { + "description": "Sets a tick label prefix.", + "dflt": "", + "editType": "calc", + "valType": "string" + }, + "ticks": { + "description": "Determines whether ticks are drawn or not. If **, this axis' ticks are not drawn. If *outside* (*inside*), this axis' are drawn outside (inside) the axis lines.", + "dflt": "", + "editType": "calc", + "valType": "enumerated", + "values": [ + "outside", + "inside", + "" + ] + }, + "ticksuffix": { + "description": "Sets a tick label suffix.", + "dflt": "", + "editType": "calc", + "valType": "string" + }, + "ticktext": { + "description": "Sets the text displayed at the ticks position via `tickvals`. Only has an effect if `tickmode` is set to *array*. Used with `tickvals`.", + "editType": "calc", + "valType": "data_array" + }, + "ticktextsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `ticktext`.", + "editType": "none", + "valType": "string" + }, + "tickvals": { + "description": "Sets the values at which ticks on this axis appear. Only has an effect if `tickmode` is set to *array*. Used with `ticktext`.", + "editType": "calc", + "valType": "data_array" + }, + "tickvalssrc": { + "description": "Sets the source reference on Chart Studio Cloud for `tickvals`.", + "editType": "none", + "valType": "string" + }, + "tickwidth": { + "description": "Sets the tick width (in px).", + "dflt": 1, + "editType": "calc", + "min": 0, + "valType": "number" + }, + "title": { + "editType": "calc", + "font": { + "color": { + "editType": "calc", + "valType": "color" + }, + "description": "Sets this color bar's title font.", + "editType": "calc", + "family": { + "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", + "editType": "calc", + "noBlank": true, + "strict": true, + "valType": "string" + }, + "lineposition": { + "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", + "dflt": "none", + "editType": "calc", + "extras": [ + "none" + ], + "flags": [ + "under", + "over", + "through" + ], + "valType": "flaglist" + }, + "role": "object", + "shadow": { + "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", + "dflt": "none", + "editType": "calc", + "valType": "string" + }, + "size": { + "editType": "calc", + "min": 1, + "valType": "number" + }, + "style": { + "description": "Sets whether a font should be styled with a normal or italic face from its family.", + "dflt": "normal", + "editType": "calc", + "valType": "enumerated", + "values": [ + "normal", + "italic" + ] + }, + "textcase": { + "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", + "dflt": "normal", + "editType": "calc", + "valType": "enumerated", + "values": [ + "normal", + "word caps", + "upper", + "lower" + ] + }, + "variant": { + "description": "Sets the variant of the font.", + "dflt": "normal", + "editType": "calc", + "valType": "enumerated", + "values": [ + "normal", + "small-caps", + "all-small-caps", + "all-petite-caps", + "petite-caps", + "unicase" + ] + }, + "weight": { + "description": "Sets the weight (or boldness) of the font.", + "dflt": "normal", + "editType": "calc", + "extras": [ + "normal", + "bold" + ], + "max": 1000, + "min": 1, + "valType": "integer" + } + }, + "role": "object", + "side": { + "description": "Determines the location of color bar's title with respect to the color bar. Defaults to *top* when `orientation` if *v* and defaults to *right* when `orientation` if *h*.", + "editType": "calc", + "valType": "enumerated", + "values": [ + "right", + "top", + "bottom" + ] + }, + "text": { + "description": "Sets the title of the color bar.", + "editType": "calc", + "valType": "string" + } + }, + "x": { + "description": "Sets the x position with respect to `xref` of the color bar (in plot fraction). When `xref` is *paper*, defaults to 1.02 when `orientation` is *v* and 0.5 when `orientation` is *h*. When `xref` is *container*, defaults to *1* when `orientation` is *v* and 0.5 when `orientation` is *h*. Must be between *0* and *1* if `xref` is *container* and between *-2* and *3* if `xref` is *paper*.", + "editType": "calc", + "valType": "number" + }, + "xanchor": { + "description": "Sets this color bar's horizontal position anchor. This anchor binds the `x` position to the *left*, *center* or *right* of the color bar. Defaults to *left* when `orientation` is *v* and *center* when `orientation` is *h*.", + "editType": "calc", + "valType": "enumerated", + "values": [ + "left", + "center", + "right" + ] + }, + "xpad": { + "description": "Sets the amount of padding (in px) along the x direction.", + "dflt": 10, + "editType": "calc", + "min": 0, + "valType": "number" + }, + "xref": { + "description": "Sets the container `x` refers to. *container* spans the entire `width` of the plot. *paper* refers to the width of the plotting area only.", + "dflt": "paper", + "editType": "calc", + "valType": "enumerated", + "values": [ + "container", + "paper" + ] + }, + "y": { + "description": "Sets the y position with respect to `yref` of the color bar (in plot fraction). When `yref` is *paper*, defaults to 0.5 when `orientation` is *v* and 1.02 when `orientation` is *h*. When `yref` is *container*, defaults to 0.5 when `orientation` is *v* and 1 when `orientation` is *h*. Must be between *0* and *1* if `yref` is *container* and between *-2* and *3* if `yref` is *paper*.", + "editType": "calc", + "valType": "number" + }, + "yanchor": { + "description": "Sets this color bar's vertical position anchor This anchor binds the `y` position to the *top*, *middle* or *bottom* of the color bar. Defaults to *middle* when `orientation` is *v* and *bottom* when `orientation` is *h*.", + "editType": "calc", + "valType": "enumerated", + "values": [ + "top", + "middle", + "bottom" + ] + }, + "ypad": { + "description": "Sets the amount of padding (in px) along the y direction.", + "dflt": 10, + "editType": "calc", + "min": 0, + "valType": "number" + }, + "yref": { + "description": "Sets the container `y` refers to. *container* spans the entire `height` of the plot. *paper* refers to the height of the plotting area only.", + "dflt": "paper", + "editType": "calc", + "valType": "enumerated", + "values": [ + "container", + "paper" + ] + } + }, + "colorscale": { + "description": "Sets the colorscale. Has an effect only if in `marker.color` is set to a numerical array. The colorscale must be an array containing arrays mapping a normalized value to an rgb, rgba, hex, hsl, hsv, or named color string. At minimum, a mapping for the lowest (0) and highest (1) values are required. For example, `[[0, 'rgb(0,0,255)'], [1, 'rgb(255,0,0)']]`. To control the bounds of the colorscale in color space, use `marker.cmin` and `marker.cmax`. Alternatively, `colorscale` may be a palette name string of the following list: Blackbody,Bluered,Blues,Cividis,Earth,Electric,Greens,Greys,Hot,Jet,Picnic,Portland,Rainbow,RdBu,Reds,Viridis,YlGnBu,YlOrRd.", + "dflt": null, + "editType": "calc", + "impliedEdits": { + "autocolorscale": false + }, + "valType": "colorscale" + }, + "colorsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `color`.", + "editType": "none", + "valType": "string" + }, + "editType": "calc", + "line": { + "autocolorscale": { + "description": "Determines whether the colorscale is a default palette (`autocolorscale: true`) or the palette determined by `marker.line.colorscale`. Has an effect only if in `marker.line.color` is set to a numerical array. In case `colorscale` is unspecified or `autocolorscale` is true, the default palette will be chosen according to whether numbers in the `color` array are all positive, all negative or mixed.", + "dflt": true, + "editType": "calc", + "impliedEdits": {}, + "valType": "boolean" + }, + "cauto": { + "description": "Determines whether or not the color domain is computed with respect to the input data (here in `marker.line.color`) or the bounds set in `marker.line.cmin` and `marker.line.cmax` Has an effect only if in `marker.line.color` is set to a numerical array. Defaults to `false` when `marker.line.cmin` and `marker.line.cmax` are set by the user.", + "dflt": true, + "editType": "calc", + "impliedEdits": {}, + "valType": "boolean" + }, + "cmax": { + "description": "Sets the upper bound of the color domain. Has an effect only if in `marker.line.color` is set to a numerical array. Value should have the same units as in `marker.line.color` and if set, `marker.line.cmin` must be set as well.", + "dflt": null, + "editType": "calc", + "impliedEdits": { + "cauto": false + }, + "valType": "number" + }, + "cmid": { + "description": "Sets the mid-point of the color domain by scaling `marker.line.cmin` and/or `marker.line.cmax` to be equidistant to this point. Has an effect only if in `marker.line.color` is set to a numerical array. Value should have the same units as in `marker.line.color`. Has no effect when `marker.line.cauto` is `false`.", + "dflt": null, + "editType": "calc", + "impliedEdits": {}, + "valType": "number" + }, + "cmin": { + "description": "Sets the lower bound of the color domain. Has an effect only if in `marker.line.color` is set to a numerical array. Value should have the same units as in `marker.line.color` and if set, `marker.line.cmax` must be set as well.", + "dflt": null, + "editType": "calc", + "impliedEdits": { + "cauto": false + }, + "valType": "number" + }, + "color": { + "arrayOk": true, + "description": "Sets the marker.line color. It accepts either a specific color or an array of numbers that are mapped to the colorscale relative to the max and min values of the array or relative to `marker.line.cmin` and `marker.line.cmax` if set.", + "editType": "calc", + "valType": "color" + }, + "coloraxis": { + "description": "Sets a reference to a shared color axis. References to these shared color axes are *coloraxis*, *coloraxis2*, *coloraxis3*, etc. Settings for these shared color axes are set in the layout, under `layout.coloraxis`, `layout.coloraxis2`, etc. Note that multiple color scales can be linked to the same color axis.", + "dflt": null, + "editType": "calc", + "regex": "/^coloraxis([2-9]|[1-9][0-9]+)?$/", + "valType": "subplotid" + }, + "colorscale": { + "description": "Sets the colorscale. Has an effect only if in `marker.line.color` is set to a numerical array. The colorscale must be an array containing arrays mapping a normalized value to an rgb, rgba, hex, hsl, hsv, or named color string. At minimum, a mapping for the lowest (0) and highest (1) values are required. For example, `[[0, 'rgb(0,0,255)'], [1, 'rgb(255,0,0)']]`. To control the bounds of the colorscale in color space, use `marker.line.cmin` and `marker.line.cmax`. Alternatively, `colorscale` may be a palette name string of the following list: Blackbody,Bluered,Blues,Cividis,Earth,Electric,Greens,Greys,Hot,Jet,Picnic,Portland,Rainbow,RdBu,Reds,Viridis,YlGnBu,YlOrRd.", + "dflt": null, + "editType": "calc", + "impliedEdits": { + "autocolorscale": false + }, + "valType": "colorscale" + }, + "colorsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `color`.", + "editType": "none", + "valType": "string" + }, + "editType": "calc", + "reversescale": { + "description": "Reverses the color mapping if true. Has an effect only if in `marker.line.color` is set to a numerical array. If true, `marker.line.cmin` will correspond to the last color in the array and `marker.line.cmax` will correspond to the first color.", + "dflt": false, + "editType": "calc", + "valType": "boolean" + }, + "role": "object", + "width": { + "arrayOk": true, + "description": "Sets the width (in px) of the lines bounding the marker points.", + "editType": "calc", + "min": 0, + "valType": "number" + }, + "widthsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `width`.", + "editType": "none", + "valType": "string" + } + }, + "opacity": { + "arrayOk": true, + "description": "Sets the marker opacity.", + "editType": "calc", + "max": 1, + "min": 0, + "valType": "number" + }, + "opacitysrc": { + "description": "Sets the source reference on Chart Studio Cloud for `opacity`.", + "editType": "none", + "valType": "string" + }, + "reversescale": { + "description": "Reverses the color mapping if true. Has an effect only if in `marker.color` is set to a numerical array. If true, `marker.cmin` will correspond to the last color in the array and `marker.cmax` will correspond to the first color.", + "dflt": false, + "editType": "calc", + "valType": "boolean" + }, + "role": "object", + "showscale": { + "description": "Determines whether or not a colorbar is displayed for this trace. Has an effect only if in `marker.color` is set to a numerical array.", + "dflt": false, + "editType": "calc", + "valType": "boolean" + }, + "size": { + "arrayOk": true, + "description": "Sets the marker size (in px).", + "dflt": 6, + "editType": "calc", + "min": 0, + "valType": "number" + }, + "sizemin": { + "description": "Has an effect only if `marker.size` is set to a numerical array. Sets the minimum size (in px) of the rendered marker points.", + "dflt": 0, + "editType": "calc", + "min": 0, + "valType": "number" + }, + "sizemode": { + "description": "Has an effect only if `marker.size` is set to a numerical array. Sets the rule for which the data in `size` is converted to pixels.", + "dflt": "diameter", + "editType": "calc", + "valType": "enumerated", + "values": [ + "diameter", + "area" + ] + }, + "sizeref": { + "description": "Has an effect only if `marker.size` is set to a numerical array. Sets the scale factor used to determine the rendered size of marker points. Use with `sizemin` and `sizemode`.", + "dflt": 1, + "editType": "calc", + "valType": "number" + }, + "sizesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `size`.", + "editType": "none", + "valType": "string" + }, + "symbol": { + "arrayOk": true, + "description": "Sets the marker symbol type. Adding 100 is equivalent to appending *-open* to a symbol name. Adding 200 is equivalent to appending *-dot* to a symbol name. Adding 300 is equivalent to appending *-open-dot* or *dot-open* to a symbol name.", + "dflt": "circle", + "editType": "calc", + "valType": "enumerated", + "values": [ + 0, + "0", + "circle", + 100, + "100", + "circle-open", + 200, + "200", + "circle-dot", + 300, + "300", + "circle-open-dot", + 1, + "1", + "square", + 101, + "101", + "square-open", + 201, + "201", + "square-dot", + 301, + "301", + "square-open-dot", + 2, + "2", + "diamond", + 102, + "102", + "diamond-open", + 202, + "202", + "diamond-dot", + 302, + "302", + "diamond-open-dot", + 3, + "3", + "cross", + 103, + "103", + "cross-open", + 203, + "203", + "cross-dot", + 303, + "303", + "cross-open-dot", + 4, + "4", + "x", + 104, + "104", + "x-open", + 204, + "204", + "x-dot", + 304, + "304", + "x-open-dot", + 5, + "5", + "triangle-up", + 105, + "105", + "triangle-up-open", + 205, + "205", + "triangle-up-dot", + 305, + "305", + "triangle-up-open-dot", + 6, + "6", + "triangle-down", + 106, + "106", + "triangle-down-open", + 206, + "206", + "triangle-down-dot", + 306, + "306", + "triangle-down-open-dot", + 7, + "7", + "triangle-left", + 107, + "107", + "triangle-left-open", + 207, + "207", + "triangle-left-dot", + 307, + "307", + "triangle-left-open-dot", + 8, + "8", + "triangle-right", + 108, + "108", + "triangle-right-open", + 208, + "208", + "triangle-right-dot", + 308, + "308", + "triangle-right-open-dot", + 9, + "9", + "triangle-ne", + 109, + "109", + "triangle-ne-open", + 209, + "209", + "triangle-ne-dot", + 309, + "309", + "triangle-ne-open-dot", + 10, + "10", + "triangle-se", + 110, + "110", + "triangle-se-open", + 210, + "210", + "triangle-se-dot", + 310, + "310", + "triangle-se-open-dot", + 11, + "11", + "triangle-sw", + 111, + "111", + "triangle-sw-open", + 211, + "211", + "triangle-sw-dot", + 311, + "311", + "triangle-sw-open-dot", + 12, + "12", + "triangle-nw", + 112, + "112", + "triangle-nw-open", + 212, + "212", + "triangle-nw-dot", + 312, + "312", + "triangle-nw-open-dot", + 13, + "13", + "pentagon", + 113, + "113", + "pentagon-open", + 213, + "213", + "pentagon-dot", + 313, + "313", + "pentagon-open-dot", + 14, + "14", + "hexagon", + 114, + "114", + "hexagon-open", + 214, + "214", + "hexagon-dot", + 314, + "314", + "hexagon-open-dot", + 15, + "15", + "hexagon2", + 115, + "115", + "hexagon2-open", + 215, + "215", + "hexagon2-dot", + 315, + "315", + "hexagon2-open-dot", + 16, + "16", + "octagon", + 116, + "116", + "octagon-open", + 216, + "216", + "octagon-dot", + 316, + "316", + "octagon-open-dot", + 17, + "17", + "star", + 117, + "117", + "star-open", + 217, + "217", + "star-dot", + 317, + "317", + "star-open-dot", + 18, + "18", + "hexagram", + 118, + "118", + "hexagram-open", + 218, + "218", + "hexagram-dot", + 318, + "318", + "hexagram-open-dot", + 19, + "19", + "star-triangle-up", + 119, + "119", + "star-triangle-up-open", + 219, + "219", + "star-triangle-up-dot", + 319, + "319", + "star-triangle-up-open-dot", + 20, + "20", + "star-triangle-down", + 120, + "120", + "star-triangle-down-open", + 220, + "220", + "star-triangle-down-dot", + 320, + "320", + "star-triangle-down-open-dot", + 21, + "21", + "star-square", + 121, + "121", + "star-square-open", + 221, + "221", + "star-square-dot", + 321, + "321", + "star-square-open-dot", + 22, + "22", + "star-diamond", + 122, + "122", + "star-diamond-open", + 222, + "222", + "star-diamond-dot", + 322, + "322", + "star-diamond-open-dot", + 23, + "23", + "diamond-tall", + 123, + "123", + "diamond-tall-open", + 223, + "223", + "diamond-tall-dot", + 323, + "323", + "diamond-tall-open-dot", + 24, + "24", + "diamond-wide", + 124, + "124", + "diamond-wide-open", + 224, + "224", + "diamond-wide-dot", + 324, + "324", + "diamond-wide-open-dot", + 25, + "25", + "hourglass", + 125, + "125", + "hourglass-open", + 26, + "26", + "bowtie", + 126, + "126", + "bowtie-open", + 27, + "27", + "circle-cross", + 127, + "127", + "circle-cross-open", + 28, + "28", + "circle-x", + 128, + "128", + "circle-x-open", + 29, + "29", + "square-cross", + 129, + "129", + "square-cross-open", + 30, + "30", + "square-x", + 130, + "130", + "square-x-open", + 31, + "31", + "diamond-cross", + 131, + "131", + "diamond-cross-open", + 32, + "32", + "diamond-x", + 132, + "132", + "diamond-x-open", + 33, + "33", + "cross-thin", + 133, + "133", + "cross-thin-open", + 34, + "34", + "x-thin", + 134, + "134", + "x-thin-open", + 35, + "35", + "asterisk", + 135, + "135", + "asterisk-open", + 36, + "36", + "hash", + 136, + "136", + "hash-open", + 236, + "236", + "hash-dot", + 336, + "336", + "hash-open-dot", + 37, + "37", + "y-up", + 137, + "137", + "y-up-open", + 38, + "38", + "y-down", + 138, + "138", + "y-down-open", + 39, + "39", + "y-left", + 139, + "139", + "y-left-open", + 40, + "40", + "y-right", + 140, + "140", + "y-right-open", + 41, + "41", + "line-ew", + 141, + "141", + "line-ew-open", + 42, + "42", + "line-ns", + 142, + "142", + "line-ns-open", + 43, + "43", + "line-ne", + 143, + "143", + "line-ne-open", + 44, + "44", + "line-nw", + 144, + "144", + "line-nw-open", + 45, + "45", + "arrow-up", + 145, + "145", + "arrow-up-open", + 46, + "46", + "arrow-down", + 146, + "146", + "arrow-down-open", + 47, + "47", + "arrow-left", + 147, + "147", + "arrow-left-open", + 48, + "48", + "arrow-right", + 148, + "148", + "arrow-right-open", + 49, + "49", + "arrow-bar-up", + 149, + "149", + "arrow-bar-up-open", + 50, + "50", + "arrow-bar-down", + 150, + "150", + "arrow-bar-down-open", + 51, + "51", + "arrow-bar-left", + 151, + "151", + "arrow-bar-left-open", + 52, + "52", + "arrow-bar-right", + 152, + "152", + "arrow-bar-right-open", + 53, + "53", + "arrow", + 153, + "153", + "arrow-open", + 54, + "54", + "arrow-wide", + 154, + "154", + "arrow-wide-open" + ] + }, + "symbolsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `symbol`.", + "editType": "none", + "valType": "string" + } + }, + "meta": { + "arrayOk": true, + "description": "Assigns extra meta information associated with this trace that can be used in various text attributes. Attributes such as trace `name`, graph, axis and colorbar `title.text`, annotation `text` `rangeselector`, `updatemenues` and `sliders` `label` text all support `meta`. To access the trace `meta` values in an attribute in the same trace, simply use `%{meta[i]}` where `i` is the index or key of the `meta` item in question. To access trace `meta` in layout attributes, use `%{data[n[.meta[i]}` where `i` is the index or key of the `meta` and `n` is the trace index.", + "editType": "plot", + "valType": "any" + }, + "metasrc": { + "description": "Sets the source reference on Chart Studio Cloud for `meta`.", + "editType": "none", + "valType": "string" + }, + "mode": { + "description": "Determines the drawing mode for this scatter trace. If the provided `mode` includes *text* then the `text` elements appear at the coordinates. Otherwise, the `text` elements appear on hover. If there are less than 20 points and the trace is not stacked then the default is *lines+markers*. Otherwise, *lines*.", + "editType": "calc", + "extras": [ + "none" + ], + "flags": [ + "lines", + "markers", + "text" + ], + "valType": "flaglist" + }, + "name": { + "description": "Sets the trace name. The trace name appears as the legend item and on hover.", + "editType": "style", + "valType": "string" + }, + "opacity": { + "description": "Sets the opacity of the trace.", + "dflt": 1, + "editType": "style", + "max": 1, + "min": 0, + "valType": "number" + }, + "r": { + "description": "Sets the radial coordinates", + "editType": "calc+clearAxisTypes", + "valType": "data_array" + }, + "r0": { + "description": "Alternate to `r`. Builds a linear space of r coordinates. Use with `dr` where `r0` is the starting coordinate and `dr` the step.", + "dflt": 0, + "editType": "calc+clearAxisTypes", + "valType": "any" + }, + "rsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `r`.", + "editType": "none", + "valType": "string" + }, + "selected": { + "editType": "style", + "marker": { + "color": { + "description": "Sets the marker color of selected points.", + "editType": "style", + "valType": "color" + }, + "editType": "style", + "opacity": { + "description": "Sets the marker opacity of selected points.", + "editType": "style", + "max": 1, + "min": 0, + "valType": "number" + }, + "role": "object", + "size": { + "description": "Sets the marker size of selected points.", + "editType": "style", + "min": 0, + "valType": "number" + } + }, + "role": "object", + "textfont": { + "color": { + "description": "Sets the text font color of selected points.", + "editType": "style", + "valType": "color" + }, + "editType": "style", + "role": "object" + } + }, + "selectedpoints": { + "description": "Array containing integer indices of selected points. Has an effect only for traces that support selections. Note that an empty array means an empty selection where the `unselected` are turned on for all points, whereas, any other non-array values means no selection all where the `selected` and `unselected` styles have no effect.", + "editType": "calc", + "valType": "any" + }, + "showlegend": { + "description": "Determines whether or not an item corresponding to this trace is shown in the legend.", + "dflt": true, + "editType": "style", + "valType": "boolean" + }, + "stream": { + "editType": "calc", + "maxpoints": { + "description": "Sets the maximum number of points to keep on the plots from an incoming stream. If `maxpoints` is set to *50*, only the newest 50 points will be displayed on the plot.", + "dflt": 500, + "editType": "calc", + "max": 10000, + "min": 0, + "valType": "number" + }, + "role": "object", + "token": { + "description": "The stream id number links a data trace on a plot with a stream. See https://chart-studio.plotly.com/settings for more details.", + "editType": "calc", + "noBlank": true, + "strict": true, + "valType": "string" + } + }, + "subplot": { + "description": "Sets a reference between this trace's data coordinates and a polar subplot. If *polar* (the default value), the data refer to `layout.polar`. If *polar2*, the data refer to `layout.polar2`, and so on.", + "dflt": "polar", + "editType": "calc", + "valType": "subplotid" + }, + "text": { + "arrayOk": true, + "description": "Sets text elements associated with each (x,y) pair. If a single string, the same string appears over all the data points. If an array of string, the items are mapped in order to the this trace's (x,y) coordinates. If trace `hoverinfo` contains a *text* flag and *hovertext* is not set, these elements will be seen in the hover labels.", + "dflt": "", + "editType": "calc", + "valType": "string" + }, + "textfont": { + "color": { + "arrayOk": true, + "editType": "calc", + "valType": "color" + }, + "colorsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `color`.", + "editType": "none", + "valType": "string" + }, + "description": "Sets the text font.", + "editType": "calc", + "family": { + "arrayOk": true, + "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", + "editType": "calc", + "noBlank": true, + "strict": true, + "valType": "string" + }, + "familysrc": { + "description": "Sets the source reference on Chart Studio Cloud for `family`.", + "editType": "none", + "valType": "string" + }, + "role": "object", + "size": { + "arrayOk": true, + "editType": "calc", + "min": 1, + "valType": "number" + }, + "sizesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `size`.", + "editType": "none", + "valType": "string" + }, + "style": { + "arrayOk": true, + "description": "Sets whether a font should be styled with a normal or italic face from its family.", + "dflt": "normal", + "editType": "calc", + "valType": "enumerated", + "values": [ + "normal", + "italic" + ] + }, + "stylesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `style`.", + "editType": "none", + "valType": "string" + }, + "variant": { + "arrayOk": true, + "description": "Sets the variant of the font.", + "dflt": "normal", + "editType": "calc", + "valType": "enumerated", + "values": [ + "normal", + "small-caps" + ] + }, + "variantsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `variant`.", + "editType": "none", + "valType": "string" + }, + "weight": { + "arrayOk": true, + "description": "Sets the weight (or boldness) of the font.", + "dflt": "normal", + "editType": "calc", + "valType": "enumerated", + "values": [ + "normal", + "bold" + ] + }, + "weightsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `weight`.", + "editType": "none", + "valType": "string" + } + }, + "textposition": { + "arrayOk": true, + "description": "Sets the positions of the `text` elements with respects to the (x,y) coordinates.", + "dflt": "middle center", + "editType": "calc", + "valType": "enumerated", + "values": [ + "top left", + "top center", + "top right", + "middle left", + "middle center", + "middle right", + "bottom left", + "bottom center", + "bottom right" + ] + }, + "textpositionsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `textposition`.", + "editType": "none", + "valType": "string" + }, + "textsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `text`.", + "editType": "none", + "valType": "string" + }, + "texttemplate": { + "arrayOk": true, + "description": "Template string used for rendering the information text that appears on points. Note that this will override `textinfo`. Variables are inserted using %{variable}, for example \"y: %{y}\". Numbers are formatted using d3-format's syntax %{variable:d3-format}, for example \"Price: %{y:$.2f}\". https://github.com/d3/d3-format/tree/v1.4.5#d3-format for details on the formatting syntax. Dates are formatted using d3-time-format's syntax %{variable|d3-time-format}, for example \"Day: %{2019-01-01|%A}\". https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format for details on the date formatting syntax. Variables that can't be found will be replaced with the specifier. For example, a template of \"data: %{x}, %{y}\" will result in a value of \"data: 1, %{y}\" if x is 1 and y is missing. Variables with an undefined value will be replaced with the fallback value. All attributes that can be specified per-point (the ones that are `arrayOk: true`) are available. Finally, the template string has access to variables `r`, `theta` and `text`.", + "dflt": "", + "editType": "plot", + "valType": "string" + }, + "texttemplatefallback": { + "description": "Fallback string that's displayed when a variable referenced in a template is missing. If the boolean value 'false' is passed in, the specifier with the missing variable will be displayed.", + "dflt": "-", + "editType": "plot", + "valType": "any" + }, + "texttemplatesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `texttemplate`.", + "editType": "none", + "valType": "string" + }, + "theta": { + "description": "Sets the angular coordinates", + "editType": "calc+clearAxisTypes", + "valType": "data_array" + }, + "theta0": { + "description": "Alternate to `theta`. Builds a linear space of theta coordinates. Use with `dtheta` where `theta0` is the starting coordinate and `dtheta` the step.", + "dflt": 0, + "editType": "calc+clearAxisTypes", + "valType": "any" + }, + "thetasrc": { + "description": "Sets the source reference on Chart Studio Cloud for `theta`.", + "editType": "none", + "valType": "string" + }, + "thetaunit": { + "description": "Sets the unit of input *theta* values. Has an effect only when on *linear* angular axes.", + "dflt": "degrees", + "editType": "calc+clearAxisTypes", + "valType": "enumerated", + "values": [ + "radians", + "degrees", + "gradians" + ] + }, + "type": "scatterpolargl", + "uid": { + "description": "Assign an id to this trace, Use this to provide object constancy between traces during animations and transitions.", + "editType": "plot", + "valType": "string" + }, + "uirevision": { + "description": "Controls persistence of some user-driven changes to the trace: `constraintrange` in `parcoords` traces, as well as some `editable: true` modifications such as `name` and `colorbar.title`. Defaults to `layout.uirevision`. Note that other user-driven trace attribute changes are controlled by `layout` attributes: `trace.visible` is controlled by `layout.legend.uirevision`, `selectedpoints` is controlled by `layout.selectionrevision`, and `colorbar.(x|y)` (accessible with `config: {editable: true}`) is controlled by `layout.editrevision`. Trace changes are tracked by `uid`, which only falls back on trace index if no `uid` is provided. So if your app can add/remove traces before the end of the `data` array, such that the same trace has a different index, you can still preserve user-driven changes if you give each trace a `uid` that stays with it as it moves.", + "editType": "none", + "valType": "any" + }, + "unselected": { + "editType": "style", + "marker": { + "color": { + "description": "Sets the marker color of unselected points, applied only when a selection exists.", + "editType": "style", + "valType": "color" + }, + "editType": "style", + "opacity": { + "description": "Sets the marker opacity of unselected points, applied only when a selection exists.", + "editType": "style", + "max": 1, + "min": 0, + "valType": "number" + }, + "role": "object", + "size": { + "description": "Sets the marker size of unselected points, applied only when a selection exists.", + "editType": "style", + "min": 0, + "valType": "number" + } + }, + "role": "object", + "textfont": { + "color": { + "description": "Sets the text font color of unselected points, applied only when a selection exists.", + "editType": "style", + "valType": "color" + }, + "editType": "style", + "role": "object" + } + }, + "visible": { + "description": "Determines whether or not this trace is visible. If *legendonly*, the trace is not drawn, but can appear as a legend item (provided that the legend itself is visible).", + "dflt": true, + "editType": "calc", + "valType": "enumerated", + "values": [ + true, + false, + "legendonly" + ] + } + }, + "categories": [ + "gl", + "regl", + "polar", + "symbols", + "showLegend", + "scatter-like" + ], + "meta": { + "description": "The scatterpolargl trace type encompasses line charts, scatter charts, and bubble charts in polar coordinates using the WebGL plotting engine. The data visualized as scatter point or lines is set in `r` (radial) and `theta` (angular) coordinates Bubble charts are achieved by setting `marker.size` and/or `marker.color` to numerical arrays.", + "hrName": "scatter_polar_gl" + }, + "type": "scatterpolargl" + }, + "quiver": { + "animatable": true, + "attributes": { + "angle": { + "description": "Angle of arrowhead in radians. Default = π/9", + "dflt": 0.3490658503988659, + "editType": "calc", + "max": 1.5707963267948966, + "min": 0, + "valType": "number" + }, + "arrow_scale": { + "description": "Value multiplied to length of barb to get length of arrowhead. Default = 0.3", + "dflt": 0.3, + "editType": "calc", + "max": 1, + "min": 0, + "valType": "number" + }, + "customdata": { + "description": "Assigns extra data each datum. This may be useful when listening to hover, click and selection events. Note that, *scatter* traces also appends customdata items in the markers DOM elements", + "editType": "calc", + "valType": "data_array" + }, + "customdatasrc": { + "description": "Sets the source reference on Chart Studio Cloud for `customdata`.", + "editType": "none", + "valType": "string" + }, + "hoverdistance": { + "description": "Maximum distance (in pixels) to look for nearby arrows on hover.", + "dflt": 20, + "editType": "calc", + "min": -1, + "valType": "number" + }, + "hoverinfo": { + "arrayOk": true, + "description": "Determines which trace information appear on hover. If `none` or `skip` are set, no information is displayed upon hovering. But, if `none` is set, click and hover events are still fired.", + "dflt": "all", + "editType": "none", + "extras": [ + "all", + "none", + "skip" + ], + "flags": [ + "x", + "y", + "u", + "v", + "text", + "name" + ], + "valType": "flaglist" + }, + "hoverinfosrc": { + "description": "Sets the source reference on Chart Studio Cloud for `hoverinfo`.", + "editType": "none", + "valType": "string" + }, + "hoverlabel": { + "align": { + "arrayOk": true, + "description": "Sets the horizontal alignment of the text content within hover label box. Has an effect only if the hover label text spans more two or more lines", + "dflt": "auto", + "editType": "none", + "valType": "enumerated", + "values": [ + "left", + "right", + "auto" + ] + }, + "alignsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `align`.", + "editType": "none", + "valType": "string" + }, + "bgcolor": { + "arrayOk": true, + "description": "Sets the background color of the hover labels for this trace", + "editType": "none", + "valType": "color" + }, + "bgcolorsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `bgcolor`.", + "editType": "none", + "valType": "string" + }, + "bordercolor": { + "arrayOk": true, + "description": "Sets the border color of the hover labels for this trace.", + "editType": "none", + "valType": "color" + }, + "bordercolorsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `bordercolor`.", + "editType": "none", + "valType": "string" + }, + "editType": "none", + "font": { + "color": { + "arrayOk": true, + "editType": "none", + "valType": "color" + }, + "colorsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `color`.", + "editType": "none", + "valType": "string" + }, + "description": "Sets the font used in hover labels.", + "editType": "none", + "family": { + "arrayOk": true, + "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", + "editType": "none", + "noBlank": true, + "strict": true, + "valType": "string" + }, + "familysrc": { + "description": "Sets the source reference on Chart Studio Cloud for `family`.", + "editType": "none", + "valType": "string" + }, + "lineposition": { + "arrayOk": true, + "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", + "dflt": "none", + "editType": "none", + "extras": [ + "none" + ], + "flags": [ + "under", + "over", + "through" + ], + "valType": "flaglist" + }, + "linepositionsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `lineposition`.", + "editType": "none", + "valType": "string" + }, + "role": "object", + "shadow": { + "arrayOk": true, + "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", + "dflt": "none", + "editType": "none", + "valType": "string" + }, + "shadowsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `shadow`.", + "editType": "none", + "valType": "string" + }, + "size": { + "arrayOk": true, + "editType": "none", + "min": 1, + "valType": "number" + }, + "sizesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `size`.", + "editType": "none", + "valType": "string" + }, + "style": { + "arrayOk": true, + "description": "Sets whether a font should be styled with a normal or italic face from its family.", + "dflt": "normal", + "editType": "none", + "valType": "enumerated", + "values": [ + "normal", + "italic" + ] + }, + "stylesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `style`.", + "editType": "none", + "valType": "string" + }, + "textcase": { + "arrayOk": true, + "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", + "dflt": "normal", + "editType": "none", + "valType": "enumerated", + "values": [ + "normal", + "word caps", + "upper", + "lower" + ] + }, + "textcasesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `textcase`.", + "editType": "none", + "valType": "string" + }, + "variant": { + "arrayOk": true, + "description": "Sets the variant of the font.", + "dflt": "normal", + "editType": "none", + "valType": "enumerated", + "values": [ + "normal", + "small-caps", + "all-small-caps", + "all-petite-caps", + "petite-caps", + "unicase" + ] + }, + "variantsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `variant`.", + "editType": "none", + "valType": "string" + }, + "weight": { + "arrayOk": true, + "description": "Sets the weight (or boldness) of the font.", + "dflt": "normal", + "editType": "none", + "extras": [ + "normal", + "bold" + ], + "max": 1000, + "min": 1, + "valType": "integer" + }, + "weightsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `weight`.", + "editType": "none", + "valType": "string" + } + }, + "namelength": { + "arrayOk": true, + "description": "Sets the default length (in number of characters) of the trace name in the hover labels for all traces. -1 shows the whole name regardless of length. 0-3 shows the first 0-3 characters, and an integer >3 will show the whole name if it is less than that many characters, but if it is longer, will truncate to `namelength - 3` characters and add an ellipsis.", + "dflt": 15, + "editType": "none", + "min": -1, + "valType": "integer" + }, + "namelengthsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `namelength`.", + "editType": "none", + "valType": "string" + }, + "role": "object", + "showarrow": { + "description": "Sets whether or not to show the hover label arrow/triangle pointing to the data point.", + "dflt": true, + "editType": "none", + "valType": "boolean" + } + }, + "hovertemplate": { + "arrayOk": true, + "description": "Template string used for rendering the information that appear on hover box. Note that this will override `hoverinfo`. Variables are inserted using %{variable}, for example \"y: %{y}\" as well as %{xother}, {%_xother}, {%_xother_}, {%xother_}. When showing info for several points, *xother* will be added to those with different x positions from the first point. An underscore before or after *(x|y)other* will add a space on that side, only when this field is shown. Numbers are formatted using d3-format's syntax %{variable:d3-format}, for example \"Price: %{y:$.2f}\". https://github.com/d3/d3-format/tree/v1.4.5#d3-format for details on the formatting syntax. Dates are formatted using d3-time-format's syntax %{variable|d3-time-format}, for example \"Day: %{2019-01-01|%A}\". https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format for details on the date formatting syntax. The variables available in `hovertemplate` are the ones emitted as event data described at this link https://plotly.com/javascript/plotlyjs-events/#event-data. Additionally, every attributes that can be specified per-point (the ones that are `arrayOk: true`) are available. Finally, the template string has access to variables `x`, `y`, `u`, `v`, `text` and `name`. Anything contained in tag `` is displayed in the secondary box, for example `%{fullData.name}`. To hide the secondary box completely, use an empty tag ``.", + "dflt": "", + "editType": "none", + "valType": "string" + }, + "hovertemplatesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `hovertemplate`.", + "editType": "none", + "valType": "string" + }, + "ids": { + "anim": true, + "description": "Assigns id labels to each datum. These ids for object constancy of data points during animation. Should be an array of strings, not numbers or any other type.", + "editType": "calc", + "valType": "data_array" + }, + "idssrc": { + "description": "Sets the source reference on Chart Studio Cloud for `ids`.", + "editType": "none", + "valType": "string" + }, + "legend": { + "description": "Sets the reference to a legend to show this trace in. References to these legends are *legend*, *legend2*, *legend3*, etc. Settings for these legends are set in the layout, under `layout.legend`, `layout.legend2`, etc.", + "dflt": "legend", + "editType": "style", + "valType": "subplotid" + }, + "legendgroup": { + "description": "Sets the legend group for this trace. Traces and shapes part of the same legend group hide/show at the same time when toggling legend items.", + "dflt": "", + "editType": "style", + "valType": "string" + }, + "legendgrouptitle": { + "editType": "style", + "font": { + "color": { + "editType": "style", + "valType": "color" + }, + "description": "Sets this legend group's title font.", + "editType": "style", + "family": { + "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", + "editType": "style", + "noBlank": true, + "strict": true, + "valType": "string" + }, + "lineposition": { + "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", + "dflt": "none", + "editType": "style", + "extras": [ + "none" + ], + "flags": [ + "under", + "over", + "through" + ], + "valType": "flaglist" + }, + "role": "object", + "shadow": { + "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", + "dflt": "none", + "editType": "style", + "valType": "string" + }, + "size": { + "editType": "style", + "min": 1, + "valType": "number" + }, + "style": { + "description": "Sets whether a font should be styled with a normal or italic face from its family.", + "dflt": "normal", + "editType": "style", + "valType": "enumerated", + "values": [ + "normal", + "italic" + ] + }, + "textcase": { + "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", + "dflt": "normal", + "editType": "style", + "valType": "enumerated", + "values": [ + "normal", + "word caps", + "upper", + "lower" + ] + }, + "variant": { + "description": "Sets the variant of the font.", + "dflt": "normal", + "editType": "style", + "valType": "enumerated", + "values": [ + "normal", + "small-caps", + "all-small-caps", + "all-petite-caps", + "petite-caps", + "unicase" + ] + }, + "weight": { + "description": "Sets the weight (or boldness) of the font.", + "dflt": "normal", + "editType": "style", + "extras": [ + "normal", + "bold" + ], + "max": 1000, + "min": 1, + "valType": "integer" + } + }, + "role": "object", + "text": { + "description": "Sets the title of the legend group.", + "dflt": "", + "editType": "style", + "valType": "string" + } + }, + "legendrank": { + "description": "Sets the legend rank for this trace. Items and groups with smaller ranks are presented on top/left side while with *reversed* `legend.traceorder` they are on bottom/right side. The default legendrank is 1000, so that you can use ranks less than 1000 to place certain items before all unranked items, and ranks greater than 1000 to go after all unranked items. When having unranked or equal rank items shapes would be displayed after traces i.e. according to their order in data and layout.", + "dflt": 1000, + "editType": "style", + "valType": "number" + }, + "legendwidth": { + "description": "Sets the width (in px or fraction) of the legend for this trace.", + "editType": "style", + "min": 0, + "valType": "number" + }, + "line": { + "color": { + "description": "Sets the color of the arrow lines.", + "dflt": "#000", + "editType": "style", + "valType": "color" + }, + "dash": { + "description": "Sets the dash style of lines. Set to a dash type string (*solid*, *dot*, *dash*, *longdash*, *dashdot*, or *longdashdot*) or a dash length list in px (eg *5px,10px,2px,2px*).", + "dflt": "solid", + "editType": "style", + "valType": "string", + "values": [ + "solid", + "dot", + "dash", + "longdash", + "dashdot", + "longdashdot" + ] + }, + "editType": "style", + "role": "object", + "shape": { + "description": "Determines the line shape.", + "dflt": "linear", + "editType": "plot", + "valType": "enumerated", + "values": [ + "linear", + "spline", + "hv", + "vh", + "hvh", + "vhv" + ] + }, + "simplify": { + "description": "Simplifies lines by removing nearly-overlapping points.", + "dflt": true, + "editType": "plot", + "valType": "boolean" + }, + "smoothing": { + "description": "Has an effect only if `shape` is set to *spline*. Sets the amount of smoothing.", + "dflt": 1, + "editType": "plot", + "max": 1.3, + "min": 0, + "valType": "number" + }, + "width": { + "description": "Sets the width (in px) of the arrow lines.", + "dflt": 1, + "editType": "style", + "min": 0, + "valType": "number" + } + }, + "meta": { + "arrayOk": true, + "description": "Assigns extra meta information associated with this trace that can be used in various text attributes. Attributes such as trace `name`, graph, axis and colorbar `title.text`, annotation `text` `rangeselector`, `updatemenues` and `sliders` `label` text all support `meta`. To access the trace `meta` values in an attribute in the same trace, simply use `%{meta[i]}` where `i` is the index or key of the `meta` item in question. To access trace `meta` in layout attributes, use `%{data[n[.meta[i]}` where `i` is the index or key of the `meta` and `n` is the trace index.", + "editType": "plot", + "valType": "any" + }, + "metasrc": { + "description": "Sets the source reference on Chart Studio Cloud for `meta`.", + "editType": "none", + "valType": "string" + }, + "name": { + "description": "Sets the trace name. The trace name appears as the legend item and on hover.", + "editType": "style", + "valType": "string" + }, + "opacity": { + "description": "Sets the opacity of the trace.", + "dflt": 1, + "editType": "style", + "max": 1, + "min": 0, + "valType": "number" + }, + "scale": { + "description": "Scales size of the arrows (ideally to avoid overlap). Default = 0.1", + "dflt": 0.1, + "editType": "calc", + "max": 1, + "min": 0, + "valType": "number" + }, + "scaleratio": { + "description": "The ratio between the scale of the y-axis and the scale of the x-axis (scale_y / scale_x). Default = null, the scale ratio is not fixed.", + "editType": "calc", + "min": 0, + "valType": "number" + }, + "selected": { + "editType": "style", + "line": { + "color": { + "description": "Sets the line color of selected points.", + "editType": "style", + "valType": "color" + }, + "editType": "style", + "role": "object", + "width": { + "description": "Sets the line width of selected points.", + "editType": "style", + "min": 0, + "valType": "number" + } + }, + "role": "object", + "textfont": { + "color": { + "description": "Sets the text font color of selected points, applied only when a selection exists.", + "editType": "style", + "valType": "color" + }, + "editType": "style", + "role": "object" + } + }, + "selectedpoints": { + "description": "Array containing integer indices of selected points. Has an effect only for traces that support selections. Note that an empty array means an empty selection where the `unselected` are turned on for all points, whereas, any other non-array values means no selection all where the `selected` and `unselected` styles have no effect.", + "editType": "calc", + "valType": "any" + }, + "showlegend": { + "description": "Determines whether or not an item corresponding to this trace is shown in the legend.", + "dflt": true, + "editType": "style", + "valType": "boolean" + }, + "stream": { + "editType": "calc", + "maxpoints": { + "description": "Sets the maximum number of points to keep on the plots from an incoming stream. If `maxpoints` is set to *50*, only the newest 50 points will be displayed on the plot.", + "dflt": 500, + "editType": "calc", + "max": 10000, + "min": 0, + "valType": "number" + }, + "role": "object", + "token": { + "description": "The stream id number links a data trace on a plot with a stream. See https://chart-studio.plotly.com/settings for more details.", + "editType": "calc", + "noBlank": true, + "strict": true, + "valType": "string" + } + }, + "text": { + "anim": true, + "description": "Sets text elements associated with each (x,y) pair.", + "editType": "calc", + "valType": "data_array" + }, + "textfont": { + "color": { + "arrayOk": true, + "editType": "style", + "valType": "color" + }, + "colorsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `color`.", + "editType": "none", + "valType": "string" + }, + "description": "Sets the text font.", + "editType": "calc", + "family": { + "arrayOk": true, + "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", + "editType": "calc", + "noBlank": true, + "strict": true, + "valType": "string" + }, + "familysrc": { + "description": "Sets the source reference on Chart Studio Cloud for `family`.", + "editType": "none", + "valType": "string" + }, + "lineposition": { + "arrayOk": true, + "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", + "dflt": "none", + "editType": "calc", + "extras": [ + "none" + ], + "flags": [ + "under", + "over", + "through" + ], + "valType": "flaglist" + }, + "linepositionsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `lineposition`.", + "editType": "none", + "valType": "string" + }, + "role": "object", + "shadow": { + "arrayOk": true, + "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", + "dflt": "none", + "editType": "calc", + "valType": "string" + }, + "shadowsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `shadow`.", + "editType": "none", + "valType": "string" + }, + "size": { + "arrayOk": true, + "editType": "calc", + "min": 1, + "valType": "number" + }, + "sizesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `size`.", + "editType": "none", + "valType": "string" + }, + "style": { + "arrayOk": true, + "description": "Sets whether a font should be styled with a normal or italic face from its family.", + "dflt": "normal", + "editType": "calc", + "valType": "enumerated", + "values": [ + "normal", + "italic" + ] + }, + "stylesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `style`.", + "editType": "none", + "valType": "string" + }, + "textcase": { + "arrayOk": true, + "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", + "dflt": "normal", + "editType": "calc", + "valType": "enumerated", + "values": [ + "normal", + "word caps", + "upper", + "lower" + ] + }, + "textcasesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `textcase`.", + "editType": "none", + "valType": "string" + }, + "variant": { + "arrayOk": true, + "description": "Sets the variant of the font.", + "dflt": "normal", + "editType": "calc", + "valType": "enumerated", + "values": [ + "normal", + "small-caps", + "all-small-caps", + "all-petite-caps", + "petite-caps", + "unicase" + ] + }, + "variantsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `variant`.", + "editType": "none", + "valType": "string" + }, + "weight": { + "arrayOk": true, + "description": "Sets the weight (or boldness) of the font.", + "dflt": "normal", + "editType": "calc", + "extras": [ + "normal", + "bold" + ], + "max": 1000, + "min": 1, + "valType": "integer" + }, + "weightsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `weight`.", + "editType": "none", + "valType": "string" + } + }, + "textposition": { + "description": "Sets the positions of the `text` elements with respects to the (x,y) coordinates.", + "dflt": "middle center", + "editType": "calc", + "valType": "enumerated", + "values": [ + "top left", + "top center", + "top right", + "middle left", + "middle center", + "middle right", + "bottom left", + "bottom center", + "bottom right" + ] + }, + "textsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `text`.", + "editType": "none", + "valType": "string" + }, + "type": "quiver", + "u": { + "anim": true, + "description": "Sets the x components of the arrow vectors.", + "editType": "calc", + "valType": "data_array" + }, + "uid": { + "anim": true, + "description": "Assign an id to this trace, Use this to provide object constancy between traces during animations and transitions.", + "editType": "plot", + "valType": "string" + }, + "uirevision": { + "description": "Controls persistence of some user-driven changes to the trace: `constraintrange` in `parcoords` traces, as well as some `editable: true` modifications such as `name` and `colorbar.title`. Defaults to `layout.uirevision`. Note that other user-driven trace attribute changes are controlled by `layout` attributes: `trace.visible` is controlled by `layout.legend.uirevision`, `selectedpoints` is controlled by `layout.selectionrevision`, and `colorbar.(x|y)` (accessible with `config: {editable: true}`) is controlled by `layout.editrevision`. Trace changes are tracked by `uid`, which only falls back on trace index if no `uid` is provided. So if your app can add/remove traces before the end of the `data` array, such that the same trace has a different index, you can still preserve user-driven changes if you give each trace a `uid` that stays with it as it moves.", + "editType": "none", + "valType": "any" + }, + "unselected": { + "editType": "style", + "line": { + "color": { + "description": "Sets the line color of unselected points.", + "editType": "style", + "valType": "color" + }, + "editType": "style", + "role": "object", + "width": { + "description": "Sets the line width of unselected points.", + "editType": "style", + "min": 0, + "valType": "number" + } + }, + "role": "object", + "textfont": { + "color": { + "description": "Sets the text font color of unselected points, applied only when a selection exists.", + "editType": "style", + "valType": "color" + }, + "editType": "style", + "role": "object" + } + }, + "usrc": { + "description": "Sets the source reference on Chart Studio Cloud for `u`.", + "editType": "none", + "valType": "string" + }, + "v": { + "anim": true, + "description": "Sets the y components of the arrow vectors.", + "editType": "calc", + "valType": "data_array" + }, + "visible": { + "description": "Determines whether or not this trace is visible. If *legendonly*, the trace is not drawn, but can appear as a legend item (provided that the legend itself is visible).", + "dflt": true, + "editType": "calc", + "valType": "enumerated", + "values": [ + true, + false, + "legendonly" + ] + }, + "vsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `v`.", + "editType": "none", + "valType": "string" + }, + "x": { + "anim": true, + "description": "Sets the x coordinates of the arrow locations.", + "editType": "calc+clearAxisTypes", + "valType": "data_array" + }, + "xaxis": { + "description": "Sets a reference between this trace's x coordinates and a 2D cartesian x axis. If *x* (the default value), the x coordinates refer to `layout.xaxis`. If *x2*, the x coordinates refer to `layout.xaxis2`, and so on.", + "dflt": "x", + "editType": "calc+clearAxisTypes", + "valType": "subplotid" + }, + "xsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `x`.", + "editType": "none", + "valType": "string" + }, + "y": { + "anim": true, + "description": "Sets the y coordinates of the arrow locations.", + "editType": "calc+clearAxisTypes", + "valType": "data_array" + }, + "yaxis": { + "description": "Sets a reference between this trace's y coordinates and a 2D cartesian y axis. If *y* (the default value), the y coordinates refer to `layout.yaxis`. If *y2*, the y coordinates refer to `layout.yaxis2`, and so on.", + "dflt": "y", + "editType": "calc+clearAxisTypes", + "valType": "subplotid" + }, + "ysrc": { + "description": "Sets the source reference on Chart Studio Cloud for `y`.", + "editType": "none", + "valType": "string" + } + }, + "categories": [ + "cartesian", + "svg", + "showLegend", + "scatter-like", + "zoomScale" + ], + "meta": { + "description": "The quiver trace type visualizes vector fields using arrows. Specify a vector field using 4 1D arrays: 2 position arrays `x`, `y` and 2 vector component arrays `u`, `v`. The arrows are drawn exactly at the positions given by `x` and `y`. Arrow length and direction are determined by `u` and `v` components." + }, + "type": "quiver" + }, + "scattersmith": { + "animatable": false, + "attributes": { + "cliponaxis": { + "description": "Determines whether or not markers and text nodes are clipped about the subplot axes. To show markers and text nodes above axis lines and tick labels, make sure to set `xaxis.layer` and `yaxis.layer` to *below traces*.", + "dflt": false, + "editType": "plot", + "valType": "boolean" + }, + "connectgaps": { + "description": "Determines whether or not gaps (i.e. {nan} or missing values) in the provided data arrays are connected.", + "dflt": false, + "editType": "calc", + "valType": "boolean" + }, + "customdata": { + "description": "Assigns extra data each datum. This may be useful when listening to hover, click and selection events. Note that, *scatter* traces also appends customdata items in the markers DOM elements", + "editType": "calc", + "valType": "data_array" + }, + "customdatasrc": { + "description": "Sets the source reference on Chart Studio Cloud for `customdata`.", + "editType": "none", + "valType": "string" + }, + "fill": { + "description": "Sets the area to fill with a solid color. Use with `fillcolor` if not *none*. scattersmith has a subset of the options available to scatter. *toself* connects the endpoints of the trace (or each segment of the trace if it has gaps) into a closed shape. *tonext* fills the space between two traces if one completely encloses the other (eg consecutive contour lines), and behaves like *toself* if there is no trace before it. *tonext* should not be used if one trace does not enclose the other.", + "dflt": "none", + "editType": "calc", + "valType": "enumerated", + "values": [ + "none", + "toself", + "tonext" + ] + }, + "fillcolor": { + "description": "Sets the fill color. Defaults to a half-transparent variant of the line color, marker color, or marker line color, whichever is available.", + "editType": "style", + "valType": "color" + }, + "hoverinfo": { + "arrayOk": true, + "description": "Determines which trace information appear on hover. If `none` or `skip` are set, no information is displayed upon hovering. But, if `none` is set, click and hover events are still fired.", + "dflt": "all", + "editType": "none", + "extras": [ + "all", + "none", + "skip" + ], + "flags": [ + "real", + "imag", + "text", + "name" + ], + "valType": "flaglist" + }, + "hoverinfosrc": { + "description": "Sets the source reference on Chart Studio Cloud for `hoverinfo`.", + "editType": "none", + "valType": "string" + }, + "hoverlabel": { + "align": { + "arrayOk": true, + "description": "Sets the horizontal alignment of the text content within hover label box. Has an effect only if the hover label text spans more two or more lines", + "dflt": "auto", + "editType": "none", + "valType": "enumerated", + "values": [ + "left", + "right", + "auto" + ] + }, + "alignsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `align`.", + "editType": "none", + "valType": "string" + }, + "bgcolor": { + "arrayOk": true, + "description": "Sets the background color of the hover labels for this trace", + "editType": "none", + "valType": "color" + }, + "bgcolorsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `bgcolor`.", + "editType": "none", + "valType": "string" + }, + "bordercolor": { + "arrayOk": true, + "description": "Sets the border color of the hover labels for this trace.", + "editType": "none", + "valType": "color" + }, + "bordercolorsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `bordercolor`.", + "editType": "none", + "valType": "string" + }, + "editType": "none", + "font": { + "color": { + "arrayOk": true, + "editType": "none", + "valType": "color" + }, + "colorsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `color`.", + "editType": "none", + "valType": "string" + }, + "description": "Sets the font used in hover labels.", + "editType": "none", + "family": { + "arrayOk": true, + "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", + "editType": "none", + "noBlank": true, + "strict": true, + "valType": "string" + }, + "familysrc": { + "description": "Sets the source reference on Chart Studio Cloud for `family`.", + "editType": "none", + "valType": "string" + }, + "lineposition": { + "arrayOk": true, + "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", + "dflt": "none", + "editType": "none", + "extras": [ + "none" + ], + "flags": [ + "under", + "over", + "through" + ], + "valType": "flaglist" + }, + "linepositionsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `lineposition`.", + "editType": "none", + "valType": "string" + }, + "role": "object", + "shadow": { + "arrayOk": true, + "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", + "dflt": "none", + "editType": "none", + "valType": "string" + }, + "shadowsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `shadow`.", + "editType": "none", + "valType": "string" + }, + "size": { + "arrayOk": true, + "editType": "none", + "min": 1, + "valType": "number" + }, + "sizesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `size`.", + "editType": "none", + "valType": "string" + }, + "style": { + "arrayOk": true, + "description": "Sets whether a font should be styled with a normal or italic face from its family.", + "dflt": "normal", + "editType": "none", + "valType": "enumerated", + "values": [ + "normal", + "italic" + ] + }, + "stylesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `style`.", + "editType": "none", + "valType": "string" + }, + "textcase": { + "arrayOk": true, + "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", + "dflt": "normal", + "editType": "none", + "valType": "enumerated", + "values": [ + "normal", + "word caps", + "upper", + "lower" + ] + }, + "textcasesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `textcase`.", + "editType": "none", + "valType": "string" + }, + "variant": { + "arrayOk": true, + "description": "Sets the variant of the font.", + "dflt": "normal", + "editType": "none", + "valType": "enumerated", + "values": [ + "normal", + "small-caps", + "all-small-caps", + "all-petite-caps", + "petite-caps", + "unicase" + ] + }, + "variantsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `variant`.", + "editType": "none", + "valType": "string" + }, + "weight": { + "arrayOk": true, + "description": "Sets the weight (or boldness) of the font.", + "dflt": "normal", + "editType": "none", + "extras": [ + "normal", + "bold" + ], + "max": 1000, + "min": 1, + "valType": "integer" + }, + "weightsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `weight`.", + "editType": "none", + "valType": "string" + } + }, + "namelength": { + "arrayOk": true, + "description": "Sets the default length (in number of characters) of the trace name in the hover labels for all traces. -1 shows the whole name regardless of length. 0-3 shows the first 0-3 characters, and an integer >3 will show the whole name if it is less than that many characters, but if it is longer, will truncate to `namelength - 3` characters and add an ellipsis.", + "dflt": 15, + "editType": "none", + "min": -1, + "valType": "integer" + }, + "namelengthsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `namelength`.", + "editType": "none", + "valType": "string" + }, + "role": "object", + "showarrow": { + "description": "Sets whether or not to show the hover label arrow/triangle pointing to the data point.", + "dflt": true, + "editType": "none", + "valType": "boolean" + } + }, + "hoveron": { + "description": "Do the hover effects highlight individual points (markers or line points) or do they highlight filled regions? If the fill is *toself* or *tonext* and there are no markers or text, then the default is *fills*, otherwise it is *points*.", + "editType": "style", + "flags": [ + "points", + "fills" + ], + "valType": "flaglist" + }, + "hovertemplate": { + "arrayOk": true, + "description": "Template string used for rendering the information that appear on hover box. Note that this will override `hoverinfo`. Variables are inserted using %{variable}, for example \"y: %{y}\" as well as %{xother}, {%_xother}, {%_xother_}, {%xother_}. When showing info for several points, *xother* will be added to those with different x positions from the first point. An underscore before or after *(x|y)other* will add a space on that side, only when this field is shown. Numbers are formatted using d3-format's syntax %{variable:d3-format}, for example \"Price: %{y:$.2f}\". https://github.com/d3/d3-format/tree/v1.4.5#d3-format for details on the formatting syntax. Dates are formatted using d3-time-format's syntax %{variable|d3-time-format}, for example \"Day: %{2019-01-01|%A}\". https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format for details on the date formatting syntax. Variables that can't be found will be replaced with the specifier. For example, a template of \"data: %{x}, %{y}\" will result in a value of \"data: 1, %{y}\" if x is 1 and y is missing. Variables with an undefined value will be replaced with the fallback value. The variables available in `hovertemplate` are the ones emitted as event data described at this link https://plotly.com/javascript/plotlyjs-events/#event-data. Additionally, all attributes that can be specified per-point (the ones that are `arrayOk: true`) are available. Anything contained in tag `` is displayed in the secondary box, for example `%{fullData.name}`. To hide the secondary box completely, use an empty tag ``.", + "dflt": "", + "editType": "none", + "valType": "string" + }, + "hovertemplatefallback": { + "description": "Fallback string that's displayed when a variable referenced in a template is missing. If the boolean value 'false' is passed in, the specifier with the missing variable will be displayed.", + "dflt": "-", + "editType": "none", + "valType": "any" + }, + "hovertemplatesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `hovertemplate`.", + "editType": "none", + "valType": "string" + }, + "hovertext": { + "arrayOk": true, + "description": "Sets hover text elements associated with each (x,y) pair. If a single string, the same string appears over all the data points. If an array of string, the items are mapped in order to the this trace's (x,y) coordinates. To be seen, trace `hoverinfo` must contain a *text* flag.", + "dflt": "", + "editType": "style", + "valType": "string" + }, + "hovertextsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `hovertext`.", + "editType": "none", + "valType": "string" + }, + "ids": { + "description": "Assigns id labels to each datum. These ids for object constancy of data points during animation. Should be an array of strings, not numbers or any other type.", + "editType": "calc", + "valType": "data_array" + }, + "idssrc": { + "description": "Sets the source reference on Chart Studio Cloud for `ids`.", + "editType": "none", + "valType": "string" + }, + "imag": { + "description": "Sets the imaginary component of the data, in units of normalized impedance such that real=1, imag=0 is the center of the chart.", + "editType": "calc+clearAxisTypes", + "valType": "data_array" + }, + "imagsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `imag`.", + "editType": "none", + "valType": "string" + }, + "legend": { + "description": "Sets the reference to a legend to show this trace in. References to these legends are *legend*, *legend2*, *legend3*, etc. Settings for these legends are set in the layout, under `layout.legend`, `layout.legend2`, etc.", + "dflt": "legend", + "editType": "style", + "valType": "subplotid" + }, + "legendgroup": { + "description": "Sets the legend group for this trace. Traces and shapes part of the same legend group hide/show at the same time when toggling legend items.", + "dflt": "", + "editType": "style", + "valType": "string" + }, + "legendgrouptitle": { + "editType": "style", + "font": { + "color": { + "editType": "style", + "valType": "color" + }, + "description": "Sets this legend group's title font.", + "editType": "style", + "family": { + "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", + "editType": "style", + "noBlank": true, + "strict": true, + "valType": "string" + }, + "lineposition": { + "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", + "dflt": "none", + "editType": "style", + "extras": [ + "none" + ], + "flags": [ + "under", + "over", + "through" + ], + "valType": "flaglist" + }, + "role": "object", + "shadow": { + "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", + "dflt": "none", + "editType": "style", + "valType": "string" + }, + "size": { + "editType": "style", + "min": 1, + "valType": "number" + }, + "style": { + "description": "Sets whether a font should be styled with a normal or italic face from its family.", + "dflt": "normal", + "editType": "style", + "valType": "enumerated", + "values": [ + "normal", + "italic" + ] + }, + "textcase": { + "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", + "dflt": "normal", + "editType": "style", + "valType": "enumerated", + "values": [ + "normal", + "word caps", + "upper", + "lower" + ] + }, + "variant": { + "description": "Sets the variant of the font.", + "dflt": "normal", + "editType": "style", + "valType": "enumerated", + "values": [ + "normal", + "small-caps", + "all-small-caps", + "all-petite-caps", + "petite-caps", + "unicase" + ] + }, + "weight": { + "description": "Sets the weight (or boldness) of the font.", + "dflt": "normal", + "editType": "style", + "extras": [ + "normal", + "bold" + ], + "max": 1000, + "min": 1, + "valType": "integer" + } + }, + "role": "object", + "text": { + "description": "Sets the title of the legend group.", + "dflt": "", + "editType": "style", + "valType": "string" + } + }, + "legendrank": { + "description": "Sets the legend rank for this trace. Items and groups with smaller ranks are presented on top/left side while with *reversed* `legend.traceorder` they are on bottom/right side. The default legendrank is 1000, so that you can use ranks less than 1000 to place certain items before all unranked items, and ranks greater than 1000 to go after all unranked items. When having unranked or equal rank items shapes would be displayed after traces i.e. according to their order in data and layout.", + "dflt": 1000, + "editType": "style", + "valType": "number" + }, + "legendwidth": { + "description": "Sets the width (in px or fraction) of the legend for this trace.", + "editType": "style", + "min": 0, + "valType": "number" + }, + "line": { + "backoff": { + "arrayOk": true, + "description": "Sets the line back off from the end point of the nth line segment (in px). This option is useful e.g. to avoid overlap with arrowhead markers. With *auto* the lines would trim before markers if `marker.angleref` is set to *previous*.", + "dflt": "auto", + "editType": "plot", + "min": 0, + "valType": "number" + }, + "backoffsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `backoff`.", + "editType": "none", + "valType": "string" + }, + "color": { + "description": "Sets the line color.", + "editType": "style", + "valType": "color" + }, + "dash": { + "description": "Sets the dash style of lines. Set to a dash type string (*solid*, *dot*, *dash*, *longdash*, *dashdot*, or *longdashdot*) or a dash length list in px (eg *5px,10px,2px,2px*).", + "dflt": "solid", + "editType": "style", + "valType": "string", + "values": [ + "solid", + "dot", + "dash", + "longdash", + "dashdot", + "longdashdot" + ] + }, + "editType": "calc", + "role": "object", + "shape": { + "description": "Determines the line shape. With *spline* the lines are drawn using spline interpolation. The other available values correspond to step-wise line shapes.", + "dflt": "linear", + "editType": "plot", + "valType": "enumerated", + "values": [ + "linear", + "spline" + ] + }, + "smoothing": { + "description": "Has an effect only if `shape` is set to *spline* Sets the amount of smoothing. *0* corresponds to no smoothing (equivalent to a *linear* shape).", + "dflt": 1, + "editType": "plot", + "max": 1.3, + "min": 0, + "valType": "number" + }, + "width": { + "description": "Sets the line width (in px).", + "dflt": 2, + "editType": "style", + "min": 0, + "valType": "number" + } + }, + "marker": { + "angle": { + "arrayOk": true, + "description": "Sets the marker angle in respect to `angleref`.", + "dflt": 0, + "editType": "plot", + "valType": "angle" + }, + "angleref": { + "description": "Sets the reference for marker angle. With *previous*, angle 0 points along the line from the previous point to this one. With *up*, angle 0 points toward the top of the screen.", + "dflt": "up", + "editType": "plot", + "valType": "enumerated", + "values": [ + "previous", + "up" + ] + }, + "anglesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `angle`.", + "editType": "none", + "valType": "string" + }, + "autocolorscale": { + "description": "Determines whether the colorscale is a default palette (`autocolorscale: true`) or the palette determined by `marker.colorscale`. Has an effect only if in `marker.color` is set to a numerical array. In case `colorscale` is unspecified or `autocolorscale` is true, the default palette will be chosen according to whether numbers in the `color` array are all positive, all negative or mixed.", + "dflt": true, + "editType": "calc", + "impliedEdits": {}, + "valType": "boolean" + }, + "cauto": { + "description": "Determines whether or not the color domain is computed with respect to the input data (here in `marker.color`) or the bounds set in `marker.cmin` and `marker.cmax` Has an effect only if in `marker.color` is set to a numerical array. Defaults to `false` when `marker.cmin` and `marker.cmax` are set by the user.", + "dflt": true, + "editType": "calc", + "impliedEdits": {}, + "valType": "boolean" + }, + "cmax": { + "description": "Sets the upper bound of the color domain. Has an effect only if in `marker.color` is set to a numerical array. Value should have the same units as in `marker.color` and if set, `marker.cmin` must be set as well.", + "dflt": null, + "editType": "plot", + "impliedEdits": { + "cauto": false + }, + "valType": "number" + }, + "cmid": { + "description": "Sets the mid-point of the color domain by scaling `marker.cmin` and/or `marker.cmax` to be equidistant to this point. Has an effect only if in `marker.color` is set to a numerical array. Value should have the same units as in `marker.color`. Has no effect when `marker.cauto` is `false`.", + "dflt": null, + "editType": "calc", + "impliedEdits": {}, + "valType": "number" + }, + "cmin": { + "description": "Sets the lower bound of the color domain. Has an effect only if in `marker.color` is set to a numerical array. Value should have the same units as in `marker.color` and if set, `marker.cmax` must be set as well.", + "dflt": null, + "editType": "plot", + "impliedEdits": { + "cauto": false + }, + "valType": "number" + }, + "color": { + "arrayOk": true, + "description": "Sets the marker color. It accepts either a specific color or an array of numbers that are mapped to the colorscale relative to the max and min values of the array or relative to `marker.cmin` and `marker.cmax` if set.", + "editType": "style", + "valType": "color" + }, + "coloraxis": { + "description": "Sets a reference to a shared color axis. References to these shared color axes are *coloraxis*, *coloraxis2*, *coloraxis3*, etc. Settings for these shared color axes are set in the layout, under `layout.coloraxis`, `layout.coloraxis2`, etc. Note that multiple color scales can be linked to the same color axis.", + "dflt": null, + "editType": "calc", + "regex": "/^coloraxis([2-9]|[1-9][0-9]+)?$/", + "valType": "subplotid" + }, + "colorbar": { + "bgcolor": { + "description": "Sets the color of padded area.", + "dflt": "rgba(0,0,0,0)", + "editType": "colorbars", + "valType": "color" + }, + "bordercolor": { + "description": "Sets the axis line color.", + "dflt": "#444", + "editType": "colorbars", + "valType": "color" + }, + "borderwidth": { + "description": "Sets the width (in px) or the border enclosing this color bar.", + "dflt": 0, + "editType": "colorbars", + "min": 0, + "valType": "number" + }, + "dtick": { + "description": "Sets the step in-between ticks on this axis. Use with `tick0`. Must be a positive number, or special strings available to *log* and *date* axes. If the axis `type` is *log*, then ticks are set every 10^(n*dtick) where n is the tick number. For example, to set a tick mark at 1, 10, 100, 1000, ... set dtick to 1. To set tick marks at 1, 100, 10000, ... set dtick to 2. To set tick marks at 1, 5, 25, 125, 625, 3125, ... set dtick to log_10(5), or 0.69897000433. *log* has several special values; *L*, where `f` is a positive number, gives ticks linearly spaced in value (but not position). For example `tick0` = 0.1, `dtick` = *L0.5* will put ticks at 0.1, 0.6, 1.1, 1.6 etc. To show powers of 10 plus small digits between, use *D1* (all digits) or *D2* (only 2 and 5). `tick0` is ignored for *D1* and *D2*. If the axis `type` is *date*, then you must convert the time to milliseconds. For example, to set the interval between ticks to one day, set `dtick` to 86400000.0. *date* also has special values *M* gives ticks spaced by a number of months. `n` must be a positive integer. To set ticks on the 15th of every third month, set `tick0` to *2000-01-15* and `dtick` to *M3*. To set ticks every 4 years, set `dtick` to *M48*", + "editType": "colorbars", + "impliedEdits": { + "tickmode": "linear" + }, + "valType": "any" + }, + "editType": "colorbars", + "exponentformat": { + "description": "Determines a formatting rule for the tick exponents. For example, consider the number 1,000,000,000. If *none*, it appears as 1,000,000,000. If *e*, 1e+9. If *E*, 1E+9. If *power*, 1x10^9 (with 9 in a super script). If *SI*, 1G. If *B*, 1B. *SI* uses prefixes from \"femto\" f (10^-15) to \"tera\" T (10^12). *SI extended* covers instead the full SI range from \"quecto\" q (10^-30) to \"quetta\" Q (10^30). If *SI* or *SI extended* is used and the exponent is beyond the above ranges, the formatting rule will automatically be switched to the power notation.", + "dflt": "B", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "none", + "e", + "E", + "power", + "SI", + "B", + "SI extended" + ] + }, + "labelalias": { + "description": "Replacement text for specific tick or hover labels. For example using {US: 'USA', CA: 'Canada'} changes US to USA and CA to Canada. The labels we would have shown must match the keys exactly, after adding any tickprefix or ticksuffix. For negative numbers the minus sign symbol used (U+2212) is wider than the regular ascii dash. That means you need to use −1 instead of -1. labelalias can be used with any axis type, and both keys (if needed) and values (if desired) can include html-like tags or MathJax.", + "dflt": false, + "editType": "colorbars", + "valType": "any" + }, + "len": { + "description": "Sets the length of the color bar This measure excludes the padding of both ends. That is, the color bar length is this length minus the padding on both ends.", + "dflt": 1, + "editType": "colorbars", + "min": 0, + "valType": "number" + }, + "lenmode": { + "description": "Determines whether this color bar's length (i.e. the measure in the color variation direction) is set in units of plot *fraction* or in *pixels. Use `len` to set the value.", + "dflt": "fraction", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "fraction", + "pixels" + ] + }, + "minexponent": { + "description": "Hide SI prefix for 10^n if |n| is below this number. This only has an effect when `tickformat` is *SI* or *B*.", + "dflt": 3, + "editType": "colorbars", + "min": 0, + "valType": "number" + }, + "nticks": { + "description": "Specifies the maximum number of ticks for the particular axis. The actual number of ticks will be chosen automatically to be less than or equal to `nticks`. Has an effect only if `tickmode` is set to *auto*.", + "dflt": 0, + "editType": "colorbars", + "min": 0, + "valType": "integer" + }, + "orientation": { + "description": "Sets the orientation of the colorbar.", + "dflt": "v", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "h", + "v" + ] + }, + "outlinecolor": { + "description": "Sets the axis line color.", + "dflt": "#444", + "editType": "colorbars", + "valType": "color" + }, + "outlinewidth": { + "description": "Sets the width (in px) of the axis line.", + "dflt": 1, + "editType": "colorbars", + "min": 0, + "valType": "number" + }, + "role": "object", + "separatethousands": { + "description": "If \"true\", even 4-digit integers are separated", + "dflt": false, + "editType": "colorbars", + "valType": "boolean" + }, + "showexponent": { + "description": "If *all*, all exponents are shown besides their significands. If *first*, only the exponent of the first tick is shown. If *last*, only the exponent of the last tick is shown. If *none*, no exponents appear.", + "dflt": "all", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "all", + "first", + "last", + "none" + ] + }, + "showticklabels": { + "description": "Determines whether or not the tick labels are drawn.", + "dflt": true, + "editType": "colorbars", + "valType": "boolean" + }, + "showtickprefix": { + "description": "If *all*, all tick labels are displayed with a prefix. If *first*, only the first tick is displayed with a prefix. If *last*, only the last tick is displayed with a suffix. If *none*, tick prefixes are hidden.", + "dflt": "all", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "all", + "first", + "last", + "none" + ] + }, + "showticksuffix": { + "description": "Same as `showtickprefix` but for tick suffixes.", + "dflt": "all", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "all", + "first", + "last", + "none" + ] + }, + "thickness": { + "description": "Sets the thickness of the color bar This measure excludes the size of the padding, ticks and labels.", + "dflt": 30, + "editType": "colorbars", + "min": 0, + "valType": "number" + }, + "thicknessmode": { + "description": "Determines whether this color bar's thickness (i.e. the measure in the constant color direction) is set in units of plot *fraction* or in *pixels*. Use `thickness` to set the value.", + "dflt": "pixels", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "fraction", + "pixels" + ] + }, + "tick0": { + "description": "Sets the placement of the first tick on this axis. Use with `dtick`. If the axis `type` is *log*, then you must take the log of your starting tick (e.g. to set the starting tick to 100, set the `tick0` to 2) except when `dtick`=*L* (see `dtick` for more info). If the axis `type` is *date*, it should be a date string, like date data. If the axis `type` is *category*, it should be a number, using the scale where each category is assigned a serial number from zero in the order it appears.", + "editType": "colorbars", + "impliedEdits": { + "tickmode": "linear" + }, + "valType": "any" + }, + "tickangle": { + "description": "Sets the angle of the tick labels with respect to the horizontal. For example, a `tickangle` of -90 draws the tick labels vertically.", + "dflt": "auto", + "editType": "colorbars", + "valType": "angle" + }, + "tickcolor": { + "description": "Sets the tick color.", + "dflt": "#444", + "editType": "colorbars", + "valType": "color" + }, + "tickfont": { + "color": { + "editType": "colorbars", + "valType": "color" + }, + "description": "Sets the color bar's tick label font", + "editType": "colorbars", + "family": { + "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", + "editType": "colorbars", + "noBlank": true, + "strict": true, + "valType": "string" + }, + "lineposition": { + "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", + "dflt": "none", + "editType": "colorbars", + "extras": [ + "none" + ], + "flags": [ + "under", + "over", + "through" + ], + "valType": "flaglist" + }, + "role": "object", + "shadow": { + "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", + "dflt": "none", + "editType": "colorbars", + "valType": "string" + }, + "size": { + "editType": "colorbars", + "min": 1, + "valType": "number" + }, + "style": { + "description": "Sets whether a font should be styled with a normal or italic face from its family.", + "dflt": "normal", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "normal", + "italic" + ] + }, + "textcase": { + "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", + "dflt": "normal", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "normal", + "word caps", + "upper", + "lower" + ] + }, + "variant": { + "description": "Sets the variant of the font.", + "dflt": "normal", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "normal", + "small-caps", + "all-small-caps", + "all-petite-caps", + "petite-caps", + "unicase" + ] + }, + "weight": { + "description": "Sets the weight (or boldness) of the font.", + "dflt": "normal", + "editType": "colorbars", + "extras": [ + "normal", + "bold" + ], + "max": 1000, + "min": 1, + "valType": "integer" + } + }, + "tickformat": { + "description": "Sets the tick label formatting rule using d3 formatting mini-languages which are very similar to those in Python. For numbers, see: https://github.com/d3/d3-format/tree/v1.4.5#d3-format. And for dates see: https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format. We add two items to d3's date formatter: *%h* for half of the year as a decimal number as well as *%{n}f* for fractional seconds with n digits. For example, *2016-10-13 09:15:23.456* with tickformat *%H~%M~%S.%2f* would display *09~15~23.46*", + "dflt": "", + "editType": "colorbars", + "valType": "string" + }, + "tickformatstops": { + "items": { + "tickformatstop": { + "dtickrange": { + "description": "range [*min*, *max*], where *min*, *max* - dtick values which describe some zoom level, it is possible to omit *min* or *max* value by passing *null*", + "editType": "colorbars", + "items": [ + { + "editType": "colorbars", + "valType": "any" + }, + { + "editType": "colorbars", + "valType": "any" + } + ], + "valType": "info_array" + }, + "editType": "colorbars", + "enabled": { + "description": "Determines whether or not this stop is used. If `false`, this stop is ignored even within its `dtickrange`.", + "dflt": true, + "editType": "colorbars", + "valType": "boolean" + }, + "name": { + "description": "When used in a template, named items are created in the output figure in addition to any items the figure already has in this array. You can modify these items in the output figure by making your own item with `templateitemname` matching this `name` alongside your modifications (including `visible: false` or `enabled: false` to hide it). Has no effect outside of a template.", + "editType": "colorbars", + "valType": "string" + }, + "role": "object", + "templateitemname": { + "description": "Used to refer to a named item in this array in the template. Named items from the template will be created even without a matching item in the input figure, but you can modify one by making an item with `templateitemname` matching its `name`, alongside your modifications (including `visible: false` or `enabled: false` to hide it). If there is no template or no matching item, this item will be hidden unless you explicitly show it with `visible: true`.", + "editType": "colorbars", + "valType": "string" + }, + "value": { + "description": "string - dtickformat for described zoom level, the same as *tickformat*", + "dflt": "", + "editType": "colorbars", + "valType": "string" + } + } + }, + "role": "object" + }, + "ticklabeloverflow": { + "description": "Determines how we handle tick labels that would overflow either the graph div or the domain of the axis. The default value for inside tick labels is *hide past domain*. In other cases the default is *hide past div*.", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "allow", + "hide past div", + "hide past domain" + ] + }, + "ticklabelposition": { + "description": "Determines where tick labels are drawn relative to the ticks. Left and right options are used when `orientation` is *h*, top and bottom when `orientation` is *v*.", + "dflt": "outside", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "outside", + "inside", + "outside top", + "inside top", + "outside left", + "inside left", + "outside right", + "inside right", + "outside bottom", + "inside bottom" + ] + }, + "ticklabelstep": { + "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", + "dflt": 1, + "editType": "colorbars", + "min": 1, + "valType": "integer" + }, + "ticklen": { + "description": "Sets the tick length (in px).", + "dflt": 5, + "editType": "colorbars", + "min": 0, + "valType": "number" + }, + "tickmode": { + "description": "Sets the tick mode for this axis. If *auto*, the number of ticks is set via `nticks`. If *linear*, the placement of the ticks is determined by a starting position `tick0` and a tick step `dtick` (*linear* is the default value if `tick0` and `dtick` are provided). If *array*, the placement of the ticks is set via `tickvals` and the tick text is `ticktext`. (*array* is the default value if `tickvals` is provided).", + "editType": "colorbars", + "impliedEdits": {}, + "valType": "enumerated", + "values": [ + "auto", + "linear", + "array" + ] + }, + "tickprefix": { + "description": "Sets a tick label prefix.", + "dflt": "", + "editType": "colorbars", + "valType": "string" + }, + "ticks": { + "description": "Determines whether ticks are drawn or not. If **, this axis' ticks are not drawn. If *outside* (*inside*), this axis' are drawn outside (inside) the axis lines.", + "dflt": "", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "outside", + "inside", + "" + ] + }, + "ticksuffix": { + "description": "Sets a tick label suffix.", + "dflt": "", + "editType": "colorbars", + "valType": "string" + }, + "ticktext": { + "description": "Sets the text displayed at the ticks position via `tickvals`. Only has an effect if `tickmode` is set to *array*. Used with `tickvals`.", + "editType": "colorbars", + "valType": "data_array" + }, + "ticktextsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `ticktext`.", + "editType": "none", + "valType": "string" + }, + "tickvals": { + "description": "Sets the values at which ticks on this axis appear. Only has an effect if `tickmode` is set to *array*. Used with `ticktext`.", + "editType": "colorbars", + "valType": "data_array" + }, + "tickvalssrc": { + "description": "Sets the source reference on Chart Studio Cloud for `tickvals`.", + "editType": "none", + "valType": "string" + }, + "tickwidth": { + "description": "Sets the tick width (in px).", + "dflt": 1, + "editType": "colorbars", + "min": 0, + "valType": "number" + }, + "title": { + "editType": "colorbars", + "font": { + "color": { + "editType": "colorbars", + "valType": "color" + }, + "description": "Sets this color bar's title font.", + "editType": "colorbars", + "family": { + "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", + "editType": "colorbars", + "noBlank": true, + "strict": true, + "valType": "string" + }, + "lineposition": { + "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", + "dflt": "none", + "editType": "colorbars", + "extras": [ + "none" + ], + "flags": [ + "under", + "over", + "through" + ], + "valType": "flaglist" + }, + "role": "object", + "shadow": { + "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", + "dflt": "none", + "editType": "colorbars", + "valType": "string" + }, + "size": { + "editType": "colorbars", + "min": 1, + "valType": "number" + }, + "style": { + "description": "Sets whether a font should be styled with a normal or italic face from its family.", + "dflt": "normal", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "normal", + "italic" + ] + }, + "textcase": { + "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", + "dflt": "normal", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "normal", + "word caps", + "upper", + "lower" + ] + }, + "variant": { + "description": "Sets the variant of the font.", + "dflt": "normal", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "normal", + "small-caps", + "all-small-caps", + "all-petite-caps", + "petite-caps", + "unicase" + ] + }, + "weight": { + "description": "Sets the weight (or boldness) of the font.", + "dflt": "normal", + "editType": "colorbars", + "extras": [ + "normal", + "bold" + ], + "max": 1000, + "min": 1, + "valType": "integer" + } + }, + "role": "object", + "side": { + "description": "Determines the location of color bar's title with respect to the color bar. Defaults to *top* when `orientation` if *v* and defaults to *right* when `orientation` if *h*.", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "right", + "top", + "bottom" + ] + }, + "text": { + "description": "Sets the title of the color bar.", + "editType": "colorbars", + "valType": "string" + } + }, + "x": { + "description": "Sets the x position with respect to `xref` of the color bar (in plot fraction). When `xref` is *paper*, defaults to 1.02 when `orientation` is *v* and 0.5 when `orientation` is *h*. When `xref` is *container*, defaults to *1* when `orientation` is *v* and 0.5 when `orientation` is *h*. Must be between *0* and *1* if `xref` is *container* and between *-2* and *3* if `xref` is *paper*.", + "editType": "colorbars", + "valType": "number" + }, + "xanchor": { + "description": "Sets this color bar's horizontal position anchor. This anchor binds the `x` position to the *left*, *center* or *right* of the color bar. Defaults to *left* when `orientation` is *v* and *center* when `orientation` is *h*.", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "left", + "center", + "right" + ] + }, + "xpad": { + "description": "Sets the amount of padding (in px) along the x direction.", + "dflt": 10, + "editType": "colorbars", + "min": 0, + "valType": "number" + }, + "xref": { + "description": "Sets the container `x` refers to. *container* spans the entire `width` of the plot. *paper* refers to the width of the plotting area only.", + "dflt": "paper", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "container", + "paper" + ] + }, + "y": { + "description": "Sets the y position with respect to `yref` of the color bar (in plot fraction). When `yref` is *paper*, defaults to 0.5 when `orientation` is *v* and 1.02 when `orientation` is *h*. When `yref` is *container*, defaults to 0.5 when `orientation` is *v* and 1 when `orientation` is *h*. Must be between *0* and *1* if `yref` is *container* and between *-2* and *3* if `yref` is *paper*.", + "editType": "colorbars", + "valType": "number" + }, + "yanchor": { + "description": "Sets this color bar's vertical position anchor This anchor binds the `y` position to the *top*, *middle* or *bottom* of the color bar. Defaults to *middle* when `orientation` is *v* and *bottom* when `orientation` is *h*.", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "top", + "middle", + "bottom" + ] + }, + "ypad": { + "description": "Sets the amount of padding (in px) along the y direction.", + "dflt": 10, + "editType": "colorbars", + "min": 0, + "valType": "number" + }, + "yref": { + "description": "Sets the container `y` refers to. *container* spans the entire `height` of the plot. *paper* refers to the height of the plotting area only.", + "dflt": "paper", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "container", + "paper" + ] + } + }, + "colorscale": { + "description": "Sets the colorscale. Has an effect only if in `marker.color` is set to a numerical array. The colorscale must be an array containing arrays mapping a normalized value to an rgb, rgba, hex, hsl, hsv, or named color string. At minimum, a mapping for the lowest (0) and highest (1) values are required. For example, `[[0, 'rgb(0,0,255)'], [1, 'rgb(255,0,0)']]`. To control the bounds of the colorscale in color space, use `marker.cmin` and `marker.cmax`. Alternatively, `colorscale` may be a palette name string of the following list: Blackbody,Bluered,Blues,Cividis,Earth,Electric,Greens,Greys,Hot,Jet,Picnic,Portland,Rainbow,RdBu,Reds,Viridis,YlGnBu,YlOrRd.", + "dflt": null, + "editType": "calc", + "impliedEdits": { + "autocolorscale": false + }, + "valType": "colorscale" + }, + "colorsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `color`.", + "editType": "none", + "valType": "string" + }, + "editType": "calc", + "gradient": { + "color": { + "arrayOk": true, + "description": "Sets the final color of the gradient fill: the center color for radial, the right for horizontal, or the bottom for vertical.", + "editType": "calc", + "valType": "color" + }, + "colorsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `color`.", + "editType": "none", + "valType": "string" + }, + "editType": "calc", + "role": "object", + "type": { + "arrayOk": true, + "description": "Sets the type of gradient used to fill the markers", + "dflt": "none", + "editType": "calc", + "valType": "enumerated", + "values": [ + "radial", + "horizontal", + "vertical", + "none" + ] + }, + "typesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `type`.", + "editType": "none", + "valType": "string" + } + }, + "line": { + "autocolorscale": { + "description": "Determines whether the colorscale is a default palette (`autocolorscale: true`) or the palette determined by `marker.line.colorscale`. Has an effect only if in `marker.line.color` is set to a numerical array. In case `colorscale` is unspecified or `autocolorscale` is true, the default palette will be chosen according to whether numbers in the `color` array are all positive, all negative or mixed.", + "dflt": true, + "editType": "calc", + "impliedEdits": {}, + "valType": "boolean" + }, + "cauto": { + "description": "Determines whether or not the color domain is computed with respect to the input data (here in `marker.line.color`) or the bounds set in `marker.line.cmin` and `marker.line.cmax` Has an effect only if in `marker.line.color` is set to a numerical array. Defaults to `false` when `marker.line.cmin` and `marker.line.cmax` are set by the user.", + "dflt": true, + "editType": "calc", + "impliedEdits": {}, + "valType": "boolean" + }, + "cmax": { + "description": "Sets the upper bound of the color domain. Has an effect only if in `marker.line.color` is set to a numerical array. Value should have the same units as in `marker.line.color` and if set, `marker.line.cmin` must be set as well.", + "dflt": null, + "editType": "plot", + "impliedEdits": { + "cauto": false + }, + "valType": "number" + }, + "cmid": { + "description": "Sets the mid-point of the color domain by scaling `marker.line.cmin` and/or `marker.line.cmax` to be equidistant to this point. Has an effect only if in `marker.line.color` is set to a numerical array. Value should have the same units as in `marker.line.color`. Has no effect when `marker.line.cauto` is `false`.", + "dflt": null, + "editType": "calc", + "impliedEdits": {}, + "valType": "number" + }, + "cmin": { + "description": "Sets the lower bound of the color domain. Has an effect only if in `marker.line.color` is set to a numerical array. Value should have the same units as in `marker.line.color` and if set, `marker.line.cmax` must be set as well.", + "dflt": null, + "editType": "plot", + "impliedEdits": { + "cauto": false + }, + "valType": "number" + }, + "color": { + "arrayOk": true, + "description": "Sets the marker.line color. It accepts either a specific color or an array of numbers that are mapped to the colorscale relative to the max and min values of the array or relative to `marker.line.cmin` and `marker.line.cmax` if set.", + "editType": "style", + "valType": "color" + }, + "coloraxis": { + "description": "Sets a reference to a shared color axis. References to these shared color axes are *coloraxis*, *coloraxis2*, *coloraxis3*, etc. Settings for these shared color axes are set in the layout, under `layout.coloraxis`, `layout.coloraxis2`, etc. Note that multiple color scales can be linked to the same color axis.", + "dflt": null, + "editType": "calc", + "regex": "/^coloraxis([2-9]|[1-9][0-9]+)?$/", + "valType": "subplotid" + }, + "colorscale": { + "description": "Sets the colorscale. Has an effect only if in `marker.line.color` is set to a numerical array. The colorscale must be an array containing arrays mapping a normalized value to an rgb, rgba, hex, hsl, hsv, or named color string. At minimum, a mapping for the lowest (0) and highest (1) values are required. For example, `[[0, 'rgb(0,0,255)'], [1, 'rgb(255,0,0)']]`. To control the bounds of the colorscale in color space, use `marker.line.cmin` and `marker.line.cmax`. Alternatively, `colorscale` may be a palette name string of the following list: Blackbody,Bluered,Blues,Cividis,Earth,Electric,Greens,Greys,Hot,Jet,Picnic,Portland,Rainbow,RdBu,Reds,Viridis,YlGnBu,YlOrRd.", + "dflt": null, + "editType": "calc", + "impliedEdits": { + "autocolorscale": false + }, + "valType": "colorscale" + }, + "colorsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `color`.", + "editType": "none", + "valType": "string" + }, + "editType": "calc", + "reversescale": { + "description": "Reverses the color mapping if true. Has an effect only if in `marker.line.color` is set to a numerical array. If true, `marker.line.cmin` will correspond to the last color in the array and `marker.line.cmax` will correspond to the first color.", + "dflt": false, + "editType": "plot", + "valType": "boolean" + }, + "role": "object", + "width": { + "arrayOk": true, + "description": "Sets the width (in px) of the lines bounding the marker points.", + "editType": "style", + "min": 0, + "valType": "number" + }, + "widthsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `width`.", + "editType": "none", + "valType": "string" + } + }, + "maxdisplayed": { + "description": "Sets a maximum number of points to be drawn on the graph. *0* corresponds to no limit.", + "dflt": 0, + "editType": "plot", + "min": 0, + "valType": "number" + }, + "opacity": { + "arrayOk": true, + "description": "Sets the marker opacity.", + "editType": "style", + "max": 1, + "min": 0, + "valType": "number" + }, + "opacitysrc": { + "description": "Sets the source reference on Chart Studio Cloud for `opacity`.", + "editType": "none", + "valType": "string" + }, + "reversescale": { + "description": "Reverses the color mapping if true. Has an effect only if in `marker.color` is set to a numerical array. If true, `marker.cmin` will correspond to the last color in the array and `marker.cmax` will correspond to the first color.", + "dflt": false, + "editType": "plot", + "valType": "boolean" + }, + "role": "object", + "showscale": { + "description": "Determines whether or not a colorbar is displayed for this trace. Has an effect only if in `marker.color` is set to a numerical array.", + "dflt": false, + "editType": "calc", + "valType": "boolean" + }, + "size": { + "arrayOk": true, + "description": "Sets the marker size (in px).", + "dflt": 6, + "editType": "calc", + "min": 0, + "valType": "number" + }, + "sizemin": { + "description": "Has an effect only if `marker.size` is set to a numerical array. Sets the minimum size (in px) of the rendered marker points.", + "dflt": 0, + "editType": "calc", + "min": 0, + "valType": "number" + }, + "sizemode": { + "description": "Has an effect only if `marker.size` is set to a numerical array. Sets the rule for which the data in `size` is converted to pixels.", + "dflt": "diameter", + "editType": "calc", + "valType": "enumerated", + "values": [ + "diameter", + "area" + ] + }, + "sizeref": { + "description": "Has an effect only if `marker.size` is set to a numerical array. Sets the scale factor used to determine the rendered size of marker points. Use with `sizemin` and `sizemode`.", + "dflt": 1, + "editType": "calc", + "valType": "number" + }, + "sizesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `size`.", + "editType": "none", + "valType": "string" + }, + "standoff": { + "arrayOk": true, + "description": "Moves the marker away from the data point in the direction of `angle` (in px). This can be useful for example if you have another marker at this location and you want to point an arrowhead marker at it.", + "dflt": 0, + "editType": "plot", + "min": 0, + "valType": "number" + }, + "standoffsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `standoff`.", + "editType": "none", + "valType": "string" + }, + "symbol": { + "arrayOk": true, + "description": "Sets the marker symbol type. Adding 100 is equivalent to appending *-open* to a symbol name. Adding 200 is equivalent to appending *-dot* to a symbol name. Adding 300 is equivalent to appending *-open-dot* or *dot-open* to a symbol name.", + "dflt": "circle", + "editType": "style", + "valType": "enumerated", + "values": [ + 0, + "0", + "circle", + 100, + "100", + "circle-open", + 200, + "200", + "circle-dot", + 300, + "300", + "circle-open-dot", + 1, + "1", + "square", + 101, + "101", + "square-open", + 201, + "201", + "square-dot", + 301, + "301", + "square-open-dot", + 2, + "2", + "diamond", + 102, + "102", + "diamond-open", + 202, + "202", + "diamond-dot", + 302, + "302", + "diamond-open-dot", + 3, + "3", + "cross", + 103, + "103", + "cross-open", + 203, + "203", + "cross-dot", + 303, + "303", + "cross-open-dot", + 4, + "4", + "x", + 104, + "104", + "x-open", + 204, + "204", + "x-dot", + 304, + "304", + "x-open-dot", + 5, + "5", + "triangle-up", + 105, + "105", + "triangle-up-open", + 205, + "205", + "triangle-up-dot", + 305, + "305", + "triangle-up-open-dot", + 6, + "6", + "triangle-down", + 106, + "106", + "triangle-down-open", + 206, + "206", + "triangle-down-dot", + 306, + "306", + "triangle-down-open-dot", + 7, + "7", + "triangle-left", + 107, + "107", + "triangle-left-open", + 207, + "207", + "triangle-left-dot", + 307, + "307", + "triangle-left-open-dot", + 8, + "8", + "triangle-right", + 108, + "108", + "triangle-right-open", + 208, + "208", + "triangle-right-dot", + 308, + "308", + "triangle-right-open-dot", + 9, + "9", + "triangle-ne", + 109, + "109", + "triangle-ne-open", + 209, + "209", + "triangle-ne-dot", + 309, + "309", + "triangle-ne-open-dot", + 10, + "10", + "triangle-se", + 110, + "110", + "triangle-se-open", + 210, + "210", + "triangle-se-dot", + 310, + "310", + "triangle-se-open-dot", + 11, + "11", + "triangle-sw", + 111, + "111", + "triangle-sw-open", + 211, + "211", + "triangle-sw-dot", + 311, + "311", + "triangle-sw-open-dot", + 12, + "12", + "triangle-nw", + 112, + "112", + "triangle-nw-open", + 212, + "212", + "triangle-nw-dot", + 312, + "312", + "triangle-nw-open-dot", + 13, + "13", + "pentagon", + 113, + "113", + "pentagon-open", + 213, + "213", + "pentagon-dot", + 313, + "313", + "pentagon-open-dot", + 14, + "14", + "hexagon", + 114, + "114", + "hexagon-open", + 214, + "214", + "hexagon-dot", + 314, + "314", + "hexagon-open-dot", + 15, + "15", + "hexagon2", + 115, + "115", + "hexagon2-open", + 215, + "215", + "hexagon2-dot", + 315, + "315", + "hexagon2-open-dot", + 16, + "16", + "octagon", + 116, + "116", + "octagon-open", + 216, + "216", + "octagon-dot", + 316, + "316", + "octagon-open-dot", + 17, + "17", + "star", + 117, + "117", + "star-open", + 217, + "217", + "star-dot", + 317, + "317", + "star-open-dot", + 18, + "18", + "hexagram", + 118, + "118", + "hexagram-open", + 218, + "218", + "hexagram-dot", + 318, + "318", + "hexagram-open-dot", + 19, + "19", + "star-triangle-up", + 119, + "119", + "star-triangle-up-open", + 219, + "219", + "star-triangle-up-dot", + 319, + "319", + "star-triangle-up-open-dot", + 20, + "20", + "star-triangle-down", + 120, + "120", + "star-triangle-down-open", + 220, + "220", + "star-triangle-down-dot", + 320, + "320", + "star-triangle-down-open-dot", + 21, + "21", + "star-square", + 121, + "121", + "star-square-open", + 221, + "221", + "star-square-dot", + 321, + "321", + "star-square-open-dot", + 22, + "22", + "star-diamond", + 122, + "122", + "star-diamond-open", + 222, + "222", + "star-diamond-dot", + 322, + "322", + "star-diamond-open-dot", + 23, + "23", + "diamond-tall", + 123, + "123", + "diamond-tall-open", + 223, + "223", + "diamond-tall-dot", + 323, + "323", + "diamond-tall-open-dot", + 24, + "24", + "diamond-wide", + 124, + "124", + "diamond-wide-open", + 224, + "224", + "diamond-wide-dot", + 324, + "324", + "diamond-wide-open-dot", + 25, + "25", + "hourglass", + 125, + "125", + "hourglass-open", + 26, + "26", + "bowtie", + 126, + "126", + "bowtie-open", + 27, + "27", + "circle-cross", + 127, + "127", + "circle-cross-open", + 28, + "28", + "circle-x", + 128, + "128", + "circle-x-open", + 29, + "29", + "square-cross", + 129, + "129", + "square-cross-open", + 30, + "30", + "square-x", + 130, + "130", + "square-x-open", + 31, + "31", + "diamond-cross", + 131, + "131", + "diamond-cross-open", + 32, + "32", + "diamond-x", + 132, + "132", + "diamond-x-open", + 33, + "33", + "cross-thin", + 133, + "133", + "cross-thin-open", + 34, + "34", + "x-thin", + 134, + "134", + "x-thin-open", + 35, + "35", + "asterisk", + 135, + "135", + "asterisk-open", + 36, + "36", + "hash", + 136, + "136", + "hash-open", + 236, + "236", + "hash-dot", + 336, + "336", + "hash-open-dot", + 37, + "37", + "y-up", + 137, + "137", + "y-up-open", + 38, + "38", + "y-down", + 138, + "138", + "y-down-open", + 39, + "39", + "y-left", + 139, + "139", + "y-left-open", + 40, + "40", + "y-right", + 140, + "140", + "y-right-open", + 41, + "41", + "line-ew", + 141, + "141", + "line-ew-open", + 42, + "42", + "line-ns", + 142, + "142", + "line-ns-open", + 43, + "43", + "line-ne", + 143, + "143", + "line-ne-open", + 44, + "44", + "line-nw", + 144, + "144", + "line-nw-open", + 45, + "45", + "arrow-up", + 145, + "145", + "arrow-up-open", + 46, + "46", + "arrow-down", + 146, + "146", + "arrow-down-open", + 47, + "47", + "arrow-left", + 147, + "147", + "arrow-left-open", + 48, + "48", + "arrow-right", + 148, + "148", + "arrow-right-open", + 49, + "49", + "arrow-bar-up", + 149, + "149", + "arrow-bar-up-open", + 50, + "50", + "arrow-bar-down", + 150, + "150", + "arrow-bar-down-open", + 51, + "51", + "arrow-bar-left", + 151, + "151", + "arrow-bar-left-open", + 52, + "52", + "arrow-bar-right", + 152, + "152", + "arrow-bar-right-open", + 53, + "53", + "arrow", + 153, + "153", + "arrow-open", + 54, + "54", + "arrow-wide", + 154, + "154", + "arrow-wide-open" + ] + }, + "symbolsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `symbol`.", + "editType": "none", + "valType": "string" + } + }, + "meta": { + "arrayOk": true, + "description": "Assigns extra meta information associated with this trace that can be used in various text attributes. Attributes such as trace `name`, graph, axis and colorbar `title.text`, annotation `text` `rangeselector`, `updatemenues` and `sliders` `label` text all support `meta`. To access the trace `meta` values in an attribute in the same trace, simply use `%{meta[i]}` where `i` is the index or key of the `meta` item in question. To access trace `meta` in layout attributes, use `%{data[n[.meta[i]}` where `i` is the index or key of the `meta` and `n` is the trace index.", + "editType": "plot", + "valType": "any" + }, + "metasrc": { + "description": "Sets the source reference on Chart Studio Cloud for `meta`.", + "editType": "none", + "valType": "string" + }, + "mode": { + "description": "Determines the drawing mode for this scatter trace. If the provided `mode` includes *text* then the `text` elements appear at the coordinates. Otherwise, the `text` elements appear on hover. If there are less than 20 points and the trace is not stacked then the default is *lines+markers*. Otherwise, *lines*.", + "editType": "calc", + "extras": [ + "none" + ], + "flags": [ + "lines", + "markers", + "text" + ], + "valType": "flaglist" + }, + "name": { + "description": "Sets the trace name. The trace name appears as the legend item and on hover.", + "editType": "style", + "valType": "string" + }, + "opacity": { + "description": "Sets the opacity of the trace.", + "dflt": 1, + "editType": "style", + "max": 1, + "min": 0, + "valType": "number" + }, + "real": { + "description": "Sets the real component of the data, in units of normalized impedance such that real=1, imag=0 is the center of the chart.", + "editType": "calc+clearAxisTypes", + "valType": "data_array" + }, + "realsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `real`.", + "editType": "none", + "valType": "string" + }, + "selected": { + "editType": "style", + "marker": { + "color": { + "description": "Sets the marker color of selected points.", + "editType": "style", + "valType": "color" + }, + "editType": "style", + "opacity": { + "description": "Sets the marker opacity of selected points.", + "editType": "style", + "max": 1, + "min": 0, + "valType": "number" + }, + "role": "object", + "size": { + "description": "Sets the marker size of selected points.", + "editType": "style", + "min": 0, + "valType": "number" + } + }, + "role": "object", + "textfont": { + "color": { + "description": "Sets the text font color of selected points.", + "editType": "style", + "valType": "color" + }, + "editType": "style", + "role": "object" + } + }, + "selectedpoints": { + "description": "Array containing integer indices of selected points. Has an effect only for traces that support selections. Note that an empty array means an empty selection where the `unselected` are turned on for all points, whereas, any other non-array values means no selection all where the `selected` and `unselected` styles have no effect.", + "editType": "calc", + "valType": "any" + }, + "showlegend": { + "description": "Determines whether or not an item corresponding to this trace is shown in the legend.", + "dflt": true, + "editType": "style", + "valType": "boolean" + }, + "stream": { + "editType": "calc", + "maxpoints": { + "description": "Sets the maximum number of points to keep on the plots from an incoming stream. If `maxpoints` is set to *50*, only the newest 50 points will be displayed on the plot.", + "dflt": 500, + "editType": "calc", + "max": 10000, + "min": 0, + "valType": "number" + }, + "role": "object", + "token": { + "description": "The stream id number links a data trace on a plot with a stream. See https://chart-studio.plotly.com/settings for more details.", + "editType": "calc", + "noBlank": true, + "strict": true, + "valType": "string" + } + }, + "subplot": { + "description": "Sets a reference between this trace's data coordinates and a smith subplot. If *smith* (the default value), the data refer to `layout.smith`. If *smith2*, the data refer to `layout.smith2`, and so on.", + "dflt": "smith", + "editType": "calc", + "valType": "subplotid" + }, + "text": { + "arrayOk": true, + "description": "Sets text elements associated with each (x,y) pair. If a single string, the same string appears over all the data points. If an array of string, the items are mapped in order to the this trace's (x,y) coordinates. If trace `hoverinfo` contains a *text* flag and *hovertext* is not set, these elements will be seen in the hover labels.", + "dflt": "", + "editType": "calc", + "valType": "string" + }, + "textfont": { + "color": { + "arrayOk": true, + "editType": "style", + "valType": "color" + }, + "colorsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `color`.", + "editType": "none", + "valType": "string" + }, + "description": "Sets the text font.", + "editType": "calc", + "family": { + "arrayOk": true, + "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", + "editType": "calc", + "noBlank": true, + "strict": true, + "valType": "string" + }, + "familysrc": { + "description": "Sets the source reference on Chart Studio Cloud for `family`.", + "editType": "none", + "valType": "string" + }, + "lineposition": { + "arrayOk": true, + "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", + "dflt": "none", + "editType": "calc", + "extras": [ + "none" + ], + "flags": [ + "under", + "over", + "through" + ], + "valType": "flaglist" + }, + "linepositionsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `lineposition`.", + "editType": "none", + "valType": "string" + }, + "role": "object", + "shadow": { + "arrayOk": true, + "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", + "dflt": "none", + "editType": "calc", + "valType": "string" + }, + "shadowsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `shadow`.", + "editType": "none", + "valType": "string" + }, + "size": { + "arrayOk": true, + "editType": "calc", + "min": 1, + "valType": "number" + }, + "sizesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `size`.", + "editType": "none", + "valType": "string" + }, + "style": { + "arrayOk": true, + "description": "Sets whether a font should be styled with a normal or italic face from its family.", + "dflt": "normal", + "editType": "calc", + "valType": "enumerated", + "values": [ + "normal", + "italic" + ] + }, + "stylesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `style`.", + "editType": "none", + "valType": "string" + }, + "textcase": { + "arrayOk": true, + "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", + "dflt": "normal", + "editType": "calc", + "valType": "enumerated", + "values": [ + "normal", + "word caps", + "upper", + "lower" + ] + }, + "textcasesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `textcase`.", + "editType": "none", + "valType": "string" + }, + "variant": { + "arrayOk": true, + "description": "Sets the variant of the font.", + "dflt": "normal", + "editType": "calc", + "valType": "enumerated", + "values": [ + "normal", + "small-caps", + "all-small-caps", + "all-petite-caps", + "petite-caps", + "unicase" + ] + }, + "variantsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `variant`.", + "editType": "none", + "valType": "string" + }, + "weight": { + "arrayOk": true, + "description": "Sets the weight (or boldness) of the font.", + "dflt": "normal", + "editType": "calc", + "extras": [ + "normal", + "bold" + ], + "max": 1000, + "min": 1, + "valType": "integer" + }, + "weightsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `weight`.", + "editType": "none", + "valType": "string" + } + }, + "textposition": { + "arrayOk": true, + "description": "Sets the positions of the `text` elements with respects to the (x,y) coordinates.", + "dflt": "middle center", + "editType": "calc", + "valType": "enumerated", + "values": [ + "top left", + "top center", + "top right", + "middle left", + "middle center", + "middle right", + "bottom left", + "bottom center", + "bottom right" + ] + }, + "textpositionsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `textposition`.", + "editType": "none", + "valType": "string" + }, + "textsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `text`.", + "editType": "none", + "valType": "string" + }, + "texttemplate": { + "arrayOk": true, + "description": "Template string used for rendering the information text that appears on points. Note that this will override `textinfo`. Variables are inserted using %{variable}, for example \"y: %{y}\". Numbers are formatted using d3-format's syntax %{variable:d3-format}, for example \"Price: %{y:$.2f}\". https://github.com/d3/d3-format/tree/v1.4.5#d3-format for details on the formatting syntax. Dates are formatted using d3-time-format's syntax %{variable|d3-time-format}, for example \"Day: %{2019-01-01|%A}\". https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format for details on the date formatting syntax. Variables that can't be found will be replaced with the specifier. For example, a template of \"data: %{x}, %{y}\" will result in a value of \"data: 1, %{y}\" if x is 1 and y is missing. Variables with an undefined value will be replaced with the fallback value. All attributes that can be specified per-point (the ones that are `arrayOk: true`) are available. Finally, the template string has access to variables `real`, `imag` and `text`.", + "dflt": "", + "editType": "plot", + "valType": "string" + }, + "texttemplatefallback": { + "description": "Fallback string that's displayed when a variable referenced in a template is missing. If the boolean value 'false' is passed in, the specifier with the missing variable will be displayed.", + "dflt": "-", + "editType": "plot", + "valType": "any" + }, + "texttemplatesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `texttemplate`.", + "editType": "none", + "valType": "string" + }, + "type": "scattersmith", + "uid": { + "description": "Assign an id to this trace, Use this to provide object constancy between traces during animations and transitions.", + "editType": "plot", + "valType": "string" + }, + "uirevision": { + "description": "Controls persistence of some user-driven changes to the trace: `constraintrange` in `parcoords` traces, as well as some `editable: true` modifications such as `name` and `colorbar.title`. Defaults to `layout.uirevision`. Note that other user-driven trace attribute changes are controlled by `layout` attributes: `trace.visible` is controlled by `layout.legend.uirevision`, `selectedpoints` is controlled by `layout.selectionrevision`, and `colorbar.(x|y)` (accessible with `config: {editable: true}`) is controlled by `layout.editrevision`. Trace changes are tracked by `uid`, which only falls back on trace index if no `uid` is provided. So if your app can add/remove traces before the end of the `data` array, such that the same trace has a different index, you can still preserve user-driven changes if you give each trace a `uid` that stays with it as it moves.", + "editType": "none", + "valType": "any" + }, + "unselected": { + "editType": "style", + "marker": { + "color": { + "description": "Sets the marker color of unselected points, applied only when a selection exists.", + "editType": "style", + "valType": "color" + }, + "editType": "style", + "opacity": { + "description": "Sets the marker opacity of unselected points, applied only when a selection exists.", + "editType": "style", + "max": 1, + "min": 0, + "valType": "number" + }, + "role": "object", + "size": { + "description": "Sets the marker size of unselected points, applied only when a selection exists.", + "editType": "style", + "min": 0, + "valType": "number" + } + }, + "role": "object", + "textfont": { + "color": { + "description": "Sets the text font color of unselected points, applied only when a selection exists.", + "editType": "style", + "valType": "color" + }, + "editType": "style", + "role": "object" + } + }, + "visible": { + "description": "Determines whether or not this trace is visible. If *legendonly*, the trace is not drawn, but can appear as a legend item (provided that the legend itself is visible).", + "dflt": true, + "editType": "calc", + "valType": "enumerated", + "values": [ + true, + false, + "legendonly" + ] + } + }, + "categories": [ + "smith", + "symbols", + "showLegend", + "scatter-like" + ], + "meta": { + "description": "The scattersmith trace type encompasses line charts, scatter charts, text charts, and bubble charts in smith coordinates. The data visualized as scatter point or lines is set in `real` and `imag` (imaginary) coordinates Text (appearing either on the chart or on hover only) is via `text`. Bubble charts are achieved by setting `marker.size` and/or `marker.color` to numerical arrays.", + "hrName": "scatter_smith" + }, + "type": "scattersmith" + }, + "scatterternary": { + "animatable": false, + "attributes": { + "a": { + "description": "Sets the quantity of component `a` in each data point. If `a`, `b`, and `c` are all provided, they need not be normalized, only the relative values matter. If only two arrays are provided they must be normalized to match `ternary.sum`.", + "editType": "calc", + "valType": "data_array" + }, + "asrc": { + "description": "Sets the source reference on Chart Studio Cloud for `a`.", + "editType": "none", + "valType": "string" + }, + "b": { + "description": "Sets the quantity of component `a` in each data point. If `a`, `b`, and `c` are all provided, they need not be normalized, only the relative values matter. If only two arrays are provided they must be normalized to match `ternary.sum`.", + "editType": "calc", + "valType": "data_array" + }, + "bsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `b`.", + "editType": "none", + "valType": "string" + }, + "c": { + "description": "Sets the quantity of component `a` in each data point. If `a`, `b`, and `c` are all provided, they need not be normalized, only the relative values matter. If only two arrays are provided they must be normalized to match `ternary.sum`.", + "editType": "calc", + "valType": "data_array" + }, + "cliponaxis": { + "description": "Determines whether or not markers and text nodes are clipped about the subplot axes. To show markers and text nodes above axis lines and tick labels, make sure to set `xaxis.layer` and `yaxis.layer` to *below traces*.", + "dflt": true, + "editType": "plot", + "valType": "boolean" + }, + "connectgaps": { + "description": "Determines whether or not gaps (i.e. {nan} or missing values) in the provided data arrays are connected.", + "dflt": false, + "editType": "calc", + "valType": "boolean" + }, + "csrc": { + "description": "Sets the source reference on Chart Studio Cloud for `c`.", + "editType": "none", + "valType": "string" + }, + "customdata": { + "description": "Assigns extra data each datum. This may be useful when listening to hover, click and selection events. Note that, *scatter* traces also appends customdata items in the markers DOM elements", + "editType": "calc", + "valType": "data_array" + }, + "customdatasrc": { + "description": "Sets the source reference on Chart Studio Cloud for `customdata`.", + "editType": "none", + "valType": "string" + }, + "fill": { + "description": "Sets the area to fill with a solid color. Use with `fillcolor` if not *none*. scatterternary has a subset of the options available to scatter. *toself* connects the endpoints of the trace (or each segment of the trace if it has gaps) into a closed shape. *tonext* fills the space between two traces if one completely encloses the other (eg consecutive contour lines), and behaves like *toself* if there is no trace before it. *tonext* should not be used if one trace does not enclose the other.", + "dflt": "none", + "editType": "calc", + "valType": "enumerated", + "values": [ + "none", + "toself", + "tonext" + ] + }, + "fillcolor": { + "description": "Sets the fill color. Defaults to a half-transparent variant of the line color, marker color, or marker line color, whichever is available.", + "editType": "style", + "valType": "color" + }, + "hoverinfo": { + "arrayOk": true, + "description": "Determines which trace information appear on hover. If `none` or `skip` are set, no information is displayed upon hovering. But, if `none` is set, click and hover events are still fired.", + "dflt": "all", + "editType": "none", + "extras": [ + "all", + "none", + "skip" + ], + "flags": [ + "a", + "b", + "c", + "text", + "name" + ], + "valType": "flaglist" + }, + "hoverinfosrc": { + "description": "Sets the source reference on Chart Studio Cloud for `hoverinfo`.", + "editType": "none", + "valType": "string" + }, + "hoverlabel": { + "align": { + "arrayOk": true, + "description": "Sets the horizontal alignment of the text content within hover label box. Has an effect only if the hover label text spans more two or more lines", + "dflt": "auto", + "editType": "none", + "valType": "enumerated", + "values": [ + "left", + "right", + "auto" + ] + }, + "alignsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `align`.", + "editType": "none", + "valType": "string" + }, + "bgcolor": { + "arrayOk": true, + "description": "Sets the background color of the hover labels for this trace", + "editType": "none", + "valType": "color" + }, + "bgcolorsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `bgcolor`.", + "editType": "none", + "valType": "string" + }, + "bordercolor": { + "arrayOk": true, + "description": "Sets the border color of the hover labels for this trace.", + "editType": "none", + "valType": "color" + }, + "bordercolorsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `bordercolor`.", + "editType": "none", + "valType": "string" + }, + "editType": "none", + "font": { + "color": { + "arrayOk": true, + "editType": "none", + "valType": "color" + }, + "colorsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `color`.", + "editType": "none", + "valType": "string" + }, + "description": "Sets the font used in hover labels.", + "editType": "none", + "family": { + "arrayOk": true, + "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", + "editType": "none", + "noBlank": true, + "strict": true, + "valType": "string" + }, + "familysrc": { + "description": "Sets the source reference on Chart Studio Cloud for `family`.", + "editType": "none", + "valType": "string" + }, + "lineposition": { + "arrayOk": true, + "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", + "dflt": "none", + "editType": "none", + "extras": [ + "none" + ], + "flags": [ + "under", + "over", + "through" + ], + "valType": "flaglist" + }, + "linepositionsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `lineposition`.", + "editType": "none", + "valType": "string" + }, + "role": "object", + "shadow": { + "arrayOk": true, + "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", + "dflt": "none", + "editType": "none", + "valType": "string" + }, + "shadowsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `shadow`.", + "editType": "none", + "valType": "string" + }, + "size": { + "arrayOk": true, + "editType": "none", + "min": 1, + "valType": "number" + }, + "sizesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `size`.", + "editType": "none", + "valType": "string" + }, + "style": { + "arrayOk": true, + "description": "Sets whether a font should be styled with a normal or italic face from its family.", + "dflt": "normal", + "editType": "none", + "valType": "enumerated", + "values": [ + "normal", + "italic" + ] + }, + "stylesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `style`.", + "editType": "none", + "valType": "string" + }, + "textcase": { + "arrayOk": true, + "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", + "dflt": "normal", + "editType": "none", + "valType": "enumerated", + "values": [ + "normal", + "word caps", + "upper", + "lower" + ] + }, + "textcasesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `textcase`.", + "editType": "none", + "valType": "string" + }, + "variant": { + "arrayOk": true, + "description": "Sets the variant of the font.", + "dflt": "normal", + "editType": "none", + "valType": "enumerated", + "values": [ + "normal", + "small-caps", + "all-small-caps", + "all-petite-caps", + "petite-caps", + "unicase" + ] + }, + "variantsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `variant`.", + "editType": "none", + "valType": "string" + }, + "weight": { + "arrayOk": true, + "description": "Sets the weight (or boldness) of the font.", + "dflt": "normal", + "editType": "none", + "extras": [ + "normal", + "bold" + ], + "max": 1000, + "min": 1, + "valType": "integer" + }, + "weightsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `weight`.", + "editType": "none", + "valType": "string" + } + }, + "namelength": { + "arrayOk": true, + "description": "Sets the default length (in number of characters) of the trace name in the hover labels for all traces. -1 shows the whole name regardless of length. 0-3 shows the first 0-3 characters, and an integer >3 will show the whole name if it is less than that many characters, but if it is longer, will truncate to `namelength - 3` characters and add an ellipsis.", + "dflt": 15, + "editType": "none", + "min": -1, + "valType": "integer" + }, + "namelengthsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `namelength`.", + "editType": "none", + "valType": "string" + }, + "role": "object", + "showarrow": { + "description": "Sets whether or not to show the hover label arrow/triangle pointing to the data point.", + "dflt": true, + "editType": "none", + "valType": "boolean" + } + }, + "hoveron": { + "description": "Do the hover effects highlight individual points (markers or line points) or do they highlight filled regions? If the fill is *toself* or *tonext* and there are no markers or text, then the default is *fills*, otherwise it is *points*.", + "editType": "style", + "flags": [ + "points", + "fills" + ], + "valType": "flaglist" + }, + "hovertemplate": { + "arrayOk": true, + "description": "Template string used for rendering the information that appear on hover box. Note that this will override `hoverinfo`. Variables are inserted using %{variable}, for example \"y: %{y}\" as well as %{xother}, {%_xother}, {%_xother_}, {%xother_}. When showing info for several points, *xother* will be added to those with different x positions from the first point. An underscore before or after *(x|y)other* will add a space on that side, only when this field is shown. Numbers are formatted using d3-format's syntax %{variable:d3-format}, for example \"Price: %{y:$.2f}\". https://github.com/d3/d3-format/tree/v1.4.5#d3-format for details on the formatting syntax. Dates are formatted using d3-time-format's syntax %{variable|d3-time-format}, for example \"Day: %{2019-01-01|%A}\". https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format for details on the date formatting syntax. Variables that can't be found will be replaced with the specifier. For example, a template of \"data: %{x}, %{y}\" will result in a value of \"data: 1, %{y}\" if x is 1 and y is missing. Variables with an undefined value will be replaced with the fallback value. The variables available in `hovertemplate` are the ones emitted as event data described at this link https://plotly.com/javascript/plotlyjs-events/#event-data. Additionally, all attributes that can be specified per-point (the ones that are `arrayOk: true`) are available. Anything contained in tag `` is displayed in the secondary box, for example `%{fullData.name}`. To hide the secondary box completely, use an empty tag ``.", + "dflt": "", + "editType": "none", + "valType": "string" + }, + "hovertemplatefallback": { + "description": "Fallback string that's displayed when a variable referenced in a template is missing. If the boolean value 'false' is passed in, the specifier with the missing variable will be displayed.", + "dflt": "-", + "editType": "none", + "valType": "any" + }, + "hovertemplatesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `hovertemplate`.", + "editType": "none", + "valType": "string" + }, + "hovertext": { + "arrayOk": true, + "description": "Sets hover text elements associated with each (a,b,c) point. If a single string, the same string appears over all the data points. If an array of strings, the items are mapped in order to the the data points in (a,b,c). To be seen, trace `hoverinfo` must contain a *text* flag.", + "dflt": "", + "editType": "style", + "valType": "string" + }, + "hovertextsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `hovertext`.", + "editType": "none", + "valType": "string" + }, + "ids": { + "description": "Assigns id labels to each datum. These ids for object constancy of data points during animation. Should be an array of strings, not numbers or any other type.", + "editType": "calc", + "valType": "data_array" + }, + "idssrc": { + "description": "Sets the source reference on Chart Studio Cloud for `ids`.", + "editType": "none", + "valType": "string" + }, + "legend": { + "description": "Sets the reference to a legend to show this trace in. References to these legends are *legend*, *legend2*, *legend3*, etc. Settings for these legends are set in the layout, under `layout.legend`, `layout.legend2`, etc.", + "dflt": "legend", + "editType": "style", + "valType": "subplotid" + }, + "legendgroup": { + "description": "Sets the legend group for this trace. Traces and shapes part of the same legend group hide/show at the same time when toggling legend items.", + "dflt": "", + "editType": "style", + "valType": "string" + }, + "legendgrouptitle": { + "editType": "style", + "font": { + "color": { + "editType": "style", + "valType": "color" + }, + "description": "Sets this legend group's title font.", + "editType": "style", + "family": { + "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", + "editType": "style", + "noBlank": true, + "strict": true, + "valType": "string" + }, + "lineposition": { + "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", + "dflt": "none", + "editType": "style", + "extras": [ + "none" + ], + "flags": [ + "under", + "over", + "through" + ], + "valType": "flaglist" + }, + "role": "object", + "shadow": { + "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", + "dflt": "none", + "editType": "style", + "valType": "string" + }, + "size": { + "editType": "style", + "min": 1, + "valType": "number" + }, + "style": { + "description": "Sets whether a font should be styled with a normal or italic face from its family.", + "dflt": "normal", + "editType": "style", + "valType": "enumerated", + "values": [ + "normal", + "italic" + ] + }, + "textcase": { + "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", + "dflt": "normal", + "editType": "style", + "valType": "enumerated", + "values": [ + "normal", + "word caps", + "upper", + "lower" + ] + }, + "variant": { + "description": "Sets the variant of the font.", + "dflt": "normal", + "editType": "style", + "valType": "enumerated", + "values": [ + "normal", + "small-caps", + "all-small-caps", + "all-petite-caps", + "petite-caps", + "unicase" + ] + }, + "weight": { + "description": "Sets the weight (or boldness) of the font.", + "dflt": "normal", + "editType": "style", + "extras": [ + "normal", + "bold" + ], + "max": 1000, + "min": 1, + "valType": "integer" + } + }, + "role": "object", + "text": { + "description": "Sets the title of the legend group.", + "dflt": "", + "editType": "style", + "valType": "string" + } + }, + "legendrank": { + "description": "Sets the legend rank for this trace. Items and groups with smaller ranks are presented on top/left side while with *reversed* `legend.traceorder` they are on bottom/right side. The default legendrank is 1000, so that you can use ranks less than 1000 to place certain items before all unranked items, and ranks greater than 1000 to go after all unranked items. When having unranked or equal rank items shapes would be displayed after traces i.e. according to their order in data and layout.", + "dflt": 1000, + "editType": "style", + "valType": "number" + }, + "legendwidth": { + "description": "Sets the width (in px or fraction) of the legend for this trace.", + "editType": "style", + "min": 0, + "valType": "number" + }, + "line": { + "backoff": { + "arrayOk": true, + "description": "Sets the line back off from the end point of the nth line segment (in px). This option is useful e.g. to avoid overlap with arrowhead markers. With *auto* the lines would trim before markers if `marker.angleref` is set to *previous*.", + "dflt": "auto", + "editType": "plot", + "min": 0, + "valType": "number" + }, + "backoffsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `backoff`.", + "editType": "none", + "valType": "string" + }, + "color": { + "description": "Sets the line color.", + "editType": "style", + "valType": "color" + }, + "dash": { + "description": "Sets the dash style of lines. Set to a dash type string (*solid*, *dot*, *dash*, *longdash*, *dashdot*, or *longdashdot*) or a dash length list in px (eg *5px,10px,2px,2px*).", + "dflt": "solid", + "editType": "style", + "valType": "string", + "values": [ + "solid", + "dot", + "dash", + "longdash", + "dashdot", + "longdashdot" + ] + }, + "editType": "calc", + "role": "object", + "shape": { + "description": "Determines the line shape. With *spline* the lines are drawn using spline interpolation. The other available values correspond to step-wise line shapes.", + "dflt": "linear", + "editType": "plot", + "valType": "enumerated", + "values": [ + "linear", + "spline" + ] + }, + "smoothing": { + "description": "Has an effect only if `shape` is set to *spline* Sets the amount of smoothing. *0* corresponds to no smoothing (equivalent to a *linear* shape).", + "dflt": 1, + "editType": "plot", + "max": 1.3, + "min": 0, + "valType": "number" + }, + "width": { + "description": "Sets the line width (in px).", + "dflt": 2, + "editType": "style", + "min": 0, + "valType": "number" + } + }, + "marker": { + "angle": { + "arrayOk": true, + "description": "Sets the marker angle in respect to `angleref`.", + "dflt": 0, + "editType": "plot", + "valType": "angle" + }, + "angleref": { + "description": "Sets the reference for marker angle. With *previous*, angle 0 points along the line from the previous point to this one. With *up*, angle 0 points toward the top of the screen.", + "dflt": "up", + "editType": "plot", + "valType": "enumerated", + "values": [ + "previous", + "up" + ] + }, + "anglesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `angle`.", + "editType": "none", + "valType": "string" + }, + "autocolorscale": { + "description": "Determines whether the colorscale is a default palette (`autocolorscale: true`) or the palette determined by `marker.colorscale`. Has an effect only if in `marker.color` is set to a numerical array. In case `colorscale` is unspecified or `autocolorscale` is true, the default palette will be chosen according to whether numbers in the `color` array are all positive, all negative or mixed.", + "dflt": true, + "editType": "calc", + "impliedEdits": {}, + "valType": "boolean" + }, + "cauto": { + "description": "Determines whether or not the color domain is computed with respect to the input data (here in `marker.color`) or the bounds set in `marker.cmin` and `marker.cmax` Has an effect only if in `marker.color` is set to a numerical array. Defaults to `false` when `marker.cmin` and `marker.cmax` are set by the user.", + "dflt": true, + "editType": "calc", + "impliedEdits": {}, + "valType": "boolean" + }, + "cmax": { + "description": "Sets the upper bound of the color domain. Has an effect only if in `marker.color` is set to a numerical array. Value should have the same units as in `marker.color` and if set, `marker.cmin` must be set as well.", + "dflt": null, + "editType": "plot", + "impliedEdits": { + "cauto": false + }, + "valType": "number" + }, + "cmid": { + "description": "Sets the mid-point of the color domain by scaling `marker.cmin` and/or `marker.cmax` to be equidistant to this point. Has an effect only if in `marker.color` is set to a numerical array. Value should have the same units as in `marker.color`. Has no effect when `marker.cauto` is `false`.", + "dflt": null, + "editType": "calc", + "impliedEdits": {}, + "valType": "number" + }, + "cmin": { + "description": "Sets the lower bound of the color domain. Has an effect only if in `marker.color` is set to a numerical array. Value should have the same units as in `marker.color` and if set, `marker.cmax` must be set as well.", + "dflt": null, + "editType": "plot", + "impliedEdits": { + "cauto": false + }, + "valType": "number" + }, + "color": { + "arrayOk": true, + "description": "Sets the marker color. It accepts either a specific color or an array of numbers that are mapped to the colorscale relative to the max and min values of the array or relative to `marker.cmin` and `marker.cmax` if set.", + "editType": "style", + "valType": "color" + }, + "coloraxis": { + "description": "Sets a reference to a shared color axis. References to these shared color axes are *coloraxis*, *coloraxis2*, *coloraxis3*, etc. Settings for these shared color axes are set in the layout, under `layout.coloraxis`, `layout.coloraxis2`, etc. Note that multiple color scales can be linked to the same color axis.", + "dflt": null, + "editType": "calc", + "regex": "/^coloraxis([2-9]|[1-9][0-9]+)?$/", + "valType": "subplotid" + }, + "colorbar": { + "bgcolor": { + "description": "Sets the color of padded area.", + "dflt": "rgba(0,0,0,0)", + "editType": "colorbars", + "valType": "color" + }, + "bordercolor": { + "description": "Sets the axis line color.", + "dflt": "#444", + "editType": "colorbars", + "valType": "color" + }, + "borderwidth": { + "description": "Sets the width (in px) or the border enclosing this color bar.", + "dflt": 0, + "editType": "colorbars", + "min": 0, + "valType": "number" + }, + "dtick": { + "description": "Sets the step in-between ticks on this axis. Use with `tick0`. Must be a positive number, or special strings available to *log* and *date* axes. If the axis `type` is *log*, then ticks are set every 10^(n*dtick) where n is the tick number. For example, to set a tick mark at 1, 10, 100, 1000, ... set dtick to 1. To set tick marks at 1, 100, 10000, ... set dtick to 2. To set tick marks at 1, 5, 25, 125, 625, 3125, ... set dtick to log_10(5), or 0.69897000433. *log* has several special values; *L*, where `f` is a positive number, gives ticks linearly spaced in value (but not position). For example `tick0` = 0.1, `dtick` = *L0.5* will put ticks at 0.1, 0.6, 1.1, 1.6 etc. To show powers of 10 plus small digits between, use *D1* (all digits) or *D2* (only 2 and 5). `tick0` is ignored for *D1* and *D2*. If the axis `type` is *date*, then you must convert the time to milliseconds. For example, to set the interval between ticks to one day, set `dtick` to 86400000.0. *date* also has special values *M* gives ticks spaced by a number of months. `n` must be a positive integer. To set ticks on the 15th of every third month, set `tick0` to *2000-01-15* and `dtick` to *M3*. To set ticks every 4 years, set `dtick` to *M48*", + "editType": "colorbars", + "impliedEdits": { + "tickmode": "linear" + }, + "valType": "any" + }, + "editType": "colorbars", + "exponentformat": { + "description": "Determines a formatting rule for the tick exponents. For example, consider the number 1,000,000,000. If *none*, it appears as 1,000,000,000. If *e*, 1e+9. If *E*, 1E+9. If *power*, 1x10^9 (with 9 in a super script). If *SI*, 1G. If *B*, 1B. *SI* uses prefixes from \"femto\" f (10^-15) to \"tera\" T (10^12). *SI extended* covers instead the full SI range from \"quecto\" q (10^-30) to \"quetta\" Q (10^30). If *SI* or *SI extended* is used and the exponent is beyond the above ranges, the formatting rule will automatically be switched to the power notation.", + "dflt": "B", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "none", + "e", + "E", + "power", + "SI", + "B", + "SI extended" + ] + }, + "labelalias": { + "description": "Replacement text for specific tick or hover labels. For example using {US: 'USA', CA: 'Canada'} changes US to USA and CA to Canada. The labels we would have shown must match the keys exactly, after adding any tickprefix or ticksuffix. For negative numbers the minus sign symbol used (U+2212) is wider than the regular ascii dash. That means you need to use −1 instead of -1. labelalias can be used with any axis type, and both keys (if needed) and values (if desired) can include html-like tags or MathJax.", + "dflt": false, + "editType": "colorbars", + "valType": "any" + }, + "len": { + "description": "Sets the length of the color bar This measure excludes the padding of both ends. That is, the color bar length is this length minus the padding on both ends.", + "dflt": 1, + "editType": "colorbars", + "min": 0, + "valType": "number" + }, + "lenmode": { + "description": "Determines whether this color bar's length (i.e. the measure in the color variation direction) is set in units of plot *fraction* or in *pixels. Use `len` to set the value.", + "dflt": "fraction", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "fraction", + "pixels" + ] + }, + "minexponent": { + "description": "Hide SI prefix for 10^n if |n| is below this number. This only has an effect when `tickformat` is *SI* or *B*.", + "dflt": 3, + "editType": "colorbars", + "min": 0, + "valType": "number" + }, + "nticks": { + "description": "Specifies the maximum number of ticks for the particular axis. The actual number of ticks will be chosen automatically to be less than or equal to `nticks`. Has an effect only if `tickmode` is set to *auto*.", + "dflt": 0, + "editType": "colorbars", + "min": 0, + "valType": "integer" + }, + "orientation": { + "description": "Sets the orientation of the colorbar.", + "dflt": "v", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "h", + "v" + ] + }, + "outlinecolor": { + "description": "Sets the axis line color.", + "dflt": "#444", + "editType": "colorbars", + "valType": "color" + }, + "outlinewidth": { + "description": "Sets the width (in px) of the axis line.", + "dflt": 1, + "editType": "colorbars", + "min": 0, + "valType": "number" + }, + "role": "object", + "separatethousands": { + "description": "If \"true\", even 4-digit integers are separated", + "dflt": false, + "editType": "colorbars", + "valType": "boolean" + }, + "showexponent": { + "description": "If *all*, all exponents are shown besides their significands. If *first*, only the exponent of the first tick is shown. If *last*, only the exponent of the last tick is shown. If *none*, no exponents appear.", + "dflt": "all", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "all", + "first", + "last", + "none" + ] + }, + "showticklabels": { + "description": "Determines whether or not the tick labels are drawn.", + "dflt": true, + "editType": "colorbars", + "valType": "boolean" + }, + "showtickprefix": { + "description": "If *all*, all tick labels are displayed with a prefix. If *first*, only the first tick is displayed with a prefix. If *last*, only the last tick is displayed with a suffix. If *none*, tick prefixes are hidden.", + "dflt": "all", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "all", + "first", + "last", + "none" + ] + }, + "showticksuffix": { + "description": "Same as `showtickprefix` but for tick suffixes.", + "dflt": "all", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "all", + "first", + "last", + "none" + ] + }, + "thickness": { + "description": "Sets the thickness of the color bar This measure excludes the size of the padding, ticks and labels.", + "dflt": 30, + "editType": "colorbars", + "min": 0, + "valType": "number" + }, + "thicknessmode": { + "description": "Determines whether this color bar's thickness (i.e. the measure in the constant color direction) is set in units of plot *fraction* or in *pixels*. Use `thickness` to set the value.", + "dflt": "pixels", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "fraction", + "pixels" + ] + }, + "tick0": { + "description": "Sets the placement of the first tick on this axis. Use with `dtick`. If the axis `type` is *log*, then you must take the log of your starting tick (e.g. to set the starting tick to 100, set the `tick0` to 2) except when `dtick`=*L* (see `dtick` for more info). If the axis `type` is *date*, it should be a date string, like date data. If the axis `type` is *category*, it should be a number, using the scale where each category is assigned a serial number from zero in the order it appears.", + "editType": "colorbars", + "impliedEdits": { + "tickmode": "linear" + }, + "valType": "any" + }, + "tickangle": { + "description": "Sets the angle of the tick labels with respect to the horizontal. For example, a `tickangle` of -90 draws the tick labels vertically.", + "dflt": "auto", + "editType": "colorbars", + "valType": "angle" + }, + "tickcolor": { + "description": "Sets the tick color.", + "dflt": "#444", + "editType": "colorbars", + "valType": "color" + }, + "tickfont": { + "color": { + "editType": "colorbars", + "valType": "color" + }, + "description": "Sets the color bar's tick label font", + "editType": "colorbars", + "family": { + "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", + "editType": "colorbars", + "noBlank": true, + "strict": true, + "valType": "string" + }, + "lineposition": { + "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", + "dflt": "none", + "editType": "colorbars", + "extras": [ + "none" + ], + "flags": [ + "under", + "over", + "through" + ], + "valType": "flaglist" + }, + "role": "object", + "shadow": { + "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", + "dflt": "none", + "editType": "colorbars", + "valType": "string" + }, + "size": { + "editType": "colorbars", + "min": 1, + "valType": "number" + }, + "style": { + "description": "Sets whether a font should be styled with a normal or italic face from its family.", + "dflt": "normal", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "normal", + "italic" + ] + }, + "textcase": { + "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", + "dflt": "normal", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "normal", + "word caps", + "upper", + "lower" + ] + }, + "variant": { + "description": "Sets the variant of the font.", + "dflt": "normal", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "normal", + "small-caps", + "all-small-caps", + "all-petite-caps", + "petite-caps", + "unicase" + ] + }, + "weight": { + "description": "Sets the weight (or boldness) of the font.", + "dflt": "normal", + "editType": "colorbars", + "extras": [ + "normal", + "bold" + ], + "max": 1000, + "min": 1, + "valType": "integer" + } + }, + "tickformat": { + "description": "Sets the tick label formatting rule using d3 formatting mini-languages which are very similar to those in Python. For numbers, see: https://github.com/d3/d3-format/tree/v1.4.5#d3-format. And for dates see: https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format. We add two items to d3's date formatter: *%h* for half of the year as a decimal number as well as *%{n}f* for fractional seconds with n digits. For example, *2016-10-13 09:15:23.456* with tickformat *%H~%M~%S.%2f* would display *09~15~23.46*", + "dflt": "", + "editType": "colorbars", + "valType": "string" + }, + "tickformatstops": { + "items": { + "tickformatstop": { + "dtickrange": { + "description": "range [*min*, *max*], where *min*, *max* - dtick values which describe some zoom level, it is possible to omit *min* or *max* value by passing *null*", + "editType": "colorbars", + "items": [ + { + "editType": "colorbars", + "valType": "any" + }, + { + "editType": "colorbars", + "valType": "any" + } + ], + "valType": "info_array" + }, + "editType": "colorbars", + "enabled": { + "description": "Determines whether or not this stop is used. If `false`, this stop is ignored even within its `dtickrange`.", + "dflt": true, + "editType": "colorbars", + "valType": "boolean" + }, + "name": { + "description": "When used in a template, named items are created in the output figure in addition to any items the figure already has in this array. You can modify these items in the output figure by making your own item with `templateitemname` matching this `name` alongside your modifications (including `visible: false` or `enabled: false` to hide it). Has no effect outside of a template.", + "editType": "colorbars", + "valType": "string" + }, + "role": "object", + "templateitemname": { + "description": "Used to refer to a named item in this array in the template. Named items from the template will be created even without a matching item in the input figure, but you can modify one by making an item with `templateitemname` matching its `name`, alongside your modifications (including `visible: false` or `enabled: false` to hide it). If there is no template or no matching item, this item will be hidden unless you explicitly show it with `visible: true`.", + "editType": "colorbars", + "valType": "string" + }, + "value": { + "description": "string - dtickformat for described zoom level, the same as *tickformat*", + "dflt": "", + "editType": "colorbars", + "valType": "string" + } + } + }, + "role": "object" + }, + "ticklabeloverflow": { + "description": "Determines how we handle tick labels that would overflow either the graph div or the domain of the axis. The default value for inside tick labels is *hide past domain*. In other cases the default is *hide past div*.", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "allow", + "hide past div", + "hide past domain" + ] + }, + "ticklabelposition": { + "description": "Determines where tick labels are drawn relative to the ticks. Left and right options are used when `orientation` is *h*, top and bottom when `orientation` is *v*.", + "dflt": "outside", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "outside", + "inside", + "outside top", + "inside top", + "outside left", + "inside left", + "outside right", + "inside right", + "outside bottom", + "inside bottom" + ] + }, + "ticklabelstep": { + "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", + "dflt": 1, + "editType": "colorbars", + "min": 1, + "valType": "integer" + }, + "ticklen": { + "description": "Sets the tick length (in px).", + "dflt": 5, + "editType": "colorbars", + "min": 0, + "valType": "number" + }, + "tickmode": { + "description": "Sets the tick mode for this axis. If *auto*, the number of ticks is set via `nticks`. If *linear*, the placement of the ticks is determined by a starting position `tick0` and a tick step `dtick` (*linear* is the default value if `tick0` and `dtick` are provided). If *array*, the placement of the ticks is set via `tickvals` and the tick text is `ticktext`. (*array* is the default value if `tickvals` is provided).", + "editType": "colorbars", + "impliedEdits": {}, + "valType": "enumerated", + "values": [ + "auto", + "linear", + "array" + ] + }, + "tickprefix": { + "description": "Sets a tick label prefix.", + "dflt": "", + "editType": "colorbars", + "valType": "string" + }, + "ticks": { + "description": "Determines whether ticks are drawn or not. If **, this axis' ticks are not drawn. If *outside* (*inside*), this axis' are drawn outside (inside) the axis lines.", + "dflt": "", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "outside", + "inside", + "" + ] + }, + "ticksuffix": { + "description": "Sets a tick label suffix.", + "dflt": "", + "editType": "colorbars", + "valType": "string" + }, + "ticktext": { + "description": "Sets the text displayed at the ticks position via `tickvals`. Only has an effect if `tickmode` is set to *array*. Used with `tickvals`.", + "editType": "colorbars", + "valType": "data_array" + }, + "ticktextsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `ticktext`.", + "editType": "none", + "valType": "string" + }, + "tickvals": { + "description": "Sets the values at which ticks on this axis appear. Only has an effect if `tickmode` is set to *array*. Used with `ticktext`.", + "editType": "colorbars", + "valType": "data_array" + }, + "tickvalssrc": { + "description": "Sets the source reference on Chart Studio Cloud for `tickvals`.", + "editType": "none", + "valType": "string" + }, + "tickwidth": { + "description": "Sets the tick width (in px).", + "dflt": 1, + "editType": "colorbars", + "min": 0, + "valType": "number" + }, + "title": { + "editType": "colorbars", + "font": { + "color": { + "editType": "colorbars", + "valType": "color" + }, + "description": "Sets this color bar's title font.", + "editType": "colorbars", + "family": { + "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", + "editType": "colorbars", + "noBlank": true, + "strict": true, + "valType": "string" + }, + "lineposition": { + "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", + "dflt": "none", + "editType": "colorbars", + "extras": [ + "none" + ], + "flags": [ + "under", + "over", + "through" + ], + "valType": "flaglist" + }, + "role": "object", + "shadow": { + "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", + "dflt": "none", + "editType": "colorbars", + "valType": "string" + }, + "size": { + "editType": "colorbars", + "min": 1, + "valType": "number" + }, + "style": { + "description": "Sets whether a font should be styled with a normal or italic face from its family.", + "dflt": "normal", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "normal", + "italic" + ] + }, + "textcase": { + "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", + "dflt": "normal", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "normal", + "word caps", + "upper", + "lower" + ] + }, + "variant": { + "description": "Sets the variant of the font.", + "dflt": "normal", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "normal", + "small-caps", + "all-small-caps", + "all-petite-caps", + "petite-caps", + "unicase" + ] + }, + "weight": { + "description": "Sets the weight (or boldness) of the font.", + "dflt": "normal", + "editType": "colorbars", + "extras": [ + "normal", + "bold" + ], + "max": 1000, + "min": 1, + "valType": "integer" + } + }, + "role": "object", + "side": { + "description": "Determines the location of color bar's title with respect to the color bar. Defaults to *top* when `orientation` if *v* and defaults to *right* when `orientation` if *h*.", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "right", + "top", + "bottom" + ] + }, + "text": { + "description": "Sets the title of the color bar.", + "editType": "colorbars", + "valType": "string" + } + }, + "x": { + "description": "Sets the x position with respect to `xref` of the color bar (in plot fraction). When `xref` is *paper*, defaults to 1.02 when `orientation` is *v* and 0.5 when `orientation` is *h*. When `xref` is *container*, defaults to *1* when `orientation` is *v* and 0.5 when `orientation` is *h*. Must be between *0* and *1* if `xref` is *container* and between *-2* and *3* if `xref` is *paper*.", + "editType": "colorbars", + "valType": "number" + }, + "xanchor": { + "description": "Sets this color bar's horizontal position anchor. This anchor binds the `x` position to the *left*, *center* or *right* of the color bar. Defaults to *left* when `orientation` is *v* and *center* when `orientation` is *h*.", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "left", + "center", + "right" + ] + }, + "xpad": { + "description": "Sets the amount of padding (in px) along the x direction.", + "dflt": 10, + "editType": "colorbars", + "min": 0, + "valType": "number" + }, + "xref": { + "description": "Sets the container `x` refers to. *container* spans the entire `width` of the plot. *paper* refers to the width of the plotting area only.", + "dflt": "paper", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "container", + "paper" + ] + }, + "y": { + "description": "Sets the y position with respect to `yref` of the color bar (in plot fraction). When `yref` is *paper*, defaults to 0.5 when `orientation` is *v* and 1.02 when `orientation` is *h*. When `yref` is *container*, defaults to 0.5 when `orientation` is *v* and 1 when `orientation` is *h*. Must be between *0* and *1* if `yref` is *container* and between *-2* and *3* if `yref` is *paper*.", + "editType": "colorbars", + "valType": "number" + }, + "yanchor": { + "description": "Sets this color bar's vertical position anchor This anchor binds the `y` position to the *top*, *middle* or *bottom* of the color bar. Defaults to *middle* when `orientation` is *v* and *bottom* when `orientation` is *h*.", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "top", + "middle", + "bottom" + ] + }, + "ypad": { + "description": "Sets the amount of padding (in px) along the y direction.", + "dflt": 10, + "editType": "colorbars", + "min": 0, + "valType": "number" + }, + "yref": { + "description": "Sets the container `y` refers to. *container* spans the entire `height` of the plot. *paper* refers to the height of the plotting area only.", + "dflt": "paper", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "container", + "paper" + ] + } + }, + "colorscale": { + "description": "Sets the colorscale. Has an effect only if in `marker.color` is set to a numerical array. The colorscale must be an array containing arrays mapping a normalized value to an rgb, rgba, hex, hsl, hsv, or named color string. At minimum, a mapping for the lowest (0) and highest (1) values are required. For example, `[[0, 'rgb(0,0,255)'], [1, 'rgb(255,0,0)']]`. To control the bounds of the colorscale in color space, use `marker.cmin` and `marker.cmax`. Alternatively, `colorscale` may be a palette name string of the following list: Blackbody,Bluered,Blues,Cividis,Earth,Electric,Greens,Greys,Hot,Jet,Picnic,Portland,Rainbow,RdBu,Reds,Viridis,YlGnBu,YlOrRd.", + "dflt": null, + "editType": "calc", + "impliedEdits": { + "autocolorscale": false + }, + "valType": "colorscale" + }, + "colorsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `color`.", + "editType": "none", + "valType": "string" + }, + "editType": "calc", + "gradient": { + "color": { + "arrayOk": true, + "description": "Sets the final color of the gradient fill: the center color for radial, the right for horizontal, or the bottom for vertical.", + "editType": "calc", + "valType": "color" + }, + "colorsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `color`.", + "editType": "none", + "valType": "string" + }, + "editType": "calc", + "role": "object", + "type": { + "arrayOk": true, + "description": "Sets the type of gradient used to fill the markers", + "dflt": "none", + "editType": "calc", + "valType": "enumerated", + "values": [ + "radial", + "horizontal", + "vertical", + "none" + ] + }, + "typesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `type`.", + "editType": "none", + "valType": "string" + } + }, + "line": { + "autocolorscale": { + "description": "Determines whether the colorscale is a default palette (`autocolorscale: true`) or the palette determined by `marker.line.colorscale`. Has an effect only if in `marker.line.color` is set to a numerical array. In case `colorscale` is unspecified or `autocolorscale` is true, the default palette will be chosen according to whether numbers in the `color` array are all positive, all negative or mixed.", + "dflt": true, + "editType": "calc", + "impliedEdits": {}, + "valType": "boolean" + }, + "cauto": { + "description": "Determines whether or not the color domain is computed with respect to the input data (here in `marker.line.color`) or the bounds set in `marker.line.cmin` and `marker.line.cmax` Has an effect only if in `marker.line.color` is set to a numerical array. Defaults to `false` when `marker.line.cmin` and `marker.line.cmax` are set by the user.", + "dflt": true, + "editType": "calc", + "impliedEdits": {}, + "valType": "boolean" + }, + "cmax": { + "description": "Sets the upper bound of the color domain. Has an effect only if in `marker.line.color` is set to a numerical array. Value should have the same units as in `marker.line.color` and if set, `marker.line.cmin` must be set as well.", + "dflt": null, + "editType": "plot", + "impliedEdits": { + "cauto": false + }, + "valType": "number" + }, + "cmid": { + "description": "Sets the mid-point of the color domain by scaling `marker.line.cmin` and/or `marker.line.cmax` to be equidistant to this point. Has an effect only if in `marker.line.color` is set to a numerical array. Value should have the same units as in `marker.line.color`. Has no effect when `marker.line.cauto` is `false`.", + "dflt": null, + "editType": "calc", + "impliedEdits": {}, + "valType": "number" + }, + "cmin": { + "description": "Sets the lower bound of the color domain. Has an effect only if in `marker.line.color` is set to a numerical array. Value should have the same units as in `marker.line.color` and if set, `marker.line.cmax` must be set as well.", + "dflt": null, + "editType": "plot", + "impliedEdits": { + "cauto": false + }, + "valType": "number" + }, + "color": { + "arrayOk": true, + "description": "Sets the marker.line color. It accepts either a specific color or an array of numbers that are mapped to the colorscale relative to the max and min values of the array or relative to `marker.line.cmin` and `marker.line.cmax` if set.", + "editType": "style", + "valType": "color" + }, + "coloraxis": { + "description": "Sets a reference to a shared color axis. References to these shared color axes are *coloraxis*, *coloraxis2*, *coloraxis3*, etc. Settings for these shared color axes are set in the layout, under `layout.coloraxis`, `layout.coloraxis2`, etc. Note that multiple color scales can be linked to the same color axis.", + "dflt": null, + "editType": "calc", + "regex": "/^coloraxis([2-9]|[1-9][0-9]+)?$/", + "valType": "subplotid" + }, + "colorscale": { + "description": "Sets the colorscale. Has an effect only if in `marker.line.color` is set to a numerical array. The colorscale must be an array containing arrays mapping a normalized value to an rgb, rgba, hex, hsl, hsv, or named color string. At minimum, a mapping for the lowest (0) and highest (1) values are required. For example, `[[0, 'rgb(0,0,255)'], [1, 'rgb(255,0,0)']]`. To control the bounds of the colorscale in color space, use `marker.line.cmin` and `marker.line.cmax`. Alternatively, `colorscale` may be a palette name string of the following list: Blackbody,Bluered,Blues,Cividis,Earth,Electric,Greens,Greys,Hot,Jet,Picnic,Portland,Rainbow,RdBu,Reds,Viridis,YlGnBu,YlOrRd.", + "dflt": null, + "editType": "calc", + "impliedEdits": { + "autocolorscale": false + }, + "valType": "colorscale" + }, + "colorsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `color`.", + "editType": "none", + "valType": "string" + }, + "editType": "calc", + "reversescale": { + "description": "Reverses the color mapping if true. Has an effect only if in `marker.line.color` is set to a numerical array. If true, `marker.line.cmin` will correspond to the last color in the array and `marker.line.cmax` will correspond to the first color.", + "dflt": false, + "editType": "plot", + "valType": "boolean" + }, + "role": "object", + "width": { + "arrayOk": true, + "description": "Sets the width (in px) of the lines bounding the marker points.", + "editType": "style", + "min": 0, + "valType": "number" + }, + "widthsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `width`.", + "editType": "none", + "valType": "string" + } + }, + "maxdisplayed": { + "description": "Sets a maximum number of points to be drawn on the graph. *0* corresponds to no limit.", + "dflt": 0, + "editType": "plot", + "min": 0, + "valType": "number" + }, + "opacity": { + "arrayOk": true, + "description": "Sets the marker opacity.", + "editType": "style", + "max": 1, + "min": 0, + "valType": "number" + }, + "opacitysrc": { + "description": "Sets the source reference on Chart Studio Cloud for `opacity`.", + "editType": "none", + "valType": "string" + }, + "reversescale": { + "description": "Reverses the color mapping if true. Has an effect only if in `marker.color` is set to a numerical array. If true, `marker.cmin` will correspond to the last color in the array and `marker.cmax` will correspond to the first color.", + "dflt": false, + "editType": "plot", + "valType": "boolean" + }, + "role": "object", + "showscale": { + "description": "Determines whether or not a colorbar is displayed for this trace. Has an effect only if in `marker.color` is set to a numerical array.", + "dflt": false, + "editType": "calc", + "valType": "boolean" + }, + "size": { + "arrayOk": true, + "description": "Sets the marker size (in px).", + "dflt": 6, + "editType": "calc", + "min": 0, + "valType": "number" + }, + "sizemin": { + "description": "Has an effect only if `marker.size` is set to a numerical array. Sets the minimum size (in px) of the rendered marker points.", + "dflt": 0, + "editType": "calc", + "min": 0, + "valType": "number" + }, + "sizemode": { + "description": "Has an effect only if `marker.size` is set to a numerical array. Sets the rule for which the data in `size` is converted to pixels.", + "dflt": "diameter", + "editType": "calc", + "valType": "enumerated", + "values": [ + "diameter", + "area" + ] + }, + "sizeref": { + "description": "Has an effect only if `marker.size` is set to a numerical array. Sets the scale factor used to determine the rendered size of marker points. Use with `sizemin` and `sizemode`.", + "dflt": 1, + "editType": "calc", + "valType": "number" + }, + "sizesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `size`.", + "editType": "none", + "valType": "string" + }, + "standoff": { + "arrayOk": true, + "description": "Moves the marker away from the data point in the direction of `angle` (in px). This can be useful for example if you have another marker at this location and you want to point an arrowhead marker at it.", + "dflt": 0, + "editType": "plot", + "min": 0, + "valType": "number" + }, + "standoffsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `standoff`.", + "editType": "none", + "valType": "string" + }, + "symbol": { + "arrayOk": true, + "description": "Sets the marker symbol type. Adding 100 is equivalent to appending *-open* to a symbol name. Adding 200 is equivalent to appending *-dot* to a symbol name. Adding 300 is equivalent to appending *-open-dot* or *dot-open* to a symbol name.", + "dflt": "circle", + "editType": "style", + "valType": "enumerated", + "values": [ + 0, + "0", + "circle", + 100, + "100", + "circle-open", + 200, + "200", + "circle-dot", + 300, + "300", + "circle-open-dot", + 1, + "1", + "square", + 101, + "101", + "square-open", + 201, + "201", + "square-dot", + 301, + "301", + "square-open-dot", + 2, + "2", + "diamond", + 102, + "102", + "diamond-open", + 202, + "202", + "diamond-dot", + 302, + "302", + "diamond-open-dot", + 3, + "3", + "cross", + 103, + "103", + "cross-open", + 203, + "203", + "cross-dot", + 303, + "303", + "cross-open-dot", + 4, + "4", + "x", + 104, + "104", + "x-open", + 204, + "204", + "x-dot", + 304, + "304", + "x-open-dot", + 5, + "5", + "triangle-up", + 105, + "105", + "triangle-up-open", + 205, + "205", + "triangle-up-dot", + 305, + "305", + "triangle-up-open-dot", + 6, + "6", + "triangle-down", + 106, + "106", + "triangle-down-open", + 206, + "206", + "triangle-down-dot", + 306, + "306", + "triangle-down-open-dot", + 7, + "7", + "triangle-left", + 107, + "107", + "triangle-left-open", + 207, + "207", + "triangle-left-dot", + 307, + "307", + "triangle-left-open-dot", + 8, + "8", + "triangle-right", + 108, + "108", + "triangle-right-open", + 208, + "208", + "triangle-right-dot", + 308, + "308", + "triangle-right-open-dot", + 9, + "9", + "triangle-ne", + 109, + "109", + "triangle-ne-open", + 209, + "209", + "triangle-ne-dot", + 309, + "309", + "triangle-ne-open-dot", + 10, + "10", + "triangle-se", + 110, + "110", + "triangle-se-open", + 210, + "210", + "triangle-se-dot", + 310, + "310", + "triangle-se-open-dot", + 11, + "11", + "triangle-sw", + 111, + "111", + "triangle-sw-open", + 211, + "211", + "triangle-sw-dot", + 311, + "311", + "triangle-sw-open-dot", + 12, + "12", + "triangle-nw", + 112, + "112", + "triangle-nw-open", + 212, + "212", + "triangle-nw-dot", + 312, + "312", + "triangle-nw-open-dot", + 13, + "13", + "pentagon", + 113, + "113", + "pentagon-open", + 213, + "213", + "pentagon-dot", + 313, + "313", + "pentagon-open-dot", + 14, + "14", + "hexagon", + 114, + "114", + "hexagon-open", + 214, + "214", + "hexagon-dot", + 314, + "314", + "hexagon-open-dot", + 15, + "15", + "hexagon2", + 115, + "115", + "hexagon2-open", + 215, + "215", + "hexagon2-dot", + 315, + "315", + "hexagon2-open-dot", + 16, + "16", + "octagon", + 116, + "116", + "octagon-open", + 216, + "216", + "octagon-dot", + 316, + "316", + "octagon-open-dot", + 17, + "17", + "star", + 117, + "117", + "star-open", + 217, + "217", + "star-dot", + 317, + "317", + "star-open-dot", + 18, + "18", + "hexagram", + 118, + "118", + "hexagram-open", + 218, + "218", + "hexagram-dot", + 318, + "318", + "hexagram-open-dot", + 19, + "19", + "star-triangle-up", + 119, + "119", + "star-triangle-up-open", + 219, + "219", + "star-triangle-up-dot", + 319, + "319", + "star-triangle-up-open-dot", + 20, + "20", + "star-triangle-down", + 120, + "120", + "star-triangle-down-open", + 220, + "220", + "star-triangle-down-dot", + 320, + "320", + "star-triangle-down-open-dot", + 21, + "21", + "star-square", + 121, + "121", + "star-square-open", + 221, + "221", + "star-square-dot", + 321, + "321", + "star-square-open-dot", + 22, + "22", + "star-diamond", + 122, + "122", + "star-diamond-open", + 222, + "222", + "star-diamond-dot", + 322, + "322", + "star-diamond-open-dot", + 23, + "23", + "diamond-tall", + 123, + "123", + "diamond-tall-open", + 223, + "223", + "diamond-tall-dot", + 323, + "323", + "diamond-tall-open-dot", + 24, + "24", + "diamond-wide", + 124, + "124", + "diamond-wide-open", + 224, + "224", + "diamond-wide-dot", + 324, + "324", + "diamond-wide-open-dot", + 25, + "25", + "hourglass", + 125, + "125", + "hourglass-open", + 26, + "26", + "bowtie", + 126, + "126", + "bowtie-open", + 27, + "27", + "circle-cross", + 127, + "127", + "circle-cross-open", + 28, + "28", + "circle-x", + 128, + "128", + "circle-x-open", + 29, + "29", + "square-cross", + 129, + "129", + "square-cross-open", + 30, + "30", + "square-x", + 130, + "130", + "square-x-open", + 31, + "31", + "diamond-cross", + 131, + "131", + "diamond-cross-open", + 32, + "32", + "diamond-x", + 132, + "132", + "diamond-x-open", + 33, + "33", + "cross-thin", + 133, + "133", + "cross-thin-open", + 34, + "34", + "x-thin", + 134, + "134", + "x-thin-open", + 35, + "35", + "asterisk", + 135, + "135", + "asterisk-open", + 36, + "36", + "hash", + 136, + "136", + "hash-open", + 236, + "236", + "hash-dot", + 336, + "336", + "hash-open-dot", + 37, + "37", + "y-up", + 137, + "137", + "y-up-open", + 38, + "38", + "y-down", + 138, + "138", + "y-down-open", + 39, + "39", + "y-left", + 139, + "139", + "y-left-open", + 40, + "40", + "y-right", + 140, + "140", + "y-right-open", + 41, + "41", + "line-ew", + 141, + "141", + "line-ew-open", + 42, + "42", + "line-ns", + 142, + "142", + "line-ns-open", + 43, + "43", + "line-ne", + 143, + "143", + "line-ne-open", + 44, + "44", + "line-nw", + 144, + "144", + "line-nw-open", + 45, + "45", + "arrow-up", + 145, + "145", + "arrow-up-open", + 46, + "46", + "arrow-down", + 146, + "146", + "arrow-down-open", + 47, + "47", + "arrow-left", + 147, + "147", + "arrow-left-open", + 48, + "48", + "arrow-right", + 148, + "148", + "arrow-right-open", + 49, + "49", + "arrow-bar-up", + 149, + "149", + "arrow-bar-up-open", + 50, + "50", + "arrow-bar-down", + 150, + "150", + "arrow-bar-down-open", + 51, + "51", + "arrow-bar-left", + 151, + "151", + "arrow-bar-left-open", + 52, + "52", + "arrow-bar-right", + 152, + "152", + "arrow-bar-right-open", + 53, + "53", + "arrow", + 153, + "153", + "arrow-open", + 54, + "54", + "arrow-wide", + 154, + "154", + "arrow-wide-open" + ] + }, + "symbolsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `symbol`.", + "editType": "none", + "valType": "string" + } + }, + "meta": { + "arrayOk": true, + "description": "Assigns extra meta information associated with this trace that can be used in various text attributes. Attributes such as trace `name`, graph, axis and colorbar `title.text`, annotation `text` `rangeselector`, `updatemenues` and `sliders` `label` text all support `meta`. To access the trace `meta` values in an attribute in the same trace, simply use `%{meta[i]}` where `i` is the index or key of the `meta` item in question. To access trace `meta` in layout attributes, use `%{data[n[.meta[i]}` where `i` is the index or key of the `meta` and `n` is the trace index.", + "editType": "plot", + "valType": "any" + }, + "metasrc": { + "description": "Sets the source reference on Chart Studio Cloud for `meta`.", + "editType": "none", + "valType": "string" + }, + "mode": { + "description": "Determines the drawing mode for this scatter trace. If the provided `mode` includes *text* then the `text` elements appear at the coordinates. Otherwise, the `text` elements appear on hover. If there are less than 20 points and the trace is not stacked then the default is *lines+markers*. Otherwise, *lines*.", + "dflt": "markers", + "editType": "calc", + "extras": [ + "none" + ], + "flags": [ + "lines", + "markers", + "text" + ], + "valType": "flaglist" + }, + "name": { + "description": "Sets the trace name. The trace name appears as the legend item and on hover.", + "editType": "style", + "valType": "string" + }, + "opacity": { + "description": "Sets the opacity of the trace.", + "dflt": 1, + "editType": "style", + "max": 1, + "min": 0, + "valType": "number" + }, + "selected": { + "editType": "style", + "marker": { + "color": { + "description": "Sets the marker color of selected points.", + "editType": "style", + "valType": "color" + }, + "editType": "style", + "opacity": { + "description": "Sets the marker opacity of selected points.", + "editType": "style", + "max": 1, + "min": 0, + "valType": "number" + }, + "role": "object", + "size": { + "description": "Sets the marker size of selected points.", + "editType": "style", + "min": 0, + "valType": "number" + } + }, + "role": "object", + "textfont": { + "color": { + "description": "Sets the text font color of selected points.", + "editType": "style", + "valType": "color" + }, + "editType": "style", + "role": "object" + } + }, + "selectedpoints": { + "description": "Array containing integer indices of selected points. Has an effect only for traces that support selections. Note that an empty array means an empty selection where the `unselected` are turned on for all points, whereas, any other non-array values means no selection all where the `selected` and `unselected` styles have no effect.", + "editType": "calc", + "valType": "any" + }, + "showlegend": { + "description": "Determines whether or not an item corresponding to this trace is shown in the legend.", + "dflt": true, + "editType": "style", + "valType": "boolean" + }, + "stream": { + "editType": "calc", + "maxpoints": { + "description": "Sets the maximum number of points to keep on the plots from an incoming stream. If `maxpoints` is set to *50*, only the newest 50 points will be displayed on the plot.", + "dflt": 500, + "editType": "calc", + "max": 10000, + "min": 0, + "valType": "number" + }, + "role": "object", + "token": { + "description": "The stream id number links a data trace on a plot with a stream. See https://chart-studio.plotly.com/settings for more details.", + "editType": "calc", + "noBlank": true, + "strict": true, + "valType": "string" + } + }, + "subplot": { + "description": "Sets a reference between this trace's data coordinates and a ternary subplot. If *ternary* (the default value), the data refer to `layout.ternary`. If *ternary2*, the data refer to `layout.ternary2`, and so on.", + "dflt": "ternary", + "editType": "calc", + "valType": "subplotid" + }, + "sum": { + "description": "The number each triplet should sum to, if only two of `a`, `b`, and `c` are provided. This overrides `ternary.sum` to normalize this specific trace, but does not affect the values displayed on the axes. 0 (or missing) means to use ternary.sum", + "dflt": 0, + "editType": "calc", + "min": 0, + "valType": "number" + }, + "text": { + "arrayOk": true, + "description": "Sets text elements associated with each (a,b,c) point. If a single string, the same string appears over all the data points. If an array of strings, the items are mapped in order to the the data points in (a,b,c). If trace `hoverinfo` contains a *text* flag and *hovertext* is not set, these elements will be seen in the hover labels.", + "dflt": "", + "editType": "calc", + "valType": "string" + }, + "textfont": { + "color": { + "arrayOk": true, + "editType": "style", + "valType": "color" + }, + "colorsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `color`.", + "editType": "none", + "valType": "string" + }, + "description": "Sets the text font.", + "editType": "calc", + "family": { + "arrayOk": true, + "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", + "editType": "calc", + "noBlank": true, + "strict": true, + "valType": "string" + }, + "familysrc": { + "description": "Sets the source reference on Chart Studio Cloud for `family`.", + "editType": "none", + "valType": "string" + }, + "lineposition": { + "arrayOk": true, + "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", + "dflt": "none", + "editType": "calc", + "extras": [ + "none" + ], + "flags": [ + "under", + "over", + "through" + ], + "valType": "flaglist" + }, + "linepositionsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `lineposition`.", + "editType": "none", + "valType": "string" + }, + "role": "object", + "shadow": { + "arrayOk": true, + "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", + "dflt": "none", + "editType": "calc", + "valType": "string" + }, + "shadowsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `shadow`.", + "editType": "none", + "valType": "string" + }, + "size": { + "arrayOk": true, + "editType": "calc", + "min": 1, + "valType": "number" + }, + "sizesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `size`.", + "editType": "none", + "valType": "string" + }, + "style": { + "arrayOk": true, + "description": "Sets whether a font should be styled with a normal or italic face from its family.", + "dflt": "normal", + "editType": "calc", + "valType": "enumerated", + "values": [ + "normal", + "italic" + ] + }, + "stylesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `style`.", + "editType": "none", + "valType": "string" + }, + "textcase": { + "arrayOk": true, + "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", + "dflt": "normal", + "editType": "calc", + "valType": "enumerated", + "values": [ + "normal", + "word caps", + "upper", + "lower" + ] + }, + "textcasesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `textcase`.", + "editType": "none", + "valType": "string" + }, + "variant": { + "arrayOk": true, + "description": "Sets the variant of the font.", + "dflt": "normal", + "editType": "calc", + "valType": "enumerated", + "values": [ + "normal", + "small-caps", + "all-small-caps", + "all-petite-caps", + "petite-caps", + "unicase" + ] + }, + "variantsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `variant`.", + "editType": "none", + "valType": "string" + }, + "weight": { + "arrayOk": true, + "description": "Sets the weight (or boldness) of the font.", + "dflt": "normal", + "editType": "calc", + "extras": [ + "normal", + "bold" + ], + "max": 1000, + "min": 1, + "valType": "integer" + }, + "weightsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `weight`.", + "editType": "none", + "valType": "string" + } + }, + "textposition": { + "arrayOk": true, + "description": "Sets the positions of the `text` elements with respects to the (x,y) coordinates.", + "dflt": "middle center", + "editType": "calc", + "valType": "enumerated", + "values": [ + "top left", + "top center", + "top right", + "middle left", + "middle center", + "middle right", + "bottom left", + "bottom center", + "bottom right" + ] + }, + "textpositionsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `textposition`.", + "editType": "none", + "valType": "string" + }, + "textsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `text`.", + "editType": "none", + "valType": "string" + }, + "texttemplate": { + "arrayOk": true, + "description": "Template string used for rendering the information text that appears on points. Note that this will override `textinfo`. Variables are inserted using %{variable}, for example \"y: %{y}\". Numbers are formatted using d3-format's syntax %{variable:d3-format}, for example \"Price: %{y:$.2f}\". https://github.com/d3/d3-format/tree/v1.4.5#d3-format for details on the formatting syntax. Dates are formatted using d3-time-format's syntax %{variable|d3-time-format}, for example \"Day: %{2019-01-01|%A}\". https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format for details on the date formatting syntax. Variables that can't be found will be replaced with the specifier. For example, a template of \"data: %{x}, %{y}\" will result in a value of \"data: 1, %{y}\" if x is 1 and y is missing. Variables with an undefined value will be replaced with the fallback value. All attributes that can be specified per-point (the ones that are `arrayOk: true`) are available. Finally, the template string has access to variables `a`, `b`, `c` and `text`.", + "dflt": "", + "editType": "plot", + "valType": "string" + }, + "texttemplatefallback": { + "description": "Fallback string that's displayed when a variable referenced in a template is missing. If the boolean value 'false' is passed in, the specifier with the missing variable will be displayed.", + "dflt": "-", + "editType": "plot", + "valType": "any" + }, + "texttemplatesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `texttemplate`.", + "editType": "none", + "valType": "string" + }, + "type": "scatterternary", + "uid": { + "description": "Assign an id to this trace, Use this to provide object constancy between traces during animations and transitions.", + "editType": "plot", + "valType": "string" + }, + "uirevision": { + "description": "Controls persistence of some user-driven changes to the trace: `constraintrange` in `parcoords` traces, as well as some `editable: true` modifications such as `name` and `colorbar.title`. Defaults to `layout.uirevision`. Note that other user-driven trace attribute changes are controlled by `layout` attributes: `trace.visible` is controlled by `layout.legend.uirevision`, `selectedpoints` is controlled by `layout.selectionrevision`, and `colorbar.(x|y)` (accessible with `config: {editable: true}`) is controlled by `layout.editrevision`. Trace changes are tracked by `uid`, which only falls back on trace index if no `uid` is provided. So if your app can add/remove traces before the end of the `data` array, such that the same trace has a different index, you can still preserve user-driven changes if you give each trace a `uid` that stays with it as it moves.", + "editType": "none", + "valType": "any" + }, + "unselected": { + "editType": "style", + "marker": { + "color": { + "description": "Sets the marker color of unselected points, applied only when a selection exists.", + "editType": "style", + "valType": "color" + }, + "editType": "style", + "opacity": { + "description": "Sets the marker opacity of unselected points, applied only when a selection exists.", + "editType": "style", + "max": 1, + "min": 0, + "valType": "number" + }, + "role": "object", + "size": { + "description": "Sets the marker size of unselected points, applied only when a selection exists.", + "editType": "style", + "min": 0, + "valType": "number" + } + }, + "role": "object", + "textfont": { + "color": { + "description": "Sets the text font color of unselected points, applied only when a selection exists.", + "editType": "style", + "valType": "color" + }, + "editType": "style", + "role": "object" + } + }, + "visible": { + "description": "Determines whether or not this trace is visible. If *legendonly*, the trace is not drawn, but can appear as a legend item (provided that the legend itself is visible).", + "dflt": true, + "editType": "calc", + "valType": "enumerated", + "values": [ + true, + false, + "legendonly" + ] + } + }, + "categories": [ + "ternary", + "symbols", + "showLegend", + "scatter-like" + ], + "meta": { + "description": "Provides similar functionality to the *scatter* type but on a ternary phase diagram. The data is provided by at least two arrays out of `a`, `b`, `c` triplets.", + "hrName": "scatter_ternary" + }, + "type": "scatterternary" + }, + "splom": { + "animatable": false, + "attributes": { + "customdata": { + "description": "Assigns extra data each datum. This may be useful when listening to hover, click and selection events. Note that, *scatter* traces also appends customdata items in the markers DOM elements", + "editType": "calc", + "valType": "data_array" + }, + "customdatasrc": { + "description": "Sets the source reference on Chart Studio Cloud for `customdata`.", + "editType": "none", + "valType": "string" + }, + "diagonal": { + "editType": "calc", + "role": "object", + "visible": { + "description": "Determines whether or not subplots on the diagonal are displayed.", + "dflt": true, + "editType": "calc", + "valType": "boolean" + } + }, + "dimensions": { + "items": { + "dimension": { + "axis": { + "editType": "calc+clearAxisTypes", + "matches": { + "description": "Determines whether or not the x & y axes generated by this dimension match. Equivalent to setting the `matches` axis attribute in the layout with the correct axis id.", + "dflt": false, + "editType": "calc", + "valType": "boolean" + }, + "role": "object", +>>>>>>> 776a4535b (Name plot type quiver not scatterquiver) "type": { "_noTemplating": true, "description": "Sets the axis type. By default, plotly attempts to determined the axis type by looking into the data of the traces that referenced the axis in question.", From ec6a2665ea835d0789df4d77aa3b4a0af3197a59 Mon Sep 17 00:00:00 2001 From: John Degner Date: Sun, 2 Nov 2025 17:00:36 -0800 Subject: [PATCH 04/46] Model quiver api closer to 3d cone trace --- lib/quiver.js | 2 -- src/traces/quiver/attributes.js | 33 +++++++++++++++++--- src/traces/quiver/defaults.js | 6 +++- src/traces/quiver/plot.js | 53 ++++++++++++++++++++++++++++----- test/plot-schema.json | 30 ++++++++++++++++--- 5 files changed, 106 insertions(+), 18 deletions(-) diff --git a/lib/quiver.js b/lib/quiver.js index 0368a75e500..12179a54900 100644 --- a/lib/quiver.js +++ b/lib/quiver.js @@ -1,5 +1,3 @@ 'use strict'; module.exports = require('../src/traces/quiver'); - - diff --git a/src/traces/quiver/attributes.js b/src/traces/quiver/attributes.js index 5586bc37783..f7f3ffc2f74 100644 --- a/src/traces/quiver/attributes.js +++ b/src/traces/quiver/attributes.js @@ -32,13 +32,38 @@ var attrs = { anim: true, description: 'Sets the y components of the arrow vectors.' }, - scale: { + sizemode: { + valType: 'enumerated', + values: ['scaled', 'absolute', 'raw'], + editType: 'calc', + dflt: 'scaled', + description: [ + 'Determines whether `sizeref` is set as a *scaled* (unitless) scalar', + '(normalized by the max u/v norm in the vector field), as an *absolute*', + 'value (in the same units as the vector field), or *raw* to use the', + 'raw vector lengths.' + ].join(' ') + }, + sizeref: { valType: 'number', - dflt: 0.1, min: 0, - max: 1, editType: 'calc', - description: 'Scales size of the arrows (ideally to avoid overlap). Default = 0.1' + description: [ + 'Adjusts the arrow size scaling.', + 'The arrow length is determined by the vector norm multiplied by `sizeref`,', + 'optionally normalized when `sizemode` is *scaled*.' + ].join(' ') + }, + anchor: { + valType: 'enumerated', + values: ['tip', 'tail', 'cm', 'center', 'middle'], + dflt: 'tail', + editType: 'calc', + description: [ + 'Sets the arrows\' anchor with respect to their (x,y) positions.', + 'Use *tail* to place (x,y) at the base, *tip* to place (x,y) at the head,', + 'or *cm*/*center*/*middle* to center the arrow on (x,y).' + ].join(' ') }, arrow_scale: { valType: 'number', diff --git a/src/traces/quiver/defaults.js b/src/traces/quiver/defaults.js index 2584e758286..4ba6a36b59f 100644 --- a/src/traces/quiver/defaults.js +++ b/src/traces/quiver/defaults.js @@ -36,8 +36,12 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout // Set basic properties traceOut.type = 'quiver'; + // Sizing API similar to cone + var sizemode = coerce('sizemode'); + coerce('sizeref', sizemode === 'raw' ? 1 : 0.5); + coerce('anchor'); + // Set default values using coerce - coerce('scale', 0.1); coerce('arrow_scale', 0.3); coerce('angle', Math.PI / 9); coerce('scaleratio'); diff --git a/src/traces/quiver/plot.js b/src/traces/quiver/plot.js index c1f67b156df..cd660cfa909 100644 --- a/src/traces/quiver/plot.js +++ b/src/traces/quiver/plot.js @@ -81,6 +81,20 @@ function plotOne(gd, idx, plotinfo, cdscatter, cdscatterAll, element, transition lineSegments.exit().remove(); + // Precompute norms for sizing + var uArr = trace.u || []; + var vArr = trace.v || []; + var maxNorm = 0; + for (var ni = 0; ni < trace._length; ni++) { + var uu = uArr[ni] || 0; + var vv = vArr[ni] || 0; + var nrm = Math.sqrt(uu * uu + vv * vv); + if (nrm > maxNorm) maxNorm = nrm; + } + var sizemode = trace.sizemode || 'scaled'; + var sizeref = (trace.sizeref !== undefined) ? trace.sizeref : (sizemode === 'raw' ? 1 : 0.5); + var anchor = trace.anchor || 'tail'; + // Update line segments lineSegments.each(function(cdi) { var path = d3.select(this); @@ -92,7 +106,6 @@ function plotOne(gd, idx, plotinfo, cdscatter, cdscatterAll, element, transition } // Compute arrow in data space - var scale = trace.scale || 1; var scaleRatio = trace.scaleratio || 1; var arrowScale = trace.arrow_scale || 0.2; var angle = trace.angle || Math.PI / 12; // small default @@ -100,8 +113,21 @@ function plotOne(gd, idx, plotinfo, cdscatter, cdscatterAll, element, transition var u = (trace.u && trace.u[cdi.i]) || 0; var v = (trace.v && trace.v[cdi.i]) || 0; - var dx = u * scale * scaleRatio; - var dy = v * scale; + var norm = Math.sqrt(u * u + v * v); + var unitx = norm ? (u / norm) : 0; + var unity = norm ? (v / norm) : 0; + var baseLen; + if (sizemode === 'scaled') { + var n = maxNorm ? (norm / maxNorm) : 0; + baseLen = n * sizeref; + } else { + baseLen = norm * sizeref; + } + + var dxBase = unitx * baseLen; + var dyBase = unity * baseLen; + var dx = dxBase * scaleRatio; + var dy = dyBase; var barbLen = Math.sqrt((dx * dx) / scaleRatio + dy * dy); var arrowLen = barbLen * arrowScale; var barbAng = Math.atan2(dy, dx / scaleRatio); @@ -109,10 +135,23 @@ function plotOne(gd, idx, plotinfo, cdscatter, cdscatterAll, element, transition var ang1 = barbAng + angle; var ang2 = barbAng - angle; - var x0 = cdi.x; - var y0 = cdi.y; - var x1 = x0 + dx; - var y1 = y0 + dy; + var x0, y0, x1, y1; + if (anchor === 'tip') { + x1 = cdi.x; + y1 = cdi.y; + x0 = x1 - dx; + y0 = y1 - dy; + } else if (anchor === 'cm' || anchor === 'center' || anchor === 'middle') { + x0 = cdi.x - dx / 2; + y0 = cdi.y - dy / 2; + x1 = cdi.x + dx / 2; + y1 = cdi.y + dy / 2; + } else { // tail + x0 = cdi.x; + y0 = cdi.y; + x1 = x0 + dx; + y1 = y0 + dy; + } var xh1 = x1 - arrowLen * Math.cos(ang1) * scaleRatio; var yh1 = y1 - arrowLen * Math.sin(ang1); diff --git a/test/plot-schema.json b/test/plot-schema.json index 79d1efd658a..6f8831d1995 100644 --- a/test/plot-schema.json +++ b/test/plot-schema.json @@ -22110,14 +22110,36 @@ "min": 0, "valType": "number" }, - "scale": { - "description": "Scales size of the arrows (ideally to avoid overlap). Default = 0.1", - "dflt": 0.1, + "sizemode": { + "description": "Determines whether `sizeref` is set as a *scaled* (unitless) scalar (normalized by the max u/v norm in the vector field), as an *absolute* value (in the same units as the vector field), or *raw* to use the raw vector lengths.", + "dflt": "scaled", + "editType": "calc", + "valType": "enumerated", + "values": [ + "scaled", + "absolute", + "raw" + ] + }, + "sizeref": { + "description": "Adjusts the arrow size scaling. The arrow length is determined by the vector norm multiplied by `sizeref`, optionally normalized when `sizemode` is *scaled*.", "editType": "calc", - "max": 1, "min": 0, "valType": "number" }, + "anchor": { + "description": "Sets the arrows' anchor with respect to their (x,y) positions. Use *tail* to place (x,y) at the base, *tip* to place (x,y) at the head, or *cm*/*center*/*middle* to center the arrow on (x,y).", + "dflt": "tail", + "editType": "calc", + "valType": "enumerated", + "values": [ + "tip", + "tail", + "cm", + "center", + "middle" + ] + }, "scaleratio": { "description": "The ratio between the scale of the y-axis and the scale of the x-axis (scale_y / scale_x). Default = null, the scale ratio is not fixed.", "editType": "calc", From 68a7608789e2ab969d39c8c67651f78a6ca71436 Mon Sep 17 00:00:00 2001 From: John Degner Date: Tue, 11 Nov 2025 12:07:16 -0800 Subject: [PATCH 05/46] Match arrowhead attributes for annotations --- src/traces/quiver/attributes.js | 36 +- src/traces/quiver/defaults.js | 6 +- src/traces/quiver/plot.js | 5 +- test/plot-schema.json | 15494 ++++++++++++++++++------------ 4 files changed, 9474 insertions(+), 6067 deletions(-) diff --git a/src/traces/quiver/attributes.js b/src/traces/quiver/attributes.js index f7f3ffc2f74..a0e64eb74a9 100644 --- a/src/traces/quiver/attributes.js +++ b/src/traces/quiver/attributes.js @@ -65,14 +65,6 @@ var attrs = { 'or *cm*/*center*/*middle* to center the arrow on (x,y).' ].join(' ') }, - arrow_scale: { - valType: 'number', - dflt: 0.3, - min: 0, - max: 1, - editType: 'calc', - description: 'Value multiplied to length of barb to get length of arrowhead. Default = 0.3' - }, angle: { valType: 'number', dflt: Math.PI / 9, @@ -95,6 +87,26 @@ var attrs = { description: 'Maximum distance (in pixels) to look for nearby arrows on hover.' }, + // Arrowhead sizing, consistent with annotations API naming + arrowsize: { + valType: 'number', + min: 0.3, + dflt: 1, + editType: 'calc', + description: [ + 'Scales the size of the arrow head relative to a base size.', + 'Higher values produce larger heads.' + ].join(' ') + }, + // Back-compat alias + arrow_scale: { + valType: 'number', + min: 0, + max: 1, + editType: 'calc', + description: 'Deprecated alias for `arrowsize`-based sizing. Prefer using `arrowsize`.' + }, + // Line styling for arrows line: { color: { @@ -135,6 +147,14 @@ var attrs = { editType: 'style' }, + // Alias consistent with annotations; maps to line.width + arrowwidth: { + valType: 'number', + min: 0.1, + editType: 'style', + description: 'Sets the width (in px) of the arrow line (alias of `line.width`).' + }, + // Text and labels text: { valType: 'data_array', diff --git a/src/traces/quiver/defaults.js b/src/traces/quiver/defaults.js index 4ba6a36b59f..2d8e81554c1 100644 --- a/src/traces/quiver/defaults.js +++ b/src/traces/quiver/defaults.js @@ -42,7 +42,9 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout coerce('anchor'); // Set default values using coerce - coerce('arrow_scale', 0.3); + coerce('arrowsize', 1); + // back-compat + coerce('arrow_scale'); coerce('angle', Math.PI / 9); coerce('scaleratio'); coerce('hoverdistance', 20); @@ -50,7 +52,7 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout // Line styling traceOut.line = { color: traceIn.line && traceIn.line.color ? traceIn.line.color : defaultColor, - width: traceIn.line && traceIn.line.width ? traceIn.line.width : 1, + width: (traceIn.arrowwidth !== undefined) ? traceIn.arrowwidth : (traceIn.line && traceIn.line.width ? traceIn.line.width : 1), dash: traceIn.line && traceIn.line.dash ? traceIn.line.dash : 'solid', shape: traceIn.line && traceIn.line.shape ? traceIn.line.shape : 'linear', smoothing: traceIn.line && traceIn.line.smoothing ? traceIn.line.smoothing : 1, diff --git a/src/traces/quiver/plot.js b/src/traces/quiver/plot.js index cd660cfa909..c6fbe470371 100644 --- a/src/traces/quiver/plot.js +++ b/src/traces/quiver/plot.js @@ -107,7 +107,10 @@ function plotOne(gd, idx, plotinfo, cdscatter, cdscatterAll, element, transition // Compute arrow in data space var scaleRatio = trace.scaleratio || 1; - var arrowScale = trace.arrow_scale || 0.2; + var baseHeadScale = 0.2; + var arrowScale = (trace.arrowsize !== undefined) + ? (baseHeadScale * trace.arrowsize) + : (trace.arrow_scale !== undefined ? trace.arrow_scale : baseHeadScale); var angle = trace.angle || Math.PI / 12; // small default var u = (trace.u && trace.u[cdi.i]) || 0; diff --git a/test/plot-schema.json b/test/plot-schema.json index 6f8831d1995..932fd5f0bf6 100644 --- a/test/plot-schema.json +++ b/test/plot-schema.json @@ -14179,4847 +14179,6941 @@ "description": "If *normal*, the range is computed in relation to the extrema of the input data. If *tozero*, the range extends to 0, regardless of the input data If *nonnegative*, the range is non-negative, regardless of the input data. Applies only to linear axes.", "dflt": "normal", "editType": "plot", +<<<<<<< HEAD "valType": "enumerated", "values": [ "normal", "tozero", "nonnegative" - ] - }, - "rangeselector": { - "activecolor": { - "description": "Sets the background color of the active range selector button.", - "editType": "plot", - "valType": "color" - }, - "bgcolor": { - "description": "Sets the background color of the range selector buttons.", - "dflt": "#eee", - "editType": "plot", - "valType": "color" - }, - "bordercolor": { - "description": "Sets the color of the border enclosing the range selector.", - "dflt": "#444", - "editType": "plot", - "valType": "color" - }, - "borderwidth": { - "description": "Sets the width (in px) of the border enclosing the range selector.", - "dflt": 0, - "editType": "plot", - "min": 0, - "valType": "number" - }, - "buttons": { - "items": { - "button": { - "count": { - "description": "Sets the number of steps to take to update the range. Use with `step` to specify the update interval.", - "dflt": 1, - "editType": "plot", - "min": 0, - "valType": "number" - }, - "description": "Sets the specifications for each buttons. By default, a range selector comes with no buttons.", - "editType": "plot", - "label": { - "description": "Sets the text label to appear on the button.", - "editType": "plot", - "valType": "string" - }, - "name": { - "description": "When used in a template, named items are created in the output figure in addition to any items the figure already has in this array. You can modify these items in the output figure by making your own item with `templateitemname` matching this `name` alongside your modifications (including `visible: false` or `enabled: false` to hide it). Has no effect outside of a template.", - "editType": "none", - "valType": "string" - }, - "role": "object", - "step": { - "description": "The unit of measurement that the `count` value will set the range by.", - "dflt": "month", - "editType": "plot", - "valType": "enumerated", - "values": [ - "month", - "year", - "day", - "hour", - "minute", - "second", - "all" - ] - }, - "stepmode": { - "description": "Sets the range update mode. If *backward*, the range update shifts the start of range back *count* times *step* milliseconds. If *todate*, the range update shifts the start of range back to the first timestamp from *count* times *step* milliseconds back. For example, with `step` set to *year* and `count` set to *1* the range update shifts the start of the range back to January 01 of the current year. Month and year *todate* are currently available only for the built-in (Gregorian) calendar.", - "dflt": "backward", - "editType": "plot", - "valType": "enumerated", - "values": [ - "backward", - "todate" - ] - }, - "templateitemname": { - "description": "Used to refer to a named item in this array in the template. Named items from the template will be created even without a matching item in the input figure, but you can modify one by making an item with `templateitemname` matching its `name`, alongside your modifications (including `visible: false` or `enabled: false` to hide it). If there is no template or no matching item, this item will be hidden unless you explicitly show it with `visible: true`.", - "editType": "calc", - "valType": "string" - }, - "visible": { - "description": "Determines whether or not this button is visible.", - "dflt": true, - "editType": "plot", - "valType": "boolean" - } - } - }, - "role": "object" - }, +======= + "valType": "any" + }, + { "editType": "plot", - "font": { - "color": { - "editType": "plot", - "valType": "color" - }, - "description": "Sets the font of the range selector button text.", - "editType": "plot", - "family": { - "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", - "editType": "plot", - "noBlank": true, - "strict": true, - "valType": "string" - }, - "lineposition": { - "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", - "dflt": "none", - "editType": "plot", - "extras": [ - "none" - ], - "flags": [ - "under", - "over", - "through" - ], - "valType": "flaglist" - }, - "role": "object", - "shadow": { - "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", - "dflt": "none", - "editType": "plot", - "valType": "string" - }, - "size": { - "editType": "plot", - "min": 1, - "valType": "number" - }, - "style": { - "description": "Sets whether a font should be styled with a normal or italic face from its family.", - "dflt": "normal", - "editType": "plot", - "valType": "enumerated", - "values": [ - "normal", - "italic" - ] - }, - "textcase": { - "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", - "dflt": "normal", - "editType": "plot", - "valType": "enumerated", - "values": [ - "normal", - "word caps", - "upper", - "lower" - ] - }, - "variant": { - "description": "Sets the variant of the font.", - "dflt": "normal", - "editType": "plot", - "valType": "enumerated", - "values": [ - "normal", - "small-caps", - "all-small-caps", - "all-petite-caps", - "petite-caps", - "unicase" - ] - }, - "weight": { - "description": "Sets the weight (or boldness) of the font.", - "dflt": "normal", - "editType": "plot", - "extras": [ - "normal", - "bold" - ], - "max": 1000, - "min": 1, - "valType": "integer" - } - }, - "role": "object", - "visible": { - "description": "Determines whether or not this range selector is visible. Note that range selectors are only available for x axes of `type` set to or auto-typed to *date*.", - "editType": "plot", - "valType": "boolean" - }, - "x": { - "description": "Sets the x position (in normalized coordinates) of the range selector.", - "editType": "plot", - "max": 3, - "min": -2, - "valType": "number" - }, - "xanchor": { - "description": "Sets the range selector's horizontal position anchor. This anchor binds the `x` position to the *left*, *center* or *right* of the range selector.", - "dflt": "left", - "editType": "plot", - "valType": "enumerated", - "values": [ - "auto", - "left", - "center", - "right" - ] - }, - "y": { - "description": "Sets the y position (in normalized coordinates) of the range selector.", - "editType": "plot", - "max": 3, - "min": -2, - "valType": "number" - }, - "yanchor": { - "description": "Sets the range selector's vertical position anchor This anchor binds the `y` position to the *top*, *middle* or *bottom* of the range selector.", - "dflt": "bottom", - "editType": "plot", - "valType": "enumerated", - "values": [ - "auto", - "top", - "middle", - "bottom" - ] - } - }, - "rangeslider": { - "autorange": { - "description": "Determines whether or not the range slider range is computed in relation to the input data. If `range` is provided, then `autorange` is set to *false*.", - "dflt": true, - "editType": "calc", - "impliedEdits": {}, - "valType": "boolean" - }, - "bgcolor": { - "description": "Sets the background color of the range slider.", - "dflt": "#fff", - "editType": "plot", - "valType": "color" - }, - "bordercolor": { - "description": "Sets the border color of the range slider.", - "dflt": "#444", - "editType": "plot", - "valType": "color" - }, - "borderwidth": { - "description": "Sets the border width of the range slider.", - "dflt": 0, - "editType": "plot", - "min": 0, - "valType": "integer" - }, - "editType": "calc", - "range": { - "description": "Sets the range of the range slider. If not set, defaults to the full xaxis range. If the axis `type` is *log*, then you must take the log of your desired range. If the axis `type` is *date*, it should be date strings, like date data, though Date objects and unix milliseconds will be accepted and converted to strings. If the axis `type` is *category*, it should be numbers, using the scale where each category is assigned a serial number from zero in the order it appears.", - "editType": "calc", - "impliedEdits": { - "autorange": false - }, - "items": [ - { - "editType": "calc", - "impliedEdits": { - "^autorange": false - }, - "valType": "any" - }, - { - "editType": "calc", - "impliedEdits": { - "^autorange": false - }, - "valType": "any" - } - ], - "valType": "info_array" - }, - "role": "object", - "thickness": { - "description": "The height of the range slider as a fraction of the total plot area height.", - "dflt": 0.15, - "editType": "plot", - "max": 1, - "min": 0, - "valType": "number" - }, - "visible": { - "description": "Determines whether or not the range slider will be visible. If visible, perpendicular axes will be set to `fixedrange`", - "dflt": true, - "editType": "calc", - "valType": "boolean" - }, - "yaxis": { - "_isSubplotObj": true, - "editType": "calc", - "range": { - "description": "Sets the range of this axis for the rangeslider.", - "editType": "plot", - "items": [ - { - "editType": "plot", - "valType": "any" - }, - { - "editType": "plot", - "valType": "any" - } - ], - "valType": "info_array" - }, - "rangemode": { - "description": "Determines whether or not the range of this axis in the rangeslider use the same value than in the main plot when zooming in/out. If *auto*, the autorange will be used. If *fixed*, the `range` is used. If *match*, the current range of the corresponding y-axis on the main subplot is used.", - "dflt": "match", - "editType": "calc", - "valType": "enumerated", - "values": [ - "auto", - "fixed", - "match" - ] - }, - "role": "object" - } - }, - "role": "object", - "scaleanchor": { - "description": "If set to another axis id (e.g. `x2`, `y`), the range of this axis changes together with the range of the corresponding axis such that the scale of pixels per unit is in a constant ratio. Both axes are still zoomable, but when you zoom one, the other will zoom the same amount, keeping a fixed midpoint. `constrain` and `constraintoward` determine how we enforce the constraint. You can chain these, ie `yaxis: {scaleanchor: *x*}, xaxis2: {scaleanchor: *y*}` but you can only link axes of the same `type`. The linked axis can have the opposite letter (to constrain the aspect ratio) or the same letter (to match scales across subplots). Loops (`yaxis: {scaleanchor: *x*}, xaxis: {scaleanchor: *y*}` or longer) are redundant and the last constraint encountered will be ignored to avoid possible inconsistent constraints via `scaleratio`. Note that setting axes simultaneously in both a `scaleanchor` and a `matches` constraint is currently forbidden. Setting `false` allows to remove a default constraint (occasionally, you may need to prevent a default `scaleanchor` constraint from being applied, eg. when having an image trace `yaxis: {scaleanchor: \"x\"}` is set automatically in order for pixels to be rendered as squares, setting `yaxis: {scaleanchor: false}` allows to remove the constraint).", - "editType": "plot", - "valType": "enumerated", - "values": [ - "/^x([2-9]|[1-9][0-9]+)?( domain)?$/", - "/^y([2-9]|[1-9][0-9]+)?( domain)?$/", - false - ] - }, - "scaleratio": { - "description": "If this axis is linked to another by `scaleanchor`, this determines the pixel to unit scale ratio. For example, if this value is 10, then every unit on this axis spans 10 times the number of pixels as a unit on the linked axis. Use this for example to create an elevation profile where the vertical scale is exaggerated a fixed amount with respect to the horizontal.", - "dflt": 1, + "valType": "any" + } + ], + "valType": "info_array" + }, + "description": "The dimensions (variables) of the parallel coordinates chart. 2..60 dimensions are supported.", + "editType": "calc", + "label": { + "description": "The shown name of the dimension.", + "editType": "plot", + "valType": "string" + }, + "multiselect": { + "description": "Do we allow multiple selection ranges or just a single range?", + "dflt": true, + "editType": "plot", + "valType": "boolean" + }, + "name": { + "description": "When used in a template, named items are created in the output figure in addition to any items the figure already has in this array. You can modify these items in the output figure by making your own item with `templateitemname` matching this `name` alongside your modifications (including `visible: false` or `enabled: false` to hide it). Has no effect outside of a template.", + "editType": "none", + "valType": "string" + }, + "range": { + "description": "The domain range that represents the full, shown axis extent. Defaults to the `values` extent. Must be an array of `[fromValue, toValue]` with finite numbers as elements.", + "editType": "plot", + "items": [ + { "editType": "plot", - "min": 0, "valType": "number" - }, - "separatethousands": { - "description": "If \"true\", even 4-digit integers are separated", - "dflt": false, - "editType": "ticks", - "valType": "boolean" - }, - "showdividers": { - "description": "Determines whether or not a dividers are drawn between the category levels of this axis. Only has an effect on *multicategory* axes.", - "dflt": true, - "editType": "ticks", - "valType": "boolean" - }, - "showexponent": { - "description": "If *all*, all exponents are shown besides their significands. If *first*, only the exponent of the first tick is shown. If *last*, only the exponent of the last tick is shown. If *none*, no exponents appear.", - "dflt": "all", - "editType": "ticks", - "valType": "enumerated", - "values": [ - "all", - "first", - "last", - "none" - ] - }, - "showgrid": { - "description": "Determines whether or not grid lines are drawn. If *true*, the grid lines are drawn at every tick mark.", - "editType": "ticks", - "valType": "boolean" - }, - "showline": { - "description": "Determines whether or not a line bounding this axis is drawn.", - "dflt": false, - "editType": "ticks+layoutstyle", - "valType": "boolean" - }, - "showspikes": { - "description": "Determines whether or not spikes (aka droplines) are drawn for this axis. Note: This only takes affect when hovermode = closest", - "dflt": false, - "editType": "modebar", - "valType": "boolean" - }, - "showticklabels": { - "description": "Determines whether or not the tick labels are drawn.", - "dflt": true, - "editType": "ticks", - "valType": "boolean" - }, - "showtickprefix": { - "description": "If *all*, all tick labels are displayed with a prefix. If *first*, only the first tick is displayed with a prefix. If *last*, only the last tick is displayed with a suffix. If *none*, tick prefixes are hidden.", - "dflt": "all", - "editType": "ticks", - "valType": "enumerated", - "values": [ - "all", - "first", - "last", - "none" - ] - }, - "showticksuffix": { - "description": "Same as `showtickprefix` but for tick suffixes.", - "dflt": "all", - "editType": "ticks", - "valType": "enumerated", - "values": [ - "all", - "first", - "last", - "none" - ] - }, - "side": { - "description": "Determines whether a x (y) axis is positioned at the *bottom* (*left*) or *top* (*right*) of the plotting area.", + }, + { "editType": "plot", - "valType": "enumerated", - "values": [ - "top", - "bottom", - "left", - "right" - ] - }, - "spikecolor": { - "description": "Sets the spike color. If undefined, will use the series color", - "dflt": null, - "editType": "none", - "valType": "color" - }, - "spikedash": { - "description": "Sets the dash style of lines. Set to a dash type string (*solid*, *dot*, *dash*, *longdash*, *dashdot*, or *longdashdot*) or a dash length list in px (eg *5px,10px,2px,2px*).", - "dflt": "dash", - "editType": "none", - "valType": "string", - "values": [ - "solid", - "dot", - "dash", - "longdash", - "dashdot", - "longdashdot" - ] - }, - "spikemode": { - "description": "Determines the drawing mode for the spike line If *toaxis*, the line is drawn from the data point to the axis the series is plotted on. If *across*, the line is drawn across the entire plot area, and supercedes *toaxis*. If *marker*, then a marker dot is drawn on the axis the series is plotted on", - "dflt": "toaxis", - "editType": "none", - "flags": [ - "toaxis", - "across", - "marker" - ], - "valType": "flaglist" - }, - "spikesnap": { - "description": "Determines whether spikelines are stuck to the cursor or to the closest datapoints.", - "dflt": "hovered data", - "editType": "none", - "valType": "enumerated", - "values": [ - "data", - "cursor", - "hovered data" - ] - }, - "spikethickness": { - "description": "Sets the width (in px) of the zero line.", - "dflt": 3, - "editType": "none", "valType": "number" - }, - "tick0": { - "description": "Sets the placement of the first tick on this axis. Use with `dtick`. If the axis `type` is *log*, then you must take the log of your starting tick (e.g. to set the starting tick to 100, set the `tick0` to 2) except when `dtick`=*L* (see `dtick` for more info). If the axis `type` is *date*, it should be a date string, like date data. If the axis `type` is *category*, it should be a number, using the scale where each category is assigned a serial number from zero in the order it appears.", - "editType": "ticks", - "impliedEdits": { - "tickmode": "linear" - }, - "valType": "any" - }, - "tickangle": { - "description": "Sets the angle of the tick labels with respect to the horizontal. For example, a `tickangle` of -90 draws the tick labels vertically.", - "dflt": "auto", - "editType": "ticks", - "valType": "angle" - }, - "tickcolor": { - "description": "Sets the tick color.", - "dflt": "#444", - "editType": "ticks", - "valType": "color" - }, - "tickfont": { - "color": { - "editType": "ticks", - "valType": "color" - }, - "description": "Sets the tick font.", - "editType": "ticks", - "family": { - "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", - "editType": "ticks", - "noBlank": true, - "strict": true, - "valType": "string" - }, - "lineposition": { - "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", - "dflt": "none", - "editType": "ticks", - "extras": [ - "none" - ], - "flags": [ - "under", - "over", - "through" - ], - "valType": "flaglist" - }, - "role": "object", - "shadow": { - "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", - "dflt": "none", - "editType": "ticks", - "valType": "string" - }, - "size": { - "editType": "ticks", - "min": 1, - "valType": "number" - }, - "style": { - "description": "Sets whether a font should be styled with a normal or italic face from its family.", - "dflt": "normal", - "editType": "ticks", - "valType": "enumerated", - "values": [ - "normal", - "italic" - ] - }, - "textcase": { - "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", - "dflt": "normal", - "editType": "ticks", - "valType": "enumerated", - "values": [ - "normal", - "word caps", - "upper", - "lower" - ] - }, - "variant": { - "description": "Sets the variant of the font.", - "dflt": "normal", - "editType": "ticks", - "valType": "enumerated", - "values": [ - "normal", - "small-caps", - "all-small-caps", - "all-petite-caps", - "petite-caps", - "unicase" - ] - }, - "weight": { - "description": "Sets the weight (or boldness) of the font.", - "dflt": "normal", - "editType": "ticks", - "extras": [ - "normal", - "bold" - ], - "max": 1000, - "min": 1, - "valType": "integer" - } - }, - "tickformat": { - "description": "Sets the tick label formatting rule using d3 formatting mini-languages which are very similar to those in Python. For numbers, see: https://github.com/d3/d3-format/tree/v1.4.5#d3-format. And for dates see: https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format. We add two items to d3's date formatter: *%h* for half of the year as a decimal number as well as *%{n}f* for fractional seconds with n digits. For example, *2016-10-13 09:15:23.456* with tickformat *%H~%M~%S.%2f* would display *09~15~23.46*", - "dflt": "", - "editType": "ticks", - "valType": "string" - }, - "tickformatstops": { - "items": { - "tickformatstop": { - "dtickrange": { - "description": "range [*min*, *max*], where *min*, *max* - dtick values which describe some zoom level, it is possible to omit *min* or *max* value by passing *null*", - "editType": "ticks", - "items": [ - { - "editType": "ticks", - "valType": "any" - }, - { - "editType": "ticks", - "valType": "any" - } - ], - "valType": "info_array" - }, - "editType": "ticks", - "enabled": { - "description": "Determines whether or not this stop is used. If `false`, this stop is ignored even within its `dtickrange`.", - "dflt": true, - "editType": "ticks", - "valType": "boolean" - }, - "name": { - "description": "When used in a template, named items are created in the output figure in addition to any items the figure already has in this array. You can modify these items in the output figure by making your own item with `templateitemname` matching this `name` alongside your modifications (including `visible: false` or `enabled: false` to hide it). Has no effect outside of a template.", - "editType": "none", - "valType": "string" - }, - "role": "object", - "templateitemname": { - "description": "Used to refer to a named item in this array in the template. Named items from the template will be created even without a matching item in the input figure, but you can modify one by making an item with `templateitemname` matching its `name`, alongside your modifications (including `visible: false` or `enabled: false` to hide it). If there is no template or no matching item, this item will be hidden unless you explicitly show it with `visible: true`.", - "editType": "calc", - "valType": "string" - }, - "value": { - "description": "string - dtickformat for described zoom level, the same as *tickformat*", - "dflt": "", - "editType": "ticks", - "valType": "string" - } - } - }, - "role": "object" - }, - "ticklabelindex": { - "arrayOk": true, - "description": "Only for axes with `type` *date* or *linear*. Instead of drawing the major tick label, draw the label for the minor tick that is n positions away from the major tick. E.g. to always draw the label for the minor tick before each major tick, choose `ticklabelindex` -1. This is useful for date axes with `ticklabelmode` *period* if you want to label the period that ends with each major tick instead of the period that begins there.", - "editType": "calc", - "valType": "integer" - }, - "ticklabelindexsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `ticklabelindex`.", - "editType": "none", - "valType": "string" - }, - "ticklabelmode": { - "description": "Determines where tick labels are drawn with respect to their corresponding ticks and grid lines. Only has an effect for axes of `type` *date* When set to *period*, tick labels are drawn in the middle of the period between ticks.", - "dflt": "instant", - "editType": "ticks", - "valType": "enumerated", - "values": [ - "instant", - "period" - ] - }, - "ticklabeloverflow": { - "description": "Determines how we handle tick labels that would overflow either the graph div or the domain of the axis. The default value for inside tick labels is *hide past domain*. Otherwise on *category* and *multicategory* axes the default is *allow*. In other cases the default is *hide past div*.", - "editType": "calc", - "valType": "enumerated", - "values": [ - "allow", - "hide past div", - "hide past domain" - ] - }, - "ticklabelposition": { - "description": "Determines where tick labels are drawn with respect to the axis. Please note that top or bottom has no effect on x axes or when `ticklabelmode` is set to *period* or when `tickson` is set to *boundaries*. Similarly, left or right has no effect on y axes or when `ticklabelmode` is set to *period* or when `tickson` is set to *boundaries*. Has no effect on *multicategory* axes. When used on axes linked by `matches` or `scaleanchor`, no extra padding for inside labels would be added by autorange, so that the scales could match.", - "dflt": "outside", - "editType": "calc", - "valType": "enumerated", - "values": [ - "outside", - "inside", - "outside top", - "inside top", - "outside left", - "inside left", - "outside right", - "inside right", - "outside bottom", - "inside bottom" - ] - }, - "ticklabelshift": { - "description": "Shifts the tick labels by the specified number of pixels in parallel to the axis. Positive values move the labels in the positive direction of the axis.", - "dflt": 0, - "editType": "ticks", - "valType": "integer" - }, - "ticklabelstandoff": { - "description": "Sets the standoff distance (in px) between the axis tick labels and their default position. A positive `ticklabelstandoff` moves the labels farther away from the plot area if `ticklabelposition` is *outside*, and deeper into the plot area if `ticklabelposition` is *inside*. A negative `ticklabelstandoff` works in the opposite direction, moving outside ticks towards the plot area and inside ticks towards the outside. If the negative value is large enough, inside ticks can even end up outside and vice versa.", - "dflt": 0, - "editType": "ticks", - "valType": "integer" - }, - "ticklabelstep": { - "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", - "dflt": 1, - "editType": "ticks", - "min": 1, - "valType": "integer" - }, - "ticklen": { - "description": "Sets the tick length (in px).", - "dflt": 5, - "editType": "ticks", - "min": 0, - "valType": "number" - }, - "tickmode": { - "description": "Sets the tick mode for this axis. If *auto*, the number of ticks is set via `nticks`. If *linear*, the placement of the ticks is determined by a starting position `tick0` and a tick step `dtick` (*linear* is the default value if `tick0` and `dtick` are provided). If *array*, the placement of the ticks is set via `tickvals` and the tick text is `ticktext`. (*array* is the default value if `tickvals` is provided). If *sync*, the number of ticks will sync with the overlayed axis set by `overlaying` property.", - "editType": "ticks", - "impliedEdits": {}, - "valType": "enumerated", - "values": [ - "auto", - "linear", - "array", - "sync" - ] - }, - "tickprefix": { - "description": "Sets a tick label prefix.", - "dflt": "", - "editType": "ticks", - "valType": "string" - }, - "ticks": { - "description": "Determines whether ticks are drawn or not. If **, this axis' ticks are not drawn. If *outside* (*inside*), this axis' are drawn outside (inside) the axis lines.", - "editType": "ticks", - "valType": "enumerated", - "values": [ - "outside", - "inside", - "" - ] - }, - "tickson": { - "description": "Determines where ticks and grid lines are drawn with respect to their corresponding tick labels. Only has an effect for axes of `type` *category* or *multicategory*. When set to *boundaries*, ticks and grid lines are drawn half a category to the left/bottom of labels.", - "dflt": "labels", - "editType": "ticks", - "valType": "enumerated", - "values": [ - "labels", - "boundaries" - ] - }, - "ticksuffix": { - "description": "Sets a tick label suffix.", - "dflt": "", - "editType": "ticks", - "valType": "string" - }, - "ticktext": { - "description": "Sets the text displayed at the ticks position via `tickvals`. Only has an effect if `tickmode` is set to *array*. Used with `tickvals`.", - "editType": "ticks", - "valType": "data_array" - }, - "ticktextsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `ticktext`.", - "editType": "none", - "valType": "string" - }, - "tickvals": { - "description": "Sets the values at which ticks on this axis appear. Only has an effect if `tickmode` is set to *array*. Used with `ticktext`.", - "editType": "ticks", - "valType": "data_array" - }, - "tickvalssrc": { - "description": "Sets the source reference on Chart Studio Cloud for `tickvals`.", - "editType": "none", - "valType": "string" - }, - "tickwidth": { - "description": "Sets the tick width (in px).", - "dflt": 1, - "editType": "ticks", - "min": 0, - "valType": "number" - }, - "title": { - "editType": "ticks", - "font": { - "color": { - "editType": "ticks", - "valType": "color" - }, - "description": "Sets this axis' title font.", - "editType": "ticks", - "family": { - "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", - "editType": "ticks", - "noBlank": true, - "strict": true, - "valType": "string" - }, - "lineposition": { - "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", - "dflt": "none", - "editType": "ticks", - "extras": [ - "none" - ], - "flags": [ - "under", - "over", - "through" - ], - "valType": "flaglist" - }, - "role": "object", - "shadow": { - "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", - "dflt": "none", - "editType": "ticks", - "valType": "string" - }, - "size": { - "editType": "ticks", - "min": 1, - "valType": "number" - }, - "style": { - "description": "Sets whether a font should be styled with a normal or italic face from its family.", - "dflt": "normal", - "editType": "ticks", - "valType": "enumerated", - "values": [ - "normal", - "italic" - ] - }, - "textcase": { - "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", - "dflt": "normal", - "editType": "ticks", - "valType": "enumerated", - "values": [ - "normal", - "word caps", - "upper", - "lower" - ] - }, - "variant": { - "description": "Sets the variant of the font.", - "dflt": "normal", - "editType": "ticks", - "valType": "enumerated", - "values": [ - "normal", - "small-caps", - "all-small-caps", - "all-petite-caps", - "petite-caps", - "unicase" - ] - }, - "weight": { - "description": "Sets the weight (or boldness) of the font.", - "dflt": "normal", - "editType": "ticks", - "extras": [ - "normal", - "bold" - ], - "max": 1000, - "min": 1, - "valType": "integer" - } - }, - "role": "object", - "standoff": { - "description": "Sets the standoff distance (in px) between the axis labels and the title text The default value is a function of the axis tick labels, the title `font.size` and the axis `linewidth`. Note that the axis title position is always constrained within the margins, so the actual standoff distance is always less than the set or default value. By setting `standoff` and turning on `automargin`, plotly.js will push the margins to fit the axis title at given standoff distance.", - "editType": "ticks", - "min": 0, - "valType": "number" - }, - "text": { - "description": "Sets the title of this axis.", - "editType": "ticks", - "valType": "string" - } - }, -<<<<<<< HEAD -======= - "role": "object", - "shadow": { - "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", - "dflt": "none", - "editType": "calc", - "valType": "string" - }, - "size": { - "editType": "calc", - "min": 1, - "valType": "number" - }, - "style": { - "description": "Sets whether a font should be styled with a normal or italic face from its family.", - "dflt": "normal", - "editType": "calc", - "valType": "enumerated", - "values": [ - "normal", - "italic" - ] - }, - "textcase": { - "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", - "dflt": "normal", - "editType": "calc", - "valType": "enumerated", - "values": [ - "normal", - "word caps", - "upper", - "lower" - ] - }, - "variant": { - "description": "Sets the variant of the font.", - "dflt": "normal", - "editType": "calc", - "valType": "enumerated", - "values": [ - "normal", - "small-caps", - "all-small-caps", - "all-petite-caps", - "petite-caps", - "unicase" - ] - }, - "weight": { - "description": "Sets the weight (or boldness) of the font.", - "dflt": "normal", - "editType": "calc", - "extras": [ - "normal", - "bold" - ], - "max": 1000, - "min": 1, - "valType": "integer" - } - }, - "role": "object", - "side": { - "description": "Determines the location of color bar's title with respect to the color bar. Defaults to *top* when `orientation` if *v* and defaults to *right* when `orientation` if *h*.", - "editType": "calc", - "valType": "enumerated", - "values": [ - "right", - "top", - "bottom" - ] - }, - "text": { - "description": "Sets the title of the color bar.", - "editType": "calc", - "valType": "string" - } - }, - "x": { - "description": "Sets the x position with respect to `xref` of the color bar (in plot fraction). When `xref` is *paper*, defaults to 1.02 when `orientation` is *v* and 0.5 when `orientation` is *h*. When `xref` is *container*, defaults to *1* when `orientation` is *v* and 0.5 when `orientation` is *h*. Must be between *0* and *1* if `xref` is *container* and between *-2* and *3* if `xref` is *paper*.", - "editType": "calc", - "valType": "number" - }, - "xanchor": { - "description": "Sets this color bar's horizontal position anchor. This anchor binds the `x` position to the *left*, *center* or *right* of the color bar. Defaults to *left* when `orientation` is *v* and *center* when `orientation` is *h*.", - "editType": "calc", - "valType": "enumerated", - "values": [ - "left", - "center", - "right" - ] - }, - "xpad": { - "description": "Sets the amount of padding (in px) along the x direction.", - "dflt": 10, - "editType": "calc", - "min": 0, - "valType": "number" - }, - "xref": { - "description": "Sets the container `x` refers to. *container* spans the entire `width` of the plot. *paper* refers to the width of the plotting area only.", - "dflt": "paper", - "editType": "calc", - "valType": "enumerated", - "values": [ - "container", - "paper" - ] - }, - "y": { - "description": "Sets the y position with respect to `yref` of the color bar (in plot fraction). When `yref` is *paper*, defaults to 0.5 when `orientation` is *v* and 1.02 when `orientation` is *h*. When `yref` is *container*, defaults to 0.5 when `orientation` is *v* and 1 when `orientation` is *h*. Must be between *0* and *1* if `yref` is *container* and between *-2* and *3* if `yref` is *paper*.", - "editType": "calc", - "valType": "number" - }, - "yanchor": { - "description": "Sets this color bar's vertical position anchor This anchor binds the `y` position to the *top*, *middle* or *bottom* of the color bar. Defaults to *middle* when `orientation` is *v* and *bottom* when `orientation` is *h*.", - "editType": "calc", - "valType": "enumerated", - "values": [ - "top", - "middle", - "bottom" - ] - }, - "ypad": { - "description": "Sets the amount of padding (in px) along the y direction.", - "dflt": 10, - "editType": "calc", - "min": 0, - "valType": "number" - }, - "yref": { - "description": "Sets the container `y` refers to. *container* spans the entire `height` of the plot. *paper* refers to the height of the plotting area only.", - "dflt": "paper", - "editType": "calc", - "valType": "enumerated", - "values": [ - "container", - "paper" - ] - } - }, - "colorscale": { - "description": "Sets the colorscale. Has an effect only if in `marker.color` is set to a numerical array. The colorscale must be an array containing arrays mapping a normalized value to an rgb, rgba, hex, hsl, hsv, or named color string. At minimum, a mapping for the lowest (0) and highest (1) values are required. For example, `[[0, 'rgb(0,0,255)'], [1, 'rgb(255,0,0)']]`. To control the bounds of the colorscale in color space, use `marker.cmin` and `marker.cmax`. Alternatively, `colorscale` may be a palette name string of the following list: Blackbody,Bluered,Blues,Cividis,Earth,Electric,Greens,Greys,Hot,Jet,Picnic,Portland,Rainbow,RdBu,Reds,Viridis,YlGnBu,YlOrRd.", - "dflt": null, - "editType": "calc", - "impliedEdits": { - "autocolorscale": false - }, - "valType": "colorscale" - }, - "colorsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `color`.", - "editType": "none", - "valType": "string" - }, - "editType": "calc", - "opacity": { - "arrayOk": true, - "description": "Sets the marker opacity.", - "editType": "calc", - "max": 1, - "min": 0, - "valType": "number" - }, - "opacitysrc": { - "description": "Sets the source reference on Chart Studio Cloud for `opacity`.", - "editType": "none", - "valType": "string" - }, - "reversescale": { - "description": "Reverses the color mapping if true. Has an effect only if in `marker.color` is set to a numerical array. If true, `marker.cmin` will correspond to the last color in the array and `marker.cmax` will correspond to the first color.", - "dflt": false, - "editType": "calc", - "valType": "boolean" - }, - "role": "object", - "showscale": { - "description": "Determines whether or not a colorbar is displayed for this trace. Has an effect only if in `marker.color` is set to a numerical array.", - "dflt": false, - "editType": "calc", - "valType": "boolean" - }, - "size": { - "arrayOk": true, - "description": "Sets the marker size (in px).", - "dflt": 6, - "editType": "calc", - "min": 0, - "valType": "number" - }, - "sizemin": { - "description": "Has an effect only if `marker.size` is set to a numerical array. Sets the minimum size (in px) of the rendered marker points.", - "dflt": 0, - "editType": "calc", - "min": 0, - "valType": "number" - }, - "sizemode": { - "description": "Has an effect only if `marker.size` is set to a numerical array. Sets the rule for which the data in `size` is converted to pixels.", - "dflt": "diameter", - "editType": "calc", - "valType": "enumerated", - "values": [ - "diameter", - "area" - ] - }, - "sizeref": { - "description": "Has an effect only if `marker.size` is set to a numerical array. Sets the scale factor used to determine the rendered size of marker points. Use with `sizemin` and `sizemode`.", - "dflt": 1, - "editType": "calc", - "valType": "number" - }, - "sizesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `size`.", - "editType": "none", - "valType": "string" - }, - "symbol": { - "arrayOk": true, - "description": "Sets the marker symbol. Full list: https://www.mapbox.com/maki-icons/ Note that the array `marker.color` and `marker.size` are only available for *circle* symbols.", - "dflt": "circle", - "editType": "calc", - "valType": "string" - }, - "symbolsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `symbol`.", - "editType": "none", - "valType": "string" - } - }, - "meta": { - "arrayOk": true, - "description": "Assigns extra meta information associated with this trace that can be used in various text attributes. Attributes such as trace `name`, graph, axis and colorbar `title.text`, annotation `text` `rangeselector`, `updatemenues` and `sliders` `label` text all support `meta`. To access the trace `meta` values in an attribute in the same trace, simply use `%{meta[i]}` where `i` is the index or key of the `meta` item in question. To access trace `meta` in layout attributes, use `%{data[n[.meta[i]}` where `i` is the index or key of the `meta` and `n` is the trace index.", - "editType": "plot", - "valType": "any" - }, - "metasrc": { - "description": "Sets the source reference on Chart Studio Cloud for `meta`.", - "editType": "none", - "valType": "string" - }, - "mode": { - "description": "Determines the drawing mode for this scatter trace. If the provided `mode` includes *text* then the `text` elements appear at the coordinates. Otherwise, the `text` elements appear on hover.", - "dflt": "markers", - "editType": "calc", - "extras": [ - "none" - ], - "flags": [ - "lines", - "markers", - "text" - ], - "valType": "flaglist" - }, - "name": { - "description": "Sets the trace name. The trace name appears as the legend item and on hover.", - "editType": "style", - "valType": "string" - }, - "opacity": { - "description": "Sets the opacity of the trace.", - "dflt": 1, - "editType": "style", - "max": 1, - "min": 0, - "valType": "number" - }, - "selected": { - "editType": "calc", - "marker": { - "color": { - "description": "Sets the marker color of selected points.", - "editType": "calc", - "valType": "color" - }, - "editType": "calc", - "opacity": { - "description": "Sets the marker opacity of selected points.", - "editType": "calc", - "max": 1, - "min": 0, - "valType": "number" - }, - "role": "object", - "size": { - "description": "Sets the marker size of selected points.", - "editType": "calc", - "min": 0, - "valType": "number" - } - }, - "role": "object" - }, - "selectedpoints": { - "description": "Array containing integer indices of selected points. Has an effect only for traces that support selections. Note that an empty array means an empty selection where the `unselected` are turned on for all points, whereas, any other non-array values means no selection all where the `selected` and `unselected` styles have no effect.", - "editType": "calc", - "valType": "any" - }, - "showlegend": { - "description": "Determines whether or not an item corresponding to this trace is shown in the legend.", - "dflt": true, - "editType": "style", - "valType": "boolean" - }, - "stream": { - "editType": "calc", - "maxpoints": { - "description": "Sets the maximum number of points to keep on the plots from an incoming stream. If `maxpoints` is set to *50*, only the newest 50 points will be displayed on the plot.", - "dflt": 500, - "editType": "calc", - "max": 10000, - "min": 0, - "valType": "number" - }, - "role": "object", - "token": { - "description": "The stream id number links a data trace on a plot with a stream. See https://chart-studio.plotly.com/settings for more details.", - "editType": "calc", - "noBlank": true, - "strict": true, - "valType": "string" - } - }, - "subplot": { - "description": "Sets a reference between this trace's data coordinates and a map subplot. If *map* (the default value), the data refer to `layout.map`. If *map2*, the data refer to `layout.map2`, and so on.", - "dflt": "map", - "editType": "calc", - "valType": "subplotid" - }, - "text": { - "arrayOk": true, - "description": "Sets text elements associated with each (lon,lat) pair If a single string, the same string appears over all the data points. If an array of string, the items are mapped in order to the this trace's (lon,lat) coordinates. If trace `hoverinfo` contains a *text* flag and *hovertext* is not set, these elements will be seen in the hover labels.", - "dflt": "", - "editType": "calc", - "valType": "string" - }, - "textfont": { - "color": { - "editType": "calc", - "valType": "color" - }, - "description": "Sets the icon text font (color=map.layer.paint.text-color, size=map.layer.layout.text-size). Has an effect only when `type` is set to *symbol*.", - "editType": "calc", - "family": { - "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", - "dflt": "Open Sans Regular, Arial Unicode MS Regular", - "editType": "calc", - "noBlank": true, - "strict": true, - "valType": "string" - }, - "role": "object", - "size": { - "editType": "calc", - "min": 1, - "valType": "number" - }, - "style": { - "description": "Sets whether a font should be styled with a normal or italic face from its family.", - "dflt": "normal", - "editType": "calc", - "valType": "enumerated", - "values": [ - "normal", - "italic" - ] - }, - "weight": { - "description": "Sets the weight (or boldness) of the font.", - "dflt": "normal", - "editType": "calc", - "extras": [ - "normal", - "bold" - ], - "max": 1000, - "min": 1, - "valType": "integer" - } - }, - "textposition": { - "arrayOk": false, - "description": "Sets the positions of the `text` elements with respects to the (x,y) coordinates.", - "dflt": "middle center", - "editType": "calc", - "valType": "enumerated", - "values": [ - "top left", - "top center", - "top right", - "middle left", - "middle center", - "middle right", - "bottom left", - "bottom center", - "bottom right" - ] - }, - "textsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `text`.", - "editType": "none", - "valType": "string" - }, - "texttemplate": { - "arrayOk": true, - "description": "Template string used for rendering the information text that appears on points. Note that this will override `textinfo`. Variables are inserted using %{variable}, for example \"y: %{y}\". Numbers are formatted using d3-format's syntax %{variable:d3-format}, for example \"Price: %{y:$.2f}\". https://github.com/d3/d3-format/tree/v1.4.5#d3-format for details on the formatting syntax. Dates are formatted using d3-time-format's syntax %{variable|d3-time-format}, for example \"Day: %{2019-01-01|%A}\". https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format for details on the date formatting syntax. Variables that can't be found will be replaced with the specifier. For example, a template of \"data: %{x}, %{y}\" will result in a value of \"data: 1, %{y}\" if x is 1 and y is missing. Variables with an undefined value will be replaced with the fallback value. All attributes that can be specified per-point (the ones that are `arrayOk: true`) are available. Finally, the template string has access to variables `lat`, `lon` and `text`.", - "dflt": "", - "editType": "calc", - "valType": "string" - }, - "texttemplatefallback": { - "description": "Fallback string that's displayed when a variable referenced in a template is missing. If the boolean value 'false' is passed in, the specifier with the missing variable will be displayed.", - "dflt": "-", - "editType": "calc", - "valType": "any" - }, - "texttemplatesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `texttemplate`.", - "editType": "none", - "valType": "string" - }, - "type": "scattermap", - "uid": { - "description": "Assign an id to this trace, Use this to provide object constancy between traces during animations and transitions.", - "editType": "plot", - "valType": "string" - }, - "uirevision": { - "description": "Controls persistence of some user-driven changes to the trace: `constraintrange` in `parcoords` traces, as well as some `editable: true` modifications such as `name` and `colorbar.title`. Defaults to `layout.uirevision`. Note that other user-driven trace attribute changes are controlled by `layout` attributes: `trace.visible` is controlled by `layout.legend.uirevision`, `selectedpoints` is controlled by `layout.selectionrevision`, and `colorbar.(x|y)` (accessible with `config: {editable: true}`) is controlled by `layout.editrevision`. Trace changes are tracked by `uid`, which only falls back on trace index if no `uid` is provided. So if your app can add/remove traces before the end of the `data` array, such that the same trace has a different index, you can still preserve user-driven changes if you give each trace a `uid` that stays with it as it moves.", - "editType": "none", - "valType": "any" - }, - "unselected": { - "editType": "calc", - "marker": { - "color": { - "description": "Sets the marker color of unselected points, applied only when a selection exists.", - "editType": "calc", - "valType": "color" - }, - "editType": "calc", - "opacity": { - "description": "Sets the marker opacity of unselected points, applied only when a selection exists.", - "editType": "calc", - "max": 1, - "min": 0, - "valType": "number" - }, - "role": "object", - "size": { - "description": "Sets the marker size of unselected points, applied only when a selection exists.", - "editType": "calc", - "min": 0, - "valType": "number" - } - }, - "role": "object" - }, - "visible": { - "description": "Determines whether or not this trace is visible. If *legendonly*, the trace is not drawn, but can appear as a legend item (provided that the legend itself is visible).", - "dflt": true, - "editType": "calc", - "valType": "enumerated", - "values": [ - true, - false, - "legendonly" - ] - } - }, - "categories": [ - "map", - "gl", - "symbols", - "showLegend", - "scatter-like" - ], - "meta": { - "description": "The data visualized as scatter point, lines or marker symbols on a MapLibre GL geographic map is provided by longitude/latitude pairs in `lon` and `lat`.", - "hrName": "scatter_map" - }, - "type": "scattermap" - }, - "scattermapbox": { - "animatable": false, - "attributes": { - "below": { - "description": "Determines if this scattermapbox trace's layers are to be inserted before the layer with the specified ID. By default, scattermapbox layers are inserted above all the base layers. To place the scattermapbox layers above every other layer, set `below` to *''*.", - "editType": "calc", - "valType": "string" - }, - "cluster": { - "color": { - "arrayOk": true, - "description": "Sets the color for each cluster step.", - "editType": "calc", - "valType": "color" - }, - "colorsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `color`.", - "editType": "none", - "valType": "string" - }, - "editType": "calc", - "enabled": { - "description": "Determines whether clustering is enabled or disabled.", - "editType": "calc", - "valType": "boolean" - }, - "maxzoom": { - "description": "Sets the maximum zoom level. At zoom levels equal to or greater than this, points will never be clustered.", - "dflt": 24, - "editType": "calc", - "max": 24, - "min": 0, - "valType": "number" - }, - "opacity": { - "arrayOk": true, - "description": "Sets the marker opacity.", - "dflt": 1, - "editType": "calc", - "max": 1, - "min": 0, - "valType": "number" - }, - "opacitysrc": { - "description": "Sets the source reference on Chart Studio Cloud for `opacity`.", - "editType": "none", - "valType": "string" - }, - "role": "object", - "size": { - "arrayOk": true, - "description": "Sets the size for each cluster step.", - "dflt": 20, - "editType": "calc", - "min": 0, - "valType": "number" - }, - "sizesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `size`.", - "editType": "none", - "valType": "string" - }, - "step": { - "arrayOk": true, - "description": "Sets how many points it takes to create a cluster or advance to the next cluster step. Use this in conjunction with arrays for `size` and / or `color`. If an integer, steps start at multiples of this number. If an array, each step extends from the given value until one less than the next value.", - "dflt": -1, - "editType": "calc", - "min": -1, - "valType": "number" - }, - "stepsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `step`.", - "editType": "none", - "valType": "string" - } - }, - "connectgaps": { - "description": "Determines whether or not gaps (i.e. {nan} or missing values) in the provided data arrays are connected.", - "dflt": false, - "editType": "calc", - "valType": "boolean" - }, - "customdata": { - "description": "Assigns extra data each datum. This may be useful when listening to hover, click and selection events. Note that, *scatter* traces also appends customdata items in the markers DOM elements", - "editType": "calc", - "valType": "data_array" - }, - "customdatasrc": { - "description": "Sets the source reference on Chart Studio Cloud for `customdata`.", - "editType": "none", - "valType": "string" - }, - "fill": { - "description": "Sets the area to fill with a solid color. Use with `fillcolor` if not *none*. *toself* connects the endpoints of the trace (or each segment of the trace if it has gaps) into a closed shape.", - "dflt": "none", - "editType": "calc", - "valType": "enumerated", - "values": [ - "none", - "toself" - ] - }, - "fillcolor": { - "description": "Sets the fill color. Defaults to a half-transparent variant of the line color, marker color, or marker line color, whichever is available.", - "editType": "calc", - "valType": "color" - }, - "hoverinfo": { - "arrayOk": true, - "description": "Determines which trace information appear on hover. If `none` or `skip` are set, no information is displayed upon hovering. But, if `none` is set, click and hover events are still fired.", - "dflt": "all", - "editType": "calc", - "extras": [ - "all", - "none", - "skip" - ], - "flags": [ - "lon", - "lat", - "text", - "name" - ], - "valType": "flaglist" - }, - "hoverinfosrc": { - "description": "Sets the source reference on Chart Studio Cloud for `hoverinfo`.", - "editType": "none", - "valType": "string" - }, - "hoverlabel": { - "align": { - "arrayOk": true, - "description": "Sets the horizontal alignment of the text content within hover label box. Has an effect only if the hover label text spans more two or more lines", - "dflt": "auto", - "editType": "none", - "valType": "enumerated", - "values": [ - "left", - "right", - "auto" - ] - }, - "alignsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `align`.", - "editType": "none", - "valType": "string" - }, - "bgcolor": { - "arrayOk": true, - "description": "Sets the background color of the hover labels for this trace", - "editType": "none", - "valType": "color" - }, - "bgcolorsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `bgcolor`.", - "editType": "none", - "valType": "string" - }, - "bordercolor": { - "arrayOk": true, - "description": "Sets the border color of the hover labels for this trace.", - "editType": "none", - "valType": "color" - }, - "bordercolorsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `bordercolor`.", - "editType": "none", - "valType": "string" - }, - "editType": "none", - "font": { - "color": { - "arrayOk": true, - "editType": "none", - "valType": "color" - }, - "colorsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `color`.", - "editType": "none", - "valType": "string" - }, - "description": "Sets the font used in hover labels.", - "editType": "none", - "family": { - "arrayOk": true, - "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", - "editType": "none", - "noBlank": true, - "strict": true, - "valType": "string" - }, - "familysrc": { - "description": "Sets the source reference on Chart Studio Cloud for `family`.", - "editType": "none", - "valType": "string" - }, - "lineposition": { - "arrayOk": true, - "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", - "dflt": "none", - "editType": "none", - "extras": [ - "none" - ], - "flags": [ - "under", - "over", - "through" - ], - "valType": "flaglist" - }, - "linepositionsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `lineposition`.", - "editType": "none", - "valType": "string" - }, - "role": "object", - "shadow": { - "arrayOk": true, - "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", - "dflt": "none", - "editType": "none", - "valType": "string" - }, - "shadowsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `shadow`.", - "editType": "none", - "valType": "string" - }, - "size": { - "arrayOk": true, - "editType": "none", - "min": 1, - "valType": "number" - }, - "sizesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `size`.", - "editType": "none", - "valType": "string" - }, - "style": { - "arrayOk": true, - "description": "Sets whether a font should be styled with a normal or italic face from its family.", - "dflt": "normal", - "editType": "none", - "valType": "enumerated", - "values": [ - "normal", - "italic" - ] - }, - "stylesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `style`.", - "editType": "none", - "valType": "string" - }, - "textcase": { - "arrayOk": true, - "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", - "dflt": "normal", - "editType": "none", - "valType": "enumerated", - "values": [ - "normal", - "word caps", - "upper", - "lower" - ] - }, - "textcasesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `textcase`.", - "editType": "none", - "valType": "string" - }, - "variant": { - "arrayOk": true, - "description": "Sets the variant of the font.", - "dflt": "normal", - "editType": "none", - "valType": "enumerated", - "values": [ - "normal", - "small-caps", - "all-small-caps", - "all-petite-caps", - "petite-caps", - "unicase" - ] - }, - "variantsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `variant`.", - "editType": "none", - "valType": "string" - }, - "weight": { - "arrayOk": true, - "description": "Sets the weight (or boldness) of the font.", - "dflt": "normal", - "editType": "none", - "extras": [ - "normal", - "bold" - ], - "max": 1000, - "min": 1, - "valType": "integer" - }, - "weightsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `weight`.", - "editType": "none", - "valType": "string" - } - }, - "namelength": { - "arrayOk": true, - "description": "Sets the default length (in number of characters) of the trace name in the hover labels for all traces. -1 shows the whole name regardless of length. 0-3 shows the first 0-3 characters, and an integer >3 will show the whole name if it is less than that many characters, but if it is longer, will truncate to `namelength - 3` characters and add an ellipsis.", - "dflt": 15, - "editType": "none", - "min": -1, - "valType": "integer" - }, - "namelengthsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `namelength`.", - "editType": "none", - "valType": "string" - }, - "role": "object", - "showarrow": { - "description": "Sets whether or not to show the hover label arrow/triangle pointing to the data point.", - "dflt": true, - "editType": "none", - "valType": "boolean" - } - }, - "hovertemplate": { - "arrayOk": true, - "description": "Template string used for rendering the information that appear on hover box. Note that this will override `hoverinfo`. Variables are inserted using %{variable}, for example \"y: %{y}\" as well as %{xother}, {%_xother}, {%_xother_}, {%xother_}. When showing info for several points, *xother* will be added to those with different x positions from the first point. An underscore before or after *(x|y)other* will add a space on that side, only when this field is shown. Numbers are formatted using d3-format's syntax %{variable:d3-format}, for example \"Price: %{y:$.2f}\". https://github.com/d3/d3-format/tree/v1.4.5#d3-format for details on the formatting syntax. Dates are formatted using d3-time-format's syntax %{variable|d3-time-format}, for example \"Day: %{2019-01-01|%A}\". https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format for details on the date formatting syntax. Variables that can't be found will be replaced with the specifier. For example, a template of \"data: %{x}, %{y}\" will result in a value of \"data: 1, %{y}\" if x is 1 and y is missing. Variables with an undefined value will be replaced with the fallback value. The variables available in `hovertemplate` are the ones emitted as event data described at this link https://plotly.com/javascript/plotlyjs-events/#event-data. Additionally, all attributes that can be specified per-point (the ones that are `arrayOk: true`) are available. Anything contained in tag `` is displayed in the secondary box, for example `%{fullData.name}`. To hide the secondary box completely, use an empty tag ``.", - "dflt": "", - "editType": "calc", - "valType": "string" - }, - "hovertemplatefallback": { - "description": "Fallback string that's displayed when a variable referenced in a template is missing. If the boolean value 'false' is passed in, the specifier with the missing variable will be displayed.", - "dflt": "-", - "editType": "calc", - "valType": "any" - }, - "hovertemplatesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `hovertemplate`.", - "editType": "none", - "valType": "string" - }, - "hovertext": { - "arrayOk": true, - "description": "Sets hover text elements associated with each (lon,lat) pair If a single string, the same string appears over all the data points. If an array of string, the items are mapped in order to the this trace's (lon,lat) coordinates. To be seen, trace `hoverinfo` must contain a *text* flag.", - "dflt": "", - "editType": "calc", - "valType": "string" - }, - "hovertextsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `hovertext`.", - "editType": "none", - "valType": "string" - }, - "ids": { - "description": "Assigns id labels to each datum. These ids for object constancy of data points during animation. Should be an array of strings, not numbers or any other type.", - "editType": "calc", - "valType": "data_array" - }, - "idssrc": { - "description": "Sets the source reference on Chart Studio Cloud for `ids`.", - "editType": "none", - "valType": "string" - }, - "lat": { - "description": "Sets the latitude coordinates (in degrees North).", - "editType": "calc", - "valType": "data_array" - }, - "latsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `lat`.", - "editType": "none", - "valType": "string" - }, - "legend": { - "description": "Sets the reference to a legend to show this trace in. References to these legends are *legend*, *legend2*, *legend3*, etc. Settings for these legends are set in the layout, under `layout.legend`, `layout.legend2`, etc.", - "dflt": "legend", - "editType": "style", - "valType": "subplotid" - }, - "legendgroup": { - "description": "Sets the legend group for this trace. Traces and shapes part of the same legend group hide/show at the same time when toggling legend items.", - "dflt": "", - "editType": "style", - "valType": "string" - }, - "legendgrouptitle": { - "editType": "style", - "font": { - "color": { - "editType": "style", - "valType": "color" - }, - "description": "Sets this legend group's title font.", - "editType": "style", - "family": { - "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", - "editType": "style", - "noBlank": true, - "strict": true, - "valType": "string" - }, - "lineposition": { - "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", - "dflt": "none", - "editType": "style", - "extras": [ - "none" - ], - "flags": [ - "under", - "over", - "through" - ], - "valType": "flaglist" - }, - "role": "object", - "shadow": { - "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", - "dflt": "none", - "editType": "style", - "valType": "string" - }, - "size": { - "editType": "style", - "min": 1, - "valType": "number" - }, - "style": { - "description": "Sets whether a font should be styled with a normal or italic face from its family.", - "dflt": "normal", - "editType": "style", - "valType": "enumerated", - "values": [ - "normal", - "italic" - ] - }, - "textcase": { - "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", - "dflt": "normal", - "editType": "style", - "valType": "enumerated", - "values": [ - "normal", - "word caps", - "upper", - "lower" - ] - }, - "variant": { - "description": "Sets the variant of the font.", - "dflt": "normal", - "editType": "style", - "valType": "enumerated", - "values": [ - "normal", - "small-caps", - "all-small-caps", - "all-petite-caps", - "petite-caps", - "unicase" - ] - }, - "weight": { - "description": "Sets the weight (or boldness) of the font.", - "dflt": "normal", - "editType": "style", - "extras": [ - "normal", - "bold" - ], - "max": 1000, - "min": 1, - "valType": "integer" - } - }, - "role": "object", - "text": { - "description": "Sets the title of the legend group.", - "dflt": "", - "editType": "style", - "valType": "string" - } - }, - "legendrank": { - "description": "Sets the legend rank for this trace. Items and groups with smaller ranks are presented on top/left side while with *reversed* `legend.traceorder` they are on bottom/right side. The default legendrank is 1000, so that you can use ranks less than 1000 to place certain items before all unranked items, and ranks greater than 1000 to go after all unranked items. When having unranked or equal rank items shapes would be displayed after traces i.e. according to their order in data and layout.", - "dflt": 1000, - "editType": "style", - "valType": "number" - }, - "legendwidth": { - "description": "Sets the width (in px or fraction) of the legend for this trace.", - "editType": "style", - "min": 0, - "valType": "number" - }, - "line": { - "color": { - "description": "Sets the line color.", - "editType": "calc", - "valType": "color" - }, - "editType": "calc", - "role": "object", - "width": { - "description": "Sets the line width (in px).", - "dflt": 2, - "editType": "calc", - "min": 0, - "valType": "number" - } - }, - "lon": { - "description": "Sets the longitude coordinates (in degrees East).", - "editType": "calc", - "valType": "data_array" - }, - "lonsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `lon`.", - "editType": "none", - "valType": "string" - }, - "marker": { - "allowoverlap": { - "description": "Flag to draw all symbols, even if they overlap.", - "dflt": false, - "editType": "calc", - "valType": "boolean" - }, - "angle": { - "arrayOk": true, - "description": "Sets the marker orientation from true North, in degrees clockwise. When using the *auto* default, no rotation would be applied in perspective views which is different from using a zero angle.", - "dflt": "auto", - "editType": "calc", - "valType": "number" - }, - "anglesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `angle`.", - "editType": "none", - "valType": "string" - }, - "autocolorscale": { - "description": "Determines whether the colorscale is a default palette (`autocolorscale: true`) or the palette determined by `marker.colorscale`. Has an effect only if in `marker.color` is set to a numerical array. In case `colorscale` is unspecified or `autocolorscale` is true, the default palette will be chosen according to whether numbers in the `color` array are all positive, all negative or mixed.", - "dflt": true, - "editType": "calc", - "impliedEdits": {}, - "valType": "boolean" - }, - "cauto": { - "description": "Determines whether or not the color domain is computed with respect to the input data (here in `marker.color`) or the bounds set in `marker.cmin` and `marker.cmax` Has an effect only if in `marker.color` is set to a numerical array. Defaults to `false` when `marker.cmin` and `marker.cmax` are set by the user.", - "dflt": true, - "editType": "calc", - "impliedEdits": {}, - "valType": "boolean" - }, - "cmax": { - "description": "Sets the upper bound of the color domain. Has an effect only if in `marker.color` is set to a numerical array. Value should have the same units as in `marker.color` and if set, `marker.cmin` must be set as well.", - "dflt": null, - "editType": "calc", - "impliedEdits": { - "cauto": false - }, - "valType": "number" - }, - "cmid": { - "description": "Sets the mid-point of the color domain by scaling `marker.cmin` and/or `marker.cmax` to be equidistant to this point. Has an effect only if in `marker.color` is set to a numerical array. Value should have the same units as in `marker.color`. Has no effect when `marker.cauto` is `false`.", - "dflt": null, - "editType": "calc", - "impliedEdits": {}, - "valType": "number" - }, - "cmin": { - "description": "Sets the lower bound of the color domain. Has an effect only if in `marker.color` is set to a numerical array. Value should have the same units as in `marker.color` and if set, `marker.cmax` must be set as well.", - "dflt": null, - "editType": "calc", - "impliedEdits": { - "cauto": false - }, - "valType": "number" - }, - "color": { - "arrayOk": true, - "description": "Sets the marker color. It accepts either a specific color or an array of numbers that are mapped to the colorscale relative to the max and min values of the array or relative to `marker.cmin` and `marker.cmax` if set.", - "editType": "calc", - "valType": "color" - }, - "coloraxis": { - "description": "Sets a reference to a shared color axis. References to these shared color axes are *coloraxis*, *coloraxis2*, *coloraxis3*, etc. Settings for these shared color axes are set in the layout, under `layout.coloraxis`, `layout.coloraxis2`, etc. Note that multiple color scales can be linked to the same color axis.", - "dflt": null, - "editType": "calc", - "regex": "/^coloraxis([2-9]|[1-9][0-9]+)?$/", - "valType": "subplotid" - }, - "colorbar": { - "bgcolor": { - "description": "Sets the color of padded area.", - "dflt": "rgba(0,0,0,0)", - "editType": "calc", - "valType": "color" - }, - "bordercolor": { - "description": "Sets the axis line color.", - "dflt": "#444", - "editType": "calc", - "valType": "color" - }, - "borderwidth": { - "description": "Sets the width (in px) or the border enclosing this color bar.", - "dflt": 0, - "editType": "calc", - "min": 0, - "valType": "number" - }, - "dtick": { - "description": "Sets the step in-between ticks on this axis. Use with `tick0`. Must be a positive number, or special strings available to *log* and *date* axes. If the axis `type` is *log*, then ticks are set every 10^(n*dtick) where n is the tick number. For example, to set a tick mark at 1, 10, 100, 1000, ... set dtick to 1. To set tick marks at 1, 100, 10000, ... set dtick to 2. To set tick marks at 1, 5, 25, 125, 625, 3125, ... set dtick to log_10(5), or 0.69897000433. *log* has several special values; *L*, where `f` is a positive number, gives ticks linearly spaced in value (but not position). For example `tick0` = 0.1, `dtick` = *L0.5* will put ticks at 0.1, 0.6, 1.1, 1.6 etc. To show powers of 10 plus small digits between, use *D1* (all digits) or *D2* (only 2 and 5). `tick0` is ignored for *D1* and *D2*. If the axis `type` is *date*, then you must convert the time to milliseconds. For example, to set the interval between ticks to one day, set `dtick` to 86400000.0. *date* also has special values *M* gives ticks spaced by a number of months. `n` must be a positive integer. To set ticks on the 15th of every third month, set `tick0` to *2000-01-15* and `dtick` to *M3*. To set ticks every 4 years, set `dtick` to *M48*", - "editType": "calc", - "impliedEdits": { - "tickmode": "linear" - }, - "valType": "any" - }, - "editType": "calc", - "exponentformat": { - "description": "Determines a formatting rule for the tick exponents. For example, consider the number 1,000,000,000. If *none*, it appears as 1,000,000,000. If *e*, 1e+9. If *E*, 1E+9. If *power*, 1x10^9 (with 9 in a super script). If *SI*, 1G. If *B*, 1B. *SI* uses prefixes from \"femto\" f (10^-15) to \"tera\" T (10^12). *SI extended* covers instead the full SI range from \"quecto\" q (10^-30) to \"quetta\" Q (10^30). If *SI* or *SI extended* is used and the exponent is beyond the above ranges, the formatting rule will automatically be switched to the power notation.", - "dflt": "B", - "editType": "calc", - "valType": "enumerated", - "values": [ - "none", - "e", - "E", - "power", - "SI", - "B", - "SI extended" - ] - }, - "labelalias": { - "description": "Replacement text for specific tick or hover labels. For example using {US: 'USA', CA: 'Canada'} changes US to USA and CA to Canada. The labels we would have shown must match the keys exactly, after adding any tickprefix or ticksuffix. For negative numbers the minus sign symbol used (U+2212) is wider than the regular ascii dash. That means you need to use −1 instead of -1. labelalias can be used with any axis type, and both keys (if needed) and values (if desired) can include html-like tags or MathJax.", - "dflt": false, - "editType": "calc", - "valType": "any" - }, - "len": { - "description": "Sets the length of the color bar This measure excludes the padding of both ends. That is, the color bar length is this length minus the padding on both ends.", - "dflt": 1, - "editType": "calc", - "min": 0, - "valType": "number" - }, - "lenmode": { - "description": "Determines whether this color bar's length (i.e. the measure in the color variation direction) is set in units of plot *fraction* or in *pixels. Use `len` to set the value.", - "dflt": "fraction", - "editType": "calc", - "valType": "enumerated", - "values": [ - "fraction", - "pixels" - ] - }, - "minexponent": { - "description": "Hide SI prefix for 10^n if |n| is below this number. This only has an effect when `tickformat` is *SI* or *B*.", - "dflt": 3, - "editType": "calc", - "min": 0, - "valType": "number" - }, - "nticks": { - "description": "Specifies the maximum number of ticks for the particular axis. The actual number of ticks will be chosen automatically to be less than or equal to `nticks`. Has an effect only if `tickmode` is set to *auto*.", - "dflt": 0, - "editType": "calc", - "min": 0, - "valType": "integer" - }, - "orientation": { - "description": "Sets the orientation of the colorbar.", - "dflt": "v", - "editType": "calc", - "valType": "enumerated", - "values": [ - "h", - "v" - ] - }, - "outlinecolor": { - "description": "Sets the axis line color.", - "dflt": "#444", - "editType": "calc", - "valType": "color" - }, - "outlinewidth": { - "description": "Sets the width (in px) of the axis line.", - "dflt": 1, - "editType": "calc", - "min": 0, - "valType": "number" - }, - "role": "object", - "separatethousands": { - "description": "If \"true\", even 4-digit integers are separated", - "dflt": false, - "editType": "calc", - "valType": "boolean" - }, - "showexponent": { - "description": "If *all*, all exponents are shown besides their significands. If *first*, only the exponent of the first tick is shown. If *last*, only the exponent of the last tick is shown. If *none*, no exponents appear.", - "dflt": "all", - "editType": "calc", - "valType": "enumerated", - "values": [ - "all", - "first", - "last", - "none" - ] - }, - "showticklabels": { - "description": "Determines whether or not the tick labels are drawn.", - "dflt": true, - "editType": "calc", - "valType": "boolean" - }, - "showtickprefix": { - "description": "If *all*, all tick labels are displayed with a prefix. If *first*, only the first tick is displayed with a prefix. If *last*, only the last tick is displayed with a suffix. If *none*, tick prefixes are hidden.", - "dflt": "all", - "editType": "calc", - "valType": "enumerated", - "values": [ - "all", - "first", - "last", - "none" - ] - }, - "showticksuffix": { - "description": "Same as `showtickprefix` but for tick suffixes.", - "dflt": "all", - "editType": "calc", - "valType": "enumerated", - "values": [ - "all", - "first", - "last", - "none" - ] - }, - "thickness": { - "description": "Sets the thickness of the color bar This measure excludes the size of the padding, ticks and labels.", - "dflt": 30, - "editType": "calc", - "min": 0, - "valType": "number" - }, - "thicknessmode": { - "description": "Determines whether this color bar's thickness (i.e. the measure in the constant color direction) is set in units of plot *fraction* or in *pixels*. Use `thickness` to set the value.", - "dflt": "pixels", - "editType": "calc", - "valType": "enumerated", - "values": [ - "fraction", - "pixels" - ] - }, - "tick0": { - "description": "Sets the placement of the first tick on this axis. Use with `dtick`. If the axis `type` is *log*, then you must take the log of your starting tick (e.g. to set the starting tick to 100, set the `tick0` to 2) except when `dtick`=*L* (see `dtick` for more info). If the axis `type` is *date*, it should be a date string, like date data. If the axis `type` is *category*, it should be a number, using the scale where each category is assigned a serial number from zero in the order it appears.", - "editType": "calc", - "impliedEdits": { - "tickmode": "linear" - }, - "valType": "any" - }, - "tickangle": { - "description": "Sets the angle of the tick labels with respect to the horizontal. For example, a `tickangle` of -90 draws the tick labels vertically.", - "dflt": "auto", - "editType": "calc", - "valType": "angle" - }, - "tickcolor": { - "description": "Sets the tick color.", - "dflt": "#444", - "editType": "calc", - "valType": "color" - }, - "tickfont": { - "color": { - "editType": "calc", - "valType": "color" - }, - "description": "Sets the color bar's tick label font", - "editType": "calc", - "family": { - "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", - "editType": "calc", - "noBlank": true, - "strict": true, - "valType": "string" - }, - "lineposition": { - "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", - "dflt": "none", - "editType": "calc", - "extras": [ - "none" - ], - "flags": [ - "under", - "over", - "through" - ], - "valType": "flaglist" - }, - "role": "object", - "shadow": { - "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", - "dflt": "none", - "editType": "calc", - "valType": "string" - }, - "size": { - "editType": "calc", - "min": 1, - "valType": "number" - }, - "style": { - "description": "Sets whether a font should be styled with a normal or italic face from its family.", - "dflt": "normal", - "editType": "calc", - "valType": "enumerated", - "values": [ - "normal", - "italic" - ] - }, - "textcase": { - "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", - "dflt": "normal", - "editType": "calc", - "valType": "enumerated", - "values": [ - "normal", - "word caps", - "upper", - "lower" - ] - }, - "variant": { - "description": "Sets the variant of the font.", - "dflt": "normal", - "editType": "calc", - "valType": "enumerated", - "values": [ - "normal", - "small-caps", - "all-small-caps", - "all-petite-caps", - "petite-caps", - "unicase" - ] - }, - "weight": { - "description": "Sets the weight (or boldness) of the font.", - "dflt": "normal", - "editType": "calc", - "extras": [ - "normal", - "bold" - ], - "max": 1000, - "min": 1, - "valType": "integer" - } - }, - "tickformat": { - "description": "Sets the tick label formatting rule using d3 formatting mini-languages which are very similar to those in Python. For numbers, see: https://github.com/d3/d3-format/tree/v1.4.5#d3-format. And for dates see: https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format. We add two items to d3's date formatter: *%h* for half of the year as a decimal number as well as *%{n}f* for fractional seconds with n digits. For example, *2016-10-13 09:15:23.456* with tickformat *%H~%M~%S.%2f* would display *09~15~23.46*", - "dflt": "", - "editType": "calc", - "valType": "string" - }, - "tickformatstops": { - "items": { - "tickformatstop": { - "dtickrange": { - "description": "range [*min*, *max*], where *min*, *max* - dtick values which describe some zoom level, it is possible to omit *min* or *max* value by passing *null*", - "editType": "calc", - "items": [ - { - "editType": "calc", - "valType": "any" - }, - { - "editType": "calc", - "valType": "any" - } - ], - "valType": "info_array" - }, - "editType": "calc", - "enabled": { - "description": "Determines whether or not this stop is used. If `false`, this stop is ignored even within its `dtickrange`.", - "dflt": true, - "editType": "calc", - "valType": "boolean" - }, - "name": { - "description": "When used in a template, named items are created in the output figure in addition to any items the figure already has in this array. You can modify these items in the output figure by making your own item with `templateitemname` matching this `name` alongside your modifications (including `visible: false` or `enabled: false` to hide it). Has no effect outside of a template.", - "editType": "calc", - "valType": "string" - }, - "role": "object", - "templateitemname": { - "description": "Used to refer to a named item in this array in the template. Named items from the template will be created even without a matching item in the input figure, but you can modify one by making an item with `templateitemname` matching its `name`, alongside your modifications (including `visible: false` or `enabled: false` to hide it). If there is no template or no matching item, this item will be hidden unless you explicitly show it with `visible: true`.", - "editType": "calc", - "valType": "string" - }, - "value": { - "description": "string - dtickformat for described zoom level, the same as *tickformat*", - "dflt": "", - "editType": "calc", - "valType": "string" - } - } - }, - "role": "object" - }, - "ticklabeloverflow": { - "description": "Determines how we handle tick labels that would overflow either the graph div or the domain of the axis. The default value for inside tick labels is *hide past domain*. In other cases the default is *hide past div*.", - "editType": "calc", - "valType": "enumerated", - "values": [ - "allow", - "hide past div", - "hide past domain" - ] - }, - "ticklabelposition": { - "description": "Determines where tick labels are drawn relative to the ticks. Left and right options are used when `orientation` is *h*, top and bottom when `orientation` is *v*.", - "dflt": "outside", - "editType": "calc", - "valType": "enumerated", - "values": [ - "outside", - "inside", - "outside top", - "inside top", - "outside left", - "inside left", - "outside right", - "inside right", - "outside bottom", - "inside bottom" - ] - }, - "ticklabelstep": { - "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", - "dflt": 1, - "editType": "calc", - "min": 1, - "valType": "integer" - }, - "ticklen": { - "description": "Sets the tick length (in px).", - "dflt": 5, - "editType": "calc", - "min": 0, - "valType": "number" - }, - "tickmode": { - "description": "Sets the tick mode for this axis. If *auto*, the number of ticks is set via `nticks`. If *linear*, the placement of the ticks is determined by a starting position `tick0` and a tick step `dtick` (*linear* is the default value if `tick0` and `dtick` are provided). If *array*, the placement of the ticks is set via `tickvals` and the tick text is `ticktext`. (*array* is the default value if `tickvals` is provided).", - "editType": "calc", - "impliedEdits": {}, - "valType": "enumerated", - "values": [ - "auto", - "linear", - "array" - ] - }, - "tickprefix": { - "description": "Sets a tick label prefix.", - "dflt": "", - "editType": "calc", - "valType": "string" - }, - "ticks": { - "description": "Determines whether ticks are drawn or not. If **, this axis' ticks are not drawn. If *outside* (*inside*), this axis' are drawn outside (inside) the axis lines.", - "dflt": "", - "editType": "calc", - "valType": "enumerated", - "values": [ - "outside", - "inside", - "" - ] - }, - "ticksuffix": { - "description": "Sets a tick label suffix.", - "dflt": "", - "editType": "calc", - "valType": "string" - }, - "ticktext": { - "description": "Sets the text displayed at the ticks position via `tickvals`. Only has an effect if `tickmode` is set to *array*. Used with `tickvals`.", - "editType": "calc", - "valType": "data_array" - }, - "ticktextsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `ticktext`.", - "editType": "none", - "valType": "string" - }, - "tickvals": { - "description": "Sets the values at which ticks on this axis appear. Only has an effect if `tickmode` is set to *array*. Used with `ticktext`.", - "editType": "calc", - "valType": "data_array" - }, - "tickvalssrc": { - "description": "Sets the source reference on Chart Studio Cloud for `tickvals`.", - "editType": "none", - "valType": "string" - }, - "tickwidth": { - "description": "Sets the tick width (in px).", - "dflt": 1, - "editType": "calc", - "min": 0, - "valType": "number" - }, - "title": { - "editType": "calc", - "font": { - "color": { - "editType": "calc", - "valType": "color" - }, - "description": "Sets this color bar's title font.", - "editType": "calc", - "family": { - "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", - "editType": "calc", - "noBlank": true, - "strict": true, - "valType": "string" - }, - "lineposition": { - "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", - "dflt": "none", - "editType": "calc", - "extras": [ - "none" - ], - "flags": [ - "under", - "over", - "through" - ], - "valType": "flaglist" - }, - "role": "object", - "shadow": { - "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", - "dflt": "none", - "editType": "calc", - "valType": "string" - }, - "size": { - "editType": "calc", - "min": 1, - "valType": "number" - }, - "style": { - "description": "Sets whether a font should be styled with a normal or italic face from its family.", - "dflt": "normal", - "editType": "calc", - "valType": "enumerated", - "values": [ - "normal", - "italic" - ] - }, - "textcase": { - "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", - "dflt": "normal", - "editType": "calc", - "valType": "enumerated", - "values": [ - "normal", - "word caps", - "upper", - "lower" - ] - }, - "variant": { - "description": "Sets the variant of the font.", - "dflt": "normal", - "editType": "calc", - "valType": "enumerated", - "values": [ - "normal", - "small-caps", - "all-small-caps", - "all-petite-caps", - "petite-caps", - "unicase" - ] - }, - "weight": { - "description": "Sets the weight (or boldness) of the font.", - "dflt": "normal", - "editType": "calc", - "extras": [ - "normal", - "bold" - ], - "max": 1000, - "min": 1, - "valType": "integer" - } - }, - "role": "object", - "side": { - "description": "Determines the location of color bar's title with respect to the color bar. Defaults to *top* when `orientation` if *v* and defaults to *right* when `orientation` if *h*.", - "editType": "calc", - "valType": "enumerated", - "values": [ - "right", - "top", - "bottom" - ] - }, - "text": { - "description": "Sets the title of the color bar.", - "editType": "calc", - "valType": "string" - } - }, - "x": { - "description": "Sets the x position with respect to `xref` of the color bar (in plot fraction). When `xref` is *paper*, defaults to 1.02 when `orientation` is *v* and 0.5 when `orientation` is *h*. When `xref` is *container*, defaults to *1* when `orientation` is *v* and 0.5 when `orientation` is *h*. Must be between *0* and *1* if `xref` is *container* and between *-2* and *3* if `xref` is *paper*.", - "editType": "calc", - "valType": "number" - }, - "xanchor": { - "description": "Sets this color bar's horizontal position anchor. This anchor binds the `x` position to the *left*, *center* or *right* of the color bar. Defaults to *left* when `orientation` is *v* and *center* when `orientation` is *h*.", - "editType": "calc", - "valType": "enumerated", - "values": [ - "left", - "center", - "right" - ] - }, - "xpad": { - "description": "Sets the amount of padding (in px) along the x direction.", - "dflt": 10, - "editType": "calc", - "min": 0, - "valType": "number" - }, - "xref": { - "description": "Sets the container `x` refers to. *container* spans the entire `width` of the plot. *paper* refers to the width of the plotting area only.", - "dflt": "paper", - "editType": "calc", - "valType": "enumerated", - "values": [ - "container", - "paper" - ] - }, - "y": { - "description": "Sets the y position with respect to `yref` of the color bar (in plot fraction). When `yref` is *paper*, defaults to 0.5 when `orientation` is *v* and 1.02 when `orientation` is *h*. When `yref` is *container*, defaults to 0.5 when `orientation` is *v* and 1 when `orientation` is *h*. Must be between *0* and *1* if `yref` is *container* and between *-2* and *3* if `yref` is *paper*.", - "editType": "calc", - "valType": "number" - }, - "yanchor": { - "description": "Sets this color bar's vertical position anchor This anchor binds the `y` position to the *top*, *middle* or *bottom* of the color bar. Defaults to *middle* when `orientation` is *v* and *bottom* when `orientation` is *h*.", - "editType": "calc", - "valType": "enumerated", - "values": [ - "top", - "middle", - "bottom" - ] - }, - "ypad": { - "description": "Sets the amount of padding (in px) along the y direction.", - "dflt": 10, - "editType": "calc", - "min": 0, - "valType": "number" - }, - "yref": { - "description": "Sets the container `y` refers to. *container* spans the entire `height` of the plot. *paper* refers to the height of the plotting area only.", - "dflt": "paper", - "editType": "calc", - "valType": "enumerated", - "values": [ - "container", - "paper" - ] - } - }, - "colorscale": { - "description": "Sets the colorscale. Has an effect only if in `marker.color` is set to a numerical array. The colorscale must be an array containing arrays mapping a normalized value to an rgb, rgba, hex, hsl, hsv, or named color string. At minimum, a mapping for the lowest (0) and highest (1) values are required. For example, `[[0, 'rgb(0,0,255)'], [1, 'rgb(255,0,0)']]`. To control the bounds of the colorscale in color space, use `marker.cmin` and `marker.cmax`. Alternatively, `colorscale` may be a palette name string of the following list: Blackbody,Bluered,Blues,Cividis,Earth,Electric,Greens,Greys,Hot,Jet,Picnic,Portland,Rainbow,RdBu,Reds,Viridis,YlGnBu,YlOrRd.", - "dflt": null, - "editType": "calc", - "impliedEdits": { - "autocolorscale": false - }, - "valType": "colorscale" - }, - "colorsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `color`.", - "editType": "none", - "valType": "string" - }, - "editType": "calc", - "opacity": { - "arrayOk": true, - "description": "Sets the marker opacity.", - "editType": "calc", - "max": 1, - "min": 0, - "valType": "number" - }, - "opacitysrc": { - "description": "Sets the source reference on Chart Studio Cloud for `opacity`.", - "editType": "none", - "valType": "string" - }, - "reversescale": { - "description": "Reverses the color mapping if true. Has an effect only if in `marker.color` is set to a numerical array. If true, `marker.cmin` will correspond to the last color in the array and `marker.cmax` will correspond to the first color.", - "dflt": false, - "editType": "calc", - "valType": "boolean" - }, - "role": "object", - "showscale": { - "description": "Determines whether or not a colorbar is displayed for this trace. Has an effect only if in `marker.color` is set to a numerical array.", - "dflt": false, - "editType": "calc", - "valType": "boolean" - }, - "size": { - "arrayOk": true, - "description": "Sets the marker size (in px).", - "dflt": 6, - "editType": "calc", - "min": 0, - "valType": "number" - }, - "sizemin": { - "description": "Has an effect only if `marker.size` is set to a numerical array. Sets the minimum size (in px) of the rendered marker points.", - "dflt": 0, - "editType": "calc", - "min": 0, - "valType": "number" - }, - "sizemode": { - "description": "Has an effect only if `marker.size` is set to a numerical array. Sets the rule for which the data in `size` is converted to pixels.", - "dflt": "diameter", - "editType": "calc", - "valType": "enumerated", - "values": [ - "diameter", - "area" - ] - }, - "sizeref": { - "description": "Has an effect only if `marker.size` is set to a numerical array. Sets the scale factor used to determine the rendered size of marker points. Use with `sizemin` and `sizemode`.", - "dflt": 1, - "editType": "calc", - "valType": "number" - }, - "sizesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `size`.", - "editType": "none", - "valType": "string" - }, - "symbol": { - "arrayOk": true, - "description": "Sets the marker symbol. Full list: https://www.mapbox.com/maki-icons/ Note that the array `marker.color` and `marker.size` are only available for *circle* symbols.", - "dflt": "circle", - "editType": "calc", - "valType": "string" - }, - "symbolsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `symbol`.", - "editType": "none", - "valType": "string" - } - }, - "meta": { - "arrayOk": true, - "description": "Assigns extra meta information associated with this trace that can be used in various text attributes. Attributes such as trace `name`, graph, axis and colorbar `title.text`, annotation `text` `rangeselector`, `updatemenues` and `sliders` `label` text all support `meta`. To access the trace `meta` values in an attribute in the same trace, simply use `%{meta[i]}` where `i` is the index or key of the `meta` item in question. To access trace `meta` in layout attributes, use `%{data[n[.meta[i]}` where `i` is the index or key of the `meta` and `n` is the trace index.", - "editType": "plot", - "valType": "any" - }, - "metasrc": { - "description": "Sets the source reference on Chart Studio Cloud for `meta`.", - "editType": "none", - "valType": "string" - }, - "mode": { - "description": "Determines the drawing mode for this scatter trace. If the provided `mode` includes *text* then the `text` elements appear at the coordinates. Otherwise, the `text` elements appear on hover.", - "dflt": "markers", - "editType": "calc", - "extras": [ - "none" - ], - "flags": [ - "lines", - "markers", - "text" - ], - "valType": "flaglist" - }, - "name": { - "description": "Sets the trace name. The trace name appears as the legend item and on hover.", - "editType": "style", - "valType": "string" - }, - "opacity": { - "description": "Sets the opacity of the trace.", - "dflt": 1, - "editType": "style", - "max": 1, - "min": 0, - "valType": "number" - }, - "selected": { - "editType": "calc", - "marker": { - "color": { - "description": "Sets the marker color of selected points.", - "editType": "calc", - "valType": "color" - }, - "editType": "calc", - "opacity": { - "description": "Sets the marker opacity of selected points.", - "editType": "calc", - "max": 1, - "min": 0, - "valType": "number" - }, - "role": "object", - "size": { - "description": "Sets the marker size of selected points.", - "editType": "calc", - "min": 0, - "valType": "number" - } - }, - "role": "object" - }, - "selectedpoints": { - "description": "Array containing integer indices of selected points. Has an effect only for traces that support selections. Note that an empty array means an empty selection where the `unselected` are turned on for all points, whereas, any other non-array values means no selection all where the `selected` and `unselected` styles have no effect.", - "editType": "calc", - "valType": "any" - }, - "showlegend": { - "description": "Determines whether or not an item corresponding to this trace is shown in the legend.", - "dflt": true, - "editType": "style", - "valType": "boolean" - }, - "stream": { - "editType": "calc", - "maxpoints": { - "description": "Sets the maximum number of points to keep on the plots from an incoming stream. If `maxpoints` is set to *50*, only the newest 50 points will be displayed on the plot.", - "dflt": 500, - "editType": "calc", - "max": 10000, - "min": 0, - "valType": "number" - }, - "role": "object", - "token": { - "description": "The stream id number links a data trace on a plot with a stream. See https://chart-studio.plotly.com/settings for more details.", - "editType": "calc", - "noBlank": true, - "strict": true, - "valType": "string" - } - }, - "subplot": { - "description": "mapbox subplots and traces are deprecated! Please consider switching to `map` subplots and traces. Learn more at: https://plotly.com/python/maplibre-migration/ as well as https://plotly.com/javascript/maplibre-migration/ Sets a reference between this trace's data coordinates and a mapbox subplot. If *mapbox* (the default value), the data refer to `layout.mapbox`. If *mapbox2*, the data refer to `layout.mapbox2`, and so on.", - "dflt": "mapbox", - "editType": "calc", - "valType": "subplotid" - }, - "text": { - "arrayOk": true, - "description": "Sets text elements associated with each (lon,lat) pair If a single string, the same string appears over all the data points. If an array of string, the items are mapped in order to the this trace's (lon,lat) coordinates. If trace `hoverinfo` contains a *text* flag and *hovertext* is not set, these elements will be seen in the hover labels.", - "dflt": "", - "editType": "calc", - "valType": "string" - }, - "textfont": { - "color": { - "editType": "calc", - "valType": "color" - }, - "description": "Sets the icon text font (color=mapbox.layer.paint.text-color, size=mapbox.layer.layout.text-size). Has an effect only when `type` is set to *symbol*.", - "editType": "calc", - "family": { - "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", - "dflt": "Open Sans Regular, Arial Unicode MS Regular", - "editType": "calc", - "noBlank": true, - "strict": true, - "valType": "string" - }, - "role": "object", - "size": { - "editType": "calc", - "min": 1, - "valType": "number" - }, - "style": { - "description": "Sets whether a font should be styled with a normal or italic face from its family.", - "dflt": "normal", - "editType": "calc", - "valType": "enumerated", - "values": [ - "normal", - "italic" - ] - }, - "weight": { - "description": "Sets the weight (or boldness) of the font.", - "dflt": "normal", - "editType": "calc", - "extras": [ - "normal", - "bold" - ], - "max": 1000, - "min": 1, - "valType": "integer" - } - }, - "textposition": { - "arrayOk": false, - "description": "Sets the positions of the `text` elements with respects to the (x,y) coordinates.", - "dflt": "middle center", - "editType": "calc", - "valType": "enumerated", - "values": [ - "top left", - "top center", - "top right", - "middle left", - "middle center", - "middle right", - "bottom left", - "bottom center", - "bottom right" - ] - }, - "textsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `text`.", - "editType": "none", - "valType": "string" - }, - "texttemplate": { - "arrayOk": true, - "description": "Template string used for rendering the information text that appears on points. Note that this will override `textinfo`. Variables are inserted using %{variable}, for example \"y: %{y}\". Numbers are formatted using d3-format's syntax %{variable:d3-format}, for example \"Price: %{y:$.2f}\". https://github.com/d3/d3-format/tree/v1.4.5#d3-format for details on the formatting syntax. Dates are formatted using d3-time-format's syntax %{variable|d3-time-format}, for example \"Day: %{2019-01-01|%A}\". https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format for details on the date formatting syntax. Variables that can't be found will be replaced with the specifier. For example, a template of \"data: %{x}, %{y}\" will result in a value of \"data: 1, %{y}\" if x is 1 and y is missing. Variables with an undefined value will be replaced with the fallback value. All attributes that can be specified per-point (the ones that are `arrayOk: true`) are available. Finally, the template string has access to variables `lat`, `lon` and `text`.", - "dflt": "", - "editType": "calc", - "valType": "string" - }, - "texttemplatefallback": { - "description": "Fallback string that's displayed when a variable referenced in a template is missing. If the boolean value 'false' is passed in, the specifier with the missing variable will be displayed.", - "dflt": "-", - "editType": "calc", - "valType": "any" - }, - "texttemplatesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `texttemplate`.", - "editType": "none", - "valType": "string" - }, - "type": "scattermapbox", - "uid": { - "description": "Assign an id to this trace, Use this to provide object constancy between traces during animations and transitions.", - "editType": "plot", - "valType": "string" - }, - "uirevision": { - "description": "Controls persistence of some user-driven changes to the trace: `constraintrange` in `parcoords` traces, as well as some `editable: true` modifications such as `name` and `colorbar.title`. Defaults to `layout.uirevision`. Note that other user-driven trace attribute changes are controlled by `layout` attributes: `trace.visible` is controlled by `layout.legend.uirevision`, `selectedpoints` is controlled by `layout.selectionrevision`, and `colorbar.(x|y)` (accessible with `config: {editable: true}`) is controlled by `layout.editrevision`. Trace changes are tracked by `uid`, which only falls back on trace index if no `uid` is provided. So if your app can add/remove traces before the end of the `data` array, such that the same trace has a different index, you can still preserve user-driven changes if you give each trace a `uid` that stays with it as it moves.", - "editType": "none", - "valType": "any" - }, - "unselected": { - "editType": "calc", - "marker": { - "color": { - "description": "Sets the marker color of unselected points, applied only when a selection exists.", - "editType": "calc", - "valType": "color" - }, - "editType": "calc", - "opacity": { - "description": "Sets the marker opacity of unselected points, applied only when a selection exists.", - "editType": "calc", - "max": 1, - "min": 0, - "valType": "number" - }, - "role": "object", - "size": { - "description": "Sets the marker size of unselected points, applied only when a selection exists.", - "editType": "calc", - "min": 0, - "valType": "number" - } - }, - "role": "object" - }, - "visible": { - "description": "Determines whether or not this trace is visible. If *legendonly*, the trace is not drawn, but can appear as a legend item (provided that the legend itself is visible).", - "dflt": true, - "editType": "calc", - "valType": "enumerated", - "values": [ - true, - false, - "legendonly" - ] - } - }, - "categories": [ - "mapbox", - "gl", - "symbols", - "showLegend", - "scatter-like" - ], - "meta": { - "description": "*scattermapbox* trace is deprecated! Please consider switching to the *scattermap* trace type and `map` subplots. Learn more at: https://plotly.com/python/maplibre-migration/ as well as https://plotly.com/javascript/maplibre-migration/ The data visualized as scatter point, lines or marker symbols on a Mapbox GL geographic map is provided by longitude/latitude pairs in `lon` and `lat`.", - "hrName": "scatter_mapbox" - }, - "type": "scattermapbox" - }, - "scatterpolar": { - "animatable": false, - "attributes": { - "cliponaxis": { - "description": "Determines whether or not markers and text nodes are clipped about the subplot axes. To show markers and text nodes above axis lines and tick labels, make sure to set `xaxis.layer` and `yaxis.layer` to *below traces*.", - "dflt": false, - "editType": "plot", - "valType": "boolean" - }, - "connectgaps": { - "description": "Determines whether or not gaps (i.e. {nan} or missing values) in the provided data arrays are connected.", - "dflt": false, - "editType": "calc", - "valType": "boolean" - }, - "customdata": { - "description": "Assigns extra data each datum. This may be useful when listening to hover, click and selection events. Note that, *scatter* traces also appends customdata items in the markers DOM elements", - "editType": "calc", - "valType": "data_array" - }, - "customdatasrc": { - "description": "Sets the source reference on Chart Studio Cloud for `customdata`.", - "editType": "none", - "valType": "string" - }, - "dr": { - "description": "Sets the r coordinate step.", - "dflt": 1, - "editType": "calc", - "valType": "number" - }, - "dtheta": { - "description": "Sets the theta coordinate step. By default, the `dtheta` step equals the subplot's period divided by the length of the `r` coordinates.", - "editType": "calc", - "valType": "number" - }, - "fill": { - "description": "Sets the area to fill with a solid color. Use with `fillcolor` if not *none*. scatterpolar has a subset of the options available to scatter. *toself* connects the endpoints of the trace (or each segment of the trace if it has gaps) into a closed shape. *tonext* fills the space between two traces if one completely encloses the other (eg consecutive contour lines), and behaves like *toself* if there is no trace before it. *tonext* should not be used if one trace does not enclose the other.", - "dflt": "none", - "editType": "calc", - "valType": "enumerated", - "values": [ - "none", - "toself", - "tonext" - ] - }, - "fillcolor": { - "description": "Sets the fill color. Defaults to a half-transparent variant of the line color, marker color, or marker line color, whichever is available.", - "editType": "style", - "valType": "color" - }, - "hoverinfo": { - "arrayOk": true, - "description": "Determines which trace information appear on hover. If `none` or `skip` are set, no information is displayed upon hovering. But, if `none` is set, click and hover events are still fired.", - "dflt": "all", - "editType": "none", - "extras": [ - "all", - "none", - "skip" - ], - "flags": [ - "r", - "theta", - "text", - "name" - ], - "valType": "flaglist" - }, - "hoverinfosrc": { - "description": "Sets the source reference on Chart Studio Cloud for `hoverinfo`.", - "editType": "none", - "valType": "string" - }, - "hoverlabel": { - "align": { - "arrayOk": true, - "description": "Sets the horizontal alignment of the text content within hover label box. Has an effect only if the hover label text spans more two or more lines", - "dflt": "auto", - "editType": "none", - "valType": "enumerated", - "values": [ - "left", - "right", - "auto" - ] - }, - "alignsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `align`.", - "editType": "none", - "valType": "string" - }, - "bgcolor": { - "arrayOk": true, - "description": "Sets the background color of the hover labels for this trace", - "editType": "none", - "valType": "color" - }, - "bgcolorsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `bgcolor`.", - "editType": "none", - "valType": "string" - }, - "bordercolor": { - "arrayOk": true, - "description": "Sets the border color of the hover labels for this trace.", - "editType": "none", - "valType": "color" - }, - "bordercolorsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `bordercolor`.", - "editType": "none", - "valType": "string" - }, - "editType": "none", - "font": { - "color": { - "arrayOk": true, - "editType": "none", - "valType": "color" - }, - "colorsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `color`.", - "editType": "none", - "valType": "string" - }, - "description": "Sets the font used in hover labels.", - "editType": "none", - "family": { - "arrayOk": true, - "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", - "editType": "none", - "noBlank": true, - "strict": true, - "valType": "string" - }, - "familysrc": { - "description": "Sets the source reference on Chart Studio Cloud for `family`.", - "editType": "none", - "valType": "string" - }, - "lineposition": { - "arrayOk": true, - "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", - "dflt": "none", - "editType": "none", - "extras": [ - "none" - ], - "flags": [ - "under", - "over", - "through" - ], - "valType": "flaglist" - }, - "linepositionsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `lineposition`.", - "editType": "none", - "valType": "string" - }, - "role": "object", - "shadow": { - "arrayOk": true, - "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", - "dflt": "none", - "editType": "none", - "valType": "string" - }, - "shadowsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `shadow`.", - "editType": "none", - "valType": "string" - }, - "size": { - "arrayOk": true, - "editType": "none", - "min": 1, - "valType": "number" - }, - "sizesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `size`.", - "editType": "none", - "valType": "string" - }, - "style": { - "arrayOk": true, - "description": "Sets whether a font should be styled with a normal or italic face from its family.", - "dflt": "normal", - "editType": "none", - "valType": "enumerated", - "values": [ - "normal", - "italic" - ] - }, - "stylesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `style`.", - "editType": "none", - "valType": "string" - }, - "textcase": { - "arrayOk": true, - "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", - "dflt": "normal", - "editType": "none", - "valType": "enumerated", - "values": [ - "normal", - "word caps", - "upper", - "lower" - ] - }, - "textcasesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `textcase`.", - "editType": "none", - "valType": "string" - }, - "variant": { - "arrayOk": true, - "description": "Sets the variant of the font.", - "dflt": "normal", - "editType": "none", - "valType": "enumerated", - "values": [ - "normal", - "small-caps", - "all-small-caps", - "all-petite-caps", - "petite-caps", - "unicase" - ] - }, - "variantsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `variant`.", - "editType": "none", - "valType": "string" - }, - "weight": { - "arrayOk": true, - "description": "Sets the weight (or boldness) of the font.", - "dflt": "normal", - "editType": "none", - "extras": [ - "normal", - "bold" - ], - "max": 1000, - "min": 1, - "valType": "integer" - }, - "weightsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `weight`.", - "editType": "none", - "valType": "string" - } - }, - "namelength": { - "arrayOk": true, - "description": "Sets the default length (in number of characters) of the trace name in the hover labels for all traces. -1 shows the whole name regardless of length. 0-3 shows the first 0-3 characters, and an integer >3 will show the whole name if it is less than that many characters, but if it is longer, will truncate to `namelength - 3` characters and add an ellipsis.", - "dflt": 15, - "editType": "none", - "min": -1, - "valType": "integer" - }, - "namelengthsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `namelength`.", - "editType": "none", - "valType": "string" - }, - "role": "object", - "showarrow": { - "description": "Sets whether or not to show the hover label arrow/triangle pointing to the data point.", - "dflt": true, - "editType": "none", - "valType": "boolean" - } - }, - "hoveron": { - "description": "Do the hover effects highlight individual points (markers or line points) or do they highlight filled regions? If the fill is *toself* or *tonext* and there are no markers or text, then the default is *fills*, otherwise it is *points*.", - "editType": "style", - "flags": [ - "points", - "fills" - ], - "valType": "flaglist" - }, - "hovertemplate": { - "arrayOk": true, - "description": "Template string used for rendering the information that appear on hover box. Note that this will override `hoverinfo`. Variables are inserted using %{variable}, for example \"y: %{y}\" as well as %{xother}, {%_xother}, {%_xother_}, {%xother_}. When showing info for several points, *xother* will be added to those with different x positions from the first point. An underscore before or after *(x|y)other* will add a space on that side, only when this field is shown. Numbers are formatted using d3-format's syntax %{variable:d3-format}, for example \"Price: %{y:$.2f}\". https://github.com/d3/d3-format/tree/v1.4.5#d3-format for details on the formatting syntax. Dates are formatted using d3-time-format's syntax %{variable|d3-time-format}, for example \"Day: %{2019-01-01|%A}\". https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format for details on the date formatting syntax. Variables that can't be found will be replaced with the specifier. For example, a template of \"data: %{x}, %{y}\" will result in a value of \"data: 1, %{y}\" if x is 1 and y is missing. Variables with an undefined value will be replaced with the fallback value. The variables available in `hovertemplate` are the ones emitted as event data described at this link https://plotly.com/javascript/plotlyjs-events/#event-data. Additionally, all attributes that can be specified per-point (the ones that are `arrayOk: true`) are available. Anything contained in tag `` is displayed in the secondary box, for example `%{fullData.name}`. To hide the secondary box completely, use an empty tag ``.", - "dflt": "", - "editType": "none", - "valType": "string" - }, - "hovertemplatefallback": { - "description": "Fallback string that's displayed when a variable referenced in a template is missing. If the boolean value 'false' is passed in, the specifier with the missing variable will be displayed.", - "dflt": "-", - "editType": "none", - "valType": "any" - }, - "hovertemplatesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `hovertemplate`.", - "editType": "none", - "valType": "string" - }, - "hovertext": { - "arrayOk": true, - "description": "Sets hover text elements associated with each (x,y) pair. If a single string, the same string appears over all the data points. If an array of string, the items are mapped in order to the this trace's (x,y) coordinates. To be seen, trace `hoverinfo` must contain a *text* flag.", - "dflt": "", - "editType": "style", - "valType": "string" - }, - "hovertextsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `hovertext`.", - "editType": "none", - "valType": "string" - }, - "ids": { - "description": "Assigns id labels to each datum. These ids for object constancy of data points during animation. Should be an array of strings, not numbers or any other type.", - "editType": "calc", - "valType": "data_array" - }, - "idssrc": { - "description": "Sets the source reference on Chart Studio Cloud for `ids`.", - "editType": "none", - "valType": "string" - }, - "legend": { - "description": "Sets the reference to a legend to show this trace in. References to these legends are *legend*, *legend2*, *legend3*, etc. Settings for these legends are set in the layout, under `layout.legend`, `layout.legend2`, etc.", - "dflt": "legend", - "editType": "style", - "valType": "subplotid" - }, - "legendgroup": { - "description": "Sets the legend group for this trace. Traces and shapes part of the same legend group hide/show at the same time when toggling legend items.", - "dflt": "", - "editType": "style", - "valType": "string" - }, - "legendgrouptitle": { - "editType": "style", - "font": { - "color": { - "editType": "style", - "valType": "color" - }, - "description": "Sets this legend group's title font.", - "editType": "style", - "family": { - "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", - "editType": "style", - "noBlank": true, - "strict": true, - "valType": "string" - }, - "lineposition": { - "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", - "dflt": "none", - "editType": "style", - "extras": [ - "none" - ], - "flags": [ - "under", - "over", - "through" - ], - "valType": "flaglist" - }, - "role": "object", - "shadow": { - "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", - "dflt": "none", - "editType": "style", - "valType": "string" - }, - "size": { - "editType": "style", - "min": 1, - "valType": "number" - }, - "style": { - "description": "Sets whether a font should be styled with a normal or italic face from its family.", - "dflt": "normal", - "editType": "style", - "valType": "enumerated", - "values": [ - "normal", - "italic" - ] - }, - "textcase": { - "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", - "dflt": "normal", - "editType": "style", - "valType": "enumerated", - "values": [ - "normal", - "word caps", - "upper", - "lower" - ] - }, - "variant": { - "description": "Sets the variant of the font.", - "dflt": "normal", - "editType": "style", - "valType": "enumerated", - "values": [ - "normal", - "small-caps", - "all-small-caps", - "all-petite-caps", - "petite-caps", - "unicase" - ] - }, - "weight": { - "description": "Sets the weight (or boldness) of the font.", - "dflt": "normal", - "editType": "style", - "extras": [ - "normal", - "bold" - ], - "max": 1000, - "min": 1, - "valType": "integer" - } - }, - "role": "object", - "text": { - "description": "Sets the title of the legend group.", - "dflt": "", - "editType": "style", - "valType": "string" - } - }, - "legendrank": { - "description": "Sets the legend rank for this trace. Items and groups with smaller ranks are presented on top/left side while with *reversed* `legend.traceorder` they are on bottom/right side. The default legendrank is 1000, so that you can use ranks less than 1000 to place certain items before all unranked items, and ranks greater than 1000 to go after all unranked items. When having unranked or equal rank items shapes would be displayed after traces i.e. according to their order in data and layout.", - "dflt": 1000, - "editType": "style", - "valType": "number" - }, - "legendwidth": { - "description": "Sets the width (in px or fraction) of the legend for this trace.", - "editType": "style", - "min": 0, - "valType": "number" - }, - "line": { - "backoff": { - "arrayOk": true, - "description": "Sets the line back off from the end point of the nth line segment (in px). This option is useful e.g. to avoid overlap with arrowhead markers. With *auto* the lines would trim before markers if `marker.angleref` is set to *previous*.", - "dflt": "auto", - "editType": "plot", - "min": 0, - "valType": "number" - }, - "backoffsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `backoff`.", - "editType": "none", - "valType": "string" - }, - "color": { - "description": "Sets the line color.", - "editType": "style", - "valType": "color" - }, - "dash": { - "description": "Sets the dash style of lines. Set to a dash type string (*solid*, *dot*, *dash*, *longdash*, *dashdot*, or *longdashdot*) or a dash length list in px (eg *5px,10px,2px,2px*).", - "dflt": "solid", - "editType": "style", - "valType": "string", - "values": [ - "solid", - "dot", - "dash", - "longdash", - "dashdot", - "longdashdot" - ] - }, - "editType": "calc", - "role": "object", - "shape": { - "description": "Determines the line shape. With *spline* the lines are drawn using spline interpolation. The other available values correspond to step-wise line shapes.", - "dflt": "linear", - "editType": "plot", - "valType": "enumerated", - "values": [ - "linear", - "spline" - ] - }, - "smoothing": { - "description": "Has an effect only if `shape` is set to *spline* Sets the amount of smoothing. *0* corresponds to no smoothing (equivalent to a *linear* shape).", - "dflt": 1, - "editType": "plot", - "max": 1.3, - "min": 0, - "valType": "number" - }, - "width": { - "description": "Sets the line width (in px).", - "dflt": 2, - "editType": "style", - "min": 0, - "valType": "number" - } - }, - "marker": { - "angle": { - "arrayOk": true, - "description": "Sets the marker angle in respect to `angleref`.", - "dflt": 0, - "editType": "plot", - "valType": "angle" - }, - "angleref": { - "description": "Sets the reference for marker angle. With *previous*, angle 0 points along the line from the previous point to this one. With *up*, angle 0 points toward the top of the screen.", - "dflt": "up", - "editType": "plot", - "valType": "enumerated", - "values": [ - "previous", - "up" - ] - }, - "anglesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `angle`.", - "editType": "none", - "valType": "string" - }, - "autocolorscale": { - "description": "Determines whether the colorscale is a default palette (`autocolorscale: true`) or the palette determined by `marker.colorscale`. Has an effect only if in `marker.color` is set to a numerical array. In case `colorscale` is unspecified or `autocolorscale` is true, the default palette will be chosen according to whether numbers in the `color` array are all positive, all negative or mixed.", - "dflt": true, - "editType": "calc", - "impliedEdits": {}, - "valType": "boolean" - }, - "cauto": { - "description": "Determines whether or not the color domain is computed with respect to the input data (here in `marker.color`) or the bounds set in `marker.cmin` and `marker.cmax` Has an effect only if in `marker.color` is set to a numerical array. Defaults to `false` when `marker.cmin` and `marker.cmax` are set by the user.", - "dflt": true, - "editType": "calc", - "impliedEdits": {}, - "valType": "boolean" - }, - "cmax": { - "description": "Sets the upper bound of the color domain. Has an effect only if in `marker.color` is set to a numerical array. Value should have the same units as in `marker.color` and if set, `marker.cmin` must be set as well.", - "dflt": null, - "editType": "plot", - "impliedEdits": { - "cauto": false - }, - "valType": "number" - }, - "cmid": { - "description": "Sets the mid-point of the color domain by scaling `marker.cmin` and/or `marker.cmax` to be equidistant to this point. Has an effect only if in `marker.color` is set to a numerical array. Value should have the same units as in `marker.color`. Has no effect when `marker.cauto` is `false`.", - "dflt": null, - "editType": "calc", - "impliedEdits": {}, - "valType": "number" - }, - "cmin": { - "description": "Sets the lower bound of the color domain. Has an effect only if in `marker.color` is set to a numerical array. Value should have the same units as in `marker.color` and if set, `marker.cmax` must be set as well.", - "dflt": null, - "editType": "plot", - "impliedEdits": { - "cauto": false - }, - "valType": "number" - }, - "color": { - "arrayOk": true, - "description": "Sets the marker color. It accepts either a specific color or an array of numbers that are mapped to the colorscale relative to the max and min values of the array or relative to `marker.cmin` and `marker.cmax` if set.", - "editType": "style", - "valType": "color" - }, - "coloraxis": { - "description": "Sets a reference to a shared color axis. References to these shared color axes are *coloraxis*, *coloraxis2*, *coloraxis3*, etc. Settings for these shared color axes are set in the layout, under `layout.coloraxis`, `layout.coloraxis2`, etc. Note that multiple color scales can be linked to the same color axis.", - "dflt": null, - "editType": "calc", - "regex": "/^coloraxis([2-9]|[1-9][0-9]+)?$/", - "valType": "subplotid" - }, - "colorbar": { - "bgcolor": { - "description": "Sets the color of padded area.", - "dflt": "rgba(0,0,0,0)", - "editType": "colorbars", - "valType": "color" - }, - "bordercolor": { - "description": "Sets the axis line color.", - "dflt": "#444", - "editType": "colorbars", - "valType": "color" - }, - "borderwidth": { - "description": "Sets the width (in px) or the border enclosing this color bar.", - "dflt": 0, - "editType": "colorbars", - "min": 0, - "valType": "number" - }, - "dtick": { - "description": "Sets the step in-between ticks on this axis. Use with `tick0`. Must be a positive number, or special strings available to *log* and *date* axes. If the axis `type` is *log*, then ticks are set every 10^(n*dtick) where n is the tick number. For example, to set a tick mark at 1, 10, 100, 1000, ... set dtick to 1. To set tick marks at 1, 100, 10000, ... set dtick to 2. To set tick marks at 1, 5, 25, 125, 625, 3125, ... set dtick to log_10(5), or 0.69897000433. *log* has several special values; *L*, where `f` is a positive number, gives ticks linearly spaced in value (but not position). For example `tick0` = 0.1, `dtick` = *L0.5* will put ticks at 0.1, 0.6, 1.1, 1.6 etc. To show powers of 10 plus small digits between, use *D1* (all digits) or *D2* (only 2 and 5). `tick0` is ignored for *D1* and *D2*. If the axis `type` is *date*, then you must convert the time to milliseconds. For example, to set the interval between ticks to one day, set `dtick` to 86400000.0. *date* also has special values *M* gives ticks spaced by a number of months. `n` must be a positive integer. To set ticks on the 15th of every third month, set `tick0` to *2000-01-15* and `dtick` to *M3*. To set ticks every 4 years, set `dtick` to *M48*", - "editType": "colorbars", - "impliedEdits": { - "tickmode": "linear" - }, - "valType": "any" - }, - "editType": "colorbars", - "exponentformat": { - "description": "Determines a formatting rule for the tick exponents. For example, consider the number 1,000,000,000. If *none*, it appears as 1,000,000,000. If *e*, 1e+9. If *E*, 1E+9. If *power*, 1x10^9 (with 9 in a super script). If *SI*, 1G. If *B*, 1B. *SI* uses prefixes from \"femto\" f (10^-15) to \"tera\" T (10^12). *SI extended* covers instead the full SI range from \"quecto\" q (10^-30) to \"quetta\" Q (10^30). If *SI* or *SI extended* is used and the exponent is beyond the above ranges, the formatting rule will automatically be switched to the power notation.", - "dflt": "B", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "none", - "e", - "E", - "power", - "SI", - "B", - "SI extended" - ] - }, - "labelalias": { - "description": "Replacement text for specific tick or hover labels. For example using {US: 'USA', CA: 'Canada'} changes US to USA and CA to Canada. The labels we would have shown must match the keys exactly, after adding any tickprefix or ticksuffix. For negative numbers the minus sign symbol used (U+2212) is wider than the regular ascii dash. That means you need to use −1 instead of -1. labelalias can be used with any axis type, and both keys (if needed) and values (if desired) can include html-like tags or MathJax.", - "dflt": false, - "editType": "colorbars", - "valType": "any" - }, - "len": { - "description": "Sets the length of the color bar This measure excludes the padding of both ends. That is, the color bar length is this length minus the padding on both ends.", - "dflt": 1, - "editType": "colorbars", - "min": 0, - "valType": "number" - }, - "lenmode": { - "description": "Determines whether this color bar's length (i.e. the measure in the color variation direction) is set in units of plot *fraction* or in *pixels. Use `len` to set the value.", - "dflt": "fraction", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "fraction", - "pixels" - ] - }, - "minexponent": { - "description": "Hide SI prefix for 10^n if |n| is below this number. This only has an effect when `tickformat` is *SI* or *B*.", - "dflt": 3, - "editType": "colorbars", - "min": 0, - "valType": "number" - }, - "nticks": { - "description": "Specifies the maximum number of ticks for the particular axis. The actual number of ticks will be chosen automatically to be less than or equal to `nticks`. Has an effect only if `tickmode` is set to *auto*.", - "dflt": 0, - "editType": "colorbars", - "min": 0, - "valType": "integer" - }, - "orientation": { - "description": "Sets the orientation of the colorbar.", - "dflt": "v", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "h", - "v" - ] - }, - "outlinecolor": { - "description": "Sets the axis line color.", - "dflt": "#444", - "editType": "colorbars", - "valType": "color" - }, - "outlinewidth": { - "description": "Sets the width (in px) of the axis line.", - "dflt": 1, - "editType": "colorbars", - "min": 0, - "valType": "number" - }, - "role": "object", - "separatethousands": { - "description": "If \"true\", even 4-digit integers are separated", - "dflt": false, - "editType": "colorbars", - "valType": "boolean" - }, - "showexponent": { - "description": "If *all*, all exponents are shown besides their significands. If *first*, only the exponent of the first tick is shown. If *last*, only the exponent of the last tick is shown. If *none*, no exponents appear.", - "dflt": "all", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "all", - "first", - "last", - "none" - ] - }, - "showticklabels": { - "description": "Determines whether or not the tick labels are drawn.", - "dflt": true, - "editType": "colorbars", - "valType": "boolean" - }, - "showtickprefix": { - "description": "If *all*, all tick labels are displayed with a prefix. If *first*, only the first tick is displayed with a prefix. If *last*, only the last tick is displayed with a suffix. If *none*, tick prefixes are hidden.", - "dflt": "all", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "all", - "first", - "last", - "none" - ] - }, - "showticksuffix": { - "description": "Same as `showtickprefix` but for tick suffixes.", - "dflt": "all", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "all", - "first", - "last", - "none" - ] - }, - "thickness": { - "description": "Sets the thickness of the color bar This measure excludes the size of the padding, ticks and labels.", - "dflt": 30, - "editType": "colorbars", - "min": 0, - "valType": "number" - }, - "thicknessmode": { - "description": "Determines whether this color bar's thickness (i.e. the measure in the constant color direction) is set in units of plot *fraction* or in *pixels*. Use `thickness` to set the value.", - "dflt": "pixels", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "fraction", - "pixels" - ] - }, - "tick0": { - "description": "Sets the placement of the first tick on this axis. Use with `dtick`. If the axis `type` is *log*, then you must take the log of your starting tick (e.g. to set the starting tick to 100, set the `tick0` to 2) except when `dtick`=*L* (see `dtick` for more info). If the axis `type` is *date*, it should be a date string, like date data. If the axis `type` is *category*, it should be a number, using the scale where each category is assigned a serial number from zero in the order it appears.", - "editType": "colorbars", - "impliedEdits": { - "tickmode": "linear" - }, - "valType": "any" - }, - "tickangle": { - "description": "Sets the angle of the tick labels with respect to the horizontal. For example, a `tickangle` of -90 draws the tick labels vertically.", - "dflt": "auto", - "editType": "colorbars", - "valType": "angle" - }, - "tickcolor": { - "description": "Sets the tick color.", - "dflt": "#444", - "editType": "colorbars", - "valType": "color" - }, - "tickfont": { - "color": { - "editType": "colorbars", - "valType": "color" - }, - "description": "Sets the color bar's tick label font", - "editType": "colorbars", - "family": { - "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", - "editType": "colorbars", - "noBlank": true, - "strict": true, - "valType": "string" - }, - "lineposition": { - "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", - "dflt": "none", - "editType": "colorbars", - "extras": [ - "none" - ], - "flags": [ - "under", - "over", - "through" - ], - "valType": "flaglist" - }, - "role": "object", - "shadow": { - "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", - "dflt": "none", - "editType": "colorbars", - "valType": "string" - }, - "size": { - "editType": "colorbars", - "min": 1, - "valType": "number" - }, - "style": { - "description": "Sets whether a font should be styled with a normal or italic face from its family.", - "dflt": "normal", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "normal", - "italic" - ] - }, - "textcase": { - "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", - "dflt": "normal", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "normal", - "word caps", - "upper", - "lower" - ] - }, - "variant": { - "description": "Sets the variant of the font.", - "dflt": "normal", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "normal", - "small-caps", - "all-small-caps", - "all-petite-caps", - "petite-caps", - "unicase" - ] - }, - "weight": { - "description": "Sets the weight (or boldness) of the font.", - "dflt": "normal", - "editType": "colorbars", - "extras": [ - "normal", - "bold" - ], - "max": 1000, - "min": 1, - "valType": "integer" - } - }, - "tickformat": { - "description": "Sets the tick label formatting rule using d3 formatting mini-languages which are very similar to those in Python. For numbers, see: https://github.com/d3/d3-format/tree/v1.4.5#d3-format. And for dates see: https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format. We add two items to d3's date formatter: *%h* for half of the year as a decimal number as well as *%{n}f* for fractional seconds with n digits. For example, *2016-10-13 09:15:23.456* with tickformat *%H~%M~%S.%2f* would display *09~15~23.46*", - "dflt": "", - "editType": "colorbars", - "valType": "string" - }, - "tickformatstops": { - "items": { - "tickformatstop": { - "dtickrange": { - "description": "range [*min*, *max*], where *min*, *max* - dtick values which describe some zoom level, it is possible to omit *min* or *max* value by passing *null*", - "editType": "colorbars", - "items": [ - { - "editType": "colorbars", - "valType": "any" - }, - { - "editType": "colorbars", - "valType": "any" - } - ], - "valType": "info_array" - }, - "editType": "colorbars", - "enabled": { - "description": "Determines whether or not this stop is used. If `false`, this stop is ignored even within its `dtickrange`.", - "dflt": true, - "editType": "colorbars", - "valType": "boolean" - }, - "name": { - "description": "When used in a template, named items are created in the output figure in addition to any items the figure already has in this array. You can modify these items in the output figure by making your own item with `templateitemname` matching this `name` alongside your modifications (including `visible: false` or `enabled: false` to hide it). Has no effect outside of a template.", - "editType": "colorbars", - "valType": "string" - }, - "role": "object", - "templateitemname": { - "description": "Used to refer to a named item in this array in the template. Named items from the template will be created even without a matching item in the input figure, but you can modify one by making an item with `templateitemname` matching its `name`, alongside your modifications (including `visible: false` or `enabled: false` to hide it). If there is no template or no matching item, this item will be hidden unless you explicitly show it with `visible: true`.", - "editType": "colorbars", - "valType": "string" - }, - "value": { - "description": "string - dtickformat for described zoom level, the same as *tickformat*", - "dflt": "", - "editType": "colorbars", - "valType": "string" - } - } - }, - "role": "object" - }, - "ticklabeloverflow": { - "description": "Determines how we handle tick labels that would overflow either the graph div or the domain of the axis. The default value for inside tick labels is *hide past domain*. In other cases the default is *hide past div*.", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "allow", - "hide past div", - "hide past domain" - ] - }, - "ticklabelposition": { - "description": "Determines where tick labels are drawn relative to the ticks. Left and right options are used when `orientation` is *h*, top and bottom when `orientation` is *v*.", - "dflt": "outside", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "outside", - "inside", - "outside top", - "inside top", - "outside left", - "inside left", - "outside right", - "inside right", - "outside bottom", - "inside bottom" - ] - }, - "ticklabelstep": { - "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", - "dflt": 1, - "editType": "colorbars", - "min": 1, - "valType": "integer" - }, - "ticklen": { - "description": "Sets the tick length (in px).", - "dflt": 5, - "editType": "colorbars", - "min": 0, - "valType": "number" - }, - "tickmode": { - "description": "Sets the tick mode for this axis. If *auto*, the number of ticks is set via `nticks`. If *linear*, the placement of the ticks is determined by a starting position `tick0` and a tick step `dtick` (*linear* is the default value if `tick0` and `dtick` are provided). If *array*, the placement of the ticks is set via `tickvals` and the tick text is `ticktext`. (*array* is the default value if `tickvals` is provided).", - "editType": "colorbars", - "impliedEdits": {}, - "valType": "enumerated", - "values": [ - "auto", - "linear", - "array" - ] - }, - "tickprefix": { - "description": "Sets a tick label prefix.", - "dflt": "", - "editType": "colorbars", - "valType": "string" - }, - "ticks": { - "description": "Determines whether ticks are drawn or not. If **, this axis' ticks are not drawn. If *outside* (*inside*), this axis' are drawn outside (inside) the axis lines.", - "dflt": "", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "outside", - "inside", - "" - ] - }, - "ticksuffix": { - "description": "Sets a tick label suffix.", - "dflt": "", - "editType": "colorbars", - "valType": "string" - }, - "ticktext": { - "description": "Sets the text displayed at the ticks position via `tickvals`. Only has an effect if `tickmode` is set to *array*. Used with `tickvals`.", - "editType": "colorbars", - "valType": "data_array" - }, - "ticktextsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `ticktext`.", - "editType": "none", - "valType": "string" - }, - "tickvals": { - "description": "Sets the values at which ticks on this axis appear. Only has an effect if `tickmode` is set to *array*. Used with `ticktext`.", - "editType": "colorbars", - "valType": "data_array" - }, - "tickvalssrc": { - "description": "Sets the source reference on Chart Studio Cloud for `tickvals`.", - "editType": "none", - "valType": "string" - }, - "tickwidth": { - "description": "Sets the tick width (in px).", - "dflt": 1, - "editType": "colorbars", - "min": 0, - "valType": "number" - }, - "title": { - "editType": "colorbars", - "font": { - "color": { - "editType": "colorbars", - "valType": "color" - }, - "description": "Sets this color bar's title font.", - "editType": "colorbars", - "family": { - "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", - "editType": "colorbars", - "noBlank": true, - "strict": true, - "valType": "string" - }, - "lineposition": { - "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", - "dflt": "none", - "editType": "colorbars", - "extras": [ - "none" - ], - "flags": [ - "under", - "over", - "through" - ], - "valType": "flaglist" - }, - "role": "object", - "shadow": { - "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", - "dflt": "none", - "editType": "colorbars", - "valType": "string" - }, - "size": { - "editType": "colorbars", - "min": 1, - "valType": "number" - }, - "style": { - "description": "Sets whether a font should be styled with a normal or italic face from its family.", - "dflt": "normal", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "normal", - "italic" - ] - }, - "textcase": { - "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", - "dflt": "normal", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "normal", - "word caps", - "upper", - "lower" - ] - }, - "variant": { - "description": "Sets the variant of the font.", - "dflt": "normal", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "normal", - "small-caps", - "all-small-caps", - "all-petite-caps", - "petite-caps", - "unicase" - ] - }, - "weight": { - "description": "Sets the weight (or boldness) of the font.", - "dflt": "normal", - "editType": "colorbars", - "extras": [ - "normal", - "bold" - ], - "max": 1000, - "min": 1, - "valType": "integer" - } - }, - "role": "object", - "side": { - "description": "Determines the location of color bar's title with respect to the color bar. Defaults to *top* when `orientation` if *v* and defaults to *right* when `orientation` if *h*.", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "right", - "top", - "bottom" - ] - }, - "text": { - "description": "Sets the title of the color bar.", - "editType": "colorbars", - "valType": "string" - } - }, - "x": { - "description": "Sets the x position with respect to `xref` of the color bar (in plot fraction). When `xref` is *paper*, defaults to 1.02 when `orientation` is *v* and 0.5 when `orientation` is *h*. When `xref` is *container*, defaults to *1* when `orientation` is *v* and 0.5 when `orientation` is *h*. Must be between *0* and *1* if `xref` is *container* and between *-2* and *3* if `xref` is *paper*.", - "editType": "colorbars", - "valType": "number" - }, - "xanchor": { - "description": "Sets this color bar's horizontal position anchor. This anchor binds the `x` position to the *left*, *center* or *right* of the color bar. Defaults to *left* when `orientation` is *v* and *center* when `orientation` is *h*.", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "left", - "center", - "right" - ] - }, - "xpad": { - "description": "Sets the amount of padding (in px) along the x direction.", - "dflt": 10, - "editType": "colorbars", - "min": 0, - "valType": "number" - }, - "xref": { - "description": "Sets the container `x` refers to. *container* spans the entire `width` of the plot. *paper* refers to the width of the plotting area only.", - "dflt": "paper", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "container", - "paper" - ] - }, - "y": { - "description": "Sets the y position with respect to `yref` of the color bar (in plot fraction). When `yref` is *paper*, defaults to 0.5 when `orientation` is *v* and 1.02 when `orientation` is *h*. When `yref` is *container*, defaults to 0.5 when `orientation` is *v* and 1 when `orientation` is *h*. Must be between *0* and *1* if `yref` is *container* and between *-2* and *3* if `yref` is *paper*.", - "editType": "colorbars", - "valType": "number" - }, - "yanchor": { - "description": "Sets this color bar's vertical position anchor This anchor binds the `y` position to the *top*, *middle* or *bottom* of the color bar. Defaults to *middle* when `orientation` is *v* and *bottom* when `orientation` is *h*.", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "top", - "middle", - "bottom" - ] - }, - "ypad": { - "description": "Sets the amount of padding (in px) along the y direction.", - "dflt": 10, - "editType": "colorbars", - "min": 0, - "valType": "number" - }, - "yref": { - "description": "Sets the container `y` refers to. *container* spans the entire `height` of the plot. *paper* refers to the height of the plotting area only.", - "dflt": "paper", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "container", - "paper" - ] - } - }, - "colorscale": { - "description": "Sets the colorscale. Has an effect only if in `marker.color` is set to a numerical array. The colorscale must be an array containing arrays mapping a normalized value to an rgb, rgba, hex, hsl, hsv, or named color string. At minimum, a mapping for the lowest (0) and highest (1) values are required. For example, `[[0, 'rgb(0,0,255)'], [1, 'rgb(255,0,0)']]`. To control the bounds of the colorscale in color space, use `marker.cmin` and `marker.cmax`. Alternatively, `colorscale` may be a palette name string of the following list: Blackbody,Bluered,Blues,Cividis,Earth,Electric,Greens,Greys,Hot,Jet,Picnic,Portland,Rainbow,RdBu,Reds,Viridis,YlGnBu,YlOrRd.", - "dflt": null, - "editType": "calc", - "impliedEdits": { - "autocolorscale": false - }, - "valType": "colorscale" - }, - "colorsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `color`.", - "editType": "none", - "valType": "string" - }, - "editType": "calc", - "gradient": { - "color": { - "arrayOk": true, - "description": "Sets the final color of the gradient fill: the center color for radial, the right for horizontal, or the bottom for vertical.", - "editType": "calc", - "valType": "color" - }, - "colorsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `color`.", - "editType": "none", - "valType": "string" - }, - "editType": "calc", - "role": "object", - "type": { - "arrayOk": true, - "description": "Sets the type of gradient used to fill the markers", - "dflt": "none", - "editType": "calc", - "valType": "enumerated", - "values": [ - "radial", - "horizontal", - "vertical", - "none" - ] - }, - "typesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `type`.", - "editType": "none", - "valType": "string" - } - }, - "line": { - "autocolorscale": { - "description": "Determines whether the colorscale is a default palette (`autocolorscale: true`) or the palette determined by `marker.line.colorscale`. Has an effect only if in `marker.line.color` is set to a numerical array. In case `colorscale` is unspecified or `autocolorscale` is true, the default palette will be chosen according to whether numbers in the `color` array are all positive, all negative or mixed.", - "dflt": true, - "editType": "calc", - "impliedEdits": {}, - "valType": "boolean" - }, - "cauto": { - "description": "Determines whether or not the color domain is computed with respect to the input data (here in `marker.line.color`) or the bounds set in `marker.line.cmin` and `marker.line.cmax` Has an effect only if in `marker.line.color` is set to a numerical array. Defaults to `false` when `marker.line.cmin` and `marker.line.cmax` are set by the user.", - "dflt": true, - "editType": "calc", - "impliedEdits": {}, - "valType": "boolean" - }, - "cmax": { - "description": "Sets the upper bound of the color domain. Has an effect only if in `marker.line.color` is set to a numerical array. Value should have the same units as in `marker.line.color` and if set, `marker.line.cmin` must be set as well.", - "dflt": null, - "editType": "plot", - "impliedEdits": { - "cauto": false - }, - "valType": "number" - }, - "cmid": { - "description": "Sets the mid-point of the color domain by scaling `marker.line.cmin` and/or `marker.line.cmax` to be equidistant to this point. Has an effect only if in `marker.line.color` is set to a numerical array. Value should have the same units as in `marker.line.color`. Has no effect when `marker.line.cauto` is `false`.", - "dflt": null, - "editType": "calc", - "impliedEdits": {}, - "valType": "number" - }, - "cmin": { - "description": "Sets the lower bound of the color domain. Has an effect only if in `marker.line.color` is set to a numerical array. Value should have the same units as in `marker.line.color` and if set, `marker.line.cmax` must be set as well.", - "dflt": null, - "editType": "plot", - "impliedEdits": { - "cauto": false - }, - "valType": "number" - }, - "color": { - "arrayOk": true, - "description": "Sets the marker.line color. It accepts either a specific color or an array of numbers that are mapped to the colorscale relative to the max and min values of the array or relative to `marker.line.cmin` and `marker.line.cmax` if set.", - "editType": "style", - "valType": "color" - }, - "coloraxis": { - "description": "Sets a reference to a shared color axis. References to these shared color axes are *coloraxis*, *coloraxis2*, *coloraxis3*, etc. Settings for these shared color axes are set in the layout, under `layout.coloraxis`, `layout.coloraxis2`, etc. Note that multiple color scales can be linked to the same color axis.", - "dflt": null, - "editType": "calc", - "regex": "/^coloraxis([2-9]|[1-9][0-9]+)?$/", - "valType": "subplotid" - }, - "colorscale": { - "description": "Sets the colorscale. Has an effect only if in `marker.line.color` is set to a numerical array. The colorscale must be an array containing arrays mapping a normalized value to an rgb, rgba, hex, hsl, hsv, or named color string. At minimum, a mapping for the lowest (0) and highest (1) values are required. For example, `[[0, 'rgb(0,0,255)'], [1, 'rgb(255,0,0)']]`. To control the bounds of the colorscale in color space, use `marker.line.cmin` and `marker.line.cmax`. Alternatively, `colorscale` may be a palette name string of the following list: Blackbody,Bluered,Blues,Cividis,Earth,Electric,Greens,Greys,Hot,Jet,Picnic,Portland,Rainbow,RdBu,Reds,Viridis,YlGnBu,YlOrRd.", - "dflt": null, - "editType": "calc", - "impliedEdits": { - "autocolorscale": false - }, - "valType": "colorscale" - }, - "colorsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `color`.", - "editType": "none", - "valType": "string" - }, - "editType": "calc", - "reversescale": { - "description": "Reverses the color mapping if true. Has an effect only if in `marker.line.color` is set to a numerical array. If true, `marker.line.cmin` will correspond to the last color in the array and `marker.line.cmax` will correspond to the first color.", - "dflt": false, - "editType": "plot", - "valType": "boolean" - }, - "role": "object", - "width": { - "arrayOk": true, - "description": "Sets the width (in px) of the lines bounding the marker points.", - "editType": "style", - "min": 0, - "valType": "number" - }, - "widthsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `width`.", - "editType": "none", - "valType": "string" - } - }, - "maxdisplayed": { - "description": "Sets a maximum number of points to be drawn on the graph. *0* corresponds to no limit.", - "dflt": 0, - "editType": "plot", - "min": 0, - "valType": "number" - }, - "opacity": { - "arrayOk": true, - "description": "Sets the marker opacity.", - "editType": "style", - "max": 1, - "min": 0, - "valType": "number" - }, - "opacitysrc": { - "description": "Sets the source reference on Chart Studio Cloud for `opacity`.", - "editType": "none", - "valType": "string" - }, - "reversescale": { - "description": "Reverses the color mapping if true. Has an effect only if in `marker.color` is set to a numerical array. If true, `marker.cmin` will correspond to the last color in the array and `marker.cmax` will correspond to the first color.", - "dflt": false, - "editType": "plot", - "valType": "boolean" - }, - "role": "object", - "showscale": { - "description": "Determines whether or not a colorbar is displayed for this trace. Has an effect only if in `marker.color` is set to a numerical array.", - "dflt": false, - "editType": "calc", - "valType": "boolean" - }, - "size": { - "arrayOk": true, - "description": "Sets the marker size (in px).", - "dflt": 6, - "editType": "calc", - "min": 0, - "valType": "number" - }, - "sizemin": { - "description": "Has an effect only if `marker.size` is set to a numerical array. Sets the minimum size (in px) of the rendered marker points.", - "dflt": 0, - "editType": "calc", - "min": 0, - "valType": "number" - }, - "sizemode": { - "description": "Has an effect only if `marker.size` is set to a numerical array. Sets the rule for which the data in `size` is converted to pixels.", - "dflt": "diameter", - "editType": "calc", - "valType": "enumerated", - "values": [ - "diameter", - "area" - ] - }, - "sizeref": { - "description": "Has an effect only if `marker.size` is set to a numerical array. Sets the scale factor used to determine the rendered size of marker points. Use with `sizemin` and `sizemode`.", - "dflt": 1, - "editType": "calc", - "valType": "number" - }, - "sizesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `size`.", - "editType": "none", - "valType": "string" - }, - "standoff": { - "arrayOk": true, - "description": "Moves the marker away from the data point in the direction of `angle` (in px). This can be useful for example if you have another marker at this location and you want to point an arrowhead marker at it.", - "dflt": 0, - "editType": "plot", - "min": 0, - "valType": "number" - }, - "standoffsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `standoff`.", - "editType": "none", - "valType": "string" - }, - "symbol": { - "arrayOk": true, - "description": "Sets the marker symbol type. Adding 100 is equivalent to appending *-open* to a symbol name. Adding 200 is equivalent to appending *-dot* to a symbol name. Adding 300 is equivalent to appending *-open-dot* or *dot-open* to a symbol name.", - "dflt": "circle", - "editType": "style", - "valType": "enumerated", - "values": [ - 0, - "0", - "circle", - 100, - "100", - "circle-open", - 200, - "200", - "circle-dot", - 300, - "300", - "circle-open-dot", - 1, - "1", - "square", - 101, - "101", - "square-open", - 201, - "201", - "square-dot", - 301, - "301", - "square-open-dot", - 2, - "2", - "diamond", - 102, - "102", - "diamond-open", - 202, - "202", - "diamond-dot", - 302, - "302", - "diamond-open-dot", - 3, - "3", - "cross", - 103, - "103", - "cross-open", - 203, - "203", - "cross-dot", - 303, - "303", - "cross-open-dot", - 4, - "4", - "x", - 104, - "104", - "x-open", - 204, - "204", - "x-dot", - 304, - "304", - "x-open-dot", - 5, - "5", - "triangle-up", - 105, - "105", - "triangle-up-open", - 205, - "205", - "triangle-up-dot", - 305, - "305", - "triangle-up-open-dot", - 6, - "6", - "triangle-down", - 106, - "106", - "triangle-down-open", - 206, - "206", - "triangle-down-dot", - 306, - "306", - "triangle-down-open-dot", - 7, - "7", - "triangle-left", - 107, - "107", - "triangle-left-open", - 207, - "207", - "triangle-left-dot", - 307, - "307", - "triangle-left-open-dot", - 8, - "8", - "triangle-right", - 108, - "108", - "triangle-right-open", - 208, - "208", - "triangle-right-dot", - 308, - "308", - "triangle-right-open-dot", - 9, - "9", - "triangle-ne", - 109, - "109", - "triangle-ne-open", - 209, - "209", - "triangle-ne-dot", - 309, - "309", - "triangle-ne-open-dot", - 10, - "10", - "triangle-se", - 110, - "110", - "triangle-se-open", - 210, - "210", - "triangle-se-dot", - 310, - "310", - "triangle-se-open-dot", - 11, - "11", - "triangle-sw", - 111, - "111", - "triangle-sw-open", - 211, - "211", - "triangle-sw-dot", - 311, - "311", - "triangle-sw-open-dot", - 12, - "12", - "triangle-nw", - 112, - "112", - "triangle-nw-open", - 212, - "212", - "triangle-nw-dot", - 312, - "312", - "triangle-nw-open-dot", - 13, - "13", - "pentagon", - 113, - "113", - "pentagon-open", - 213, - "213", - "pentagon-dot", - 313, - "313", - "pentagon-open-dot", - 14, - "14", - "hexagon", - 114, - "114", - "hexagon-open", - 214, - "214", - "hexagon-dot", - 314, - "314", - "hexagon-open-dot", - 15, - "15", - "hexagon2", - 115, - "115", - "hexagon2-open", - 215, - "215", - "hexagon2-dot", - 315, - "315", - "hexagon2-open-dot", - 16, - "16", - "octagon", - 116, - "116", - "octagon-open", - 216, - "216", - "octagon-dot", - 316, - "316", - "octagon-open-dot", - 17, - "17", - "star", - 117, - "117", - "star-open", - 217, - "217", - "star-dot", - 317, - "317", - "star-open-dot", - 18, - "18", - "hexagram", - 118, - "118", - "hexagram-open", - 218, - "218", - "hexagram-dot", - 318, - "318", - "hexagram-open-dot", - 19, - "19", - "star-triangle-up", - 119, - "119", - "star-triangle-up-open", - 219, - "219", - "star-triangle-up-dot", - 319, - "319", - "star-triangle-up-open-dot", - 20, - "20", - "star-triangle-down", - 120, - "120", - "star-triangle-down-open", - 220, - "220", - "star-triangle-down-dot", - 320, - "320", - "star-triangle-down-open-dot", - 21, - "21", - "star-square", - 121, - "121", - "star-square-open", - 221, - "221", - "star-square-dot", - 321, - "321", - "star-square-open-dot", - 22, - "22", - "star-diamond", - 122, - "122", - "star-diamond-open", - 222, - "222", - "star-diamond-dot", - 322, - "322", - "star-diamond-open-dot", - 23, - "23", - "diamond-tall", - 123, - "123", - "diamond-tall-open", - 223, - "223", - "diamond-tall-dot", - 323, - "323", - "diamond-tall-open-dot", - 24, - "24", - "diamond-wide", - 124, - "124", - "diamond-wide-open", - 224, - "224", - "diamond-wide-dot", - 324, - "324", - "diamond-wide-open-dot", - 25, - "25", - "hourglass", - 125, - "125", - "hourglass-open", - 26, - "26", - "bowtie", - 126, - "126", - "bowtie-open", - 27, - "27", - "circle-cross", - 127, - "127", - "circle-cross-open", - 28, - "28", - "circle-x", - 128, - "128", - "circle-x-open", - 29, - "29", - "square-cross", - 129, - "129", - "square-cross-open", - 30, - "30", - "square-x", - 130, - "130", - "square-x-open", - 31, - "31", - "diamond-cross", - 131, - "131", - "diamond-cross-open", - 32, - "32", - "diamond-x", - 132, - "132", - "diamond-x-open", - 33, - "33", - "cross-thin", - 133, - "133", - "cross-thin-open", - 34, - "34", - "x-thin", - 134, - "134", - "x-thin-open", - 35, - "35", - "asterisk", - 135, - "135", - "asterisk-open", - 36, - "36", - "hash", - 136, - "136", - "hash-open", - 236, - "236", - "hash-dot", - 336, - "336", - "hash-open-dot", - 37, - "37", - "y-up", - 137, - "137", - "y-up-open", - 38, - "38", - "y-down", - 138, - "138", - "y-down-open", - 39, - "39", - "y-left", - 139, - "139", - "y-left-open", - 40, - "40", - "y-right", - 140, - "140", - "y-right-open", - 41, - "41", - "line-ew", - 141, - "141", - "line-ew-open", - 42, - "42", - "line-ns", - 142, - "142", - "line-ns-open", - 43, - "43", - "line-ne", - 143, - "143", - "line-ne-open", - 44, - "44", - "line-nw", - 144, - "144", - "line-nw-open", - 45, - "45", - "arrow-up", - 145, - "145", - "arrow-up-open", - 46, - "46", - "arrow-down", - 146, - "146", - "arrow-down-open", - 47, - "47", - "arrow-left", - 147, - "147", - "arrow-left-open", - 48, - "48", - "arrow-right", - 148, - "148", - "arrow-right-open", - 49, - "49", - "arrow-bar-up", - 149, - "149", - "arrow-bar-up-open", - 50, - "50", - "arrow-bar-down", - 150, - "150", - "arrow-bar-down-open", - 51, - "51", - "arrow-bar-left", - 151, - "151", - "arrow-bar-left-open", - 52, - "52", - "arrow-bar-right", - 152, - "152", - "arrow-bar-right-open", - 53, - "53", - "arrow", - 153, - "153", - "arrow-open", - 54, - "54", - "arrow-wide", - 154, - "154", - "arrow-wide-open" + } + ], + "valType": "info_array" + }, + "role": "object", + "templateitemname": { + "description": "Used to refer to a named item in this array in the template. Named items from the template will be created even without a matching item in the input figure, but you can modify one by making an item with `templateitemname` matching its `name`, alongside your modifications (including `visible: false` or `enabled: false` to hide it). If there is no template or no matching item, this item will be hidden unless you explicitly show it with `visible: true`.", + "editType": "calc", + "valType": "string" + }, + "tickformat": { + "description": "Sets the tick label formatting rule using d3 formatting mini-languages which are very similar to those in Python. For numbers, see: https://github.com/d3/d3-format/tree/v1.4.5#d3-format. And for dates see: https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format. We add two items to d3's date formatter: *%h* for half of the year as a decimal number as well as *%{n}f* for fractional seconds with n digits. For example, *2016-10-13 09:15:23.456* with tickformat *%H~%M~%S.%2f* would display *09~15~23.46*", + "dflt": "", + "editType": "plot", + "valType": "string" + }, + "ticktext": { + "description": "Sets the text displayed at the ticks position via `tickvals`.", + "editType": "plot", + "valType": "data_array" + }, + "ticktextsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `ticktext`.", + "editType": "none", + "valType": "string" + }, + "tickvals": { + "description": "Sets the values at which ticks on this axis appear.", + "editType": "plot", + "valType": "data_array" + }, + "tickvalssrc": { + "description": "Sets the source reference on Chart Studio Cloud for `tickvals`.", + "editType": "none", + "valType": "string" + }, + "values": { + "description": "Dimension values. `values[n]` represents the value of the `n`th point in the dataset, therefore the `values` vector for all dimensions must be the same (longer vectors will be truncated). Each value must be a finite number.", + "editType": "calc", + "valType": "data_array" + }, + "valuessrc": { + "description": "Sets the source reference on Chart Studio Cloud for `values`.", + "editType": "none", + "valType": "string" + }, + "visible": { + "description": "Shows the dimension when set to `true` (the default). Hides the dimension for `false`.", + "dflt": true, + "editType": "plot", + "valType": "boolean" + } + } + }, + "role": "object" + }, + "domain": { + "column": { + "description": "If there is a layout grid, use the domain for this column in the grid for this parcoords trace .", + "dflt": 0, + "editType": "plot", + "min": 0, + "valType": "integer" + }, + "editType": "plot", + "role": "object", + "row": { + "description": "If there is a layout grid, use the domain for this row in the grid for this parcoords trace .", + "dflt": 0, + "editType": "plot", + "min": 0, + "valType": "integer" + }, + "x": { + "description": "Sets the horizontal domain of this parcoords trace (in plot fraction).", + "dflt": [ + 0, + 1 + ], + "editType": "plot", + "items": [ + { + "editType": "plot", + "max": 1, + "min": 0, + "valType": "number" + }, + { + "editType": "plot", + "max": 1, + "min": 0, + "valType": "number" + } + ], + "valType": "info_array" + }, + "y": { + "description": "Sets the vertical domain of this parcoords trace (in plot fraction).", + "dflt": [ + 0, + 1 + ], + "editType": "plot", + "items": [ + { + "editType": "plot", + "max": 1, + "min": 0, + "valType": "number" + }, + { + "editType": "plot", + "max": 1, + "min": 0, + "valType": "number" + } + ], + "valType": "info_array" + } + }, + "ids": { + "description": "Assigns id labels to each datum. These ids for object constancy of data points during animation. Should be an array of strings, not numbers or any other type.", + "editType": "calc", + "valType": "data_array" + }, + "idssrc": { + "description": "Sets the source reference on Chart Studio Cloud for `ids`.", + "editType": "none", + "valType": "string" + }, + "labelangle": { + "description": "Sets the angle of the labels with respect to the horizontal. For example, a `tickangle` of -90 draws the labels vertically. Tilted labels with *labelangle* may be positioned better inside margins when `labelposition` is set to *bottom*.", + "dflt": 0, + "editType": "plot", + "valType": "angle" + }, + "labelfont": { + "color": { + "editType": "plot", + "valType": "color" + }, + "description": "Sets the font for the `dimension` labels.", + "editType": "plot", + "family": { + "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", + "editType": "plot", + "noBlank": true, + "strict": true, + "valType": "string" + }, + "lineposition": { + "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", + "dflt": "none", + "editType": "plot", + "extras": [ + "none" + ], + "flags": [ + "under", + "over", + "through" + ], + "valType": "flaglist" + }, + "role": "object", + "shadow": { + "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", + "dflt": "none", + "editType": "plot", + "valType": "string" + }, + "size": { + "editType": "plot", + "min": 1, + "valType": "number" + }, + "style": { + "description": "Sets whether a font should be styled with a normal or italic face from its family.", + "dflt": "normal", + "editType": "plot", + "valType": "enumerated", + "values": [ + "normal", + "italic" + ] + }, + "textcase": { + "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", + "dflt": "normal", + "editType": "plot", + "valType": "enumerated", + "values": [ + "normal", + "word caps", + "upper", + "lower" + ] + }, + "variant": { + "description": "Sets the variant of the font.", + "dflt": "normal", + "editType": "plot", + "valType": "enumerated", + "values": [ + "normal", + "small-caps", + "all-small-caps", + "all-petite-caps", + "petite-caps", + "unicase" + ] + }, + "weight": { + "description": "Sets the weight (or boldness) of the font.", + "dflt": "normal", + "editType": "plot", + "extras": [ + "normal", + "bold" + ], + "max": 1000, + "min": 1, + "valType": "integer" + } + }, + "labelside": { + "description": "Specifies the location of the `label`. *top* positions labels above, next to the title *bottom* positions labels below the graph Tilted labels with *labelangle* may be positioned better inside margins when `labelposition` is set to *bottom*.", + "dflt": "top", + "editType": "plot", + "valType": "enumerated", + "values": [ + "top", + "bottom" + ] + }, + "legend": { + "description": "Sets the reference to a legend to show this trace in. References to these legends are *legend*, *legend2*, *legend3*, etc. Settings for these legends are set in the layout, under `layout.legend`, `layout.legend2`, etc.", + "dflt": "legend", + "editType": "style", + "valType": "subplotid" + }, + "legendgrouptitle": { + "editType": "style", + "font": { + "color": { + "editType": "style", + "valType": "color" + }, + "description": "Sets this legend group's title font.", + "editType": "style", + "family": { + "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", + "editType": "style", + "noBlank": true, + "strict": true, + "valType": "string" + }, + "lineposition": { + "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", + "dflt": "none", + "editType": "style", + "extras": [ + "none" + ], + "flags": [ + "under", + "over", + "through" + ], + "valType": "flaglist" + }, + "role": "object", + "shadow": { + "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", + "dflt": "none", + "editType": "style", + "valType": "string" + }, + "size": { + "editType": "style", + "min": 1, + "valType": "number" + }, + "style": { + "description": "Sets whether a font should be styled with a normal or italic face from its family.", + "dflt": "normal", + "editType": "style", + "valType": "enumerated", + "values": [ + "normal", + "italic" + ] + }, + "textcase": { + "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", + "dflt": "normal", + "editType": "style", + "valType": "enumerated", + "values": [ + "normal", + "word caps", + "upper", + "lower" + ] + }, + "variant": { + "description": "Sets the variant of the font.", + "dflt": "normal", + "editType": "style", + "valType": "enumerated", + "values": [ + "normal", + "small-caps", + "all-small-caps", + "all-petite-caps", + "petite-caps", + "unicase" + ] + }, + "weight": { + "description": "Sets the weight (or boldness) of the font.", + "dflt": "normal", + "editType": "style", + "extras": [ + "normal", + "bold" + ], + "max": 1000, + "min": 1, + "valType": "integer" + } + }, + "role": "object", + "text": { + "description": "Sets the title of the legend group.", + "dflt": "", + "editType": "style", + "valType": "string" + } + }, + "legendrank": { + "description": "Sets the legend rank for this trace. Items and groups with smaller ranks are presented on top/left side while with *reversed* `legend.traceorder` they are on bottom/right side. The default legendrank is 1000, so that you can use ranks less than 1000 to place certain items before all unranked items, and ranks greater than 1000 to go after all unranked items. When having unranked or equal rank items shapes would be displayed after traces i.e. according to their order in data and layout.", + "dflt": 1000, + "editType": "style", + "valType": "number" + }, + "legendwidth": { + "description": "Sets the width (in px or fraction) of the legend for this trace.", + "editType": "style", + "min": 0, + "valType": "number" + }, + "line": { + "autocolorscale": { + "description": "Determines whether the colorscale is a default palette (`autocolorscale: true`) or the palette determined by `line.colorscale`. Has an effect only if in `line.color` is set to a numerical array. In case `colorscale` is unspecified or `autocolorscale` is true, the default palette will be chosen according to whether numbers in the `color` array are all positive, all negative or mixed.", + "dflt": false, + "editType": "calc", + "impliedEdits": {}, + "valType": "boolean" + }, + "cauto": { + "description": "Determines whether or not the color domain is computed with respect to the input data (here in `line.color`) or the bounds set in `line.cmin` and `line.cmax` Has an effect only if in `line.color` is set to a numerical array. Defaults to `false` when `line.cmin` and `line.cmax` are set by the user.", + "dflt": true, + "editType": "calc", + "impliedEdits": {}, + "valType": "boolean" + }, + "cmax": { + "description": "Sets the upper bound of the color domain. Has an effect only if in `line.color` is set to a numerical array. Value should have the same units as in `line.color` and if set, `line.cmin` must be set as well.", + "dflt": null, + "editType": "calc", + "impliedEdits": { + "cauto": false + }, + "valType": "number" + }, + "cmid": { + "description": "Sets the mid-point of the color domain by scaling `line.cmin` and/or `line.cmax` to be equidistant to this point. Has an effect only if in `line.color` is set to a numerical array. Value should have the same units as in `line.color`. Has no effect when `line.cauto` is `false`.", + "dflt": null, + "editType": "calc", + "impliedEdits": {}, + "valType": "number" + }, + "cmin": { + "description": "Sets the lower bound of the color domain. Has an effect only if in `line.color` is set to a numerical array. Value should have the same units as in `line.color` and if set, `line.cmax` must be set as well.", + "dflt": null, + "editType": "calc", + "impliedEdits": { + "cauto": false + }, + "valType": "number" + }, + "color": { + "arrayOk": true, + "description": "Sets the line color. It accepts either a specific color or an array of numbers that are mapped to the colorscale relative to the max and min values of the array or relative to `line.cmin` and `line.cmax` if set.", + "editType": "calc", + "valType": "color" + }, + "coloraxis": { + "description": "Sets a reference to a shared color axis. References to these shared color axes are *coloraxis*, *coloraxis2*, *coloraxis3*, etc. Settings for these shared color axes are set in the layout, under `layout.coloraxis`, `layout.coloraxis2`, etc. Note that multiple color scales can be linked to the same color axis.", + "dflt": null, + "editType": "calc", + "regex": "/^coloraxis([2-9]|[1-9][0-9]+)?$/", + "valType": "subplotid" + }, + "colorbar": { + "bgcolor": { + "description": "Sets the color of padded area.", + "dflt": "rgba(0,0,0,0)", + "editType": "colorbars", + "valType": "color" + }, + "bordercolor": { + "description": "Sets the axis line color.", + "dflt": "#444", + "editType": "colorbars", + "valType": "color" + }, + "borderwidth": { + "description": "Sets the width (in px) or the border enclosing this color bar.", + "dflt": 0, + "editType": "colorbars", + "min": 0, + "valType": "number" + }, + "dtick": { + "description": "Sets the step in-between ticks on this axis. Use with `tick0`. Must be a positive number, or special strings available to *log* and *date* axes. If the axis `type` is *log*, then ticks are set every 10^(n*dtick) where n is the tick number. For example, to set a tick mark at 1, 10, 100, 1000, ... set dtick to 1. To set tick marks at 1, 100, 10000, ... set dtick to 2. To set tick marks at 1, 5, 25, 125, 625, 3125, ... set dtick to log_10(5), or 0.69897000433. *log* has several special values; *L*, where `f` is a positive number, gives ticks linearly spaced in value (but not position). For example `tick0` = 0.1, `dtick` = *L0.5* will put ticks at 0.1, 0.6, 1.1, 1.6 etc. To show powers of 10 plus small digits between, use *D1* (all digits) or *D2* (only 2 and 5). `tick0` is ignored for *D1* and *D2*. If the axis `type` is *date*, then you must convert the time to milliseconds. For example, to set the interval between ticks to one day, set `dtick` to 86400000.0. *date* also has special values *M* gives ticks spaced by a number of months. `n` must be a positive integer. To set ticks on the 15th of every third month, set `tick0` to *2000-01-15* and `dtick` to *M3*. To set ticks every 4 years, set `dtick` to *M48*", + "editType": "colorbars", + "impliedEdits": { + "tickmode": "linear" + }, + "valType": "any" + }, + "editType": "colorbars", + "exponentformat": { + "description": "Determines a formatting rule for the tick exponents. For example, consider the number 1,000,000,000. If *none*, it appears as 1,000,000,000. If *e*, 1e+9. If *E*, 1E+9. If *power*, 1x10^9 (with 9 in a super script). If *SI*, 1G. If *B*, 1B. *SI* uses prefixes from \"femto\" f (10^-15) to \"tera\" T (10^12). *SI extended* covers instead the full SI range from \"quecto\" q (10^-30) to \"quetta\" Q (10^30). If *SI* or *SI extended* is used and the exponent is beyond the above ranges, the formatting rule will automatically be switched to the power notation.", + "dflt": "B", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "none", + "e", + "E", + "power", + "SI", + "B", + "SI extended" + ] + }, + "labelalias": { + "description": "Replacement text for specific tick or hover labels. For example using {US: 'USA', CA: 'Canada'} changes US to USA and CA to Canada. The labels we would have shown must match the keys exactly, after adding any tickprefix or ticksuffix. For negative numbers the minus sign symbol used (U+2212) is wider than the regular ascii dash. That means you need to use −1 instead of -1. labelalias can be used with any axis type, and both keys (if needed) and values (if desired) can include html-like tags or MathJax.", + "dflt": false, + "editType": "colorbars", + "valType": "any" + }, + "len": { + "description": "Sets the length of the color bar This measure excludes the padding of both ends. That is, the color bar length is this length minus the padding on both ends.", + "dflt": 1, + "editType": "colorbars", + "min": 0, + "valType": "number" + }, + "lenmode": { + "description": "Determines whether this color bar's length (i.e. the measure in the color variation direction) is set in units of plot *fraction* or in *pixels. Use `len` to set the value.", + "dflt": "fraction", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "fraction", + "pixels" + ] + }, + "minexponent": { + "description": "Hide SI prefix for 10^n if |n| is below this number. This only has an effect when `tickformat` is *SI* or *B*.", + "dflt": 3, + "editType": "colorbars", + "min": 0, + "valType": "number" + }, + "nticks": { + "description": "Specifies the maximum number of ticks for the particular axis. The actual number of ticks will be chosen automatically to be less than or equal to `nticks`. Has an effect only if `tickmode` is set to *auto*.", + "dflt": 0, + "editType": "colorbars", + "min": 0, + "valType": "integer" + }, + "orientation": { + "description": "Sets the orientation of the colorbar.", + "dflt": "v", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "h", + "v" + ] + }, + "outlinecolor": { + "description": "Sets the axis line color.", + "dflt": "#444", + "editType": "colorbars", + "valType": "color" + }, + "outlinewidth": { + "description": "Sets the width (in px) of the axis line.", + "dflt": 1, + "editType": "colorbars", + "min": 0, + "valType": "number" + }, + "role": "object", + "separatethousands": { + "description": "If \"true\", even 4-digit integers are separated", + "dflt": false, + "editType": "colorbars", + "valType": "boolean" + }, + "showexponent": { + "description": "If *all*, all exponents are shown besides their significands. If *first*, only the exponent of the first tick is shown. If *last*, only the exponent of the last tick is shown. If *none*, no exponents appear.", + "dflt": "all", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "all", + "first", + "last", + "none" + ] + }, + "showticklabels": { + "description": "Determines whether or not the tick labels are drawn.", + "dflt": true, + "editType": "colorbars", + "valType": "boolean" + }, + "showtickprefix": { + "description": "If *all*, all tick labels are displayed with a prefix. If *first*, only the first tick is displayed with a prefix. If *last*, only the last tick is displayed with a suffix. If *none*, tick prefixes are hidden.", + "dflt": "all", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "all", + "first", + "last", + "none" + ] + }, + "showticksuffix": { + "description": "Same as `showtickprefix` but for tick suffixes.", + "dflt": "all", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "all", + "first", + "last", + "none" + ] + }, + "thickness": { + "description": "Sets the thickness of the color bar This measure excludes the size of the padding, ticks and labels.", + "dflt": 30, + "editType": "colorbars", + "min": 0, + "valType": "number" + }, + "thicknessmode": { + "description": "Determines whether this color bar's thickness (i.e. the measure in the constant color direction) is set in units of plot *fraction* or in *pixels*. Use `thickness` to set the value.", + "dflt": "pixels", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "fraction", + "pixels" + ] + }, + "tick0": { + "description": "Sets the placement of the first tick on this axis. Use with `dtick`. If the axis `type` is *log*, then you must take the log of your starting tick (e.g. to set the starting tick to 100, set the `tick0` to 2) except when `dtick`=*L* (see `dtick` for more info). If the axis `type` is *date*, it should be a date string, like date data. If the axis `type` is *category*, it should be a number, using the scale where each category is assigned a serial number from zero in the order it appears.", + "editType": "colorbars", + "impliedEdits": { + "tickmode": "linear" + }, + "valType": "any" + }, + "tickangle": { + "description": "Sets the angle of the tick labels with respect to the horizontal. For example, a `tickangle` of -90 draws the tick labels vertically.", + "dflt": "auto", + "editType": "colorbars", + "valType": "angle" + }, + "tickcolor": { + "description": "Sets the tick color.", + "dflt": "#444", + "editType": "colorbars", + "valType": "color" + }, + "tickfont": { + "color": { + "editType": "colorbars", + "valType": "color" + }, + "description": "Sets the color bar's tick label font", + "editType": "colorbars", + "family": { + "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", + "editType": "colorbars", + "noBlank": true, + "strict": true, + "valType": "string" + }, + "lineposition": { + "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", + "dflt": "none", + "editType": "colorbars", + "extras": [ + "none" + ], + "flags": [ + "under", + "over", + "through" + ], + "valType": "flaglist" + }, + "role": "object", + "shadow": { + "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", + "dflt": "none", + "editType": "colorbars", + "valType": "string" + }, + "size": { + "editType": "colorbars", + "min": 1, + "valType": "number" + }, + "style": { + "description": "Sets whether a font should be styled with a normal or italic face from its family.", + "dflt": "normal", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "normal", + "italic" + ] + }, + "textcase": { + "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", + "dflt": "normal", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "normal", + "word caps", + "upper", + "lower" + ] + }, + "variant": { + "description": "Sets the variant of the font.", + "dflt": "normal", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "normal", + "small-caps", + "all-small-caps", + "all-petite-caps", + "petite-caps", + "unicase" + ] + }, + "weight": { + "description": "Sets the weight (or boldness) of the font.", + "dflt": "normal", + "editType": "colorbars", + "extras": [ + "normal", + "bold" + ], + "max": 1000, + "min": 1, + "valType": "integer" + } + }, + "tickformat": { + "description": "Sets the tick label formatting rule using d3 formatting mini-languages which are very similar to those in Python. For numbers, see: https://github.com/d3/d3-format/tree/v1.4.5#d3-format. And for dates see: https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format. We add two items to d3's date formatter: *%h* for half of the year as a decimal number as well as *%{n}f* for fractional seconds with n digits. For example, *2016-10-13 09:15:23.456* with tickformat *%H~%M~%S.%2f* would display *09~15~23.46*", + "dflt": "", + "editType": "colorbars", + "valType": "string" + }, + "tickformatstops": { + "items": { + "tickformatstop": { + "dtickrange": { + "description": "range [*min*, *max*], where *min*, *max* - dtick values which describe some zoom level, it is possible to omit *min* or *max* value by passing *null*", + "editType": "colorbars", + "items": [ + { + "editType": "colorbars", + "valType": "any" + }, + { + "editType": "colorbars", + "valType": "any" + } + ], + "valType": "info_array" + }, + "editType": "colorbars", + "enabled": { + "description": "Determines whether or not this stop is used. If `false`, this stop is ignored even within its `dtickrange`.", + "dflt": true, + "editType": "colorbars", + "valType": "boolean" + }, + "name": { + "description": "When used in a template, named items are created in the output figure in addition to any items the figure already has in this array. You can modify these items in the output figure by making your own item with `templateitemname` matching this `name` alongside your modifications (including `visible: false` or `enabled: false` to hide it). Has no effect outside of a template.", + "editType": "colorbars", + "valType": "string" + }, + "role": "object", + "templateitemname": { + "description": "Used to refer to a named item in this array in the template. Named items from the template will be created even without a matching item in the input figure, but you can modify one by making an item with `templateitemname` matching its `name`, alongside your modifications (including `visible: false` or `enabled: false` to hide it). If there is no template or no matching item, this item will be hidden unless you explicitly show it with `visible: true`.", + "editType": "colorbars", + "valType": "string" + }, + "value": { + "description": "string - dtickformat for described zoom level, the same as *tickformat*", + "dflt": "", + "editType": "colorbars", + "valType": "string" + } + } + }, + "role": "object" + }, + "ticklabeloverflow": { + "description": "Determines how we handle tick labels that would overflow either the graph div or the domain of the axis. The default value for inside tick labels is *hide past domain*. In other cases the default is *hide past div*.", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "allow", + "hide past div", + "hide past domain" + ] + }, + "ticklabelposition": { + "description": "Determines where tick labels are drawn relative to the ticks. Left and right options are used when `orientation` is *h*, top and bottom when `orientation` is *v*.", + "dflt": "outside", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "outside", + "inside", + "outside top", + "inside top", + "outside left", + "inside left", + "outside right", + "inside right", + "outside bottom", + "inside bottom" + ] + }, + "ticklabelstep": { + "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", + "dflt": 1, + "editType": "colorbars", + "min": 1, + "valType": "integer" + }, + "ticklen": { + "description": "Sets the tick length (in px).", + "dflt": 5, + "editType": "colorbars", + "min": 0, + "valType": "number" + }, + "tickmode": { + "description": "Sets the tick mode for this axis. If *auto*, the number of ticks is set via `nticks`. If *linear*, the placement of the ticks is determined by a starting position `tick0` and a tick step `dtick` (*linear* is the default value if `tick0` and `dtick` are provided). If *array*, the placement of the ticks is set via `tickvals` and the tick text is `ticktext`. (*array* is the default value if `tickvals` is provided).", + "editType": "colorbars", + "impliedEdits": {}, + "valType": "enumerated", + "values": [ + "auto", + "linear", + "array" + ] + }, + "tickprefix": { + "description": "Sets a tick label prefix.", + "dflt": "", + "editType": "colorbars", + "valType": "string" + }, + "ticks": { + "description": "Determines whether ticks are drawn or not. If **, this axis' ticks are not drawn. If *outside* (*inside*), this axis' are drawn outside (inside) the axis lines.", + "dflt": "", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "outside", + "inside", + "" + ] + }, + "ticksuffix": { + "description": "Sets a tick label suffix.", + "dflt": "", + "editType": "colorbars", + "valType": "string" + }, + "ticktext": { + "description": "Sets the text displayed at the ticks position via `tickvals`. Only has an effect if `tickmode` is set to *array*. Used with `tickvals`.", + "editType": "colorbars", + "valType": "data_array" + }, + "ticktextsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `ticktext`.", + "editType": "none", + "valType": "string" + }, + "tickvals": { + "description": "Sets the values at which ticks on this axis appear. Only has an effect if `tickmode` is set to *array*. Used with `ticktext`.", + "editType": "colorbars", + "valType": "data_array" + }, + "tickvalssrc": { + "description": "Sets the source reference on Chart Studio Cloud for `tickvals`.", + "editType": "none", + "valType": "string" + }, + "tickwidth": { + "description": "Sets the tick width (in px).", + "dflt": 1, + "editType": "colorbars", + "min": 0, + "valType": "number" + }, + "title": { + "editType": "colorbars", + "font": { + "color": { + "editType": "colorbars", + "valType": "color" + }, + "description": "Sets this color bar's title font.", + "editType": "colorbars", + "family": { + "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", + "editType": "colorbars", + "noBlank": true, + "strict": true, + "valType": "string" + }, + "lineposition": { + "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", + "dflt": "none", + "editType": "colorbars", + "extras": [ + "none" + ], + "flags": [ + "under", + "over", + "through" + ], + "valType": "flaglist" + }, + "role": "object", + "shadow": { + "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", + "dflt": "none", + "editType": "colorbars", + "valType": "string" + }, + "size": { + "editType": "colorbars", + "min": 1, + "valType": "number" + }, + "style": { + "description": "Sets whether a font should be styled with a normal or italic face from its family.", + "dflt": "normal", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "normal", + "italic" + ] + }, + "textcase": { + "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", + "dflt": "normal", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "normal", + "word caps", + "upper", + "lower" + ] + }, + "variant": { + "description": "Sets the variant of the font.", + "dflt": "normal", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "normal", + "small-caps", + "all-small-caps", + "all-petite-caps", + "petite-caps", + "unicase" + ] + }, + "weight": { + "description": "Sets the weight (or boldness) of the font.", + "dflt": "normal", + "editType": "colorbars", + "extras": [ + "normal", + "bold" + ], + "max": 1000, + "min": 1, + "valType": "integer" + } + }, + "role": "object", + "side": { + "description": "Determines the location of color bar's title with respect to the color bar. Defaults to *top* when `orientation` if *v* and defaults to *right* when `orientation` if *h*.", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "right", + "top", + "bottom" + ] + }, + "text": { + "description": "Sets the title of the color bar.", + "editType": "colorbars", + "valType": "string" + } + }, + "x": { + "description": "Sets the x position with respect to `xref` of the color bar (in plot fraction). When `xref` is *paper*, defaults to 1.02 when `orientation` is *v* and 0.5 when `orientation` is *h*. When `xref` is *container*, defaults to *1* when `orientation` is *v* and 0.5 when `orientation` is *h*. Must be between *0* and *1* if `xref` is *container* and between *-2* and *3* if `xref` is *paper*.", + "editType": "colorbars", + "valType": "number" + }, + "xanchor": { + "description": "Sets this color bar's horizontal position anchor. This anchor binds the `x` position to the *left*, *center* or *right* of the color bar. Defaults to *left* when `orientation` is *v* and *center* when `orientation` is *h*.", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "left", + "center", + "right" + ] + }, + "xpad": { + "description": "Sets the amount of padding (in px) along the x direction.", + "dflt": 10, + "editType": "colorbars", + "min": 0, + "valType": "number" + }, + "xref": { + "description": "Sets the container `x` refers to. *container* spans the entire `width` of the plot. *paper* refers to the width of the plotting area only.", + "dflt": "paper", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "container", + "paper" + ] + }, + "y": { + "description": "Sets the y position with respect to `yref` of the color bar (in plot fraction). When `yref` is *paper*, defaults to 0.5 when `orientation` is *v* and 1.02 when `orientation` is *h*. When `yref` is *container*, defaults to 0.5 when `orientation` is *v* and 1 when `orientation` is *h*. Must be between *0* and *1* if `yref` is *container* and between *-2* and *3* if `yref` is *paper*.", + "editType": "colorbars", + "valType": "number" + }, + "yanchor": { + "description": "Sets this color bar's vertical position anchor This anchor binds the `y` position to the *top*, *middle* or *bottom* of the color bar. Defaults to *middle* when `orientation` is *v* and *bottom* when `orientation` is *h*.", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "top", + "middle", + "bottom" + ] + }, + "ypad": { + "description": "Sets the amount of padding (in px) along the y direction.", + "dflt": 10, + "editType": "colorbars", + "min": 0, + "valType": "number" + }, + "yref": { + "description": "Sets the container `y` refers to. *container* spans the entire `height` of the plot. *paper* refers to the height of the plotting area only.", + "dflt": "paper", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "container", + "paper" + ] + } + }, + "colorscale": { + "description": "Sets the colorscale. Has an effect only if in `line.color` is set to a numerical array. The colorscale must be an array containing arrays mapping a normalized value to an rgb, rgba, hex, hsl, hsv, or named color string. At minimum, a mapping for the lowest (0) and highest (1) values are required. For example, `[[0, 'rgb(0,0,255)'], [1, 'rgb(255,0,0)']]`. To control the bounds of the colorscale in color space, use `line.cmin` and `line.cmax`. Alternatively, `colorscale` may be a palette name string of the following list: Blackbody,Bluered,Blues,Cividis,Earth,Electric,Greens,Greys,Hot,Jet,Picnic,Portland,Rainbow,RdBu,Reds,Viridis,YlGnBu,YlOrRd.", + "dflt": [ + [ + 0, + "#440154" + ], + [ + 0.06274509803921569, + "#48186a" + ], + [ + 0.12549019607843137, + "#472d7b" + ], + [ + 0.18823529411764706, + "#424086" + ], + [ + 0.25098039215686274, + "#3b528b" + ], + [ + 0.3137254901960784, + "#33638d" + ], + [ + 0.3764705882352941, + "#2c728e" + ], + [ + 0.4392156862745098, + "#26828e" + ], + [ + 0.5019607843137255, + "#21918c" + ], + [ + 0.5647058823529412, + "#1fa088" + ], + [ + 0.6274509803921569, + "#28ae80" + ], + [ + 0.6901960784313725, + "#3fbc73" + ], + [ + 0.7529411764705882, + "#5ec962" + ], + [ + 0.8156862745098039, + "#84d44b" + ], + [ + 0.8784313725490196, + "#addc30" + ], + [ + 0.9411764705882353, + "#d8e219" + ], + [ + 1, + "#fde725" + ] + ], + "editType": "calc", + "impliedEdits": { + "autocolorscale": false + }, + "valType": "colorscale" + }, + "colorsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `color`.", + "editType": "none", + "valType": "string" + }, + "editType": "calc", + "reversescale": { + "description": "Reverses the color mapping if true. Has an effect only if in `line.color` is set to a numerical array. If true, `line.cmin` will correspond to the last color in the array and `line.cmax` will correspond to the first color.", + "dflt": false, + "editType": "plot", + "valType": "boolean" + }, + "role": "object", + "showscale": { + "description": "Determines whether or not a colorbar is displayed for this trace. Has an effect only if in `line.color` is set to a numerical array.", + "dflt": false, + "editType": "calc", + "valType": "boolean" + } + }, + "meta": { + "arrayOk": true, + "description": "Assigns extra meta information associated with this trace that can be used in various text attributes. Attributes such as trace `name`, graph, axis and colorbar `title.text`, annotation `text` `rangeselector`, `updatemenues` and `sliders` `label` text all support `meta`. To access the trace `meta` values in an attribute in the same trace, simply use `%{meta[i]}` where `i` is the index or key of the `meta` item in question. To access trace `meta` in layout attributes, use `%{data[n[.meta[i]}` where `i` is the index or key of the `meta` and `n` is the trace index.", + "editType": "plot", + "valType": "any" + }, + "metasrc": { + "description": "Sets the source reference on Chart Studio Cloud for `meta`.", + "editType": "none", + "valType": "string" + }, + "name": { + "description": "Sets the trace name. The trace name appears as the legend item and on hover.", + "editType": "style", + "valType": "string" + }, + "rangefont": { + "color": { + "editType": "plot", + "valType": "color" + }, + "description": "Sets the font for the `dimension` range values.", + "editType": "plot", + "family": { + "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", + "editType": "plot", + "noBlank": true, + "strict": true, + "valType": "string" + }, + "lineposition": { + "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", + "dflt": "none", + "editType": "plot", + "extras": [ + "none" + ], + "flags": [ + "under", + "over", + "through" + ], + "valType": "flaglist" + }, + "role": "object", + "shadow": { + "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", + "dflt": "none", + "editType": "plot", + "valType": "string" + }, + "size": { + "editType": "plot", + "min": 1, + "valType": "number" + }, + "style": { + "description": "Sets whether a font should be styled with a normal or italic face from its family.", + "dflt": "normal", + "editType": "plot", + "valType": "enumerated", + "values": [ + "normal", + "italic" + ] + }, + "textcase": { + "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", + "dflt": "normal", + "editType": "plot", + "valType": "enumerated", + "values": [ + "normal", + "word caps", + "upper", + "lower" + ] + }, + "variant": { + "description": "Sets the variant of the font.", + "dflt": "normal", + "editType": "plot", + "valType": "enumerated", + "values": [ + "normal", + "small-caps", + "all-small-caps", + "all-petite-caps", + "petite-caps", + "unicase" + ] + }, + "weight": { + "description": "Sets the weight (or boldness) of the font.", + "dflt": "normal", + "editType": "plot", + "extras": [ + "normal", + "bold" + ], + "max": 1000, + "min": 1, + "valType": "integer" + } + }, + "stream": { + "editType": "calc", + "maxpoints": { + "description": "Sets the maximum number of points to keep on the plots from an incoming stream. If `maxpoints` is set to *50*, only the newest 50 points will be displayed on the plot.", + "dflt": 500, + "editType": "calc", + "max": 10000, + "min": 0, + "valType": "number" + }, + "role": "object", + "token": { + "description": "The stream id number links a data trace on a plot with a stream. See https://chart-studio.plotly.com/settings for more details.", + "editType": "calc", + "noBlank": true, + "strict": true, + "valType": "string" + } + }, + "tickfont": { + "color": { + "editType": "plot", + "valType": "color" + }, + "description": "Sets the font for the `dimension` tick values.", + "editType": "plot", + "family": { + "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", + "editType": "plot", + "noBlank": true, + "strict": true, + "valType": "string" + }, + "lineposition": { + "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", + "dflt": "none", + "editType": "plot", + "extras": [ + "none" + ], + "flags": [ + "under", + "over", + "through" + ], + "valType": "flaglist" + }, + "role": "object", + "shadow": { + "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", + "dflt": "auto", + "editType": "plot", + "valType": "string" + }, + "size": { + "editType": "plot", + "min": 1, + "valType": "number" + }, + "style": { + "description": "Sets whether a font should be styled with a normal or italic face from its family.", + "dflt": "normal", + "editType": "plot", + "valType": "enumerated", + "values": [ + "normal", + "italic" + ] + }, + "textcase": { + "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", + "dflt": "normal", + "editType": "plot", + "valType": "enumerated", + "values": [ + "normal", + "word caps", + "upper", + "lower" + ] + }, + "variant": { + "description": "Sets the variant of the font.", + "dflt": "normal", + "editType": "plot", + "valType": "enumerated", + "values": [ + "normal", + "small-caps", + "all-small-caps", + "all-petite-caps", + "petite-caps", + "unicase" + ] + }, + "weight": { + "description": "Sets the weight (or boldness) of the font.", + "dflt": "normal", + "editType": "plot", + "extras": [ + "normal", + "bold" + ], + "max": 1000, + "min": 1, + "valType": "integer" + } + }, + "type": "parcoords", + "uid": { + "description": "Assign an id to this trace, Use this to provide object constancy between traces during animations and transitions.", + "editType": "plot", + "valType": "string" + }, + "uirevision": { + "description": "Controls persistence of some user-driven changes to the trace: `constraintrange` in `parcoords` traces, as well as some `editable: true` modifications such as `name` and `colorbar.title`. Defaults to `layout.uirevision`. Note that other user-driven trace attribute changes are controlled by `layout` attributes: `trace.visible` is controlled by `layout.legend.uirevision`, `selectedpoints` is controlled by `layout.selectionrevision`, and `colorbar.(x|y)` (accessible with `config: {editable: true}`) is controlled by `layout.editrevision`. Trace changes are tracked by `uid`, which only falls back on trace index if no `uid` is provided. So if your app can add/remove traces before the end of the `data` array, such that the same trace has a different index, you can still preserve user-driven changes if you give each trace a `uid` that stays with it as it moves.", + "editType": "none", + "valType": "any" + }, + "unselected": { + "editType": "plot", + "line": { + "color": { + "description": "Sets the base color of unselected lines. in connection with `unselected.line.opacity`.", + "dflt": "#7f7f7f", + "editType": "plot", + "valType": "color" + }, + "editType": "plot", + "opacity": { + "description": "Sets the opacity of unselected lines. The default *auto* decreases the opacity smoothly as the number of lines increases. Use *1* to achieve exact `unselected.line.color`.", + "dflt": "auto", + "editType": "plot", + "max": 1, + "min": 0, + "valType": "number" + }, + "role": "object" + }, + "role": "object" + }, + "visible": { + "description": "Determines whether or not this trace is visible. If *legendonly*, the trace is not drawn, but can appear as a legend item (provided that the legend itself is visible).", + "dflt": true, + "editType": "calc", + "valType": "enumerated", + "values": [ + true, + false, + "legendonly" + ] + } + }, + "categories": [ + "gl", + "regl", + "noOpacity", + "noHover" + ], + "meta": { + "description": "Parallel coordinates for multidimensional exploratory data analysis. The samples are specified in `dimensions`. The colors are set in `line.color`." + }, + "type": "parcoords" + }, + "pie": { + "animatable": false, + "attributes": { + "automargin": { + "description": "Determines whether outside text labels can push the margins.", + "dflt": false, + "editType": "plot", + "valType": "boolean" + }, + "customdata": { + "description": "Assigns extra data each datum. This may be useful when listening to hover, click and selection events. Note that, *scatter* traces also appends customdata items in the markers DOM elements", + "editType": "calc", + "valType": "data_array" + }, + "customdatasrc": { + "description": "Sets the source reference on Chart Studio Cloud for `customdata`.", + "editType": "none", + "valType": "string" + }, + "direction": { + "description": "Specifies the direction at which succeeding sectors follow one another.", + "dflt": "counterclockwise", + "editType": "calc", + "valType": "enumerated", + "values": [ + "clockwise", + "counterclockwise" + ] + }, + "dlabel": { + "description": "Sets the label step. See `label0` for more info.", + "dflt": 1, + "editType": "calc", + "valType": "number" + }, + "domain": { + "column": { + "description": "If there is a layout grid, use the domain for this column in the grid for this pie trace .", + "dflt": 0, + "editType": "calc", + "min": 0, + "valType": "integer" + }, + "editType": "calc", + "role": "object", + "row": { + "description": "If there is a layout grid, use the domain for this row in the grid for this pie trace .", + "dflt": 0, + "editType": "calc", + "min": 0, + "valType": "integer" + }, + "x": { + "description": "Sets the horizontal domain of this pie trace (in plot fraction).", + "dflt": [ + 0, + 1 + ], + "editType": "calc", + "items": [ + { + "editType": "calc", + "max": 1, + "min": 0, + "valType": "number" + }, + { + "editType": "calc", + "max": 1, + "min": 0, + "valType": "number" + } + ], + "valType": "info_array" + }, + "y": { + "description": "Sets the vertical domain of this pie trace (in plot fraction).", + "dflt": [ + 0, + 1 + ], + "editType": "calc", + "items": [ + { + "editType": "calc", + "max": 1, + "min": 0, + "valType": "number" + }, + { + "editType": "calc", + "max": 1, + "min": 0, + "valType": "number" + } + ], + "valType": "info_array" + } + }, + "hole": { + "description": "Sets the fraction of the radius to cut out of the pie. Use this to make a donut chart.", + "dflt": 0, + "editType": "calc", + "max": 1, + "min": 0, + "valType": "number" + }, + "hoverinfo": { + "arrayOk": true, + "description": "Determines which trace information appear on hover. If `none` or `skip` are set, no information is displayed upon hovering. But, if `none` is set, click and hover events are still fired.", + "dflt": "all", + "editType": "none", + "extras": [ + "all", + "none", + "skip" + ], + "flags": [ + "label", + "text", + "value", + "percent", + "name" + ], + "valType": "flaglist" + }, + "hoverinfosrc": { + "description": "Sets the source reference on Chart Studio Cloud for `hoverinfo`.", + "editType": "none", + "valType": "string" + }, + "hoverlabel": { + "align": { + "arrayOk": true, + "description": "Sets the horizontal alignment of the text content within hover label box. Has an effect only if the hover label text spans more two or more lines", + "dflt": "auto", + "editType": "none", + "valType": "enumerated", + "values": [ + "left", + "right", + "auto" + ] + }, + "alignsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `align`.", + "editType": "none", + "valType": "string" + }, + "bgcolor": { + "arrayOk": true, + "description": "Sets the background color of the hover labels for this trace", + "editType": "none", + "valType": "color" + }, + "bgcolorsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `bgcolor`.", + "editType": "none", + "valType": "string" + }, + "bordercolor": { + "arrayOk": true, + "description": "Sets the border color of the hover labels for this trace.", + "editType": "none", + "valType": "color" + }, + "bordercolorsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `bordercolor`.", + "editType": "none", + "valType": "string" + }, + "editType": "none", + "font": { + "color": { + "arrayOk": true, + "editType": "none", + "valType": "color" + }, + "colorsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `color`.", + "editType": "none", + "valType": "string" + }, + "description": "Sets the font used in hover labels.", + "editType": "none", + "family": { + "arrayOk": true, + "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", + "editType": "none", + "noBlank": true, + "strict": true, + "valType": "string" + }, + "familysrc": { + "description": "Sets the source reference on Chart Studio Cloud for `family`.", + "editType": "none", + "valType": "string" + }, + "lineposition": { + "arrayOk": true, + "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", + "dflt": "none", + "editType": "none", + "extras": [ + "none" + ], + "flags": [ + "under", + "over", + "through" + ], + "valType": "flaglist" + }, + "linepositionsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `lineposition`.", + "editType": "none", + "valType": "string" + }, + "role": "object", + "shadow": { + "arrayOk": true, + "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", + "dflt": "none", + "editType": "none", + "valType": "string" + }, + "shadowsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `shadow`.", + "editType": "none", + "valType": "string" + }, + "size": { + "arrayOk": true, + "editType": "none", + "min": 1, + "valType": "number" + }, + "sizesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `size`.", + "editType": "none", + "valType": "string" + }, + "style": { + "arrayOk": true, + "description": "Sets whether a font should be styled with a normal or italic face from its family.", + "dflt": "normal", + "editType": "none", + "valType": "enumerated", + "values": [ + "normal", + "italic" + ] + }, + "stylesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `style`.", + "editType": "none", + "valType": "string" + }, + "textcase": { + "arrayOk": true, + "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", + "dflt": "normal", + "editType": "none", + "valType": "enumerated", + "values": [ + "normal", + "word caps", + "upper", + "lower" + ] + }, + "textcasesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `textcase`.", + "editType": "none", + "valType": "string" + }, + "variant": { + "arrayOk": true, + "description": "Sets the variant of the font.", + "dflt": "normal", + "editType": "none", + "valType": "enumerated", + "values": [ + "normal", + "small-caps", + "all-small-caps", + "all-petite-caps", + "petite-caps", + "unicase" + ] + }, + "variantsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `variant`.", + "editType": "none", + "valType": "string" + }, + "weight": { + "arrayOk": true, + "description": "Sets the weight (or boldness) of the font.", + "dflt": "normal", + "editType": "none", + "extras": [ + "normal", + "bold" + ], + "max": 1000, + "min": 1, + "valType": "integer" + }, + "weightsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `weight`.", + "editType": "none", + "valType": "string" + } + }, + "namelength": { + "arrayOk": true, + "description": "Sets the default length (in number of characters) of the trace name in the hover labels for all traces. -1 shows the whole name regardless of length. 0-3 shows the first 0-3 characters, and an integer >3 will show the whole name if it is less than that many characters, but if it is longer, will truncate to `namelength - 3` characters and add an ellipsis.", + "dflt": 15, + "editType": "none", + "min": -1, + "valType": "integer" + }, + "namelengthsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `namelength`.", + "editType": "none", + "valType": "string" + }, + "role": "object", + "showarrow": { + "description": "Sets whether or not to show the hover label arrow/triangle pointing to the data point.", + "dflt": true, + "editType": "none", + "valType": "boolean" + } + }, + "hovertemplate": { + "arrayOk": true, + "description": "Template string used for rendering the information that appear on hover box. Note that this will override `hoverinfo`. Variables are inserted using %{variable}, for example \"y: %{y}\" as well as %{xother}, {%_xother}, {%_xother_}, {%xother_}. When showing info for several points, *xother* will be added to those with different x positions from the first point. An underscore before or after *(x|y)other* will add a space on that side, only when this field is shown. Numbers are formatted using d3-format's syntax %{variable:d3-format}, for example \"Price: %{y:$.2f}\". https://github.com/d3/d3-format/tree/v1.4.5#d3-format for details on the formatting syntax. Dates are formatted using d3-time-format's syntax %{variable|d3-time-format}, for example \"Day: %{2019-01-01|%A}\". https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format for details on the date formatting syntax. Variables that can't be found will be replaced with the specifier. For example, a template of \"data: %{x}, %{y}\" will result in a value of \"data: 1, %{y}\" if x is 1 and y is missing. Variables with an undefined value will be replaced with the fallback value. The variables available in `hovertemplate` are the ones emitted as event data described at this link https://plotly.com/javascript/plotlyjs-events/#event-data. Additionally, all attributes that can be specified per-point (the ones that are `arrayOk: true`) are available. Finally, the template string has access to variables `label`, `color`, `value`, `percent` and `text`. Anything contained in tag `` is displayed in the secondary box, for example `%{fullData.name}`. To hide the secondary box completely, use an empty tag ``.", + "dflt": "", + "editType": "none", + "valType": "string" + }, + "hovertemplatefallback": { + "description": "Fallback string that's displayed when a variable referenced in a template is missing. If the boolean value 'false' is passed in, the specifier with the missing variable will be displayed.", + "dflt": "-", + "editType": "none", + "valType": "any" + }, + "hovertemplatesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `hovertemplate`.", + "editType": "none", + "valType": "string" + }, + "hovertext": { + "arrayOk": true, + "description": "Sets hover text elements associated with each sector. If a single string, the same string appears for all data points. If an array of string, the items are mapped in order of this trace's sectors. To be seen, trace `hoverinfo` must contain a *text* flag.", + "dflt": "", + "editType": "style", + "valType": "string" + }, + "hovertextsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `hovertext`.", + "editType": "none", + "valType": "string" + }, + "ids": { + "description": "Assigns id labels to each datum. These ids for object constancy of data points during animation. Should be an array of strings, not numbers or any other type.", + "editType": "calc", + "valType": "data_array" + }, + "idssrc": { + "description": "Sets the source reference on Chart Studio Cloud for `ids`.", + "editType": "none", + "valType": "string" + }, + "insidetextfont": { + "color": { + "arrayOk": true, + "editType": "plot", + "valType": "color" + }, + "colorsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `color`.", + "editType": "none", + "valType": "string" + }, + "description": "Sets the font used for `textinfo` lying inside the sector.", + "editType": "plot", + "family": { + "arrayOk": true, + "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", + "editType": "plot", + "noBlank": true, + "strict": true, + "valType": "string" + }, + "familysrc": { + "description": "Sets the source reference on Chart Studio Cloud for `family`.", + "editType": "none", + "valType": "string" + }, + "lineposition": { + "arrayOk": true, + "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", + "dflt": "none", + "editType": "plot", + "extras": [ + "none" + ], + "flags": [ + "under", + "over", + "through" + ], + "valType": "flaglist" + }, + "linepositionsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `lineposition`.", + "editType": "none", + "valType": "string" + }, + "role": "object", + "shadow": { + "arrayOk": true, + "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", + "dflt": "none", + "editType": "plot", + "valType": "string" + }, + "shadowsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `shadow`.", + "editType": "none", + "valType": "string" + }, + "size": { + "arrayOk": true, + "editType": "plot", + "min": 1, + "valType": "number" + }, + "sizesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `size`.", + "editType": "none", + "valType": "string" + }, + "style": { + "arrayOk": true, + "description": "Sets whether a font should be styled with a normal or italic face from its family.", + "dflt": "normal", + "editType": "plot", + "valType": "enumerated", + "values": [ + "normal", + "italic" + ] + }, + "stylesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `style`.", + "editType": "none", + "valType": "string" + }, + "textcase": { + "arrayOk": true, + "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", + "dflt": "normal", + "editType": "plot", + "valType": "enumerated", + "values": [ + "normal", + "word caps", + "upper", + "lower" + ] + }, + "textcasesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `textcase`.", + "editType": "none", + "valType": "string" + }, + "variant": { + "arrayOk": true, + "description": "Sets the variant of the font.", + "dflt": "normal", + "editType": "plot", + "valType": "enumerated", + "values": [ + "normal", + "small-caps", + "all-small-caps", + "all-petite-caps", + "petite-caps", + "unicase" + ] + }, + "variantsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `variant`.", + "editType": "none", + "valType": "string" + }, + "weight": { + "arrayOk": true, + "description": "Sets the weight (or boldness) of the font.", + "dflt": "normal", + "editType": "plot", + "extras": [ + "normal", + "bold" + ], + "max": 1000, + "min": 1, + "valType": "integer" + }, + "weightsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `weight`.", + "editType": "none", + "valType": "string" + } + }, + "insidetextorientation": { + "description": "Controls the orientation of the text inside chart sectors. When set to *auto*, text may be oriented in any direction in order to be as big as possible in the middle of a sector. The *horizontal* option orients text to be parallel with the bottom of the chart, and may make text smaller in order to achieve that goal. The *radial* option orients text along the radius of the sector. The *tangential* option orients text perpendicular to the radius of the sector.", + "dflt": "auto", + "editType": "plot", + "valType": "enumerated", + "values": [ + "horizontal", + "radial", + "tangential", + "auto" + ] + }, + "label0": { + "description": "Alternate to `labels`. Builds a numeric set of labels. Use with `dlabel` where `label0` is the starting label and `dlabel` the step.", + "dflt": 0, + "editType": "calc", + "valType": "number" + }, + "labels": { + "description": "Sets the sector labels. If `labels` entries are duplicated, we sum associated `values` or simply count occurrences if `values` is not provided. For other array attributes (including color) we use the first non-empty entry among all occurrences of the label.", + "editType": "calc", + "valType": "data_array" + }, + "labelssrc": { + "description": "Sets the source reference on Chart Studio Cloud for `labels`.", + "editType": "none", + "valType": "string" + }, + "legend": { + "description": "Sets the reference to a legend to show this trace in. References to these legends are *legend*, *legend2*, *legend3*, etc. Settings for these legends are set in the layout, under `layout.legend`, `layout.legend2`, etc.", + "dflt": "legend", + "editType": "style", + "valType": "subplotid" + }, + "legendgroup": { + "description": "Sets the legend group for this trace. Traces and shapes part of the same legend group hide/show at the same time when toggling legend items.", + "dflt": "", + "editType": "style", + "valType": "string" + }, + "legendgrouptitle": { + "editType": "style", + "font": { + "color": { + "editType": "style", + "valType": "color" + }, + "description": "Sets this legend group's title font.", + "editType": "style", + "family": { + "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", + "editType": "style", + "noBlank": true, + "strict": true, + "valType": "string" + }, + "lineposition": { + "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", + "dflt": "none", + "editType": "style", + "extras": [ + "none" + ], + "flags": [ + "under", + "over", + "through" + ], + "valType": "flaglist" + }, + "role": "object", + "shadow": { + "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", + "dflt": "none", + "editType": "style", + "valType": "string" + }, + "size": { + "editType": "style", + "min": 1, + "valType": "number" + }, + "style": { + "description": "Sets whether a font should be styled with a normal or italic face from its family.", + "dflt": "normal", + "editType": "style", + "valType": "enumerated", + "values": [ + "normal", + "italic" + ] + }, + "textcase": { + "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", + "dflt": "normal", + "editType": "style", + "valType": "enumerated", + "values": [ + "normal", + "word caps", + "upper", + "lower" + ] + }, + "variant": { + "description": "Sets the variant of the font.", + "dflt": "normal", + "editType": "style", + "valType": "enumerated", + "values": [ + "normal", + "small-caps", + "all-small-caps", + "all-petite-caps", + "petite-caps", + "unicase" + ] + }, + "weight": { + "description": "Sets the weight (or boldness) of the font.", + "dflt": "normal", + "editType": "style", + "extras": [ + "normal", + "bold" + ], + "max": 1000, + "min": 1, + "valType": "integer" + } + }, + "role": "object", + "text": { + "description": "Sets the title of the legend group.", + "dflt": "", + "editType": "style", + "valType": "string" + } + }, + "legendrank": { + "description": "Sets the legend rank for this trace. Items and groups with smaller ranks are presented on top/left side while with *reversed* `legend.traceorder` they are on bottom/right side. The default legendrank is 1000, so that you can use ranks less than 1000 to place certain items before all unranked items, and ranks greater than 1000 to go after all unranked items. When having unranked or equal rank items shapes would be displayed after traces i.e. according to their order in data and layout.", + "dflt": 1000, + "editType": "style", + "valType": "number" + }, + "legendwidth": { + "description": "Sets the width (in px or fraction) of the legend for this trace.", + "editType": "style", + "min": 0, + "valType": "number" + }, + "marker": { + "colors": { + "description": "Sets the color of each sector. If not specified, the default trace color set is used to pick the sector colors.", + "editType": "calc", + "valType": "data_array" + }, + "colorssrc": { + "description": "Sets the source reference on Chart Studio Cloud for `colors`.", + "editType": "none", + "valType": "string" + }, + "editType": "calc", + "line": { + "color": { + "arrayOk": true, + "description": "Sets the color of the line enclosing each sector.", + "dflt": "#444", + "editType": "style", + "valType": "color" + }, + "colorsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `color`.", + "editType": "none", + "valType": "string" + }, + "editType": "calc", + "role": "object", + "width": { + "arrayOk": true, + "description": "Sets the width (in px) of the line enclosing each sector.", + "dflt": 0, + "editType": "style", + "min": 0, + "valType": "number" + }, + "widthsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `width`.", + "editType": "none", + "valType": "string" + } + }, + "pattern": { + "bgcolor": { + "arrayOk": true, + "description": "When there is no colorscale sets the color of background pattern fill. Defaults to a `marker.color` background when `fillmode` is *overlay*. Otherwise, defaults to a transparent background.", + "editType": "style", + "valType": "color" + }, + "bgcolorsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `bgcolor`.", + "editType": "none", + "valType": "string" + }, + "description": "Sets the pattern within the marker.", + "editType": "style", + "fgcolor": { + "arrayOk": true, + "description": "When there is no colorscale sets the color of foreground pattern fill. Defaults to a `marker.color` background when `fillmode` is *replace*. Otherwise, defaults to dark grey or white to increase contrast with the `bgcolor`.", + "editType": "style", + "valType": "color" + }, + "fgcolorsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `fgcolor`.", + "editType": "none", + "valType": "string" + }, + "fgopacity": { + "description": "Sets the opacity of the foreground pattern fill. Defaults to a 0.5 when `fillmode` is *overlay*. Otherwise, defaults to 1.", + "editType": "style", + "max": 1, + "min": 0, + "valType": "number" + }, + "fillmode": { + "description": "Determines whether `marker.color` should be used as a default to `bgcolor` or a `fgcolor`.", + "dflt": "replace", + "editType": "style", + "valType": "enumerated", + "values": [ + "replace", + "overlay" + ] + }, + "path": { + "arrayOk": true, + "description": "Sets a custom path for pattern fill. Use with no `shape` or `solidity`, provide an SVG path string for the regions of the square from (0,0) to (`size`,`size`) to color.", + "editType": "style", + "valType": "string" + }, + "pathsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `path`.", + "editType": "none", + "valType": "string" + }, + "role": "object", + "shape": { + "arrayOk": true, + "description": "Sets the shape of the pattern fill. By default, no pattern is used for filling the area.", + "dflt": "", + "editType": "style", + "valType": "enumerated", + "values": [ + "", + "/", + "\\", + "x", + "-", + "|", + "+", + "." + ] + }, + "shapesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `shape`.", + "editType": "none", + "valType": "string" + }, + "size": { + "arrayOk": true, + "description": "Sets the size of unit squares of the pattern fill in pixels, which corresponds to the interval of repetition of the pattern.", + "dflt": 8, + "editType": "style", + "min": 0, + "valType": "number" + }, + "sizesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `size`.", + "editType": "none", + "valType": "string" + }, + "solidity": { + "arrayOk": true, + "description": "Sets the solidity of the pattern fill. Solidity is roughly the fraction of the area filled by the pattern. Solidity of 0 shows only the background color without pattern and solidty of 1 shows only the foreground color without pattern.", + "dflt": 0.3, + "editType": "style", + "max": 1, + "min": 0, + "valType": "number" + }, + "soliditysrc": { + "description": "Sets the source reference on Chart Studio Cloud for `solidity`.", + "editType": "none", + "valType": "string" + } + }, + "role": "object" + }, + "meta": { + "arrayOk": true, + "description": "Assigns extra meta information associated with this trace that can be used in various text attributes. Attributes such as trace `name`, graph, axis and colorbar `title.text`, annotation `text` `rangeselector`, `updatemenues` and `sliders` `label` text all support `meta`. To access the trace `meta` values in an attribute in the same trace, simply use `%{meta[i]}` where `i` is the index or key of the `meta` item in question. To access trace `meta` in layout attributes, use `%{data[n[.meta[i]}` where `i` is the index or key of the `meta` and `n` is the trace index.", + "editType": "plot", + "valType": "any" + }, + "metasrc": { + "description": "Sets the source reference on Chart Studio Cloud for `meta`.", + "editType": "none", + "valType": "string" + }, + "name": { + "description": "Sets the trace name. The trace name appears as the legend item and on hover.", + "editType": "style", + "valType": "string" + }, + "opacity": { + "description": "Sets the opacity of the trace.", + "dflt": 1, + "editType": "style", + "max": 1, + "min": 0, + "valType": "number" + }, + "outsidetextfont": { + "color": { + "arrayOk": true, + "editType": "plot", + "valType": "color" + }, + "colorsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `color`.", + "editType": "none", + "valType": "string" + }, + "description": "Sets the font used for `textinfo` lying outside the sector.", + "editType": "plot", + "family": { + "arrayOk": true, + "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", + "editType": "plot", + "noBlank": true, + "strict": true, + "valType": "string" + }, + "familysrc": { + "description": "Sets the source reference on Chart Studio Cloud for `family`.", + "editType": "none", + "valType": "string" + }, + "lineposition": { + "arrayOk": true, + "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", + "dflt": "none", + "editType": "plot", + "extras": [ + "none" + ], + "flags": [ + "under", + "over", + "through" + ], + "valType": "flaglist" + }, + "linepositionsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `lineposition`.", + "editType": "none", + "valType": "string" + }, + "role": "object", + "shadow": { + "arrayOk": true, + "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", + "dflt": "none", + "editType": "plot", + "valType": "string" + }, + "shadowsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `shadow`.", + "editType": "none", + "valType": "string" + }, + "size": { + "arrayOk": true, + "editType": "plot", + "min": 1, + "valType": "number" + }, + "sizesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `size`.", + "editType": "none", + "valType": "string" + }, + "style": { + "arrayOk": true, + "description": "Sets whether a font should be styled with a normal or italic face from its family.", + "dflt": "normal", + "editType": "plot", + "valType": "enumerated", + "values": [ + "normal", + "italic" + ] + }, + "stylesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `style`.", + "editType": "none", + "valType": "string" + }, + "textcase": { + "arrayOk": true, + "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", + "dflt": "normal", + "editType": "plot", + "valType": "enumerated", + "values": [ + "normal", + "word caps", + "upper", + "lower" + ] + }, + "textcasesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `textcase`.", + "editType": "none", + "valType": "string" + }, + "variant": { + "arrayOk": true, + "description": "Sets the variant of the font.", + "dflt": "normal", + "editType": "plot", + "valType": "enumerated", + "values": [ + "normal", + "small-caps", + "all-small-caps", + "all-petite-caps", + "petite-caps", + "unicase" + ] + }, + "variantsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `variant`.", + "editType": "none", + "valType": "string" + }, + "weight": { + "arrayOk": true, + "description": "Sets the weight (or boldness) of the font.", + "dflt": "normal", + "editType": "plot", + "extras": [ + "normal", + "bold" + ], + "max": 1000, + "min": 1, + "valType": "integer" + }, + "weightsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `weight`.", + "editType": "none", + "valType": "string" + } + }, + "pull": { + "arrayOk": true, + "description": "Sets the fraction of larger radius to pull the sectors out from the center. This can be a constant to pull all slices apart from each other equally or an array to highlight one or more slices.", + "dflt": 0, + "editType": "calc", + "max": 1, + "min": 0, + "valType": "number" + }, + "pullsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `pull`.", + "editType": "none", + "valType": "string" + }, + "rotation": { + "description": "Instead of the first slice starting at 12 o'clock, rotate to some other angle.", + "dflt": 0, + "editType": "calc", + "valType": "angle" + }, + "scalegroup": { + "description": "If there are multiple pie charts that should be sized according to their totals, link them by providing a non-empty group id here shared by every trace in the same group.", + "dflt": "", + "editType": "calc", + "valType": "string" + }, + "showlegend": { + "description": "Determines whether or not an item corresponding to this trace is shown in the legend.", + "dflt": true, + "editType": "style", + "valType": "boolean" + }, + "sort": { + "description": "Determines whether or not the sectors are reordered from largest to smallest.", + "dflt": true, + "editType": "calc", + "valType": "boolean" + }, + "stream": { + "editType": "calc", + "maxpoints": { + "description": "Sets the maximum number of points to keep on the plots from an incoming stream. If `maxpoints` is set to *50*, only the newest 50 points will be displayed on the plot.", + "dflt": 500, + "editType": "calc", + "max": 10000, + "min": 0, + "valType": "number" + }, + "role": "object", + "token": { + "description": "The stream id number links a data trace on a plot with a stream. See https://chart-studio.plotly.com/settings for more details.", + "editType": "calc", + "noBlank": true, + "strict": true, + "valType": "string" + } + }, + "text": { + "description": "Sets text elements associated with each sector. If trace `textinfo` contains a *text* flag, these elements will be seen on the chart. If trace `hoverinfo` contains a *text* flag and *hovertext* is not set, these elements will be seen in the hover labels.", + "editType": "plot", + "valType": "data_array" + }, + "textfont": { + "color": { + "arrayOk": true, + "editType": "plot", + "valType": "color" + }, + "colorsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `color`.", + "editType": "none", + "valType": "string" + }, + "description": "Sets the font used for `textinfo`.", + "editType": "plot", + "family": { + "arrayOk": true, + "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", + "editType": "plot", + "noBlank": true, + "strict": true, + "valType": "string" + }, + "familysrc": { + "description": "Sets the source reference on Chart Studio Cloud for `family`.", + "editType": "none", + "valType": "string" + }, + "lineposition": { + "arrayOk": true, + "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", + "dflt": "none", + "editType": "plot", + "extras": [ + "none" + ], + "flags": [ + "under", + "over", + "through" + ], + "valType": "flaglist" + }, + "linepositionsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `lineposition`.", + "editType": "none", + "valType": "string" + }, + "role": "object", + "shadow": { + "arrayOk": true, + "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", + "dflt": "none", + "editType": "plot", + "valType": "string" + }, + "shadowsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `shadow`.", + "editType": "none", + "valType": "string" + }, + "size": { + "arrayOk": true, + "editType": "plot", + "min": 1, + "valType": "number" + }, + "sizesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `size`.", + "editType": "none", + "valType": "string" + }, + "style": { + "arrayOk": true, + "description": "Sets whether a font should be styled with a normal or italic face from its family.", + "dflt": "normal", + "editType": "plot", + "valType": "enumerated", + "values": [ + "normal", + "italic" + ] + }, + "stylesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `style`.", + "editType": "none", + "valType": "string" + }, + "textcase": { + "arrayOk": true, + "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", + "dflt": "normal", + "editType": "plot", + "valType": "enumerated", + "values": [ + "normal", + "word caps", + "upper", + "lower" + ] + }, + "textcasesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `textcase`.", + "editType": "none", + "valType": "string" + }, + "variant": { + "arrayOk": true, + "description": "Sets the variant of the font.", + "dflt": "normal", + "editType": "plot", + "valType": "enumerated", + "values": [ + "normal", + "small-caps", + "all-small-caps", + "all-petite-caps", + "petite-caps", + "unicase" + ] + }, + "variantsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `variant`.", + "editType": "none", + "valType": "string" + }, + "weight": { + "arrayOk": true, + "description": "Sets the weight (or boldness) of the font.", + "dflt": "normal", + "editType": "plot", + "extras": [ + "normal", + "bold" + ], + "max": 1000, + "min": 1, + "valType": "integer" + }, + "weightsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `weight`.", + "editType": "none", + "valType": "string" + } + }, + "textinfo": { + "description": "Determines which trace information appear on the graph.", + "editType": "calc", + "extras": [ + "none" + ], + "flags": [ + "label", + "text", + "value", + "percent" + ], + "valType": "flaglist" + }, + "textposition": { + "arrayOk": true, + "description": "Specifies the location of the `textinfo`.", + "dflt": "auto", + "editType": "plot", + "valType": "enumerated", + "values": [ + "inside", + "outside", + "auto", + "none" + ] + }, + "textpositionsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `textposition`.", + "editType": "none", + "valType": "string" + }, + "textsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `text`.", + "editType": "none", + "valType": "string" + }, + "texttemplate": { + "arrayOk": true, + "description": "Template string used for rendering the information text that appears on points. Note that this will override `textinfo`. Variables are inserted using %{variable}, for example \"y: %{y}\". Numbers are formatted using d3-format's syntax %{variable:d3-format}, for example \"Price: %{y:$.2f}\". https://github.com/d3/d3-format/tree/v1.4.5#d3-format for details on the formatting syntax. Dates are formatted using d3-time-format's syntax %{variable|d3-time-format}, for example \"Day: %{2019-01-01|%A}\". https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format for details on the date formatting syntax. Variables that can't be found will be replaced with the specifier. For example, a template of \"data: %{x}, %{y}\" will result in a value of \"data: 1, %{y}\" if x is 1 and y is missing. Variables with an undefined value will be replaced with the fallback value. All attributes that can be specified per-point (the ones that are `arrayOk: true`) are available. Finally, the template string has access to variables `label`, `color`, `value`, `percent` and `text`.", + "dflt": "", + "editType": "plot", + "valType": "string" + }, + "texttemplatefallback": { + "description": "Fallback string that's displayed when a variable referenced in a template is missing. If the boolean value 'false' is passed in, the specifier with the missing variable will be displayed.", + "dflt": "-", + "editType": "plot", + "valType": "any" + }, + "texttemplatesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `texttemplate`.", + "editType": "none", + "valType": "string" + }, + "title": { + "editType": "plot", + "font": { + "color": { + "arrayOk": true, + "editType": "plot", + "valType": "color" + }, + "colorsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `color`.", + "editType": "none", + "valType": "string" + }, + "description": "Sets the font used for `title`.", + "editType": "plot", + "family": { + "arrayOk": true, + "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", + "editType": "plot", + "noBlank": true, + "strict": true, + "valType": "string" + }, + "familysrc": { + "description": "Sets the source reference on Chart Studio Cloud for `family`.", + "editType": "none", + "valType": "string" + }, + "lineposition": { + "arrayOk": true, + "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", + "dflt": "none", + "editType": "plot", + "extras": [ + "none" + ], + "flags": [ + "under", + "over", + "through" + ], + "valType": "flaglist" + }, + "linepositionsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `lineposition`.", + "editType": "none", + "valType": "string" + }, + "role": "object", + "shadow": { + "arrayOk": true, + "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", + "dflt": "none", + "editType": "plot", + "valType": "string" + }, + "shadowsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `shadow`.", + "editType": "none", + "valType": "string" + }, + "size": { + "arrayOk": true, + "editType": "plot", + "min": 1, + "valType": "number" + }, + "sizesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `size`.", + "editType": "none", + "valType": "string" + }, + "style": { + "arrayOk": true, + "description": "Sets whether a font should be styled with a normal or italic face from its family.", + "dflt": "normal", + "editType": "plot", + "valType": "enumerated", + "values": [ + "normal", + "italic" + ] + }, + "stylesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `style`.", + "editType": "none", + "valType": "string" + }, + "textcase": { + "arrayOk": true, + "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", + "dflt": "normal", + "editType": "plot", + "valType": "enumerated", + "values": [ + "normal", + "word caps", + "upper", + "lower" + ] + }, + "textcasesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `textcase`.", + "editType": "none", + "valType": "string" + }, + "variant": { + "arrayOk": true, + "description": "Sets the variant of the font.", + "dflt": "normal", + "editType": "plot", + "valType": "enumerated", + "values": [ + "normal", + "small-caps", + "all-small-caps", + "all-petite-caps", + "petite-caps", + "unicase" + ] + }, + "variantsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `variant`.", + "editType": "none", + "valType": "string" + }, + "weight": { + "arrayOk": true, + "description": "Sets the weight (or boldness) of the font.", + "dflt": "normal", + "editType": "plot", + "extras": [ + "normal", + "bold" + ], + "max": 1000, + "min": 1, + "valType": "integer" + }, + "weightsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `weight`.", + "editType": "none", + "valType": "string" + } + }, + "position": { + "description": "Specifies the location of the `title`.", + "editType": "plot", + "valType": "enumerated", + "values": [ + "top left", + "top center", + "top right", + "middle center", + "bottom left", + "bottom center", + "bottom right" + ] + }, + "role": "object", + "text": { + "description": "Sets the title of the chart. If it is empty, no title is displayed.", + "dflt": "", + "editType": "plot", + "valType": "string" + } + }, + "type": "pie", + "uid": { + "description": "Assign an id to this trace, Use this to provide object constancy between traces during animations and transitions.", + "editType": "plot", + "valType": "string" + }, + "uirevision": { + "description": "Controls persistence of some user-driven changes to the trace: `constraintrange` in `parcoords` traces, as well as some `editable: true` modifications such as `name` and `colorbar.title`. Defaults to `layout.uirevision`. Note that other user-driven trace attribute changes are controlled by `layout` attributes: `trace.visible` is controlled by `layout.legend.uirevision`, `selectedpoints` is controlled by `layout.selectionrevision`, and `colorbar.(x|y)` (accessible with `config: {editable: true}`) is controlled by `layout.editrevision`. Trace changes are tracked by `uid`, which only falls back on trace index if no `uid` is provided. So if your app can add/remove traces before the end of the `data` array, such that the same trace has a different index, you can still preserve user-driven changes if you give each trace a `uid` that stays with it as it moves.", + "editType": "none", + "valType": "any" + }, + "values": { + "description": "Sets the values of the sectors. If omitted, we count occurrences of each label.", + "editType": "calc", + "valType": "data_array" + }, + "valuessrc": { + "description": "Sets the source reference on Chart Studio Cloud for `values`.", + "editType": "none", + "valType": "string" + }, + "visible": { + "description": "Determines whether or not this trace is visible. If *legendonly*, the trace is not drawn, but can appear as a legend item (provided that the legend itself is visible).", + "dflt": true, + "editType": "calc", + "valType": "enumerated", + "values": [ + true, + false, + "legendonly" + ] + } + }, + "categories": [ + "pie-like", + "pie", + "showLegend" + ], + "layoutAttributes": { + "extendpiecolors": { + "description": "If `true`, the pie slice colors (whether given by `piecolorway` or inherited from `colorway`) will be extended to three times its original length by first repeating every color 20% lighter then each color 20% darker. This is intended to reduce the likelihood of reusing the same color when you have many slices, but you can set `false` to disable. Colors provided in the trace, using `marker.colors`, are never extended.", + "dflt": true, + "editType": "calc", + "valType": "boolean" + }, + "hiddenlabels": { + "description": "hiddenlabels is the funnelarea & pie chart analog of visible:'legendonly' but it can contain many labels, and can simultaneously hide slices from several pies/funnelarea charts", + "editType": "calc", + "valType": "data_array" + }, + "hiddenlabelssrc": { + "description": "Sets the source reference on Chart Studio Cloud for `hiddenlabels`.", + "editType": "none", + "valType": "string" + }, + "piecolorway": { + "description": "Sets the default pie slice colors. Defaults to the main `colorway` used for trace colors. If you specify a new list here it can still be extended with lighter and darker colors, see `extendpiecolors`.", + "editType": "calc", + "valType": "colorlist" + } + }, + "meta": { + "description": "A data visualized by the sectors of the pie is set in `values`. The sector labels are set in `labels`. The sector colors are set in `marker.colors`" + }, + "type": "pie" + }, + "quiver": { + "animatable": true, + "attributes": { + "anchor": { + "description": "Sets the arrows' anchor with respect to their (x,y) positions. Use *tail* to place (x,y) at the base, *tip* to place (x,y) at the head, or *cm*/*center*/*middle* to center the arrow on (x,y).", + "dflt": "tail", + "editType": "calc", + "valType": "enumerated", + "values": [ + "tip", + "tail", + "cm", + "center", + "middle" + ] + }, + "angle": { + "description": "Angle of arrowhead in radians. Default = π/9", + "dflt": 0.3490658503988659, + "editType": "calc", + "max": 1.5707963267948966, + "min": 0, + "valType": "number" + }, + "arrow_scale": { + "description": "Deprecated alias for `arrowsize`-based sizing. Prefer using `arrowsize`.", + "editType": "calc", + "max": 1, + "min": 0, + "valType": "number" + }, + "arrowsize": { + "description": "Scales the size of the arrow head relative to a base size. Higher values produce larger heads.", + "dflt": 1, + "editType": "calc", + "min": 0.3, + "valType": "number" + }, + "arrowwidth": { + "description": "Sets the width (in px) of the arrow line (alias of `line.width`).", + "editType": "style", + "min": 0.1, + "valType": "number" + }, + "customdata": { + "description": "Assigns extra data each datum. This may be useful when listening to hover, click and selection events. Note that, *scatter* traces also appends customdata items in the markers DOM elements", + "editType": "calc", + "valType": "data_array" + }, + "customdatasrc": { + "description": "Sets the source reference on Chart Studio Cloud for `customdata`.", + "editType": "none", + "valType": "string" + }, + "hoverdistance": { + "description": "Maximum distance (in pixels) to look for nearby arrows on hover.", + "dflt": 20, + "editType": "calc", + "min": -1, + "valType": "number" + }, + "hoverinfo": { + "arrayOk": true, + "description": "Determines which trace information appear on hover. If `none` or `skip` are set, no information is displayed upon hovering. But, if `none` is set, click and hover events are still fired.", + "dflt": "all", + "editType": "none", + "extras": [ + "all", + "none", + "skip" + ], + "flags": [ + "x", + "y", + "u", + "v", + "text", + "name" + ], + "valType": "flaglist" + }, + "hoverinfosrc": { + "description": "Sets the source reference on Chart Studio Cloud for `hoverinfo`.", + "editType": "none", + "valType": "string" + }, + "hoverlabel": { + "align": { + "arrayOk": true, + "description": "Sets the horizontal alignment of the text content within hover label box. Has an effect only if the hover label text spans more two or more lines", + "dflt": "auto", + "editType": "none", + "valType": "enumerated", + "values": [ + "left", + "right", + "auto" + ] + }, + "alignsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `align`.", + "editType": "none", + "valType": "string" + }, + "bgcolor": { + "arrayOk": true, + "description": "Sets the background color of the hover labels for this trace", + "editType": "none", + "valType": "color" + }, + "bgcolorsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `bgcolor`.", + "editType": "none", + "valType": "string" + }, + "bordercolor": { + "arrayOk": true, + "description": "Sets the border color of the hover labels for this trace.", + "editType": "none", + "valType": "color" + }, + "bordercolorsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `bordercolor`.", + "editType": "none", + "valType": "string" + }, + "editType": "none", + "font": { + "color": { + "arrayOk": true, + "editType": "none", + "valType": "color" + }, + "colorsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `color`.", + "editType": "none", + "valType": "string" + }, + "description": "Sets the font used in hover labels.", + "editType": "none", + "family": { + "arrayOk": true, + "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", + "editType": "none", + "noBlank": true, + "strict": true, + "valType": "string" + }, + "familysrc": { + "description": "Sets the source reference on Chart Studio Cloud for `family`.", + "editType": "none", + "valType": "string" + }, + "lineposition": { + "arrayOk": true, + "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", + "dflt": "none", + "editType": "none", + "extras": [ + "none" + ], + "flags": [ + "under", + "over", + "through" + ], + "valType": "flaglist" + }, + "linepositionsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `lineposition`.", + "editType": "none", + "valType": "string" + }, + "role": "object", + "shadow": { + "arrayOk": true, + "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", + "dflt": "none", + "editType": "none", + "valType": "string" + }, + "shadowsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `shadow`.", + "editType": "none", + "valType": "string" + }, + "size": { + "arrayOk": true, + "editType": "none", + "min": 1, + "valType": "number" + }, + "sizesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `size`.", + "editType": "none", + "valType": "string" + }, + "style": { + "arrayOk": true, + "description": "Sets whether a font should be styled with a normal or italic face from its family.", + "dflt": "normal", + "editType": "none", + "valType": "enumerated", + "values": [ + "normal", + "italic" + ] + }, + "stylesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `style`.", + "editType": "none", + "valType": "string" + }, + "textcase": { + "arrayOk": true, + "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", + "dflt": "normal", + "editType": "none", + "valType": "enumerated", + "values": [ + "normal", + "word caps", + "upper", + "lower" + ] + }, + "textcasesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `textcase`.", + "editType": "none", + "valType": "string" + }, + "variant": { + "arrayOk": true, + "description": "Sets the variant of the font.", + "dflt": "normal", + "editType": "none", + "valType": "enumerated", + "values": [ + "normal", + "small-caps", + "all-small-caps", + "all-petite-caps", + "petite-caps", + "unicase" + ] + }, + "variantsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `variant`.", + "editType": "none", + "valType": "string" + }, + "weight": { + "arrayOk": true, + "description": "Sets the weight (or boldness) of the font.", + "dflt": "normal", + "editType": "none", + "extras": [ + "normal", + "bold" + ], + "max": 1000, + "min": 1, + "valType": "integer" + }, + "weightsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `weight`.", + "editType": "none", + "valType": "string" + } + }, + "namelength": { + "arrayOk": true, + "description": "Sets the default length (in number of characters) of the trace name in the hover labels for all traces. -1 shows the whole name regardless of length. 0-3 shows the first 0-3 characters, and an integer >3 will show the whole name if it is less than that many characters, but if it is longer, will truncate to `namelength - 3` characters and add an ellipsis.", + "dflt": 15, + "editType": "none", + "min": -1, + "valType": "integer" + }, + "namelengthsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `namelength`.", + "editType": "none", + "valType": "string" + }, + "role": "object", + "showarrow": { + "description": "Sets whether or not to show the hover label arrow/triangle pointing to the data point.", + "dflt": true, + "editType": "none", + "valType": "boolean" + } + }, + "hovertemplate": { + "arrayOk": true, + "description": "Template string used for rendering the information that appear on hover box. Note that this will override `hoverinfo`. Variables are inserted using %{variable}, for example \"y: %{y}\" as well as %{xother}, {%_xother}, {%_xother_}, {%xother_}. When showing info for several points, *xother* will be added to those with different x positions from the first point. An underscore before or after *(x|y)other* will add a space on that side, only when this field is shown. Numbers are formatted using d3-format's syntax %{variable:d3-format}, for example \"Price: %{y:$.2f}\". https://github.com/d3/d3-format/tree/v1.4.5#d3-format for details on the formatting syntax. Dates are formatted using d3-time-format's syntax %{variable|d3-time-format}, for example \"Day: %{2019-01-01|%A}\". https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format for details on the date formatting syntax. Variables that can't be found will be replaced with the specifier. For example, a template of \"data: %{x}, %{y}\" will result in a value of \"data: 1, %{y}\" if x is 1 and y is missing. Variables with an undefined value will be replaced with the fallback value. The variables available in `hovertemplate` are the ones emitted as event data described at this link https://plotly.com/javascript/plotlyjs-events/#event-data. Additionally, all attributes that can be specified per-point (the ones that are `arrayOk: true`) are available. Finally, the template string has access to variables `x`, `y`, `u`, `v`, `text` and `name`. Anything contained in tag `` is displayed in the secondary box, for example `%{fullData.name}`. To hide the secondary box completely, use an empty tag ``.", + "dflt": "", + "editType": "none", + "valType": "string" + }, + "hovertemplatesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `hovertemplate`.", + "editType": "none", + "valType": "string" + }, + "ids": { + "anim": true, + "description": "Assigns id labels to each datum. These ids for object constancy of data points during animation. Should be an array of strings, not numbers or any other type.", + "editType": "calc", + "valType": "data_array" + }, + "idssrc": { + "description": "Sets the source reference on Chart Studio Cloud for `ids`.", + "editType": "none", + "valType": "string" + }, + "legend": { + "description": "Sets the reference to a legend to show this trace in. References to these legends are *legend*, *legend2*, *legend3*, etc. Settings for these legends are set in the layout, under `layout.legend`, `layout.legend2`, etc.", + "dflt": "legend", + "editType": "style", + "valType": "subplotid" + }, + "legendgroup": { + "description": "Sets the legend group for this trace. Traces and shapes part of the same legend group hide/show at the same time when toggling legend items.", + "dflt": "", + "editType": "style", + "valType": "string" + }, + "legendgrouptitle": { + "editType": "style", + "font": { + "color": { + "editType": "style", + "valType": "color" + }, + "description": "Sets this legend group's title font.", + "editType": "style", + "family": { + "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", + "editType": "style", + "noBlank": true, + "strict": true, + "valType": "string" + }, + "lineposition": { + "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", + "dflt": "none", + "editType": "style", + "extras": [ + "none" + ], + "flags": [ + "under", + "over", + "through" + ], + "valType": "flaglist" + }, + "role": "object", + "shadow": { + "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", + "dflt": "none", + "editType": "style", + "valType": "string" + }, + "size": { + "editType": "style", + "min": 1, + "valType": "number" + }, + "style": { + "description": "Sets whether a font should be styled with a normal or italic face from its family.", + "dflt": "normal", + "editType": "style", + "valType": "enumerated", + "values": [ + "normal", + "italic" + ] + }, + "textcase": { + "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", + "dflt": "normal", + "editType": "style", + "valType": "enumerated", + "values": [ + "normal", + "word caps", + "upper", + "lower" + ] + }, + "variant": { + "description": "Sets the variant of the font.", + "dflt": "normal", + "editType": "style", + "valType": "enumerated", + "values": [ + "normal", + "small-caps", + "all-small-caps", + "all-petite-caps", + "petite-caps", + "unicase" + ] + }, + "weight": { + "description": "Sets the weight (or boldness) of the font.", + "dflt": "normal", + "editType": "style", + "extras": [ + "normal", + "bold" + ], + "max": 1000, + "min": 1, + "valType": "integer" + } + }, + "role": "object", + "text": { + "description": "Sets the title of the legend group.", + "dflt": "", + "editType": "style", + "valType": "string" + } + }, + "legendrank": { + "description": "Sets the legend rank for this trace. Items and groups with smaller ranks are presented on top/left side while with *reversed* `legend.traceorder` they are on bottom/right side. The default legendrank is 1000, so that you can use ranks less than 1000 to place certain items before all unranked items, and ranks greater than 1000 to go after all unranked items. When having unranked or equal rank items shapes would be displayed after traces i.e. according to their order in data and layout.", + "dflt": 1000, + "editType": "style", + "valType": "number" + }, + "legendwidth": { + "description": "Sets the width (in px or fraction) of the legend for this trace.", + "editType": "style", + "min": 0, + "valType": "number" + }, + "line": { + "color": { + "description": "Sets the color of the arrow lines.", + "dflt": "#000", + "editType": "style", + "valType": "color" + }, + "dash": { + "description": "Sets the dash style of lines. Set to a dash type string (*solid*, *dot*, *dash*, *longdash*, *dashdot*, or *longdashdot*) or a dash length list in px (eg *5px,10px,2px,2px*).", + "dflt": "solid", + "editType": "style", + "valType": "string", + "values": [ + "solid", + "dot", + "dash", + "longdash", + "dashdot", + "longdashdot" + ] + }, + "editType": "style", + "role": "object", + "shape": { + "description": "Determines the line shape.", + "dflt": "linear", + "editType": "plot", + "valType": "enumerated", + "values": [ + "linear", + "spline", + "hv", + "vh", + "hvh", + "vhv" + ] + }, + "simplify": { + "description": "Simplifies lines by removing nearly-overlapping points.", + "dflt": true, + "editType": "plot", + "valType": "boolean" + }, + "smoothing": { + "description": "Has an effect only if `shape` is set to *spline*. Sets the amount of smoothing.", + "dflt": 1, + "editType": "plot", + "max": 1.3, + "min": 0, + "valType": "number" + }, + "width": { + "description": "Sets the width (in px) of the arrow lines.", + "dflt": 1, + "editType": "style", + "min": 0, + "valType": "number" + } + }, + "meta": { + "arrayOk": true, + "description": "Assigns extra meta information associated with this trace that can be used in various text attributes. Attributes such as trace `name`, graph, axis and colorbar `title.text`, annotation `text` `rangeselector`, `updatemenues` and `sliders` `label` text all support `meta`. To access the trace `meta` values in an attribute in the same trace, simply use `%{meta[i]}` where `i` is the index or key of the `meta` item in question. To access trace `meta` in layout attributes, use `%{data[n[.meta[i]}` where `i` is the index or key of the `meta` and `n` is the trace index.", + "editType": "plot", + "valType": "any" + }, + "metasrc": { + "description": "Sets the source reference on Chart Studio Cloud for `meta`.", + "editType": "none", + "valType": "string" + }, + "name": { + "description": "Sets the trace name. The trace name appears as the legend item and on hover.", + "editType": "style", + "valType": "string" + }, + "opacity": { + "description": "Sets the opacity of the trace.", + "dflt": 1, + "editType": "style", + "max": 1, + "min": 0, + "valType": "number" + }, + "scaleratio": { + "description": "The ratio between the scale of the y-axis and the scale of the x-axis (scale_y / scale_x). Default = null, the scale ratio is not fixed.", + "editType": "calc", + "min": 0, + "valType": "number" + }, + "selected": { + "editType": "style", + "line": { + "color": { + "description": "Sets the line color of selected points.", + "editType": "style", + "valType": "color" + }, + "editType": "style", + "role": "object", + "width": { + "description": "Sets the line width of selected points.", + "editType": "style", + "min": 0, + "valType": "number" + } + }, + "role": "object", + "textfont": { + "color": { + "description": "Sets the text font color of selected points, applied only when a selection exists.", + "editType": "style", + "valType": "color" + }, + "editType": "style", + "role": "object" + } + }, + "selectedpoints": { + "description": "Array containing integer indices of selected points. Has an effect only for traces that support selections. Note that an empty array means an empty selection where the `unselected` are turned on for all points, whereas, any other non-array values means no selection all where the `selected` and `unselected` styles have no effect.", + "editType": "calc", + "valType": "any" + }, + "showlegend": { + "description": "Determines whether or not an item corresponding to this trace is shown in the legend.", + "dflt": true, + "editType": "style", + "valType": "boolean" + }, + "sizemode": { + "description": "Determines whether `sizeref` is set as a *scaled* (unitless) scalar (normalized by the max u/v norm in the vector field), as an *absolute* value (in the same units as the vector field), or *raw* to use the raw vector lengths.", + "dflt": "scaled", + "editType": "calc", + "valType": "enumerated", + "values": [ + "scaled", + "absolute", + "raw" + ] + }, + "sizeref": { + "description": "Adjusts the arrow size scaling. The arrow length is determined by the vector norm multiplied by `sizeref`, optionally normalized when `sizemode` is *scaled*.", + "editType": "calc", + "min": 0, + "valType": "number" + }, + "stream": { + "editType": "calc", + "maxpoints": { + "description": "Sets the maximum number of points to keep on the plots from an incoming stream. If `maxpoints` is set to *50*, only the newest 50 points will be displayed on the plot.", + "dflt": 500, + "editType": "calc", + "max": 10000, + "min": 0, + "valType": "number" + }, + "role": "object", + "token": { + "description": "The stream id number links a data trace on a plot with a stream. See https://chart-studio.plotly.com/settings for more details.", + "editType": "calc", + "noBlank": true, + "strict": true, + "valType": "string" + } + }, + "text": { + "anim": true, + "description": "Sets text elements associated with each (x,y) pair.", + "editType": "calc", + "valType": "data_array" + }, + "textfont": { + "color": { + "arrayOk": true, + "editType": "style", + "valType": "color" + }, + "colorsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `color`.", + "editType": "none", + "valType": "string" + }, + "description": "Sets the text font.", + "editType": "calc", + "family": { + "arrayOk": true, + "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", + "editType": "calc", + "noBlank": true, + "strict": true, + "valType": "string" + }, + "familysrc": { + "description": "Sets the source reference on Chart Studio Cloud for `family`.", + "editType": "none", + "valType": "string" + }, + "lineposition": { + "arrayOk": true, + "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", + "dflt": "none", + "editType": "calc", + "extras": [ + "none" + ], + "flags": [ + "under", + "over", + "through" + ], + "valType": "flaglist" + }, + "linepositionsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `lineposition`.", + "editType": "none", + "valType": "string" + }, + "role": "object", + "shadow": { + "arrayOk": true, + "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", + "dflt": "none", + "editType": "calc", + "valType": "string" + }, + "shadowsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `shadow`.", + "editType": "none", + "valType": "string" + }, + "size": { + "arrayOk": true, + "editType": "calc", + "min": 1, + "valType": "number" + }, + "sizesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `size`.", + "editType": "none", + "valType": "string" + }, + "style": { + "arrayOk": true, + "description": "Sets whether a font should be styled with a normal or italic face from its family.", + "dflt": "normal", + "editType": "calc", + "valType": "enumerated", + "values": [ + "normal", + "italic" + ] + }, + "stylesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `style`.", + "editType": "none", + "valType": "string" + }, + "textcase": { + "arrayOk": true, + "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", + "dflt": "normal", + "editType": "calc", + "valType": "enumerated", + "values": [ + "normal", + "word caps", + "upper", + "lower" + ] + }, + "textcasesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `textcase`.", + "editType": "none", + "valType": "string" + }, + "variant": { + "arrayOk": true, + "description": "Sets the variant of the font.", + "dflt": "normal", + "editType": "calc", + "valType": "enumerated", + "values": [ + "normal", + "small-caps", + "all-small-caps", + "all-petite-caps", + "petite-caps", + "unicase" + ] + }, + "variantsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `variant`.", + "editType": "none", + "valType": "string" + }, + "weight": { + "arrayOk": true, + "description": "Sets the weight (or boldness) of the font.", + "dflt": "normal", + "editType": "calc", + "extras": [ + "normal", + "bold" + ], + "max": 1000, + "min": 1, + "valType": "integer" + }, + "weightsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `weight`.", + "editType": "none", + "valType": "string" + } + }, + "textposition": { + "description": "Sets the positions of the `text` elements with respects to the (x,y) coordinates.", + "dflt": "middle center", + "editType": "calc", + "valType": "enumerated", + "values": [ + "top left", + "top center", + "top right", + "middle left", + "middle center", + "middle right", + "bottom left", + "bottom center", + "bottom right" + ] + }, + "textsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `text`.", + "editType": "none", + "valType": "string" + }, + "type": "quiver", + "u": { + "anim": true, + "description": "Sets the x components of the arrow vectors.", + "editType": "calc", + "valType": "data_array" + }, + "uid": { + "anim": true, + "description": "Assign an id to this trace, Use this to provide object constancy between traces during animations and transitions.", + "editType": "plot", + "valType": "string" + }, + "uirevision": { + "description": "Controls persistence of some user-driven changes to the trace: `constraintrange` in `parcoords` traces, as well as some `editable: true` modifications such as `name` and `colorbar.title`. Defaults to `layout.uirevision`. Note that other user-driven trace attribute changes are controlled by `layout` attributes: `trace.visible` is controlled by `layout.legend.uirevision`, `selectedpoints` is controlled by `layout.selectionrevision`, and `colorbar.(x|y)` (accessible with `config: {editable: true}`) is controlled by `layout.editrevision`. Trace changes are tracked by `uid`, which only falls back on trace index if no `uid` is provided. So if your app can add/remove traces before the end of the `data` array, such that the same trace has a different index, you can still preserve user-driven changes if you give each trace a `uid` that stays with it as it moves.", + "editType": "none", + "valType": "any" + }, + "unselected": { + "editType": "style", + "line": { + "color": { + "description": "Sets the line color of unselected points.", + "editType": "style", + "valType": "color" + }, + "editType": "style", + "role": "object", + "width": { + "description": "Sets the line width of unselected points.", + "editType": "style", + "min": 0, + "valType": "number" + } + }, + "role": "object", + "textfont": { + "color": { + "description": "Sets the text font color of unselected points, applied only when a selection exists.", + "editType": "style", + "valType": "color" + }, + "editType": "style", + "role": "object" + } + }, + "usrc": { + "description": "Sets the source reference on Chart Studio Cloud for `u`.", + "editType": "none", + "valType": "string" + }, + "v": { + "anim": true, + "description": "Sets the y components of the arrow vectors.", + "editType": "calc", + "valType": "data_array" + }, + "visible": { + "description": "Determines whether or not this trace is visible. If *legendonly*, the trace is not drawn, but can appear as a legend item (provided that the legend itself is visible).", + "dflt": true, + "editType": "calc", + "valType": "enumerated", + "values": [ + true, + false, + "legendonly" + ] + }, + "vsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `v`.", + "editType": "none", + "valType": "string" + }, + "x": { + "anim": true, + "description": "Sets the x coordinates of the arrow locations.", + "editType": "calc+clearAxisTypes", + "valType": "data_array" + }, + "xaxis": { + "description": "Sets a reference between this trace's x coordinates and a 2D cartesian x axis. If *x* (the default value), the x coordinates refer to `layout.xaxis`. If *x2*, the x coordinates refer to `layout.xaxis2`, and so on.", + "dflt": "x", + "editType": "calc+clearAxisTypes", + "valType": "subplotid" + }, + "xsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `x`.", + "editType": "none", + "valType": "string" + }, + "y": { + "anim": true, + "description": "Sets the y coordinates of the arrow locations.", + "editType": "calc+clearAxisTypes", + "valType": "data_array" + }, + "yaxis": { + "description": "Sets a reference between this trace's y coordinates and a 2D cartesian y axis. If *y* (the default value), the y coordinates refer to `layout.yaxis`. If *y2*, the y coordinates refer to `layout.yaxis2`, and so on.", + "dflt": "y", + "editType": "calc+clearAxisTypes", + "valType": "subplotid" + }, + "ysrc": { + "description": "Sets the source reference on Chart Studio Cloud for `y`.", + "editType": "none", + "valType": "string" + } + }, + "categories": [ + "cartesian", + "svg", + "showLegend", + "scatter-like", + "zoomScale" + ], + "meta": { + "description": "The quiver trace type visualizes vector fields using arrows. Specify a vector field using 4 1D arrays: 2 position arrays `x`, `y` and 2 vector component arrays `u`, `v`. The arrows are drawn exactly at the positions given by `x` and `y`. Arrow length and direction are determined by `u` and `v` components." + }, + "type": "quiver" + }, + "sankey": { + "animatable": false, + "attributes": { + "arrangement": { + "description": "If value is `snap` (the default), the node arrangement is assisted by automatic snapping of elements to preserve space between nodes specified via `nodepad`. If value is `perpendicular`, the nodes can only move along a line perpendicular to the flow. If value is `freeform`, the nodes can freely move on the plane. If value is `fixed`, the nodes are stationary.", + "dflt": "snap", + "editType": "calc", + "valType": "enumerated", + "values": [ + "snap", + "perpendicular", + "freeform", + "fixed" + ] + }, + "customdata": { + "description": "Assigns extra data each datum. This may be useful when listening to hover, click and selection events. Note that, *scatter* traces also appends customdata items in the markers DOM elements", + "editType": "calc", + "valType": "data_array" + }, + "customdatasrc": { + "description": "Sets the source reference on Chart Studio Cloud for `customdata`.", + "editType": "none", + "valType": "string" + }, + "domain": { + "column": { + "description": "If there is a layout grid, use the domain for this column in the grid for this sankey trace .", + "dflt": 0, + "editType": "calc", + "min": 0, + "valType": "integer" + }, + "editType": "calc", + "role": "object", + "row": { + "description": "If there is a layout grid, use the domain for this row in the grid for this sankey trace .", + "dflt": 0, + "editType": "calc", + "min": 0, + "valType": "integer" + }, + "x": { + "description": "Sets the horizontal domain of this sankey trace (in plot fraction).", + "dflt": [ + 0, + 1 + ], + "editType": "calc", + "items": [ + { + "editType": "calc", + "max": 1, + "min": 0, + "valType": "number" + }, + { + "editType": "calc", + "max": 1, + "min": 0, + "valType": "number" + } + ], + "valType": "info_array" + }, + "y": { + "description": "Sets the vertical domain of this sankey trace (in plot fraction).", + "dflt": [ + 0, + 1 + ], + "editType": "calc", + "items": [ + { + "editType": "calc", + "max": 1, + "min": 0, + "valType": "number" + }, + { + "editType": "calc", + "max": 1, + "min": 0, + "valType": "number" + } + ], + "valType": "info_array" + } + }, + "hoverinfo": { + "arrayOk": false, + "description": "Determines which trace information appear on hover. If `none` or `skip` are set, no information is displayed upon hovering. But, if `none` is set, click and hover events are still fired. Note that this attribute is superseded by `node.hoverinfo` and `node.hoverinfo` for nodes and links respectively.", + "dflt": "all", + "editType": "calc", + "extras": [ + "all", + "none", + "skip" + ], + "flags": [], + "valType": "flaglist" + }, + "hoverlabel": { + "align": { + "arrayOk": true, + "description": "Sets the horizontal alignment of the text content within hover label box. Has an effect only if the hover label text spans more two or more lines", + "dflt": "auto", + "editType": "calc", + "valType": "enumerated", + "values": [ + "left", + "right", + "auto" + ] + }, + "alignsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `align`.", + "editType": "none", + "valType": "string" + }, + "bgcolor": { + "arrayOk": true, + "description": "Sets the background color of the hover labels for this trace", + "editType": "calc", + "valType": "color" + }, + "bgcolorsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `bgcolor`.", + "editType": "none", + "valType": "string" + }, + "bordercolor": { + "arrayOk": true, + "description": "Sets the border color of the hover labels for this trace.", + "editType": "calc", + "valType": "color" + }, + "bordercolorsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `bordercolor`.", + "editType": "none", + "valType": "string" + }, + "editType": "calc", + "font": { + "color": { + "arrayOk": true, + "editType": "calc", + "valType": "color" + }, + "colorsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `color`.", + "editType": "none", + "valType": "string" + }, + "description": "Sets the font used in hover labels.", + "editType": "calc", + "family": { + "arrayOk": true, + "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", + "editType": "calc", + "noBlank": true, + "strict": true, + "valType": "string" + }, + "familysrc": { + "description": "Sets the source reference on Chart Studio Cloud for `family`.", + "editType": "none", + "valType": "string" + }, + "lineposition": { + "arrayOk": true, + "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", + "dflt": "none", + "editType": "calc", + "extras": [ + "none" + ], + "flags": [ + "under", + "over", + "through" + ], + "valType": "flaglist" + }, + "linepositionsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `lineposition`.", + "editType": "none", + "valType": "string" + }, + "role": "object", + "shadow": { + "arrayOk": true, + "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", + "dflt": "none", + "editType": "calc", + "valType": "string" + }, + "shadowsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `shadow`.", + "editType": "none", + "valType": "string" + }, + "size": { + "arrayOk": true, + "editType": "calc", + "min": 1, + "valType": "number" + }, + "sizesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `size`.", + "editType": "none", + "valType": "string" + }, + "style": { + "arrayOk": true, + "description": "Sets whether a font should be styled with a normal or italic face from its family.", + "dflt": "normal", + "editType": "calc", + "valType": "enumerated", + "values": [ + "normal", + "italic" + ] + }, + "stylesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `style`.", + "editType": "none", + "valType": "string" + }, + "textcase": { + "arrayOk": true, + "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", + "dflt": "normal", + "editType": "calc", + "valType": "enumerated", + "values": [ + "normal", + "word caps", + "upper", + "lower" + ] + }, + "textcasesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `textcase`.", + "editType": "none", + "valType": "string" + }, + "variant": { + "arrayOk": true, + "description": "Sets the variant of the font.", + "dflt": "normal", + "editType": "calc", + "valType": "enumerated", + "values": [ + "normal", + "small-caps", + "all-small-caps", + "all-petite-caps", + "petite-caps", + "unicase" + ] + }, + "variantsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `variant`.", + "editType": "none", + "valType": "string" + }, + "weight": { + "arrayOk": true, + "description": "Sets the weight (or boldness) of the font.", + "dflt": "normal", + "editType": "calc", + "extras": [ + "normal", + "bold" + ], + "max": 1000, + "min": 1, + "valType": "integer" + }, + "weightsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `weight`.", + "editType": "none", + "valType": "string" + } + }, + "namelength": { + "arrayOk": true, + "description": "Sets the default length (in number of characters) of the trace name in the hover labels for all traces. -1 shows the whole name regardless of length. 0-3 shows the first 0-3 characters, and an integer >3 will show the whole name if it is less than that many characters, but if it is longer, will truncate to `namelength - 3` characters and add an ellipsis.", + "dflt": 15, + "editType": "calc", + "min": -1, + "valType": "integer" + }, + "namelengthsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `namelength`.", + "editType": "none", + "valType": "string" + }, + "role": "object", + "showarrow": { + "description": "Sets whether or not to show the hover label arrow/triangle pointing to the data point.", + "dflt": true, + "editType": "calc", + "valType": "boolean" + } + }, + "ids": { + "description": "Assigns id labels to each datum. These ids for object constancy of data points during animation. Should be an array of strings, not numbers or any other type.", + "editType": "calc", + "valType": "data_array" + }, + "idssrc": { + "description": "Sets the source reference on Chart Studio Cloud for `ids`.", + "editType": "none", + "valType": "string" + }, + "legend": { + "description": "Sets the reference to a legend to show this trace in. References to these legends are *legend*, *legend2*, *legend3*, etc. Settings for these legends are set in the layout, under `layout.legend`, `layout.legend2`, etc.", + "dflt": "legend", + "editType": "style", + "valType": "subplotid" + }, + "legendgrouptitle": { + "editType": "style", + "font": { + "color": { + "editType": "style", + "valType": "color" + }, + "description": "Sets this legend group's title font.", + "editType": "style", + "family": { + "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", + "editType": "style", + "noBlank": true, + "strict": true, + "valType": "string" + }, + "lineposition": { + "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", + "dflt": "none", + "editType": "style", + "extras": [ + "none" + ], + "flags": [ + "under", + "over", + "through" + ], + "valType": "flaglist" + }, + "role": "object", + "shadow": { + "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", + "dflt": "none", + "editType": "style", + "valType": "string" + }, + "size": { + "editType": "style", + "min": 1, + "valType": "number" + }, + "style": { + "description": "Sets whether a font should be styled with a normal or italic face from its family.", + "dflt": "normal", + "editType": "style", + "valType": "enumerated", + "values": [ + "normal", + "italic" + ] + }, + "textcase": { + "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", + "dflt": "normal", + "editType": "style", + "valType": "enumerated", + "values": [ + "normal", + "word caps", + "upper", + "lower" + ] + }, + "variant": { + "description": "Sets the variant of the font.", + "dflt": "normal", + "editType": "style", + "valType": "enumerated", + "values": [ + "normal", + "small-caps", + "all-small-caps", + "all-petite-caps", + "petite-caps", + "unicase" + ] + }, + "weight": { + "description": "Sets the weight (or boldness) of the font.", + "dflt": "normal", + "editType": "style", + "extras": [ + "normal", + "bold" + ], + "max": 1000, + "min": 1, + "valType": "integer" + } + }, + "role": "object", + "text": { + "description": "Sets the title of the legend group.", + "dflt": "", + "editType": "style", + "valType": "string" + } + }, + "legendrank": { + "description": "Sets the legend rank for this trace. Items and groups with smaller ranks are presented on top/left side while with *reversed* `legend.traceorder` they are on bottom/right side. The default legendrank is 1000, so that you can use ranks less than 1000 to place certain items before all unranked items, and ranks greater than 1000 to go after all unranked items. When having unranked or equal rank items shapes would be displayed after traces i.e. according to their order in data and layout.", + "dflt": 1000, + "editType": "style", + "valType": "number" + }, + "legendwidth": { + "description": "Sets the width (in px or fraction) of the legend for this trace.", + "editType": "style", + "min": 0, + "valType": "number" + }, + "link": { + "arrowlen": { + "description": "Sets the length (in px) of the links arrow, if 0 no arrow will be drawn.", + "dflt": 0, + "editType": "calc", + "min": 0, + "valType": "number" + }, + "color": { + "arrayOk": true, + "description": "Sets the `link` color. It can be a single value, or an array for specifying color for each `link`. If `link.color` is omitted, then by default, a translucent grey link will be used.", + "editType": "calc", + "valType": "color" + }, + "colorscales": { + "items": { + "concentrationscales": { + "cmax": { + "description": "Sets the upper bound of the color domain.", + "dflt": 1, + "editType": "calc", + "valType": "number" + }, + "cmin": { + "description": "Sets the lower bound of the color domain.", + "dflt": 0, + "editType": "calc", + "valType": "number" + }, + "colorscale": { + "description": "Sets the colorscale. The colorscale must be an array containing arrays mapping a normalized value to an rgb, rgba, hex, hsl, hsv, or named color string. At minimum, a mapping for the lowest (0) and highest (1) values are required. For example, `[[0, 'rgb(0,0,255)'], [1, 'rgb(255,0,0)']]`. To control the bounds of the colorscale in color space, use `cmin` and `cmax`. Alternatively, `colorscale` may be a palette name string of the following list: Blackbody,Bluered,Blues,Cividis,Earth,Electric,Greens,Greys,Hot,Jet,Picnic,Portland,Rainbow,RdBu,Reds,Viridis,YlGnBu,YlOrRd.", + "dflt": [ + [ + 0, + "white" + ], + [ + 1, + "black" +>>>>>>> b50bcc3af (Match arrowhead attributes for annotations) + ] + }, + "rangeselector": { + "activecolor": { + "description": "Sets the background color of the active range selector button.", + "editType": "plot", + "valType": "color" + }, + "bgcolor": { + "description": "Sets the background color of the range selector buttons.", + "dflt": "#eee", + "editType": "plot", + "valType": "color" + }, + "bordercolor": { + "description": "Sets the color of the border enclosing the range selector.", + "dflt": "#444", + "editType": "plot", + "valType": "color" + }, + "borderwidth": { + "description": "Sets the width (in px) of the border enclosing the range selector.", + "dflt": 0, + "editType": "plot", + "min": 0, + "valType": "number" + }, + "buttons": { + "items": { + "button": { + "count": { + "description": "Sets the number of steps to take to update the range. Use with `step` to specify the update interval.", + "dflt": 1, + "editType": "plot", + "min": 0, + "valType": "number" + }, + "description": "Sets the specifications for each buttons. By default, a range selector comes with no buttons.", + "editType": "plot", + "label": { + "description": "Sets the text label to appear on the button.", + "editType": "plot", + "valType": "string" + }, + "name": { + "description": "When used in a template, named items are created in the output figure in addition to any items the figure already has in this array. You can modify these items in the output figure by making your own item with `templateitemname` matching this `name` alongside your modifications (including `visible: false` or `enabled: false` to hide it). Has no effect outside of a template.", + "editType": "none", + "valType": "string" + }, + "role": "object", + "step": { + "description": "The unit of measurement that the `count` value will set the range by.", + "dflt": "month", + "editType": "plot", + "valType": "enumerated", + "values": [ + "month", + "year", + "day", + "hour", + "minute", + "second", + "all" + ] + }, + "stepmode": { + "description": "Sets the range update mode. If *backward*, the range update shifts the start of range back *count* times *step* milliseconds. If *todate*, the range update shifts the start of range back to the first timestamp from *count* times *step* milliseconds back. For example, with `step` set to *year* and `count` set to *1* the range update shifts the start of the range back to January 01 of the current year. Month and year *todate* are currently available only for the built-in (Gregorian) calendar.", + "dflt": "backward", + "editType": "plot", + "valType": "enumerated", + "values": [ + "backward", + "todate" + ] + }, + "templateitemname": { + "description": "Used to refer to a named item in this array in the template. Named items from the template will be created even without a matching item in the input figure, but you can modify one by making an item with `templateitemname` matching its `name`, alongside your modifications (including `visible: false` or `enabled: false` to hide it). If there is no template or no matching item, this item will be hidden unless you explicitly show it with `visible: true`.", + "editType": "calc", + "valType": "string" + }, + "visible": { + "description": "Determines whether or not this button is visible.", + "dflt": true, + "editType": "plot", + "valType": "boolean" + } + } + }, + "role": "object" + }, + "editType": "plot", + "font": { + "color": { + "editType": "plot", + "valType": "color" + }, + "description": "Sets the font of the range selector button text.", + "editType": "plot", + "family": { + "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", + "editType": "plot", + "noBlank": true, + "strict": true, + "valType": "string" + }, + "lineposition": { + "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", + "dflt": "none", + "editType": "plot", + "extras": [ + "none" + ], + "flags": [ + "under", + "over", + "through" + ], + "valType": "flaglist" + }, + "role": "object", + "shadow": { + "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", + "dflt": "none", + "editType": "plot", + "valType": "string" + }, + "size": { + "editType": "plot", + "min": 1, + "valType": "number" + }, + "style": { + "description": "Sets whether a font should be styled with a normal or italic face from its family.", + "dflt": "normal", + "editType": "plot", + "valType": "enumerated", + "values": [ + "normal", + "italic" + ] + }, + "textcase": { + "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", + "dflt": "normal", + "editType": "plot", + "valType": "enumerated", + "values": [ + "normal", + "word caps", + "upper", + "lower" + ] + }, + "variant": { + "description": "Sets the variant of the font.", + "dflt": "normal", + "editType": "plot", + "valType": "enumerated", + "values": [ + "normal", + "small-caps", + "all-small-caps", + "all-petite-caps", + "petite-caps", + "unicase" + ] + }, + "weight": { + "description": "Sets the weight (or boldness) of the font.", + "dflt": "normal", + "editType": "plot", + "extras": [ + "normal", + "bold" + ], + "max": 1000, + "min": 1, + "valType": "integer" + } + }, + "role": "object", + "visible": { + "description": "Determines whether or not this range selector is visible. Note that range selectors are only available for x axes of `type` set to or auto-typed to *date*.", + "editType": "plot", + "valType": "boolean" + }, + "x": { + "description": "Sets the x position (in normalized coordinates) of the range selector.", + "editType": "plot", + "max": 3, + "min": -2, + "valType": "number" + }, + "xanchor": { + "description": "Sets the range selector's horizontal position anchor. This anchor binds the `x` position to the *left*, *center* or *right* of the range selector.", + "dflt": "left", + "editType": "plot", + "valType": "enumerated", + "values": [ + "auto", + "left", + "center", + "right" + ] + }, + "y": { + "description": "Sets the y position (in normalized coordinates) of the range selector.", + "editType": "plot", + "max": 3, + "min": -2, + "valType": "number" + }, + "yanchor": { + "description": "Sets the range selector's vertical position anchor This anchor binds the `y` position to the *top*, *middle* or *bottom* of the range selector.", + "dflt": "bottom", + "editType": "plot", + "valType": "enumerated", + "values": [ + "auto", + "top", + "middle", + "bottom" + ] + } + }, + "rangeslider": { + "autorange": { + "description": "Determines whether or not the range slider range is computed in relation to the input data. If `range` is provided, then `autorange` is set to *false*.", + "dflt": true, + "editType": "calc", + "impliedEdits": {}, + "valType": "boolean" + }, + "bgcolor": { + "description": "Sets the background color of the range slider.", + "dflt": "#fff", + "editType": "plot", + "valType": "color" + }, + "bordercolor": { + "description": "Sets the border color of the range slider.", + "dflt": "#444", + "editType": "plot", + "valType": "color" + }, + "borderwidth": { + "description": "Sets the border width of the range slider.", + "dflt": 0, + "editType": "plot", + "min": 0, + "valType": "integer" + }, + "editType": "calc", + "range": { + "description": "Sets the range of the range slider. If not set, defaults to the full xaxis range. If the axis `type` is *log*, then you must take the log of your desired range. If the axis `type` is *date*, it should be date strings, like date data, though Date objects and unix milliseconds will be accepted and converted to strings. If the axis `type` is *category*, it should be numbers, using the scale where each category is assigned a serial number from zero in the order it appears.", + "editType": "calc", + "impliedEdits": { + "autorange": false + }, + "items": [ + { + "editType": "calc", + "impliedEdits": { + "^autorange": false + }, + "valType": "any" + }, + { + "editType": "calc", + "impliedEdits": { + "^autorange": false + }, + "valType": "any" + } + ], + "valType": "info_array" + }, + "role": "object", + "thickness": { + "description": "The height of the range slider as a fraction of the total plot area height.", + "dflt": 0.15, + "editType": "plot", + "max": 1, + "min": 0, + "valType": "number" + }, + "visible": { + "description": "Determines whether or not the range slider will be visible. If visible, perpendicular axes will be set to `fixedrange`", + "dflt": true, + "editType": "calc", + "valType": "boolean" + }, + "yaxis": { + "_isSubplotObj": true, + "editType": "calc", + "range": { + "description": "Sets the range of this axis for the rangeslider.", + "editType": "plot", + "items": [ + { + "editType": "plot", + "valType": "any" + }, + { + "editType": "plot", + "valType": "any" + } + ], + "valType": "info_array" + }, + "rangemode": { + "description": "Determines whether or not the range of this axis in the rangeslider use the same value than in the main plot when zooming in/out. If *auto*, the autorange will be used. If *fixed*, the `range` is used. If *match*, the current range of the corresponding y-axis on the main subplot is used.", + "dflt": "match", + "editType": "calc", + "valType": "enumerated", + "values": [ + "auto", + "fixed", + "match" + ] + }, + "role": "object" + } + }, + "role": "object", + "scaleanchor": { + "description": "If set to another axis id (e.g. `x2`, `y`), the range of this axis changes together with the range of the corresponding axis such that the scale of pixels per unit is in a constant ratio. Both axes are still zoomable, but when you zoom one, the other will zoom the same amount, keeping a fixed midpoint. `constrain` and `constraintoward` determine how we enforce the constraint. You can chain these, ie `yaxis: {scaleanchor: *x*}, xaxis2: {scaleanchor: *y*}` but you can only link axes of the same `type`. The linked axis can have the opposite letter (to constrain the aspect ratio) or the same letter (to match scales across subplots). Loops (`yaxis: {scaleanchor: *x*}, xaxis: {scaleanchor: *y*}` or longer) are redundant and the last constraint encountered will be ignored to avoid possible inconsistent constraints via `scaleratio`. Note that setting axes simultaneously in both a `scaleanchor` and a `matches` constraint is currently forbidden. Setting `false` allows to remove a default constraint (occasionally, you may need to prevent a default `scaleanchor` constraint from being applied, eg. when having an image trace `yaxis: {scaleanchor: \"x\"}` is set automatically in order for pixels to be rendered as squares, setting `yaxis: {scaleanchor: false}` allows to remove the constraint).", + "editType": "plot", + "valType": "enumerated", + "values": [ + "/^x([2-9]|[1-9][0-9]+)?( domain)?$/", + "/^y([2-9]|[1-9][0-9]+)?( domain)?$/", + false + ] + }, + "scaleratio": { + "description": "If this axis is linked to another by `scaleanchor`, this determines the pixel to unit scale ratio. For example, if this value is 10, then every unit on this axis spans 10 times the number of pixels as a unit on the linked axis. Use this for example to create an elevation profile where the vertical scale is exaggerated a fixed amount with respect to the horizontal.", + "dflt": 1, + "editType": "plot", + "min": 0, + "valType": "number" + }, + "separatethousands": { + "description": "If \"true\", even 4-digit integers are separated", + "dflt": false, + "editType": "ticks", + "valType": "boolean" + }, + "showdividers": { + "description": "Determines whether or not a dividers are drawn between the category levels of this axis. Only has an effect on *multicategory* axes.", + "dflt": true, + "editType": "ticks", + "valType": "boolean" + }, + "showexponent": { + "description": "If *all*, all exponents are shown besides their significands. If *first*, only the exponent of the first tick is shown. If *last*, only the exponent of the last tick is shown. If *none*, no exponents appear.", + "dflt": "all", + "editType": "ticks", + "valType": "enumerated", + "values": [ + "all", + "first", + "last", + "none" + ] + }, + "showgrid": { + "description": "Determines whether or not grid lines are drawn. If *true*, the grid lines are drawn at every tick mark.", + "editType": "ticks", + "valType": "boolean" + }, + "showline": { + "description": "Determines whether or not a line bounding this axis is drawn.", + "dflt": false, + "editType": "ticks+layoutstyle", + "valType": "boolean" + }, + "showspikes": { + "description": "Determines whether or not spikes (aka droplines) are drawn for this axis. Note: This only takes affect when hovermode = closest", + "dflt": false, + "editType": "modebar", + "valType": "boolean" + }, + "showticklabels": { + "description": "Determines whether or not the tick labels are drawn.", + "dflt": true, + "editType": "ticks", + "valType": "boolean" + }, + "showtickprefix": { + "description": "If *all*, all tick labels are displayed with a prefix. If *first*, only the first tick is displayed with a prefix. If *last*, only the last tick is displayed with a suffix. If *none*, tick prefixes are hidden.", + "dflt": "all", + "editType": "ticks", + "valType": "enumerated", + "values": [ + "all", + "first", + "last", + "none" + ] + }, + "showticksuffix": { + "description": "Same as `showtickprefix` but for tick suffixes.", + "dflt": "all", + "editType": "ticks", + "valType": "enumerated", + "values": [ + "all", + "first", + "last", + "none" + ] + }, + "side": { + "description": "Determines whether a x (y) axis is positioned at the *bottom* (*left*) or *top* (*right*) of the plotting area.", + "editType": "plot", + "valType": "enumerated", + "values": [ + "top", + "bottom", + "left", + "right" + ] + }, + "spikecolor": { + "description": "Sets the spike color. If undefined, will use the series color", + "dflt": null, + "editType": "none", + "valType": "color" + }, + "spikedash": { + "description": "Sets the dash style of lines. Set to a dash type string (*solid*, *dot*, *dash*, *longdash*, *dashdot*, or *longdashdot*) or a dash length list in px (eg *5px,10px,2px,2px*).", + "dflt": "dash", + "editType": "none", + "valType": "string", + "values": [ + "solid", + "dot", + "dash", + "longdash", + "dashdot", + "longdashdot" + ] + }, + "spikemode": { + "description": "Determines the drawing mode for the spike line If *toaxis*, the line is drawn from the data point to the axis the series is plotted on. If *across*, the line is drawn across the entire plot area, and supercedes *toaxis*. If *marker*, then a marker dot is drawn on the axis the series is plotted on", + "dflt": "toaxis", + "editType": "none", + "flags": [ + "toaxis", + "across", + "marker" + ], + "valType": "flaglist" + }, + "spikesnap": { + "description": "Determines whether spikelines are stuck to the cursor or to the closest datapoints.", + "dflt": "hovered data", + "editType": "none", + "valType": "enumerated", + "values": [ + "data", + "cursor", + "hovered data" + ] + }, + "spikethickness": { + "description": "Sets the width (in px) of the zero line.", + "dflt": 3, + "editType": "none", + "valType": "number" + }, + "tick0": { + "description": "Sets the placement of the first tick on this axis. Use with `dtick`. If the axis `type` is *log*, then you must take the log of your starting tick (e.g. to set the starting tick to 100, set the `tick0` to 2) except when `dtick`=*L* (see `dtick` for more info). If the axis `type` is *date*, it should be a date string, like date data. If the axis `type` is *category*, it should be a number, using the scale where each category is assigned a serial number from zero in the order it appears.", + "editType": "ticks", + "impliedEdits": { + "tickmode": "linear" + }, + "valType": "any" + }, + "tickangle": { + "description": "Sets the angle of the tick labels with respect to the horizontal. For example, a `tickangle` of -90 draws the tick labels vertically.", + "dflt": "auto", + "editType": "ticks", + "valType": "angle" + }, + "tickcolor": { + "description": "Sets the tick color.", + "dflt": "#444", + "editType": "ticks", + "valType": "color" + }, + "tickfont": { + "color": { + "editType": "ticks", + "valType": "color" + }, + "description": "Sets the tick font.", + "editType": "ticks", + "family": { + "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", + "editType": "ticks", + "noBlank": true, + "strict": true, + "valType": "string" + }, + "lineposition": { + "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", + "dflt": "none", + "editType": "ticks", + "extras": [ + "none" + ], + "flags": [ + "under", + "over", + "through" + ], + "valType": "flaglist" + }, + "role": "object", + "shadow": { + "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", + "dflt": "none", + "editType": "ticks", + "valType": "string" + }, + "size": { + "editType": "ticks", + "min": 1, + "valType": "number" + }, + "style": { + "description": "Sets whether a font should be styled with a normal or italic face from its family.", + "dflt": "normal", + "editType": "ticks", + "valType": "enumerated", + "values": [ + "normal", + "italic" + ] + }, + "textcase": { + "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", + "dflt": "normal", + "editType": "ticks", + "valType": "enumerated", + "values": [ + "normal", + "word caps", + "upper", + "lower" + ] + }, + "variant": { + "description": "Sets the variant of the font.", + "dflt": "normal", + "editType": "ticks", + "valType": "enumerated", + "values": [ + "normal", + "small-caps", + "all-small-caps", + "all-petite-caps", + "petite-caps", + "unicase" + ] + }, + "weight": { + "description": "Sets the weight (or boldness) of the font.", + "dflt": "normal", + "editType": "ticks", + "extras": [ + "normal", + "bold" + ], + "max": 1000, + "min": 1, + "valType": "integer" + } + }, + "tickformat": { + "description": "Sets the tick label formatting rule using d3 formatting mini-languages which are very similar to those in Python. For numbers, see: https://github.com/d3/d3-format/tree/v1.4.5#d3-format. And for dates see: https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format. We add two items to d3's date formatter: *%h* for half of the year as a decimal number as well as *%{n}f* for fractional seconds with n digits. For example, *2016-10-13 09:15:23.456* with tickformat *%H~%M~%S.%2f* would display *09~15~23.46*", + "dflt": "", + "editType": "ticks", + "valType": "string" + }, + "tickformatstops": { + "items": { + "tickformatstop": { + "dtickrange": { + "description": "range [*min*, *max*], where *min*, *max* - dtick values which describe some zoom level, it is possible to omit *min* or *max* value by passing *null*", + "editType": "ticks", + "items": [ + { + "editType": "ticks", + "valType": "any" + }, + { + "editType": "ticks", + "valType": "any" + } + ], + "valType": "info_array" + }, + "editType": "ticks", + "enabled": { + "description": "Determines whether or not this stop is used. If `false`, this stop is ignored even within its `dtickrange`.", + "dflt": true, + "editType": "ticks", + "valType": "boolean" + }, + "name": { + "description": "When used in a template, named items are created in the output figure in addition to any items the figure already has in this array. You can modify these items in the output figure by making your own item with `templateitemname` matching this `name` alongside your modifications (including `visible: false` or `enabled: false` to hide it). Has no effect outside of a template.", + "editType": "none", + "valType": "string" + }, + "role": "object", + "templateitemname": { + "description": "Used to refer to a named item in this array in the template. Named items from the template will be created even without a matching item in the input figure, but you can modify one by making an item with `templateitemname` matching its `name`, alongside your modifications (including `visible: false` or `enabled: false` to hide it). If there is no template or no matching item, this item will be hidden unless you explicitly show it with `visible: true`.", + "editType": "calc", + "valType": "string" + }, + "value": { + "description": "string - dtickformat for described zoom level, the same as *tickformat*", + "dflt": "", + "editType": "ticks", + "valType": "string" + } + } + }, + "role": "object" + }, + "ticklabelindex": { + "arrayOk": true, + "description": "Only for axes with `type` *date* or *linear*. Instead of drawing the major tick label, draw the label for the minor tick that is n positions away from the major tick. E.g. to always draw the label for the minor tick before each major tick, choose `ticklabelindex` -1. This is useful for date axes with `ticklabelmode` *period* if you want to label the period that ends with each major tick instead of the period that begins there.", + "editType": "calc", + "valType": "integer" + }, + "ticklabelindexsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `ticklabelindex`.", + "editType": "none", + "valType": "string" + }, + "ticklabelmode": { + "description": "Determines where tick labels are drawn with respect to their corresponding ticks and grid lines. Only has an effect for axes of `type` *date* When set to *period*, tick labels are drawn in the middle of the period between ticks.", + "dflt": "instant", + "editType": "ticks", + "valType": "enumerated", + "values": [ + "instant", + "period" + ] + }, + "ticklabeloverflow": { + "description": "Determines how we handle tick labels that would overflow either the graph div or the domain of the axis. The default value for inside tick labels is *hide past domain*. Otherwise on *category* and *multicategory* axes the default is *allow*. In other cases the default is *hide past div*.", + "editType": "calc", + "valType": "enumerated", + "values": [ + "allow", + "hide past div", + "hide past domain" + ] + }, + "ticklabelposition": { + "description": "Determines where tick labels are drawn with respect to the axis. Please note that top or bottom has no effect on x axes or when `ticklabelmode` is set to *period* or when `tickson` is set to *boundaries*. Similarly, left or right has no effect on y axes or when `ticklabelmode` is set to *period* or when `tickson` is set to *boundaries*. Has no effect on *multicategory* axes. When used on axes linked by `matches` or `scaleanchor`, no extra padding for inside labels would be added by autorange, so that the scales could match.", + "dflt": "outside", + "editType": "calc", + "valType": "enumerated", + "values": [ + "outside", + "inside", + "outside top", + "inside top", + "outside left", + "inside left", + "outside right", + "inside right", + "outside bottom", + "inside bottom" + ] + }, + "ticklabelshift": { + "description": "Shifts the tick labels by the specified number of pixels in parallel to the axis. Positive values move the labels in the positive direction of the axis.", + "dflt": 0, + "editType": "ticks", + "valType": "integer" + }, + "ticklabelstandoff": { + "description": "Sets the standoff distance (in px) between the axis tick labels and their default position. A positive `ticklabelstandoff` moves the labels farther away from the plot area if `ticklabelposition` is *outside*, and deeper into the plot area if `ticklabelposition` is *inside*. A negative `ticklabelstandoff` works in the opposite direction, moving outside ticks towards the plot area and inside ticks towards the outside. If the negative value is large enough, inside ticks can even end up outside and vice versa.", + "dflt": 0, + "editType": "ticks", + "valType": "integer" + }, + "ticklabelstep": { + "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", + "dflt": 1, + "editType": "ticks", + "min": 1, + "valType": "integer" + }, + "ticklen": { + "description": "Sets the tick length (in px).", + "dflt": 5, + "editType": "ticks", + "min": 0, + "valType": "number" + }, + "tickmode": { + "description": "Sets the tick mode for this axis. If *auto*, the number of ticks is set via `nticks`. If *linear*, the placement of the ticks is determined by a starting position `tick0` and a tick step `dtick` (*linear* is the default value if `tick0` and `dtick` are provided). If *array*, the placement of the ticks is set via `tickvals` and the tick text is `ticktext`. (*array* is the default value if `tickvals` is provided). If *sync*, the number of ticks will sync with the overlayed axis set by `overlaying` property.", + "editType": "ticks", + "impliedEdits": {}, + "valType": "enumerated", + "values": [ + "auto", + "linear", + "array", + "sync" + ] + }, + "tickprefix": { + "description": "Sets a tick label prefix.", + "dflt": "", + "editType": "ticks", + "valType": "string" + }, + "ticks": { + "description": "Determines whether ticks are drawn or not. If **, this axis' ticks are not drawn. If *outside* (*inside*), this axis' are drawn outside (inside) the axis lines.", + "editType": "ticks", + "valType": "enumerated", + "values": [ + "outside", + "inside", + "" + ] + }, + "tickson": { + "description": "Determines where ticks and grid lines are drawn with respect to their corresponding tick labels. Only has an effect for axes of `type` *category* or *multicategory*. When set to *boundaries*, ticks and grid lines are drawn half a category to the left/bottom of labels.", + "dflt": "labels", + "editType": "ticks", + "valType": "enumerated", + "values": [ + "labels", + "boundaries" + ] + }, + "ticksuffix": { + "description": "Sets a tick label suffix.", + "dflt": "", + "editType": "ticks", + "valType": "string" + }, + "ticktext": { + "description": "Sets the text displayed at the ticks position via `tickvals`. Only has an effect if `tickmode` is set to *array*. Used with `tickvals`.", + "editType": "ticks", + "valType": "data_array" + }, + "ticktextsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `ticktext`.", + "editType": "none", + "valType": "string" + }, + "tickvals": { + "description": "Sets the values at which ticks on this axis appear. Only has an effect if `tickmode` is set to *array*. Used with `ticktext`.", + "editType": "ticks", + "valType": "data_array" + }, + "tickvalssrc": { + "description": "Sets the source reference on Chart Studio Cloud for `tickvals`.", + "editType": "none", + "valType": "string" + }, + "tickwidth": { + "description": "Sets the tick width (in px).", + "dflt": 1, + "editType": "ticks", + "min": 0, + "valType": "number" + }, + "title": { + "editType": "ticks", + "font": { + "color": { + "editType": "ticks", + "valType": "color" + }, + "description": "Sets this axis' title font.", + "editType": "ticks", + "family": { + "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", + "editType": "ticks", + "noBlank": true, + "strict": true, + "valType": "string" + }, + "lineposition": { + "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", + "dflt": "none", + "editType": "ticks", + "extras": [ + "none" + ], + "flags": [ + "under", + "over", + "through" + ], + "valType": "flaglist" + }, + "role": "object", + "shadow": { + "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", + "dflt": "none", + "editType": "ticks", + "valType": "string" + }, + "size": { + "editType": "ticks", + "min": 1, + "valType": "number" + }, + "style": { + "description": "Sets whether a font should be styled with a normal or italic face from its family.", + "dflt": "normal", + "editType": "ticks", + "valType": "enumerated", + "values": [ + "normal", + "italic" + ] + }, + "textcase": { + "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", + "dflt": "normal", + "editType": "ticks", + "valType": "enumerated", + "values": [ + "normal", + "word caps", + "upper", + "lower" + ] + }, + "variant": { + "description": "Sets the variant of the font.", + "dflt": "normal", + "editType": "ticks", + "valType": "enumerated", + "values": [ + "normal", + "small-caps", + "all-small-caps", + "all-petite-caps", + "petite-caps", + "unicase" + ] + }, + "weight": { + "description": "Sets the weight (or boldness) of the font.", + "dflt": "normal", + "editType": "ticks", + "extras": [ + "normal", + "bold" + ], + "max": 1000, + "min": 1, + "valType": "integer" + } + }, + "role": "object", + "standoff": { + "description": "Sets the standoff distance (in px) between the axis labels and the title text The default value is a function of the axis tick labels, the title `font.size` and the axis `linewidth`. Note that the axis title position is always constrained within the margins, so the actual standoff distance is always less than the set or default value. By setting `standoff` and turning on `automargin`, plotly.js will push the margins to fit the axis title at given standoff distance.", + "editType": "ticks", + "min": 0, + "valType": "number" + }, + "text": { + "description": "Sets the title of this axis.", + "editType": "ticks", + "valType": "string" + } + }, +<<<<<<< HEAD +======= + "role": "object", + "shadow": { + "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", + "dflt": "none", + "editType": "calc", + "valType": "string" + }, + "size": { + "editType": "calc", + "min": 1, + "valType": "number" + }, + "style": { + "description": "Sets whether a font should be styled with a normal or italic face from its family.", + "dflt": "normal", + "editType": "calc", + "valType": "enumerated", + "values": [ + "normal", + "italic" + ] + }, + "textcase": { + "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", + "dflt": "normal", + "editType": "calc", + "valType": "enumerated", + "values": [ + "normal", + "word caps", + "upper", + "lower" + ] + }, + "variant": { + "description": "Sets the variant of the font.", + "dflt": "normal", + "editType": "calc", + "valType": "enumerated", + "values": [ + "normal", + "small-caps", + "all-small-caps", + "all-petite-caps", + "petite-caps", + "unicase" + ] + }, + "weight": { + "description": "Sets the weight (or boldness) of the font.", + "dflt": "normal", + "editType": "calc", + "extras": [ + "normal", + "bold" + ], + "max": 1000, + "min": 1, + "valType": "integer" + } + }, + "role": "object", + "side": { + "description": "Determines the location of color bar's title with respect to the color bar. Defaults to *top* when `orientation` if *v* and defaults to *right* when `orientation` if *h*.", + "editType": "calc", + "valType": "enumerated", + "values": [ + "right", + "top", + "bottom" + ] + }, + "text": { + "description": "Sets the title of the color bar.", + "editType": "calc", + "valType": "string" + } + }, + "x": { + "description": "Sets the x position with respect to `xref` of the color bar (in plot fraction). When `xref` is *paper*, defaults to 1.02 when `orientation` is *v* and 0.5 when `orientation` is *h*. When `xref` is *container*, defaults to *1* when `orientation` is *v* and 0.5 when `orientation` is *h*. Must be between *0* and *1* if `xref` is *container* and between *-2* and *3* if `xref` is *paper*.", + "editType": "calc", + "valType": "number" + }, + "xanchor": { + "description": "Sets this color bar's horizontal position anchor. This anchor binds the `x` position to the *left*, *center* or *right* of the color bar. Defaults to *left* when `orientation` is *v* and *center* when `orientation` is *h*.", + "editType": "calc", + "valType": "enumerated", + "values": [ + "left", + "center", + "right" + ] + }, + "xpad": { + "description": "Sets the amount of padding (in px) along the x direction.", + "dflt": 10, + "editType": "calc", + "min": 0, + "valType": "number" + }, + "xref": { + "description": "Sets the container `x` refers to. *container* spans the entire `width` of the plot. *paper* refers to the width of the plotting area only.", + "dflt": "paper", + "editType": "calc", + "valType": "enumerated", + "values": [ + "container", + "paper" + ] + }, + "y": { + "description": "Sets the y position with respect to `yref` of the color bar (in plot fraction). When `yref` is *paper*, defaults to 0.5 when `orientation` is *v* and 1.02 when `orientation` is *h*. When `yref` is *container*, defaults to 0.5 when `orientation` is *v* and 1 when `orientation` is *h*. Must be between *0* and *1* if `yref` is *container* and between *-2* and *3* if `yref` is *paper*.", + "editType": "calc", + "valType": "number" + }, + "yanchor": { + "description": "Sets this color bar's vertical position anchor This anchor binds the `y` position to the *top*, *middle* or *bottom* of the color bar. Defaults to *middle* when `orientation` is *v* and *bottom* when `orientation` is *h*.", + "editType": "calc", + "valType": "enumerated", + "values": [ + "top", + "middle", + "bottom" + ] + }, + "ypad": { + "description": "Sets the amount of padding (in px) along the y direction.", + "dflt": 10, + "editType": "calc", + "min": 0, + "valType": "number" + }, + "yref": { + "description": "Sets the container `y` refers to. *container* spans the entire `height` of the plot. *paper* refers to the height of the plotting area only.", + "dflt": "paper", + "editType": "calc", + "valType": "enumerated", + "values": [ + "container", + "paper" + ] + } + }, + "colorscale": { + "description": "Sets the colorscale. Has an effect only if in `marker.color` is set to a numerical array. The colorscale must be an array containing arrays mapping a normalized value to an rgb, rgba, hex, hsl, hsv, or named color string. At minimum, a mapping for the lowest (0) and highest (1) values are required. For example, `[[0, 'rgb(0,0,255)'], [1, 'rgb(255,0,0)']]`. To control the bounds of the colorscale in color space, use `marker.cmin` and `marker.cmax`. Alternatively, `colorscale` may be a palette name string of the following list: Blackbody,Bluered,Blues,Cividis,Earth,Electric,Greens,Greys,Hot,Jet,Picnic,Portland,Rainbow,RdBu,Reds,Viridis,YlGnBu,YlOrRd.", + "dflt": null, + "editType": "calc", + "impliedEdits": { + "autocolorscale": false + }, + "valType": "colorscale" + }, + "colorsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `color`.", + "editType": "none", + "valType": "string" + }, + "editType": "calc", + "opacity": { + "arrayOk": true, + "description": "Sets the marker opacity.", + "editType": "calc", + "max": 1, + "min": 0, + "valType": "number" + }, + "opacitysrc": { + "description": "Sets the source reference on Chart Studio Cloud for `opacity`.", + "editType": "none", + "valType": "string" + }, + "reversescale": { + "description": "Reverses the color mapping if true. Has an effect only if in `marker.color` is set to a numerical array. If true, `marker.cmin` will correspond to the last color in the array and `marker.cmax` will correspond to the first color.", + "dflt": false, + "editType": "calc", + "valType": "boolean" + }, + "role": "object", + "showscale": { + "description": "Determines whether or not a colorbar is displayed for this trace. Has an effect only if in `marker.color` is set to a numerical array.", + "dflt": false, + "editType": "calc", + "valType": "boolean" + }, + "size": { + "arrayOk": true, + "description": "Sets the marker size (in px).", + "dflt": 6, + "editType": "calc", + "min": 0, + "valType": "number" + }, + "sizemin": { + "description": "Has an effect only if `marker.size` is set to a numerical array. Sets the minimum size (in px) of the rendered marker points.", + "dflt": 0, + "editType": "calc", + "min": 0, + "valType": "number" + }, + "sizemode": { + "description": "Has an effect only if `marker.size` is set to a numerical array. Sets the rule for which the data in `size` is converted to pixels.", + "dflt": "diameter", + "editType": "calc", + "valType": "enumerated", + "values": [ + "diameter", + "area" + ] + }, + "sizeref": { + "description": "Has an effect only if `marker.size` is set to a numerical array. Sets the scale factor used to determine the rendered size of marker points. Use with `sizemin` and `sizemode`.", + "dflt": 1, + "editType": "calc", + "valType": "number" + }, + "sizesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `size`.", + "editType": "none", + "valType": "string" + }, + "symbol": { + "arrayOk": true, + "description": "Sets the marker symbol. Full list: https://www.mapbox.com/maki-icons/ Note that the array `marker.color` and `marker.size` are only available for *circle* symbols.", + "dflt": "circle", + "editType": "calc", + "valType": "string" + }, + "symbolsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `symbol`.", + "editType": "none", + "valType": "string" + } + }, + "meta": { + "arrayOk": true, + "description": "Assigns extra meta information associated with this trace that can be used in various text attributes. Attributes such as trace `name`, graph, axis and colorbar `title.text`, annotation `text` `rangeselector`, `updatemenues` and `sliders` `label` text all support `meta`. To access the trace `meta` values in an attribute in the same trace, simply use `%{meta[i]}` where `i` is the index or key of the `meta` item in question. To access trace `meta` in layout attributes, use `%{data[n[.meta[i]}` where `i` is the index or key of the `meta` and `n` is the trace index.", + "editType": "plot", + "valType": "any" + }, + "metasrc": { + "description": "Sets the source reference on Chart Studio Cloud for `meta`.", + "editType": "none", + "valType": "string" + }, + "mode": { + "description": "Determines the drawing mode for this scatter trace. If the provided `mode` includes *text* then the `text` elements appear at the coordinates. Otherwise, the `text` elements appear on hover.", + "dflt": "markers", + "editType": "calc", + "extras": [ + "none" + ], + "flags": [ + "lines", + "markers", + "text" + ], + "valType": "flaglist" + }, + "name": { + "description": "Sets the trace name. The trace name appears as the legend item and on hover.", + "editType": "style", + "valType": "string" + }, + "opacity": { + "description": "Sets the opacity of the trace.", + "dflt": 1, + "editType": "style", + "max": 1, + "min": 0, + "valType": "number" + }, + "selected": { + "editType": "calc", + "marker": { + "color": { + "description": "Sets the marker color of selected points.", + "editType": "calc", + "valType": "color" + }, + "editType": "calc", + "opacity": { + "description": "Sets the marker opacity of selected points.", + "editType": "calc", + "max": 1, + "min": 0, + "valType": "number" + }, + "role": "object", + "size": { + "description": "Sets the marker size of selected points.", + "editType": "calc", + "min": 0, + "valType": "number" + } + }, + "role": "object" + }, + "selectedpoints": { + "description": "Array containing integer indices of selected points. Has an effect only for traces that support selections. Note that an empty array means an empty selection where the `unselected` are turned on for all points, whereas, any other non-array values means no selection all where the `selected` and `unselected` styles have no effect.", + "editType": "calc", + "valType": "any" + }, + "showlegend": { + "description": "Determines whether or not an item corresponding to this trace is shown in the legend.", + "dflt": true, + "editType": "style", + "valType": "boolean" + }, + "stream": { + "editType": "calc", + "maxpoints": { + "description": "Sets the maximum number of points to keep on the plots from an incoming stream. If `maxpoints` is set to *50*, only the newest 50 points will be displayed on the plot.", + "dflt": 500, + "editType": "calc", + "max": 10000, + "min": 0, + "valType": "number" + }, + "role": "object", + "token": { + "description": "The stream id number links a data trace on a plot with a stream. See https://chart-studio.plotly.com/settings for more details.", + "editType": "calc", + "noBlank": true, + "strict": true, + "valType": "string" + } + }, + "subplot": { + "description": "Sets a reference between this trace's data coordinates and a map subplot. If *map* (the default value), the data refer to `layout.map`. If *map2*, the data refer to `layout.map2`, and so on.", + "dflt": "map", + "editType": "calc", + "valType": "subplotid" + }, + "text": { + "arrayOk": true, + "description": "Sets text elements associated with each (lon,lat) pair If a single string, the same string appears over all the data points. If an array of string, the items are mapped in order to the this trace's (lon,lat) coordinates. If trace `hoverinfo` contains a *text* flag and *hovertext* is not set, these elements will be seen in the hover labels.", + "dflt": "", + "editType": "calc", + "valType": "string" + }, + "textfont": { + "color": { + "editType": "calc", + "valType": "color" + }, + "description": "Sets the icon text font (color=map.layer.paint.text-color, size=map.layer.layout.text-size). Has an effect only when `type` is set to *symbol*.", + "editType": "calc", + "family": { + "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", + "dflt": "Open Sans Regular, Arial Unicode MS Regular", + "editType": "calc", + "noBlank": true, + "strict": true, + "valType": "string" + }, + "role": "object", + "size": { + "editType": "calc", + "min": 1, + "valType": "number" + }, + "style": { + "description": "Sets whether a font should be styled with a normal or italic face from its family.", + "dflt": "normal", + "editType": "calc", + "valType": "enumerated", + "values": [ + "normal", + "italic" + ] + }, + "weight": { + "description": "Sets the weight (or boldness) of the font.", + "dflt": "normal", + "editType": "calc", + "extras": [ + "normal", + "bold" + ], + "max": 1000, + "min": 1, + "valType": "integer" + } + }, + "textposition": { + "arrayOk": false, + "description": "Sets the positions of the `text` elements with respects to the (x,y) coordinates.", + "dflt": "middle center", + "editType": "calc", + "valType": "enumerated", + "values": [ + "top left", + "top center", + "top right", + "middle left", + "middle center", + "middle right", + "bottom left", + "bottom center", + "bottom right" + ] + }, + "textsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `text`.", + "editType": "none", + "valType": "string" + }, + "texttemplate": { + "arrayOk": true, + "description": "Template string used for rendering the information text that appears on points. Note that this will override `textinfo`. Variables are inserted using %{variable}, for example \"y: %{y}\". Numbers are formatted using d3-format's syntax %{variable:d3-format}, for example \"Price: %{y:$.2f}\". https://github.com/d3/d3-format/tree/v1.4.5#d3-format for details on the formatting syntax. Dates are formatted using d3-time-format's syntax %{variable|d3-time-format}, for example \"Day: %{2019-01-01|%A}\". https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format for details on the date formatting syntax. Variables that can't be found will be replaced with the specifier. For example, a template of \"data: %{x}, %{y}\" will result in a value of \"data: 1, %{y}\" if x is 1 and y is missing. Variables with an undefined value will be replaced with the fallback value. All attributes that can be specified per-point (the ones that are `arrayOk: true`) are available. Finally, the template string has access to variables `lat`, `lon` and `text`.", + "dflt": "", + "editType": "calc", + "valType": "string" + }, + "texttemplatefallback": { + "description": "Fallback string that's displayed when a variable referenced in a template is missing. If the boolean value 'false' is passed in, the specifier with the missing variable will be displayed.", + "dflt": "-", + "editType": "calc", + "valType": "any" + }, + "texttemplatesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `texttemplate`.", + "editType": "none", + "valType": "string" + }, + "type": "scattermap", + "uid": { + "description": "Assign an id to this trace, Use this to provide object constancy between traces during animations and transitions.", + "editType": "plot", + "valType": "string" + }, + "uirevision": { + "description": "Controls persistence of some user-driven changes to the trace: `constraintrange` in `parcoords` traces, as well as some `editable: true` modifications such as `name` and `colorbar.title`. Defaults to `layout.uirevision`. Note that other user-driven trace attribute changes are controlled by `layout` attributes: `trace.visible` is controlled by `layout.legend.uirevision`, `selectedpoints` is controlled by `layout.selectionrevision`, and `colorbar.(x|y)` (accessible with `config: {editable: true}`) is controlled by `layout.editrevision`. Trace changes are tracked by `uid`, which only falls back on trace index if no `uid` is provided. So if your app can add/remove traces before the end of the `data` array, such that the same trace has a different index, you can still preserve user-driven changes if you give each trace a `uid` that stays with it as it moves.", + "editType": "none", + "valType": "any" + }, + "unselected": { + "editType": "calc", + "marker": { + "color": { + "description": "Sets the marker color of unselected points, applied only when a selection exists.", + "editType": "calc", + "valType": "color" + }, + "editType": "calc", + "opacity": { + "description": "Sets the marker opacity of unselected points, applied only when a selection exists.", + "editType": "calc", + "max": 1, + "min": 0, + "valType": "number" + }, + "role": "object", + "size": { + "description": "Sets the marker size of unselected points, applied only when a selection exists.", + "editType": "calc", + "min": 0, + "valType": "number" + } + }, + "role": "object" + }, + "visible": { + "description": "Determines whether or not this trace is visible. If *legendonly*, the trace is not drawn, but can appear as a legend item (provided that the legend itself is visible).", + "dflt": true, + "editType": "calc", + "valType": "enumerated", + "values": [ + true, + false, + "legendonly" + ] + } + }, + "categories": [ + "map", + "gl", + "symbols", + "showLegend", + "scatter-like" + ], + "meta": { + "description": "The data visualized as scatter point, lines or marker symbols on a MapLibre GL geographic map is provided by longitude/latitude pairs in `lon` and `lat`.", + "hrName": "scatter_map" + }, + "type": "scattermap" + }, + "scattermapbox": { + "animatable": false, + "attributes": { + "below": { + "description": "Determines if this scattermapbox trace's layers are to be inserted before the layer with the specified ID. By default, scattermapbox layers are inserted above all the base layers. To place the scattermapbox layers above every other layer, set `below` to *''*.", + "editType": "calc", + "valType": "string" + }, + "cluster": { + "color": { + "arrayOk": true, + "description": "Sets the color for each cluster step.", + "editType": "calc", + "valType": "color" + }, + "colorsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `color`.", + "editType": "none", + "valType": "string" + }, + "editType": "calc", + "enabled": { + "description": "Determines whether clustering is enabled or disabled.", + "editType": "calc", + "valType": "boolean" + }, + "maxzoom": { + "description": "Sets the maximum zoom level. At zoom levels equal to or greater than this, points will never be clustered.", + "dflt": 24, + "editType": "calc", + "max": 24, + "min": 0, + "valType": "number" + }, + "opacity": { + "arrayOk": true, + "description": "Sets the marker opacity.", + "dflt": 1, + "editType": "calc", + "max": 1, + "min": 0, + "valType": "number" + }, + "opacitysrc": { + "description": "Sets the source reference on Chart Studio Cloud for `opacity`.", + "editType": "none", + "valType": "string" + }, + "role": "object", + "size": { + "arrayOk": true, + "description": "Sets the size for each cluster step.", + "dflt": 20, + "editType": "calc", + "min": 0, + "valType": "number" + }, + "sizesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `size`.", + "editType": "none", + "valType": "string" + }, + "step": { + "arrayOk": true, + "description": "Sets how many points it takes to create a cluster or advance to the next cluster step. Use this in conjunction with arrays for `size` and / or `color`. If an integer, steps start at multiples of this number. If an array, each step extends from the given value until one less than the next value.", + "dflt": -1, + "editType": "calc", + "min": -1, + "valType": "number" + }, + "stepsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `step`.", + "editType": "none", + "valType": "string" + } + }, + "connectgaps": { + "description": "Determines whether or not gaps (i.e. {nan} or missing values) in the provided data arrays are connected.", + "dflt": false, + "editType": "calc", + "valType": "boolean" + }, + "customdata": { + "description": "Assigns extra data each datum. This may be useful when listening to hover, click and selection events. Note that, *scatter* traces also appends customdata items in the markers DOM elements", + "editType": "calc", + "valType": "data_array" + }, + "customdatasrc": { + "description": "Sets the source reference on Chart Studio Cloud for `customdata`.", + "editType": "none", + "valType": "string" + }, + "fill": { + "description": "Sets the area to fill with a solid color. Use with `fillcolor` if not *none*. *toself* connects the endpoints of the trace (or each segment of the trace if it has gaps) into a closed shape.", + "dflt": "none", + "editType": "calc", + "valType": "enumerated", + "values": [ + "none", + "toself" + ] + }, + "fillcolor": { + "description": "Sets the fill color. Defaults to a half-transparent variant of the line color, marker color, or marker line color, whichever is available.", + "editType": "calc", + "valType": "color" + }, + "hoverinfo": { + "arrayOk": true, + "description": "Determines which trace information appear on hover. If `none` or `skip` are set, no information is displayed upon hovering. But, if `none` is set, click and hover events are still fired.", + "dflt": "all", + "editType": "calc", + "extras": [ + "all", + "none", + "skip" + ], + "flags": [ + "lon", + "lat", + "text", + "name" + ], + "valType": "flaglist" + }, + "hoverinfosrc": { + "description": "Sets the source reference on Chart Studio Cloud for `hoverinfo`.", + "editType": "none", + "valType": "string" + }, + "hoverlabel": { + "align": { + "arrayOk": true, + "description": "Sets the horizontal alignment of the text content within hover label box. Has an effect only if the hover label text spans more two or more lines", + "dflt": "auto", + "editType": "none", + "valType": "enumerated", + "values": [ + "left", + "right", + "auto" + ] + }, + "alignsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `align`.", + "editType": "none", + "valType": "string" + }, + "bgcolor": { + "arrayOk": true, + "description": "Sets the background color of the hover labels for this trace", + "editType": "none", + "valType": "color" + }, + "bgcolorsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `bgcolor`.", + "editType": "none", + "valType": "string" + }, + "bordercolor": { + "arrayOk": true, + "description": "Sets the border color of the hover labels for this trace.", + "editType": "none", + "valType": "color" + }, + "bordercolorsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `bordercolor`.", + "editType": "none", + "valType": "string" + }, + "editType": "none", + "font": { + "color": { + "arrayOk": true, + "editType": "none", + "valType": "color" + }, + "colorsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `color`.", + "editType": "none", + "valType": "string" + }, + "description": "Sets the font used in hover labels.", + "editType": "none", + "family": { + "arrayOk": true, + "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", + "editType": "none", + "noBlank": true, + "strict": true, + "valType": "string" + }, + "familysrc": { + "description": "Sets the source reference on Chart Studio Cloud for `family`.", + "editType": "none", + "valType": "string" + }, + "lineposition": { + "arrayOk": true, + "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", + "dflt": "none", + "editType": "none", + "extras": [ + "none" + ], + "flags": [ + "under", + "over", + "through" + ], + "valType": "flaglist" + }, + "linepositionsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `lineposition`.", + "editType": "none", + "valType": "string" + }, + "role": "object", + "shadow": { + "arrayOk": true, + "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", + "dflt": "none", + "editType": "none", + "valType": "string" + }, + "shadowsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `shadow`.", + "editType": "none", + "valType": "string" + }, + "size": { + "arrayOk": true, + "editType": "none", + "min": 1, + "valType": "number" + }, + "sizesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `size`.", + "editType": "none", + "valType": "string" + }, + "style": { + "arrayOk": true, + "description": "Sets whether a font should be styled with a normal or italic face from its family.", + "dflt": "normal", + "editType": "none", + "valType": "enumerated", + "values": [ + "normal", + "italic" + ] + }, + "stylesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `style`.", + "editType": "none", + "valType": "string" + }, + "textcase": { + "arrayOk": true, + "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", + "dflt": "normal", + "editType": "none", + "valType": "enumerated", + "values": [ + "normal", + "word caps", + "upper", + "lower" + ] + }, + "textcasesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `textcase`.", + "editType": "none", + "valType": "string" + }, + "variant": { + "arrayOk": true, + "description": "Sets the variant of the font.", + "dflt": "normal", + "editType": "none", + "valType": "enumerated", + "values": [ + "normal", + "small-caps", + "all-small-caps", + "all-petite-caps", + "petite-caps", + "unicase" + ] + }, + "variantsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `variant`.", + "editType": "none", + "valType": "string" + }, + "weight": { + "arrayOk": true, + "description": "Sets the weight (or boldness) of the font.", + "dflt": "normal", + "editType": "none", + "extras": [ + "normal", + "bold" + ], + "max": 1000, + "min": 1, + "valType": "integer" + }, + "weightsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `weight`.", + "editType": "none", + "valType": "string" + } + }, + "namelength": { + "arrayOk": true, + "description": "Sets the default length (in number of characters) of the trace name in the hover labels for all traces. -1 shows the whole name regardless of length. 0-3 shows the first 0-3 characters, and an integer >3 will show the whole name if it is less than that many characters, but if it is longer, will truncate to `namelength - 3` characters and add an ellipsis.", + "dflt": 15, + "editType": "none", + "min": -1, + "valType": "integer" + }, + "namelengthsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `namelength`.", + "editType": "none", + "valType": "string" + }, + "role": "object", + "showarrow": { + "description": "Sets whether or not to show the hover label arrow/triangle pointing to the data point.", + "dflt": true, + "editType": "none", + "valType": "boolean" + } + }, + "hovertemplate": { + "arrayOk": true, + "description": "Template string used for rendering the information that appear on hover box. Note that this will override `hoverinfo`. Variables are inserted using %{variable}, for example \"y: %{y}\" as well as %{xother}, {%_xother}, {%_xother_}, {%xother_}. When showing info for several points, *xother* will be added to those with different x positions from the first point. An underscore before or after *(x|y)other* will add a space on that side, only when this field is shown. Numbers are formatted using d3-format's syntax %{variable:d3-format}, for example \"Price: %{y:$.2f}\". https://github.com/d3/d3-format/tree/v1.4.5#d3-format for details on the formatting syntax. Dates are formatted using d3-time-format's syntax %{variable|d3-time-format}, for example \"Day: %{2019-01-01|%A}\". https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format for details on the date formatting syntax. Variables that can't be found will be replaced with the specifier. For example, a template of \"data: %{x}, %{y}\" will result in a value of \"data: 1, %{y}\" if x is 1 and y is missing. Variables with an undefined value will be replaced with the fallback value. The variables available in `hovertemplate` are the ones emitted as event data described at this link https://plotly.com/javascript/plotlyjs-events/#event-data. Additionally, all attributes that can be specified per-point (the ones that are `arrayOk: true`) are available. Anything contained in tag `` is displayed in the secondary box, for example `%{fullData.name}`. To hide the secondary box completely, use an empty tag ``.", + "dflt": "", + "editType": "calc", + "valType": "string" + }, + "hovertemplatefallback": { + "description": "Fallback string that's displayed when a variable referenced in a template is missing. If the boolean value 'false' is passed in, the specifier with the missing variable will be displayed.", + "dflt": "-", + "editType": "calc", + "valType": "any" + }, + "hovertemplatesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `hovertemplate`.", + "editType": "none", + "valType": "string" + }, + "hovertext": { + "arrayOk": true, + "description": "Sets hover text elements associated with each (lon,lat) pair If a single string, the same string appears over all the data points. If an array of string, the items are mapped in order to the this trace's (lon,lat) coordinates. To be seen, trace `hoverinfo` must contain a *text* flag.", + "dflt": "", + "editType": "calc", + "valType": "string" + }, + "hovertextsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `hovertext`.", + "editType": "none", + "valType": "string" + }, + "ids": { + "description": "Assigns id labels to each datum. These ids for object constancy of data points during animation. Should be an array of strings, not numbers or any other type.", + "editType": "calc", + "valType": "data_array" + }, + "idssrc": { + "description": "Sets the source reference on Chart Studio Cloud for `ids`.", + "editType": "none", + "valType": "string" + }, + "lat": { + "description": "Sets the latitude coordinates (in degrees North).", + "editType": "calc", + "valType": "data_array" + }, + "latsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `lat`.", + "editType": "none", + "valType": "string" + }, + "legend": { + "description": "Sets the reference to a legend to show this trace in. References to these legends are *legend*, *legend2*, *legend3*, etc. Settings for these legends are set in the layout, under `layout.legend`, `layout.legend2`, etc.", + "dflt": "legend", + "editType": "style", + "valType": "subplotid" + }, + "legendgroup": { + "description": "Sets the legend group for this trace. Traces and shapes part of the same legend group hide/show at the same time when toggling legend items.", + "dflt": "", + "editType": "style", + "valType": "string" + }, + "legendgrouptitle": { + "editType": "style", + "font": { + "color": { + "editType": "style", + "valType": "color" + }, + "description": "Sets this legend group's title font.", + "editType": "style", + "family": { + "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", + "editType": "style", + "noBlank": true, + "strict": true, + "valType": "string" + }, + "lineposition": { + "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", + "dflt": "none", + "editType": "style", + "extras": [ + "none" + ], + "flags": [ + "under", + "over", + "through" + ], + "valType": "flaglist" + }, + "role": "object", + "shadow": { + "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", + "dflt": "none", + "editType": "style", + "valType": "string" + }, + "size": { + "editType": "style", + "min": 1, + "valType": "number" + }, + "style": { + "description": "Sets whether a font should be styled with a normal or italic face from its family.", + "dflt": "normal", + "editType": "style", + "valType": "enumerated", + "values": [ + "normal", + "italic" + ] + }, + "textcase": { + "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", + "dflt": "normal", + "editType": "style", + "valType": "enumerated", + "values": [ + "normal", + "word caps", + "upper", + "lower" + ] + }, + "variant": { + "description": "Sets the variant of the font.", + "dflt": "normal", + "editType": "style", + "valType": "enumerated", + "values": [ + "normal", + "small-caps", + "all-small-caps", + "all-petite-caps", + "petite-caps", + "unicase" + ] + }, + "weight": { + "description": "Sets the weight (or boldness) of the font.", + "dflt": "normal", + "editType": "style", + "extras": [ + "normal", + "bold" + ], + "max": 1000, + "min": 1, + "valType": "integer" + } + }, + "role": "object", + "text": { + "description": "Sets the title of the legend group.", + "dflt": "", + "editType": "style", + "valType": "string" + } + }, + "legendrank": { + "description": "Sets the legend rank for this trace. Items and groups with smaller ranks are presented on top/left side while with *reversed* `legend.traceorder` they are on bottom/right side. The default legendrank is 1000, so that you can use ranks less than 1000 to place certain items before all unranked items, and ranks greater than 1000 to go after all unranked items. When having unranked or equal rank items shapes would be displayed after traces i.e. according to their order in data and layout.", + "dflt": 1000, + "editType": "style", + "valType": "number" + }, + "legendwidth": { + "description": "Sets the width (in px or fraction) of the legend for this trace.", + "editType": "style", + "min": 0, + "valType": "number" + }, + "line": { + "color": { + "description": "Sets the line color.", + "editType": "calc", + "valType": "color" + }, + "editType": "calc", + "role": "object", + "width": { + "description": "Sets the line width (in px).", + "dflt": 2, + "editType": "calc", + "min": 0, + "valType": "number" + } + }, + "lon": { + "description": "Sets the longitude coordinates (in degrees East).", + "editType": "calc", + "valType": "data_array" + }, + "lonsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `lon`.", + "editType": "none", + "valType": "string" + }, + "marker": { + "allowoverlap": { + "description": "Flag to draw all symbols, even if they overlap.", + "dflt": false, + "editType": "calc", + "valType": "boolean" + }, + "angle": { + "arrayOk": true, + "description": "Sets the marker orientation from true North, in degrees clockwise. When using the *auto* default, no rotation would be applied in perspective views which is different from using a zero angle.", + "dflt": "auto", + "editType": "calc", + "valType": "number" + }, + "anglesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `angle`.", + "editType": "none", + "valType": "string" + }, + "autocolorscale": { + "description": "Determines whether the colorscale is a default palette (`autocolorscale: true`) or the palette determined by `marker.colorscale`. Has an effect only if in `marker.color` is set to a numerical array. In case `colorscale` is unspecified or `autocolorscale` is true, the default palette will be chosen according to whether numbers in the `color` array are all positive, all negative or mixed.", + "dflt": true, + "editType": "calc", + "impliedEdits": {}, + "valType": "boolean" + }, + "cauto": { + "description": "Determines whether or not the color domain is computed with respect to the input data (here in `marker.color`) or the bounds set in `marker.cmin` and `marker.cmax` Has an effect only if in `marker.color` is set to a numerical array. Defaults to `false` when `marker.cmin` and `marker.cmax` are set by the user.", + "dflt": true, + "editType": "calc", + "impliedEdits": {}, + "valType": "boolean" + }, + "cmax": { + "description": "Sets the upper bound of the color domain. Has an effect only if in `marker.color` is set to a numerical array. Value should have the same units as in `marker.color` and if set, `marker.cmin` must be set as well.", + "dflt": null, + "editType": "calc", + "impliedEdits": { + "cauto": false + }, + "valType": "number" + }, + "cmid": { + "description": "Sets the mid-point of the color domain by scaling `marker.cmin` and/or `marker.cmax` to be equidistant to this point. Has an effect only if in `marker.color` is set to a numerical array. Value should have the same units as in `marker.color`. Has no effect when `marker.cauto` is `false`.", + "dflt": null, + "editType": "calc", + "impliedEdits": {}, + "valType": "number" + }, + "cmin": { + "description": "Sets the lower bound of the color domain. Has an effect only if in `marker.color` is set to a numerical array. Value should have the same units as in `marker.color` and if set, `marker.cmax` must be set as well.", + "dflt": null, + "editType": "calc", + "impliedEdits": { + "cauto": false + }, + "valType": "number" + }, + "color": { + "arrayOk": true, + "description": "Sets the marker color. It accepts either a specific color or an array of numbers that are mapped to the colorscale relative to the max and min values of the array or relative to `marker.cmin` and `marker.cmax` if set.", + "editType": "calc", + "valType": "color" + }, + "coloraxis": { + "description": "Sets a reference to a shared color axis. References to these shared color axes are *coloraxis*, *coloraxis2*, *coloraxis3*, etc. Settings for these shared color axes are set in the layout, under `layout.coloraxis`, `layout.coloraxis2`, etc. Note that multiple color scales can be linked to the same color axis.", + "dflt": null, + "editType": "calc", + "regex": "/^coloraxis([2-9]|[1-9][0-9]+)?$/", + "valType": "subplotid" + }, + "colorbar": { + "bgcolor": { + "description": "Sets the color of padded area.", + "dflt": "rgba(0,0,0,0)", + "editType": "calc", + "valType": "color" + }, + "bordercolor": { + "description": "Sets the axis line color.", + "dflt": "#444", + "editType": "calc", + "valType": "color" + }, + "borderwidth": { + "description": "Sets the width (in px) or the border enclosing this color bar.", + "dflt": 0, + "editType": "calc", + "min": 0, + "valType": "number" + }, + "dtick": { + "description": "Sets the step in-between ticks on this axis. Use with `tick0`. Must be a positive number, or special strings available to *log* and *date* axes. If the axis `type` is *log*, then ticks are set every 10^(n*dtick) where n is the tick number. For example, to set a tick mark at 1, 10, 100, 1000, ... set dtick to 1. To set tick marks at 1, 100, 10000, ... set dtick to 2. To set tick marks at 1, 5, 25, 125, 625, 3125, ... set dtick to log_10(5), or 0.69897000433. *log* has several special values; *L*, where `f` is a positive number, gives ticks linearly spaced in value (but not position). For example `tick0` = 0.1, `dtick` = *L0.5* will put ticks at 0.1, 0.6, 1.1, 1.6 etc. To show powers of 10 plus small digits between, use *D1* (all digits) or *D2* (only 2 and 5). `tick0` is ignored for *D1* and *D2*. If the axis `type` is *date*, then you must convert the time to milliseconds. For example, to set the interval between ticks to one day, set `dtick` to 86400000.0. *date* also has special values *M* gives ticks spaced by a number of months. `n` must be a positive integer. To set ticks on the 15th of every third month, set `tick0` to *2000-01-15* and `dtick` to *M3*. To set ticks every 4 years, set `dtick` to *M48*", + "editType": "calc", + "impliedEdits": { + "tickmode": "linear" + }, + "valType": "any" + }, + "editType": "calc", + "exponentformat": { + "description": "Determines a formatting rule for the tick exponents. For example, consider the number 1,000,000,000. If *none*, it appears as 1,000,000,000. If *e*, 1e+9. If *E*, 1E+9. If *power*, 1x10^9 (with 9 in a super script). If *SI*, 1G. If *B*, 1B. *SI* uses prefixes from \"femto\" f (10^-15) to \"tera\" T (10^12). *SI extended* covers instead the full SI range from \"quecto\" q (10^-30) to \"quetta\" Q (10^30). If *SI* or *SI extended* is used and the exponent is beyond the above ranges, the formatting rule will automatically be switched to the power notation.", + "dflt": "B", + "editType": "calc", + "valType": "enumerated", + "values": [ + "none", + "e", + "E", + "power", + "SI", + "B", + "SI extended" + ] + }, + "labelalias": { + "description": "Replacement text for specific tick or hover labels. For example using {US: 'USA', CA: 'Canada'} changes US to USA and CA to Canada. The labels we would have shown must match the keys exactly, after adding any tickprefix or ticksuffix. For negative numbers the minus sign symbol used (U+2212) is wider than the regular ascii dash. That means you need to use −1 instead of -1. labelalias can be used with any axis type, and both keys (if needed) and values (if desired) can include html-like tags or MathJax.", + "dflt": false, + "editType": "calc", + "valType": "any" + }, + "len": { + "description": "Sets the length of the color bar This measure excludes the padding of both ends. That is, the color bar length is this length minus the padding on both ends.", + "dflt": 1, + "editType": "calc", + "min": 0, + "valType": "number" + }, + "lenmode": { + "description": "Determines whether this color bar's length (i.e. the measure in the color variation direction) is set in units of plot *fraction* or in *pixels. Use `len` to set the value.", + "dflt": "fraction", + "editType": "calc", + "valType": "enumerated", + "values": [ + "fraction", + "pixels" + ] + }, + "minexponent": { + "description": "Hide SI prefix for 10^n if |n| is below this number. This only has an effect when `tickformat` is *SI* or *B*.", + "dflt": 3, + "editType": "calc", + "min": 0, + "valType": "number" + }, + "nticks": { + "description": "Specifies the maximum number of ticks for the particular axis. The actual number of ticks will be chosen automatically to be less than or equal to `nticks`. Has an effect only if `tickmode` is set to *auto*.", + "dflt": 0, + "editType": "calc", + "min": 0, + "valType": "integer" + }, + "orientation": { + "description": "Sets the orientation of the colorbar.", + "dflt": "v", + "editType": "calc", + "valType": "enumerated", + "values": [ + "h", + "v" + ] + }, + "outlinecolor": { + "description": "Sets the axis line color.", + "dflt": "#444", + "editType": "calc", + "valType": "color" + }, + "outlinewidth": { + "description": "Sets the width (in px) of the axis line.", + "dflt": 1, + "editType": "calc", + "min": 0, + "valType": "number" + }, + "role": "object", + "separatethousands": { + "description": "If \"true\", even 4-digit integers are separated", + "dflt": false, + "editType": "calc", + "valType": "boolean" + }, + "showexponent": { + "description": "If *all*, all exponents are shown besides their significands. If *first*, only the exponent of the first tick is shown. If *last*, only the exponent of the last tick is shown. If *none*, no exponents appear.", + "dflt": "all", + "editType": "calc", + "valType": "enumerated", + "values": [ + "all", + "first", + "last", + "none" + ] + }, + "showticklabels": { + "description": "Determines whether or not the tick labels are drawn.", + "dflt": true, + "editType": "calc", + "valType": "boolean" + }, + "showtickprefix": { + "description": "If *all*, all tick labels are displayed with a prefix. If *first*, only the first tick is displayed with a prefix. If *last*, only the last tick is displayed with a suffix. If *none*, tick prefixes are hidden.", + "dflt": "all", + "editType": "calc", + "valType": "enumerated", + "values": [ + "all", + "first", + "last", + "none" + ] + }, + "showticksuffix": { + "description": "Same as `showtickprefix` but for tick suffixes.", + "dflt": "all", + "editType": "calc", + "valType": "enumerated", + "values": [ + "all", + "first", + "last", + "none" + ] + }, + "thickness": { + "description": "Sets the thickness of the color bar This measure excludes the size of the padding, ticks and labels.", + "dflt": 30, + "editType": "calc", + "min": 0, + "valType": "number" + }, + "thicknessmode": { + "description": "Determines whether this color bar's thickness (i.e. the measure in the constant color direction) is set in units of plot *fraction* or in *pixels*. Use `thickness` to set the value.", + "dflt": "pixels", + "editType": "calc", + "valType": "enumerated", + "values": [ + "fraction", + "pixels" + ] + }, + "tick0": { + "description": "Sets the placement of the first tick on this axis. Use with `dtick`. If the axis `type` is *log*, then you must take the log of your starting tick (e.g. to set the starting tick to 100, set the `tick0` to 2) except when `dtick`=*L* (see `dtick` for more info). If the axis `type` is *date*, it should be a date string, like date data. If the axis `type` is *category*, it should be a number, using the scale where each category is assigned a serial number from zero in the order it appears.", + "editType": "calc", + "impliedEdits": { + "tickmode": "linear" + }, + "valType": "any" + }, + "tickangle": { + "description": "Sets the angle of the tick labels with respect to the horizontal. For example, a `tickangle` of -90 draws the tick labels vertically.", + "dflt": "auto", + "editType": "calc", + "valType": "angle" + }, + "tickcolor": { + "description": "Sets the tick color.", + "dflt": "#444", + "editType": "calc", + "valType": "color" + }, + "tickfont": { + "color": { + "editType": "calc", + "valType": "color" + }, + "description": "Sets the color bar's tick label font", + "editType": "calc", + "family": { + "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", + "editType": "calc", + "noBlank": true, + "strict": true, + "valType": "string" + }, + "lineposition": { + "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", + "dflt": "none", + "editType": "calc", + "extras": [ + "none" + ], + "flags": [ + "under", + "over", + "through" + ], + "valType": "flaglist" + }, + "role": "object", + "shadow": { + "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", + "dflt": "none", + "editType": "calc", + "valType": "string" + }, + "size": { + "editType": "calc", + "min": 1, + "valType": "number" + }, + "style": { + "description": "Sets whether a font should be styled with a normal or italic face from its family.", + "dflt": "normal", + "editType": "calc", + "valType": "enumerated", + "values": [ + "normal", + "italic" + ] + }, + "textcase": { + "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", + "dflt": "normal", + "editType": "calc", + "valType": "enumerated", + "values": [ + "normal", + "word caps", + "upper", + "lower" + ] + }, + "variant": { + "description": "Sets the variant of the font.", + "dflt": "normal", + "editType": "calc", + "valType": "enumerated", + "values": [ + "normal", + "small-caps", + "all-small-caps", + "all-petite-caps", + "petite-caps", + "unicase" + ] + }, + "weight": { + "description": "Sets the weight (or boldness) of the font.", + "dflt": "normal", + "editType": "calc", + "extras": [ + "normal", + "bold" + ], + "max": 1000, + "min": 1, + "valType": "integer" + } + }, + "tickformat": { + "description": "Sets the tick label formatting rule using d3 formatting mini-languages which are very similar to those in Python. For numbers, see: https://github.com/d3/d3-format/tree/v1.4.5#d3-format. And for dates see: https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format. We add two items to d3's date formatter: *%h* for half of the year as a decimal number as well as *%{n}f* for fractional seconds with n digits. For example, *2016-10-13 09:15:23.456* with tickformat *%H~%M~%S.%2f* would display *09~15~23.46*", + "dflt": "", + "editType": "calc", + "valType": "string" + }, + "tickformatstops": { + "items": { + "tickformatstop": { + "dtickrange": { + "description": "range [*min*, *max*], where *min*, *max* - dtick values which describe some zoom level, it is possible to omit *min* or *max* value by passing *null*", + "editType": "calc", + "items": [ + { + "editType": "calc", + "valType": "any" + }, + { + "editType": "calc", + "valType": "any" + } + ], + "valType": "info_array" + }, + "editType": "calc", + "enabled": { + "description": "Determines whether or not this stop is used. If `false`, this stop is ignored even within its `dtickrange`.", + "dflt": true, + "editType": "calc", + "valType": "boolean" + }, + "name": { + "description": "When used in a template, named items are created in the output figure in addition to any items the figure already has in this array. You can modify these items in the output figure by making your own item with `templateitemname` matching this `name` alongside your modifications (including `visible: false` or `enabled: false` to hide it). Has no effect outside of a template.", + "editType": "calc", + "valType": "string" + }, + "role": "object", + "templateitemname": { + "description": "Used to refer to a named item in this array in the template. Named items from the template will be created even without a matching item in the input figure, but you can modify one by making an item with `templateitemname` matching its `name`, alongside your modifications (including `visible: false` or `enabled: false` to hide it). If there is no template or no matching item, this item will be hidden unless you explicitly show it with `visible: true`.", + "editType": "calc", + "valType": "string" + }, + "value": { + "description": "string - dtickformat for described zoom level, the same as *tickformat*", + "dflt": "", + "editType": "calc", + "valType": "string" + } + } + }, + "role": "object" + }, + "ticklabeloverflow": { + "description": "Determines how we handle tick labels that would overflow either the graph div or the domain of the axis. The default value for inside tick labels is *hide past domain*. In other cases the default is *hide past div*.", + "editType": "calc", + "valType": "enumerated", + "values": [ + "allow", + "hide past div", + "hide past domain" + ] + }, + "ticklabelposition": { + "description": "Determines where tick labels are drawn relative to the ticks. Left and right options are used when `orientation` is *h*, top and bottom when `orientation` is *v*.", + "dflt": "outside", + "editType": "calc", + "valType": "enumerated", + "values": [ + "outside", + "inside", + "outside top", + "inside top", + "outside left", + "inside left", + "outside right", + "inside right", + "outside bottom", + "inside bottom" + ] + }, + "ticklabelstep": { + "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", + "dflt": 1, + "editType": "calc", + "min": 1, + "valType": "integer" + }, + "ticklen": { + "description": "Sets the tick length (in px).", + "dflt": 5, + "editType": "calc", + "min": 0, + "valType": "number" + }, + "tickmode": { + "description": "Sets the tick mode for this axis. If *auto*, the number of ticks is set via `nticks`. If *linear*, the placement of the ticks is determined by a starting position `tick0` and a tick step `dtick` (*linear* is the default value if `tick0` and `dtick` are provided). If *array*, the placement of the ticks is set via `tickvals` and the tick text is `ticktext`. (*array* is the default value if `tickvals` is provided).", + "editType": "calc", + "impliedEdits": {}, + "valType": "enumerated", + "values": [ + "auto", + "linear", + "array" + ] + }, + "tickprefix": { + "description": "Sets a tick label prefix.", + "dflt": "", + "editType": "calc", + "valType": "string" + }, + "ticks": { + "description": "Determines whether ticks are drawn or not. If **, this axis' ticks are not drawn. If *outside* (*inside*), this axis' are drawn outside (inside) the axis lines.", + "dflt": "", + "editType": "calc", + "valType": "enumerated", + "values": [ + "outside", + "inside", + "" + ] + }, + "ticksuffix": { + "description": "Sets a tick label suffix.", + "dflt": "", + "editType": "calc", + "valType": "string" + }, + "ticktext": { + "description": "Sets the text displayed at the ticks position via `tickvals`. Only has an effect if `tickmode` is set to *array*. Used with `tickvals`.", + "editType": "calc", + "valType": "data_array" + }, + "ticktextsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `ticktext`.", + "editType": "none", + "valType": "string" + }, + "tickvals": { + "description": "Sets the values at which ticks on this axis appear. Only has an effect if `tickmode` is set to *array*. Used with `ticktext`.", + "editType": "calc", + "valType": "data_array" + }, + "tickvalssrc": { + "description": "Sets the source reference on Chart Studio Cloud for `tickvals`.", + "editType": "none", + "valType": "string" + }, + "tickwidth": { + "description": "Sets the tick width (in px).", + "dflt": 1, + "editType": "calc", + "min": 0, + "valType": "number" + }, + "title": { + "editType": "calc", + "font": { + "color": { + "editType": "calc", + "valType": "color" + }, + "description": "Sets this color bar's title font.", + "editType": "calc", + "family": { + "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", + "editType": "calc", + "noBlank": true, + "strict": true, + "valType": "string" + }, + "lineposition": { + "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", + "dflt": "none", + "editType": "calc", + "extras": [ + "none" + ], + "flags": [ + "under", + "over", + "through" + ], + "valType": "flaglist" + }, + "role": "object", + "shadow": { + "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", + "dflt": "none", + "editType": "calc", + "valType": "string" + }, + "size": { + "editType": "calc", + "min": 1, + "valType": "number" + }, + "style": { + "description": "Sets whether a font should be styled with a normal or italic face from its family.", + "dflt": "normal", + "editType": "calc", + "valType": "enumerated", + "values": [ + "normal", + "italic" + ] + }, + "textcase": { + "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", + "dflt": "normal", + "editType": "calc", + "valType": "enumerated", + "values": [ + "normal", + "word caps", + "upper", + "lower" + ] + }, + "variant": { + "description": "Sets the variant of the font.", + "dflt": "normal", + "editType": "calc", + "valType": "enumerated", + "values": [ + "normal", + "small-caps", + "all-small-caps", + "all-petite-caps", + "petite-caps", + "unicase" + ] + }, + "weight": { + "description": "Sets the weight (or boldness) of the font.", + "dflt": "normal", + "editType": "calc", + "extras": [ + "normal", + "bold" + ], + "max": 1000, + "min": 1, + "valType": "integer" + } + }, + "role": "object", + "side": { + "description": "Determines the location of color bar's title with respect to the color bar. Defaults to *top* when `orientation` if *v* and defaults to *right* when `orientation` if *h*.", + "editType": "calc", + "valType": "enumerated", + "values": [ + "right", + "top", + "bottom" + ] + }, + "text": { + "description": "Sets the title of the color bar.", + "editType": "calc", + "valType": "string" + } + }, + "x": { + "description": "Sets the x position with respect to `xref` of the color bar (in plot fraction). When `xref` is *paper*, defaults to 1.02 when `orientation` is *v* and 0.5 when `orientation` is *h*. When `xref` is *container*, defaults to *1* when `orientation` is *v* and 0.5 when `orientation` is *h*. Must be between *0* and *1* if `xref` is *container* and between *-2* and *3* if `xref` is *paper*.", + "editType": "calc", + "valType": "number" + }, + "xanchor": { + "description": "Sets this color bar's horizontal position anchor. This anchor binds the `x` position to the *left*, *center* or *right* of the color bar. Defaults to *left* when `orientation` is *v* and *center* when `orientation` is *h*.", + "editType": "calc", + "valType": "enumerated", + "values": [ + "left", + "center", + "right" + ] + }, + "xpad": { + "description": "Sets the amount of padding (in px) along the x direction.", + "dflt": 10, + "editType": "calc", + "min": 0, + "valType": "number" + }, + "xref": { + "description": "Sets the container `x` refers to. *container* spans the entire `width` of the plot. *paper* refers to the width of the plotting area only.", + "dflt": "paper", + "editType": "calc", + "valType": "enumerated", + "values": [ + "container", + "paper" + ] + }, + "y": { + "description": "Sets the y position with respect to `yref` of the color bar (in plot fraction). When `yref` is *paper*, defaults to 0.5 when `orientation` is *v* and 1.02 when `orientation` is *h*. When `yref` is *container*, defaults to 0.5 when `orientation` is *v* and 1 when `orientation` is *h*. Must be between *0* and *1* if `yref` is *container* and between *-2* and *3* if `yref` is *paper*.", + "editType": "calc", + "valType": "number" + }, + "yanchor": { + "description": "Sets this color bar's vertical position anchor This anchor binds the `y` position to the *top*, *middle* or *bottom* of the color bar. Defaults to *middle* when `orientation` is *v* and *bottom* when `orientation` is *h*.", + "editType": "calc", + "valType": "enumerated", + "values": [ + "top", + "middle", + "bottom" + ] + }, + "ypad": { + "description": "Sets the amount of padding (in px) along the y direction.", + "dflt": 10, + "editType": "calc", + "min": 0, + "valType": "number" + }, + "yref": { + "description": "Sets the container `y` refers to. *container* spans the entire `height` of the plot. *paper* refers to the height of the plotting area only.", + "dflt": "paper", + "editType": "calc", + "valType": "enumerated", + "values": [ + "container", + "paper" + ] + } + }, + "colorscale": { + "description": "Sets the colorscale. Has an effect only if in `marker.color` is set to a numerical array. The colorscale must be an array containing arrays mapping a normalized value to an rgb, rgba, hex, hsl, hsv, or named color string. At minimum, a mapping for the lowest (0) and highest (1) values are required. For example, `[[0, 'rgb(0,0,255)'], [1, 'rgb(255,0,0)']]`. To control the bounds of the colorscale in color space, use `marker.cmin` and `marker.cmax`. Alternatively, `colorscale` may be a palette name string of the following list: Blackbody,Bluered,Blues,Cividis,Earth,Electric,Greens,Greys,Hot,Jet,Picnic,Portland,Rainbow,RdBu,Reds,Viridis,YlGnBu,YlOrRd.", + "dflt": null, + "editType": "calc", + "impliedEdits": { + "autocolorscale": false + }, + "valType": "colorscale" + }, + "colorsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `color`.", + "editType": "none", + "valType": "string" + }, + "editType": "calc", + "opacity": { + "arrayOk": true, + "description": "Sets the marker opacity.", + "editType": "calc", + "max": 1, + "min": 0, + "valType": "number" + }, + "opacitysrc": { + "description": "Sets the source reference on Chart Studio Cloud for `opacity`.", + "editType": "none", + "valType": "string" + }, + "reversescale": { + "description": "Reverses the color mapping if true. Has an effect only if in `marker.color` is set to a numerical array. If true, `marker.cmin` will correspond to the last color in the array and `marker.cmax` will correspond to the first color.", + "dflt": false, + "editType": "calc", + "valType": "boolean" + }, + "role": "object", + "showscale": { + "description": "Determines whether or not a colorbar is displayed for this trace. Has an effect only if in `marker.color` is set to a numerical array.", + "dflt": false, + "editType": "calc", + "valType": "boolean" + }, + "size": { + "arrayOk": true, + "description": "Sets the marker size (in px).", + "dflt": 6, + "editType": "calc", + "min": 0, + "valType": "number" + }, + "sizemin": { + "description": "Has an effect only if `marker.size` is set to a numerical array. Sets the minimum size (in px) of the rendered marker points.", + "dflt": 0, + "editType": "calc", + "min": 0, + "valType": "number" + }, + "sizemode": { + "description": "Has an effect only if `marker.size` is set to a numerical array. Sets the rule for which the data in `size` is converted to pixels.", + "dflt": "diameter", + "editType": "calc", + "valType": "enumerated", + "values": [ + "diameter", + "area" ] }, + "sizeref": { + "description": "Has an effect only if `marker.size` is set to a numerical array. Sets the scale factor used to determine the rendered size of marker points. Use with `sizemin` and `sizemode`.", + "dflt": 1, + "editType": "calc", + "valType": "number" + }, + "sizesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `size`.", + "editType": "none", + "valType": "string" + }, + "symbol": { + "arrayOk": true, + "description": "Sets the marker symbol. Full list: https://www.mapbox.com/maki-icons/ Note that the array `marker.color` and `marker.size` are only available for *circle* symbols.", + "dflt": "circle", + "editType": "calc", + "valType": "string" + }, "symbolsrc": { "description": "Sets the source reference on Chart Studio Cloud for `symbol`.", "editType": "none", @@ -19038,7 +21132,8 @@ "valType": "string" }, "mode": { - "description": "Determines the drawing mode for this scatter trace. If the provided `mode` includes *text* then the `text` elements appear at the coordinates. Otherwise, the `text` elements appear on hover. If there are less than 20 points and the trace is not stacked then the default is *lines+markers*. Otherwise, *lines*.", + "description": "Determines the drawing mode for this scatter trace. If the provided `mode` includes *text* then the `text` elements appear at the coordinates. Otherwise, the `text` elements appear on hover.", + "dflt": "markers", "editType": "calc", "extras": [ "none" @@ -19063,34 +21158,18 @@ "min": 0, "valType": "number" }, - "r": { - "description": "Sets the radial coordinates", - "editType": "calc+clearAxisTypes", - "valType": "data_array" - }, - "r0": { - "description": "Alternate to `r`. Builds a linear space of r coordinates. Use with `dr` where `r0` is the starting coordinate and `dr` the step.", - "dflt": 0, - "editType": "calc+clearAxisTypes", - "valType": "any" - }, - "rsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `r`.", - "editType": "none", - "valType": "string" - }, "selected": { - "editType": "style", + "editType": "calc", "marker": { "color": { "description": "Sets the marker color of selected points.", - "editType": "style", + "editType": "calc", "valType": "color" }, - "editType": "style", + "editType": "calc", "opacity": { "description": "Sets the marker opacity of selected points.", - "editType": "style", + "editType": "calc", "max": 1, "min": 0, "valType": "number" @@ -19098,21 +21177,12 @@ "role": "object", "size": { "description": "Sets the marker size of selected points.", - "editType": "style", + "editType": "calc", "min": 0, "valType": "number" } }, - "role": "object", - "textfont": { - "color": { - "description": "Sets the text font color of selected points.", - "editType": "style", - "valType": "color" - }, - "editType": "style", - "role": "object" - } + "role": "object" }, "selectedpoints": { "description": "Array containing integer indices of selected points. Has an effect only for traces that support selections. Note that an empty array means an empty selection where the `unselected` are turned on for all points, whereas, any other non-array values means no selection all where the `selected` and `unselected` styles have no effect.", @@ -19145,90 +21215,40 @@ } }, "subplot": { - "description": "Sets a reference between this trace's data coordinates and a polar subplot. If *polar* (the default value), the data refer to `layout.polar`. If *polar2*, the data refer to `layout.polar2`, and so on.", - "dflt": "polar", + "description": "mapbox subplots and traces are deprecated! Please consider switching to `map` subplots and traces. Learn more at: https://plotly.com/python/maplibre-migration/ as well as https://plotly.com/javascript/maplibre-migration/ Sets a reference between this trace's data coordinates and a mapbox subplot. If *mapbox* (the default value), the data refer to `layout.mapbox`. If *mapbox2*, the data refer to `layout.mapbox2`, and so on.", + "dflt": "mapbox", "editType": "calc", "valType": "subplotid" }, "text": { "arrayOk": true, - "description": "Sets text elements associated with each (x,y) pair. If a single string, the same string appears over all the data points. If an array of string, the items are mapped in order to the this trace's (x,y) coordinates. If trace `hoverinfo` contains a *text* flag and *hovertext* is not set, these elements will be seen in the hover labels.", + "description": "Sets text elements associated with each (lon,lat) pair If a single string, the same string appears over all the data points. If an array of string, the items are mapped in order to the this trace's (lon,lat) coordinates. If trace `hoverinfo` contains a *text* flag and *hovertext* is not set, these elements will be seen in the hover labels.", "dflt": "", "editType": "calc", "valType": "string" }, "textfont": { "color": { - "arrayOk": true, - "editType": "style", + "editType": "calc", "valType": "color" }, - "colorsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `color`.", - "editType": "none", - "valType": "string" - }, - "description": "Sets the text font.", + "description": "Sets the icon text font (color=mapbox.layer.paint.text-color, size=mapbox.layer.layout.text-size). Has an effect only when `type` is set to *symbol*.", "editType": "calc", "family": { - "arrayOk": true, "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", + "dflt": "Open Sans Regular, Arial Unicode MS Regular", "editType": "calc", "noBlank": true, "strict": true, "valType": "string" }, - "familysrc": { - "description": "Sets the source reference on Chart Studio Cloud for `family`.", - "editType": "none", - "valType": "string" - }, - "lineposition": { - "arrayOk": true, - "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", - "dflt": "none", - "editType": "calc", - "extras": [ - "none" - ], - "flags": [ - "under", - "over", - "through" - ], - "valType": "flaglist" - }, - "linepositionsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `lineposition`.", - "editType": "none", - "valType": "string" - }, "role": "object", - "shadow": { - "arrayOk": true, - "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", - "dflt": "none", - "editType": "calc", - "valType": "string" - }, - "shadowsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `shadow`.", - "editType": "none", - "valType": "string" - }, "size": { - "arrayOk": true, "editType": "calc", "min": 1, "valType": "number" }, - "sizesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `size`.", - "editType": "none", - "valType": "string" - }, "style": { - "arrayOk": true, "description": "Sets whether a font should be styled with a normal or italic face from its family.", "dflt": "normal", "editType": "calc", @@ -19238,51 +21258,7 @@ "italic" ] }, - "stylesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `style`.", - "editType": "none", - "valType": "string" - }, - "textcase": { - "arrayOk": true, - "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", - "dflt": "normal", - "editType": "calc", - "valType": "enumerated", - "values": [ - "normal", - "word caps", - "upper", - "lower" - ] - }, - "textcasesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `textcase`.", - "editType": "none", - "valType": "string" - }, - "variant": { - "arrayOk": true, - "description": "Sets the variant of the font.", - "dflt": "normal", - "editType": "calc", - "valType": "enumerated", - "values": [ - "normal", - "small-caps", - "all-small-caps", - "all-petite-caps", - "petite-caps", - "unicase" - ] - }, - "variantsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `variant`.", - "editType": "none", - "valType": "string" - }, "weight": { - "arrayOk": true, "description": "Sets the weight (or boldness) of the font.", "dflt": "normal", "editType": "calc", @@ -19290,18 +21266,13 @@ "normal", "bold" ], - "max": 1000, - "min": 1, - "valType": "integer" - }, - "weightsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `weight`.", - "editType": "none", - "valType": "string" + "max": 1000, + "min": 1, + "valType": "integer" } }, "textposition": { - "arrayOk": true, + "arrayOk": false, "description": "Sets the positions of the `text` elements with respects to the (x,y) coordinates.", "dflt": "middle center", "editType": "calc", @@ -19318,11 +21289,6 @@ "bottom right" ] }, - "textpositionsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `textposition`.", - "editType": "none", - "valType": "string" - }, "textsrc": { "description": "Sets the source reference on Chart Studio Cloud for `text`.", "editType": "none", @@ -19330,15 +21296,15 @@ }, "texttemplate": { "arrayOk": true, - "description": "Template string used for rendering the information text that appears on points. Note that this will override `textinfo`. Variables are inserted using %{variable}, for example \"y: %{y}\". Numbers are formatted using d3-format's syntax %{variable:d3-format}, for example \"Price: %{y:$.2f}\". https://github.com/d3/d3-format/tree/v1.4.5#d3-format for details on the formatting syntax. Dates are formatted using d3-time-format's syntax %{variable|d3-time-format}, for example \"Day: %{2019-01-01|%A}\". https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format for details on the date formatting syntax. Variables that can't be found will be replaced with the specifier. For example, a template of \"data: %{x}, %{y}\" will result in a value of \"data: 1, %{y}\" if x is 1 and y is missing. Variables with an undefined value will be replaced with the fallback value. All attributes that can be specified per-point (the ones that are `arrayOk: true`) are available. Finally, the template string has access to variables `r`, `theta` and `text`.", + "description": "Template string used for rendering the information text that appears on points. Note that this will override `textinfo`. Variables are inserted using %{variable}, for example \"y: %{y}\". Numbers are formatted using d3-format's syntax %{variable:d3-format}, for example \"Price: %{y:$.2f}\". https://github.com/d3/d3-format/tree/v1.4.5#d3-format for details on the formatting syntax. Dates are formatted using d3-time-format's syntax %{variable|d3-time-format}, for example \"Day: %{2019-01-01|%A}\". https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format for details on the date formatting syntax. Variables that can't be found will be replaced with the specifier. For example, a template of \"data: %{x}, %{y}\" will result in a value of \"data: 1, %{y}\" if x is 1 and y is missing. Variables with an undefined value will be replaced with the fallback value. All attributes that can be specified per-point (the ones that are `arrayOk: true`) are available. Finally, the template string has access to variables `lat`, `lon` and `text`.", "dflt": "", - "editType": "plot", + "editType": "calc", "valType": "string" }, "texttemplatefallback": { "description": "Fallback string that's displayed when a variable referenced in a template is missing. If the boolean value 'false' is passed in, the specifier with the missing variable will be displayed.", "dflt": "-", - "editType": "plot", + "editType": "calc", "valType": "any" }, "texttemplatesrc": { @@ -19346,34 +21312,7 @@ "editType": "none", "valType": "string" }, - "theta": { - "description": "Sets the angular coordinates", - "editType": "calc+clearAxisTypes", - "valType": "data_array" - }, - "theta0": { - "description": "Alternate to `theta`. Builds a linear space of theta coordinates. Use with `dtheta` where `theta0` is the starting coordinate and `dtheta` the step.", - "dflt": 0, - "editType": "calc+clearAxisTypes", - "valType": "any" - }, - "thetasrc": { - "description": "Sets the source reference on Chart Studio Cloud for `theta`.", - "editType": "none", - "valType": "string" - }, - "thetaunit": { - "description": "Sets the unit of input *theta* values. Has an effect only when on *linear* angular axes.", - "dflt": "degrees", - "editType": "calc+clearAxisTypes", - "valType": "enumerated", - "values": [ - "radians", - "degrees", - "gradians" - ] - }, - "type": "scatterpolar", + "type": "scattermapbox", "uid": { "description": "Assign an id to this trace, Use this to provide object constancy between traces during animations and transitions.", "editType": "plot", @@ -19385,17 +21324,17 @@ "valType": "any" }, "unselected": { - "editType": "style", + "editType": "calc", "marker": { "color": { "description": "Sets the marker color of unselected points, applied only when a selection exists.", - "editType": "style", + "editType": "calc", "valType": "color" }, - "editType": "style", + "editType": "calc", "opacity": { "description": "Sets the marker opacity of unselected points, applied only when a selection exists.", - "editType": "style", + "editType": "calc", "max": 1, "min": 0, "valType": "number" @@ -19403,21 +21342,12 @@ "role": "object", "size": { "description": "Sets the marker size of unselected points, applied only when a selection exists.", - "editType": "style", + "editType": "calc", "min": 0, "valType": "number" } }, - "role": "object", - "textfont": { - "color": { - "description": "Sets the text font color of unselected points, applied only when a selection exists.", - "editType": "style", - "valType": "color" - }, - "editType": "style", - "role": "object" - } + "role": "object" }, "visible": { "description": "Determines whether or not this trace is visible. If *legendonly*, the trace is not drawn, but can appear as a legend item (provided that the legend itself is visible).", @@ -19432,20 +21362,27 @@ } }, "categories": [ - "polar", + "mapbox", + "gl", "symbols", "showLegend", "scatter-like" ], "meta": { - "description": "The scatterpolar trace type encompasses line charts, scatter charts, text charts, and bubble charts in polar coordinates. The data visualized as scatter point or lines is set in `r` (radial) and `theta` (angular) coordinates Text (appearing either on the chart or on hover only) is via `text`. Bubble charts are achieved by setting `marker.size` and/or `marker.color` to numerical arrays.", - "hrName": "scatter_polar" + "description": "*scattermapbox* trace is deprecated! Please consider switching to the *scattermap* trace type and `map` subplots. Learn more at: https://plotly.com/python/maplibre-migration/ as well as https://plotly.com/javascript/maplibre-migration/ The data visualized as scatter point, lines or marker symbols on a Mapbox GL geographic map is provided by longitude/latitude pairs in `lon` and `lat`.", + "hrName": "scatter_mapbox" }, - "type": "scatterpolar" + "type": "scattermapbox" }, - "scatterpolargl": { + "scatterpolar": { "animatable": false, "attributes": { + "cliponaxis": { + "description": "Determines whether or not markers and text nodes are clipped about the subplot axes. To show markers and text nodes above axis lines and tick labels, make sure to set `xaxis.layer` and `yaxis.layer` to *below traces*.", + "dflt": false, + "editType": "plot", + "valType": "boolean" + }, "connectgaps": { "description": "Determines whether or not gaps (i.e. {nan} or missing values) in the provided data arrays are connected.", "dflt": false, @@ -19474,23 +21411,19 @@ "valType": "number" }, "fill": { - "description": "Sets the area to fill with a solid color. Defaults to *none* unless this trace is stacked, then it gets *tonexty* (*tonextx*) if `orientation` is *v* (*h*) Use with `fillcolor` if not *none*. *tozerox* and *tozeroy* fill to x=0 and y=0 respectively. *tonextx* and *tonexty* fill between the endpoints of this trace and the endpoints of the trace before it, connecting those endpoints with straight lines (to make a stacked area graph); if there is no trace before it, they behave like *tozerox* and *tozeroy*. *toself* connects the endpoints of the trace (or each segment of the trace if it has gaps) into a closed shape. *tonext* fills the space between two traces if one completely encloses the other (eg consecutive contour lines), and behaves like *toself* if there is no trace before it. *tonext* should not be used if one trace does not enclose the other. Traces in a `stackgroup` will only fill to (or be filled to) other traces in the same group. With multiple `stackgroup`s or some traces stacked and some not, if fill-linked traces are not already consecutive, the later ones will be pushed down in the drawing order.", + "description": "Sets the area to fill with a solid color. Use with `fillcolor` if not *none*. scatterpolar has a subset of the options available to scatter. *toself* connects the endpoints of the trace (or each segment of the trace if it has gaps) into a closed shape. *tonext* fills the space between two traces if one completely encloses the other (eg consecutive contour lines), and behaves like *toself* if there is no trace before it. *tonext* should not be used if one trace does not enclose the other.", "dflt": "none", "editType": "calc", "valType": "enumerated", "values": [ "none", - "tozeroy", - "tozerox", - "tonexty", - "tonextx", "toself", "tonext" ] }, "fillcolor": { "description": "Sets the fill color. Defaults to a half-transparent variant of the line color, marker color, or marker line color, whichever is available.", - "editType": "calc", + "editType": "style", "valType": "color" }, "hoverinfo": { @@ -19721,6 +21654,15 @@ "valType": "boolean" } }, + "hoveron": { + "description": "Do the hover effects highlight individual points (markers or line points) or do they highlight filled regions? If the fill is *toself* or *tonext* and there are no markers or text, then the default is *fills*, otherwise it is *points*.", + "editType": "style", + "flags": [ + "points", + "fills" + ], + "valType": "flaglist" + }, "hovertemplate": { "arrayOk": true, "description": "Template string used for rendering the information that appear on hover box. Note that this will override `hoverinfo`. Variables are inserted using %{variable}, for example \"y: %{y}\" as well as %{xother}, {%_xother}, {%_xother_}, {%xother_}. When showing info for several points, *xother* will be added to those with different x positions from the first point. An underscore before or after *(x|y)other* will add a space on that side, only when this field is shown. Numbers are formatted using d3-format's syntax %{variable:d3-format}, for example \"Price: %{y:$.2f}\". https://github.com/d3/d3-format/tree/v1.4.5#d3-format for details on the formatting syntax. Dates are formatted using d3-time-format's syntax %{variable|d3-time-format}, for example \"Day: %{2019-01-01|%A}\". https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format for details on the date formatting syntax. Variables that can't be found will be replaced with the specifier. For example, a template of \"data: %{x}, %{y}\" will result in a value of \"data: 1, %{y}\" if x is 1 and y is missing. Variables with an undefined value will be replaced with the fallback value. The variables available in `hovertemplate` are the ones emitted as event data described at this link https://plotly.com/javascript/plotlyjs-events/#event-data. Additionally, all attributes that can be specified per-point (the ones that are `arrayOk: true`) are available. Anything contained in tag `` is displayed in the secondary box, for example `%{fullData.name}`. To hide the secondary box completely, use an empty tag ``.", @@ -19885,31 +21827,62 @@ "valType": "number" }, "line": { + "backoff": { + "arrayOk": true, + "description": "Sets the line back off from the end point of the nth line segment (in px). This option is useful e.g. to avoid overlap with arrowhead markers. With *auto* the lines would trim before markers if `marker.angleref` is set to *previous*.", + "dflt": "auto", + "editType": "plot", + "min": 0, + "valType": "number" + }, + "backoffsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `backoff`.", + "editType": "none", + "valType": "string" + }, "color": { "description": "Sets the line color.", - "editType": "calc", + "editType": "style", "valType": "color" }, "dash": { - "description": "Sets the style of the lines.", + "description": "Sets the dash style of lines. Set to a dash type string (*solid*, *dot*, *dash*, *longdash*, *dashdot*, or *longdashdot*) or a dash length list in px (eg *5px,10px,2px,2px*).", "dflt": "solid", - "editType": "calc", - "valType": "enumerated", + "editType": "style", + "valType": "string", "values": [ - "dash", - "dashdot", + "solid", "dot", + "dash", "longdash", - "longdashdot", - "solid" + "dashdot", + "longdashdot" ] }, "editType": "calc", "role": "object", + "shape": { + "description": "Determines the line shape. With *spline* the lines are drawn using spline interpolation. The other available values correspond to step-wise line shapes.", + "dflt": "linear", + "editType": "plot", + "valType": "enumerated", + "values": [ + "linear", + "spline" + ] + }, + "smoothing": { + "description": "Has an effect only if `shape` is set to *spline* Sets the amount of smoothing. *0* corresponds to no smoothing (equivalent to a *linear* shape).", + "dflt": 1, + "editType": "plot", + "max": 1.3, + "min": 0, + "valType": "number" + }, "width": { "description": "Sets the line width (in px).", "dflt": 2, - "editType": "calc", + "editType": "style", "min": 0, "valType": "number" } @@ -19919,9 +21892,19 @@ "arrayOk": true, "description": "Sets the marker angle in respect to `angleref`.", "dflt": 0, - "editType": "calc", + "editType": "plot", "valType": "angle" }, + "angleref": { + "description": "Sets the reference for marker angle. With *previous*, angle 0 points along the line from the previous point to this one. With *up*, angle 0 points toward the top of the screen.", + "dflt": "up", + "editType": "plot", + "valType": "enumerated", + "values": [ + "previous", + "up" + ] + }, "anglesrc": { "description": "Sets the source reference on Chart Studio Cloud for `angle`.", "editType": "none", @@ -19944,7 +21927,7 @@ "cmax": { "description": "Sets the upper bound of the color domain. Has an effect only if in `marker.color` is set to a numerical array. Value should have the same units as in `marker.color` and if set, `marker.cmin` must be set as well.", "dflt": null, - "editType": "calc", + "editType": "plot", "impliedEdits": { "cauto": false }, @@ -19960,7 +21943,7 @@ "cmin": { "description": "Sets the lower bound of the color domain. Has an effect only if in `marker.color` is set to a numerical array. Value should have the same units as in `marker.color` and if set, `marker.cmax` must be set as well.", "dflt": null, - "editType": "calc", + "editType": "plot", "impliedEdits": { "cauto": false }, @@ -19969,7 +21952,7 @@ "color": { "arrayOk": true, "description": "Sets the marker color. It accepts either a specific color or an array of numbers that are mapped to the colorscale relative to the max and min values of the array or relative to `marker.cmin` and `marker.cmax` if set.", - "editType": "calc", + "editType": "style", "valType": "color" }, "coloraxis": { @@ -19983,35 +21966,35 @@ "bgcolor": { "description": "Sets the color of padded area.", "dflt": "rgba(0,0,0,0)", - "editType": "calc", + "editType": "colorbars", "valType": "color" }, "bordercolor": { "description": "Sets the axis line color.", "dflt": "#444", - "editType": "calc", + "editType": "colorbars", "valType": "color" }, "borderwidth": { "description": "Sets the width (in px) or the border enclosing this color bar.", "dflt": 0, - "editType": "calc", + "editType": "colorbars", "min": 0, "valType": "number" }, "dtick": { "description": "Sets the step in-between ticks on this axis. Use with `tick0`. Must be a positive number, or special strings available to *log* and *date* axes. If the axis `type` is *log*, then ticks are set every 10^(n*dtick) where n is the tick number. For example, to set a tick mark at 1, 10, 100, 1000, ... set dtick to 1. To set tick marks at 1, 100, 10000, ... set dtick to 2. To set tick marks at 1, 5, 25, 125, 625, 3125, ... set dtick to log_10(5), or 0.69897000433. *log* has several special values; *L*, where `f` is a positive number, gives ticks linearly spaced in value (but not position). For example `tick0` = 0.1, `dtick` = *L0.5* will put ticks at 0.1, 0.6, 1.1, 1.6 etc. To show powers of 10 plus small digits between, use *D1* (all digits) or *D2* (only 2 and 5). `tick0` is ignored for *D1* and *D2*. If the axis `type` is *date*, then you must convert the time to milliseconds. For example, to set the interval between ticks to one day, set `dtick` to 86400000.0. *date* also has special values *M* gives ticks spaced by a number of months. `n` must be a positive integer. To set ticks on the 15th of every third month, set `tick0` to *2000-01-15* and `dtick` to *M3*. To set ticks every 4 years, set `dtick` to *M48*", - "editType": "calc", + "editType": "colorbars", "impliedEdits": { "tickmode": "linear" }, "valType": "any" }, - "editType": "calc", + "editType": "colorbars", "exponentformat": { "description": "Determines a formatting rule for the tick exponents. For example, consider the number 1,000,000,000. If *none*, it appears as 1,000,000,000. If *e*, 1e+9. If *E*, 1E+9. If *power*, 1x10^9 (with 9 in a super script). If *SI*, 1G. If *B*, 1B. *SI* uses prefixes from \"femto\" f (10^-15) to \"tera\" T (10^12). *SI extended* covers instead the full SI range from \"quecto\" q (10^-30) to \"quetta\" Q (10^30). If *SI* or *SI extended* is used and the exponent is beyond the above ranges, the formatting rule will automatically be switched to the power notation.", "dflt": "B", - "editType": "calc", + "editType": "colorbars", "valType": "enumerated", "values": [ "none", @@ -20026,20 +22009,20 @@ "labelalias": { "description": "Replacement text for specific tick or hover labels. For example using {US: 'USA', CA: 'Canada'} changes US to USA and CA to Canada. The labels we would have shown must match the keys exactly, after adding any tickprefix or ticksuffix. For negative numbers the minus sign symbol used (U+2212) is wider than the regular ascii dash. That means you need to use −1 instead of -1. labelalias can be used with any axis type, and both keys (if needed) and values (if desired) can include html-like tags or MathJax.", "dflt": false, - "editType": "calc", + "editType": "colorbars", "valType": "any" }, "len": { "description": "Sets the length of the color bar This measure excludes the padding of both ends. That is, the color bar length is this length minus the padding on both ends.", "dflt": 1, - "editType": "calc", + "editType": "colorbars", "min": 0, "valType": "number" }, "lenmode": { "description": "Determines whether this color bar's length (i.e. the measure in the color variation direction) is set in units of plot *fraction* or in *pixels. Use `len` to set the value.", "dflt": "fraction", - "editType": "calc", + "editType": "colorbars", "valType": "enumerated", "values": [ "fraction", @@ -20049,21 +22032,21 @@ "minexponent": { "description": "Hide SI prefix for 10^n if |n| is below this number. This only has an effect when `tickformat` is *SI* or *B*.", "dflt": 3, - "editType": "calc", + "editType": "colorbars", "min": 0, "valType": "number" }, "nticks": { "description": "Specifies the maximum number of ticks for the particular axis. The actual number of ticks will be chosen automatically to be less than or equal to `nticks`. Has an effect only if `tickmode` is set to *auto*.", "dflt": 0, - "editType": "calc", + "editType": "colorbars", "min": 0, "valType": "integer" }, "orientation": { "description": "Sets the orientation of the colorbar.", "dflt": "v", - "editType": "calc", + "editType": "colorbars", "valType": "enumerated", "values": [ "h", @@ -20073,13 +22056,13 @@ "outlinecolor": { "description": "Sets the axis line color.", "dflt": "#444", - "editType": "calc", + "editType": "colorbars", "valType": "color" }, "outlinewidth": { "description": "Sets the width (in px) of the axis line.", "dflt": 1, - "editType": "calc", + "editType": "colorbars", "min": 0, "valType": "number" }, @@ -20087,13 +22070,13 @@ "separatethousands": { "description": "If \"true\", even 4-digit integers are separated", "dflt": false, - "editType": "calc", + "editType": "colorbars", "valType": "boolean" }, "showexponent": { "description": "If *all*, all exponents are shown besides their significands. If *first*, only the exponent of the first tick is shown. If *last*, only the exponent of the last tick is shown. If *none*, no exponents appear.", "dflt": "all", - "editType": "calc", + "editType": "colorbars", "valType": "enumerated", "values": [ "all", @@ -20105,13 +22088,13 @@ "showticklabels": { "description": "Determines whether or not the tick labels are drawn.", "dflt": true, - "editType": "calc", + "editType": "colorbars", "valType": "boolean" }, "showtickprefix": { "description": "If *all*, all tick labels are displayed with a prefix. If *first*, only the first tick is displayed with a prefix. If *last*, only the last tick is displayed with a suffix. If *none*, tick prefixes are hidden.", "dflt": "all", - "editType": "calc", + "editType": "colorbars", "valType": "enumerated", "values": [ "all", @@ -20123,7 +22106,7 @@ "showticksuffix": { "description": "Same as `showtickprefix` but for tick suffixes.", "dflt": "all", - "editType": "calc", + "editType": "colorbars", "valType": "enumerated", "values": [ "all", @@ -20135,14 +22118,14 @@ "thickness": { "description": "Sets the thickness of the color bar This measure excludes the size of the padding, ticks and labels.", "dflt": 30, - "editType": "calc", + "editType": "colorbars", "min": 0, "valType": "number" }, "thicknessmode": { "description": "Determines whether this color bar's thickness (i.e. the measure in the constant color direction) is set in units of plot *fraction* or in *pixels*. Use `thickness` to set the value.", "dflt": "pixels", - "editType": "calc", + "editType": "colorbars", "valType": "enumerated", "values": [ "fraction", @@ -20151,7 +22134,7 @@ }, "tick0": { "description": "Sets the placement of the first tick on this axis. Use with `dtick`. If the axis `type` is *log*, then you must take the log of your starting tick (e.g. to set the starting tick to 100, set the `tick0` to 2) except when `dtick`=*L* (see `dtick` for more info). If the axis `type` is *date*, it should be a date string, like date data. If the axis `type` is *category*, it should be a number, using the scale where each category is assigned a serial number from zero in the order it appears.", - "editType": "calc", + "editType": "colorbars", "impliedEdits": { "tickmode": "linear" }, @@ -20160,25 +22143,25 @@ "tickangle": { "description": "Sets the angle of the tick labels with respect to the horizontal. For example, a `tickangle` of -90 draws the tick labels vertically.", "dflt": "auto", - "editType": "calc", + "editType": "colorbars", "valType": "angle" }, "tickcolor": { "description": "Sets the tick color.", "dflt": "#444", - "editType": "calc", + "editType": "colorbars", "valType": "color" }, "tickfont": { "color": { - "editType": "calc", + "editType": "colorbars", "valType": "color" }, "description": "Sets the color bar's tick label font", - "editType": "calc", + "editType": "colorbars", "family": { "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", - "editType": "calc", + "editType": "colorbars", "noBlank": true, "strict": true, "valType": "string" @@ -20186,7 +22169,7 @@ "lineposition": { "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", "dflt": "none", - "editType": "calc", + "editType": "colorbars", "extras": [ "none" ], @@ -20201,18 +22184,18 @@ "shadow": { "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", "dflt": "none", - "editType": "calc", + "editType": "colorbars", "valType": "string" }, "size": { - "editType": "calc", + "editType": "colorbars", "min": 1, "valType": "number" }, "style": { "description": "Sets whether a font should be styled with a normal or italic face from its family.", "dflt": "normal", - "editType": "calc", + "editType": "colorbars", "valType": "enumerated", "values": [ "normal", @@ -20222,7 +22205,7 @@ "textcase": { "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", "dflt": "normal", - "editType": "calc", + "editType": "colorbars", "valType": "enumerated", "values": [ "normal", @@ -20234,7 +22217,7 @@ "variant": { "description": "Sets the variant of the font.", "dflt": "normal", - "editType": "calc", + "editType": "colorbars", "valType": "enumerated", "values": [ "normal", @@ -20248,7 +22231,7 @@ "weight": { "description": "Sets the weight (or boldness) of the font.", "dflt": "normal", - "editType": "calc", + "editType": "colorbars", "extras": [ "normal", "bold" @@ -20261,7 +22244,7 @@ "tickformat": { "description": "Sets the tick label formatting rule using d3 formatting mini-languages which are very similar to those in Python. For numbers, see: https://github.com/d3/d3-format/tree/v1.4.5#d3-format. And for dates see: https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format. We add two items to d3's date formatter: *%h* for half of the year as a decimal number as well as *%{n}f* for fractional seconds with n digits. For example, *2016-10-13 09:15:23.456* with tickformat *%H~%M~%S.%2f* would display *09~15~23.46*", "dflt": "", - "editType": "calc", + "editType": "colorbars", "valType": "string" }, "tickformatstops": { @@ -20269,41 +22252,41 @@ "tickformatstop": { "dtickrange": { "description": "range [*min*, *max*], where *min*, *max* - dtick values which describe some zoom level, it is possible to omit *min* or *max* value by passing *null*", - "editType": "calc", + "editType": "colorbars", "items": [ { - "editType": "calc", + "editType": "colorbars", "valType": "any" }, { - "editType": "calc", + "editType": "colorbars", "valType": "any" } ], "valType": "info_array" }, - "editType": "calc", + "editType": "colorbars", "enabled": { "description": "Determines whether or not this stop is used. If `false`, this stop is ignored even within its `dtickrange`.", "dflt": true, - "editType": "calc", + "editType": "colorbars", "valType": "boolean" }, "name": { "description": "When used in a template, named items are created in the output figure in addition to any items the figure already has in this array. You can modify these items in the output figure by making your own item with `templateitemname` matching this `name` alongside your modifications (including `visible: false` or `enabled: false` to hide it). Has no effect outside of a template.", - "editType": "calc", + "editType": "colorbars", "valType": "string" }, "role": "object", "templateitemname": { "description": "Used to refer to a named item in this array in the template. Named items from the template will be created even without a matching item in the input figure, but you can modify one by making an item with `templateitemname` matching its `name`, alongside your modifications (including `visible: false` or `enabled: false` to hide it). If there is no template or no matching item, this item will be hidden unless you explicitly show it with `visible: true`.", - "editType": "calc", + "editType": "colorbars", "valType": "string" }, "value": { "description": "string - dtickformat for described zoom level, the same as *tickformat*", "dflt": "", - "editType": "calc", + "editType": "colorbars", "valType": "string" } } @@ -20312,7 +22295,7 @@ }, "ticklabeloverflow": { "description": "Determines how we handle tick labels that would overflow either the graph div or the domain of the axis. The default value for inside tick labels is *hide past domain*. In other cases the default is *hide past div*.", - "editType": "calc", + "editType": "colorbars", "valType": "enumerated", "values": [ "allow", @@ -20323,7 +22306,7 @@ "ticklabelposition": { "description": "Determines where tick labels are drawn relative to the ticks. Left and right options are used when `orientation` is *h*, top and bottom when `orientation` is *v*.", "dflt": "outside", - "editType": "calc", + "editType": "colorbars", "valType": "enumerated", "values": [ "outside", @@ -20341,20 +22324,20 @@ "ticklabelstep": { "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", "dflt": 1, - "editType": "calc", + "editType": "colorbars", "min": 1, "valType": "integer" }, "ticklen": { "description": "Sets the tick length (in px).", "dflt": 5, - "editType": "calc", + "editType": "colorbars", "min": 0, "valType": "number" }, "tickmode": { "description": "Sets the tick mode for this axis. If *auto*, the number of ticks is set via `nticks`. If *linear*, the placement of the ticks is determined by a starting position `tick0` and a tick step `dtick` (*linear* is the default value if `tick0` and `dtick` are provided). If *array*, the placement of the ticks is set via `tickvals` and the tick text is `ticktext`. (*array* is the default value if `tickvals` is provided).", - "editType": "calc", + "editType": "colorbars", "impliedEdits": {}, "valType": "enumerated", "values": [ @@ -20366,13 +22349,13 @@ "tickprefix": { "description": "Sets a tick label prefix.", "dflt": "", - "editType": "calc", + "editType": "colorbars", "valType": "string" }, "ticks": { "description": "Determines whether ticks are drawn or not. If **, this axis' ticks are not drawn. If *outside* (*inside*), this axis' are drawn outside (inside) the axis lines.", "dflt": "", - "editType": "calc", + "editType": "colorbars", "valType": "enumerated", "values": [ "outside", @@ -20383,12 +22366,12 @@ "ticksuffix": { "description": "Sets a tick label suffix.", "dflt": "", - "editType": "calc", + "editType": "colorbars", "valType": "string" }, "ticktext": { "description": "Sets the text displayed at the ticks position via `tickvals`. Only has an effect if `tickmode` is set to *array*. Used with `tickvals`.", - "editType": "calc", + "editType": "colorbars", "valType": "data_array" }, "ticktextsrc": { @@ -20398,7 +22381,7 @@ }, "tickvals": { "description": "Sets the values at which ticks on this axis appear. Only has an effect if `tickmode` is set to *array*. Used with `ticktext`.", - "editType": "calc", + "editType": "colorbars", "valType": "data_array" }, "tickvalssrc": { @@ -20409,22 +22392,22 @@ "tickwidth": { "description": "Sets the tick width (in px).", "dflt": 1, - "editType": "calc", + "editType": "colorbars", "min": 0, "valType": "number" }, "title": { - "editType": "calc", + "editType": "colorbars", "font": { "color": { - "editType": "calc", + "editType": "colorbars", "valType": "color" }, "description": "Sets this color bar's title font.", - "editType": "calc", + "editType": "colorbars", "family": { "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", - "editType": "calc", + "editType": "colorbars", "noBlank": true, "strict": true, "valType": "string" @@ -20432,7 +22415,7 @@ "lineposition": { "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", "dflt": "none", - "editType": "calc", + "editType": "colorbars", "extras": [ "none" ], @@ -20447,18 +22430,18 @@ "shadow": { "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", "dflt": "none", - "editType": "calc", + "editType": "colorbars", "valType": "string" }, "size": { - "editType": "calc", + "editType": "colorbars", "min": 1, "valType": "number" }, "style": { "description": "Sets whether a font should be styled with a normal or italic face from its family.", "dflt": "normal", - "editType": "calc", + "editType": "colorbars", "valType": "enumerated", "values": [ "normal", @@ -20468,7 +22451,7 @@ "textcase": { "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", "dflt": "normal", - "editType": "calc", + "editType": "colorbars", "valType": "enumerated", "values": [ "normal", @@ -20480,7 +22463,7 @@ "variant": { "description": "Sets the variant of the font.", "dflt": "normal", - "editType": "calc", + "editType": "colorbars", "valType": "enumerated", "values": [ "normal", @@ -20494,7 +22477,7 @@ "weight": { "description": "Sets the weight (or boldness) of the font.", "dflt": "normal", - "editType": "calc", + "editType": "colorbars", "extras": [ "normal", "bold" @@ -20507,7 +22490,7 @@ "role": "object", "side": { "description": "Determines the location of color bar's title with respect to the color bar. Defaults to *top* when `orientation` if *v* and defaults to *right* when `orientation` if *h*.", - "editType": "calc", + "editType": "colorbars", "valType": "enumerated", "values": [ "right", @@ -20517,18 +22500,18 @@ }, "text": { "description": "Sets the title of the color bar.", - "editType": "calc", + "editType": "colorbars", "valType": "string" } }, "x": { "description": "Sets the x position with respect to `xref` of the color bar (in plot fraction). When `xref` is *paper*, defaults to 1.02 when `orientation` is *v* and 0.5 when `orientation` is *h*. When `xref` is *container*, defaults to *1* when `orientation` is *v* and 0.5 when `orientation` is *h*. Must be between *0* and *1* if `xref` is *container* and between *-2* and *3* if `xref` is *paper*.", - "editType": "calc", + "editType": "colorbars", "valType": "number" }, "xanchor": { "description": "Sets this color bar's horizontal position anchor. This anchor binds the `x` position to the *left*, *center* or *right* of the color bar. Defaults to *left* when `orientation` is *v* and *center* when `orientation` is *h*.", - "editType": "calc", + "editType": "colorbars", "valType": "enumerated", "values": [ "left", @@ -20539,14 +22522,14 @@ "xpad": { "description": "Sets the amount of padding (in px) along the x direction.", "dflt": 10, - "editType": "calc", + "editType": "colorbars", "min": 0, "valType": "number" }, "xref": { "description": "Sets the container `x` refers to. *container* spans the entire `width` of the plot. *paper* refers to the width of the plotting area only.", "dflt": "paper", - "editType": "calc", + "editType": "colorbars", "valType": "enumerated", "values": [ "container", @@ -20555,12 +22538,12 @@ }, "y": { "description": "Sets the y position with respect to `yref` of the color bar (in plot fraction). When `yref` is *paper*, defaults to 0.5 when `orientation` is *v* and 1.02 when `orientation` is *h*. When `yref` is *container*, defaults to 0.5 when `orientation` is *v* and 1 when `orientation` is *h*. Must be between *0* and *1* if `yref` is *container* and between *-2* and *3* if `yref` is *paper*.", - "editType": "calc", + "editType": "colorbars", "valType": "number" }, "yanchor": { "description": "Sets this color bar's vertical position anchor This anchor binds the `y` position to the *top*, *middle* or *bottom* of the color bar. Defaults to *middle* when `orientation` is *v* and *bottom* when `orientation` is *h*.", - "editType": "calc", + "editType": "colorbars", "valType": "enumerated", "values": [ "top", @@ -20571,14 +22554,14 @@ "ypad": { "description": "Sets the amount of padding (in px) along the y direction.", "dflt": 10, - "editType": "calc", + "editType": "colorbars", "min": 0, "valType": "number" }, "yref": { "description": "Sets the container `y` refers to. *container* spans the entire `height` of the plot. *paper* refers to the height of the plotting area only.", "dflt": "paper", - "editType": "calc", + "editType": "colorbars", "valType": "enumerated", "values": [ "container", @@ -20601,6 +22584,39 @@ "valType": "string" }, "editType": "calc", + "gradient": { + "color": { + "arrayOk": true, + "description": "Sets the final color of the gradient fill: the center color for radial, the right for horizontal, or the bottom for vertical.", + "editType": "calc", + "valType": "color" + }, + "colorsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `color`.", + "editType": "none", + "valType": "string" + }, + "editType": "calc", + "role": "object", + "type": { + "arrayOk": true, + "description": "Sets the type of gradient used to fill the markers", + "dflt": "none", + "editType": "calc", + "valType": "enumerated", + "values": [ + "radial", + "horizontal", + "vertical", + "none" + ] + }, + "typesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `type`.", + "editType": "none", + "valType": "string" + } + }, "line": { "autocolorscale": { "description": "Determines whether the colorscale is a default palette (`autocolorscale: true`) or the palette determined by `marker.line.colorscale`. Has an effect only if in `marker.line.color` is set to a numerical array. In case `colorscale` is unspecified or `autocolorscale` is true, the default palette will be chosen according to whether numbers in the `color` array are all positive, all negative or mixed.", @@ -20619,7 +22635,7 @@ "cmax": { "description": "Sets the upper bound of the color domain. Has an effect only if in `marker.line.color` is set to a numerical array. Value should have the same units as in `marker.line.color` and if set, `marker.line.cmin` must be set as well.", "dflt": null, - "editType": "calc", + "editType": "plot", "impliedEdits": { "cauto": false }, @@ -20635,7 +22651,7 @@ "cmin": { "description": "Sets the lower bound of the color domain. Has an effect only if in `marker.line.color` is set to a numerical array. Value should have the same units as in `marker.line.color` and if set, `marker.line.cmax` must be set as well.", "dflt": null, - "editType": "calc", + "editType": "plot", "impliedEdits": { "cauto": false }, @@ -20644,7 +22660,7 @@ "color": { "arrayOk": true, "description": "Sets the marker.line color. It accepts either a specific color or an array of numbers that are mapped to the colorscale relative to the max and min values of the array or relative to `marker.line.cmin` and `marker.line.cmax` if set.", - "editType": "calc", + "editType": "style", "valType": "color" }, "coloraxis": { @@ -20672,14 +22688,14 @@ "reversescale": { "description": "Reverses the color mapping if true. Has an effect only if in `marker.line.color` is set to a numerical array. If true, `marker.line.cmin` will correspond to the last color in the array and `marker.line.cmax` will correspond to the first color.", "dflt": false, - "editType": "calc", + "editType": "plot", "valType": "boolean" }, "role": "object", "width": { "arrayOk": true, "description": "Sets the width (in px) of the lines bounding the marker points.", - "editType": "calc", + "editType": "style", "min": 0, "valType": "number" }, @@ -20689,10 +22705,17 @@ "valType": "string" } }, + "maxdisplayed": { + "description": "Sets a maximum number of points to be drawn on the graph. *0* corresponds to no limit.", + "dflt": 0, + "editType": "plot", + "min": 0, + "valType": "number" + }, "opacity": { "arrayOk": true, "description": "Sets the marker opacity.", - "editType": "calc", + "editType": "style", "max": 1, "min": 0, "valType": "number" @@ -20705,7 +22728,7 @@ "reversescale": { "description": "Reverses the color mapping if true. Has an effect only if in `marker.color` is set to a numerical array. If true, `marker.cmin` will correspond to the last color in the array and `marker.cmax` will correspond to the first color.", "dflt": false, - "editType": "calc", + "editType": "plot", "valType": "boolean" }, "role": "object", @@ -20751,11 +22774,24 @@ "editType": "none", "valType": "string" }, + "standoff": { + "arrayOk": true, + "description": "Moves the marker away from the data point in the direction of `angle` (in px). This can be useful for example if you have another marker at this location and you want to point an arrowhead marker at it.", + "dflt": 0, + "editType": "plot", + "min": 0, + "valType": "number" + }, + "standoffsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `standoff`.", + "editType": "none", + "valType": "string" + }, "symbol": { "arrayOk": true, "description": "Sets the marker symbol type. Adding 100 is equivalent to appending *-open* to a symbol name. Adding 200 is equivalent to appending *-dot* to a symbol name. Adding 300 is equivalent to appending *-open-dot* or *dot-open* to a symbol name.", "dflt": "circle", - "editType": "calc", + "editType": "style", "valType": "enumerated", "values": [ 0, @@ -21246,844 +23282,2236 @@ "arrow-wide-open" ] }, - "symbolsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `symbol`.", + "symbolsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `symbol`.", + "editType": "none", + "valType": "string" + } + }, + "meta": { + "arrayOk": true, + "description": "Assigns extra meta information associated with this trace that can be used in various text attributes. Attributes such as trace `name`, graph, axis and colorbar `title.text`, annotation `text` `rangeselector`, `updatemenues` and `sliders` `label` text all support `meta`. To access the trace `meta` values in an attribute in the same trace, simply use `%{meta[i]}` where `i` is the index or key of the `meta` item in question. To access trace `meta` in layout attributes, use `%{data[n[.meta[i]}` where `i` is the index or key of the `meta` and `n` is the trace index.", + "editType": "plot", + "valType": "any" + }, + "metasrc": { + "description": "Sets the source reference on Chart Studio Cloud for `meta`.", + "editType": "none", + "valType": "string" + }, + "mode": { + "description": "Determines the drawing mode for this scatter trace. If the provided `mode` includes *text* then the `text` elements appear at the coordinates. Otherwise, the `text` elements appear on hover. If there are less than 20 points and the trace is not stacked then the default is *lines+markers*. Otherwise, *lines*.", + "editType": "calc", + "extras": [ + "none" + ], + "flags": [ + "lines", + "markers", + "text" + ], + "valType": "flaglist" + }, + "name": { + "description": "Sets the trace name. The trace name appears as the legend item and on hover.", + "editType": "style", + "valType": "string" + }, + "opacity": { + "description": "Sets the opacity of the trace.", + "dflt": 1, + "editType": "style", + "max": 1, + "min": 0, + "valType": "number" + }, + "r": { + "description": "Sets the radial coordinates", + "editType": "calc+clearAxisTypes", + "valType": "data_array" + }, + "r0": { + "description": "Alternate to `r`. Builds a linear space of r coordinates. Use with `dr` where `r0` is the starting coordinate and `dr` the step.", + "dflt": 0, + "editType": "calc+clearAxisTypes", + "valType": "any" + }, + "rsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `r`.", + "editType": "none", + "valType": "string" + }, + "selected": { + "editType": "style", + "marker": { + "color": { + "description": "Sets the marker color of selected points.", + "editType": "style", + "valType": "color" + }, + "editType": "style", + "opacity": { + "description": "Sets the marker opacity of selected points.", + "editType": "style", + "max": 1, + "min": 0, + "valType": "number" + }, + "role": "object", + "size": { + "description": "Sets the marker size of selected points.", + "editType": "style", + "min": 0, + "valType": "number" + } + }, + "role": "object", + "textfont": { + "color": { + "description": "Sets the text font color of selected points.", + "editType": "style", + "valType": "color" + }, + "editType": "style", + "role": "object" + } + }, + "selectedpoints": { + "description": "Array containing integer indices of selected points. Has an effect only for traces that support selections. Note that an empty array means an empty selection where the `unselected` are turned on for all points, whereas, any other non-array values means no selection all where the `selected` and `unselected` styles have no effect.", + "editType": "calc", + "valType": "any" + }, + "showlegend": { + "description": "Determines whether or not an item corresponding to this trace is shown in the legend.", + "dflt": true, + "editType": "style", + "valType": "boolean" + }, + "stream": { + "editType": "calc", + "maxpoints": { + "description": "Sets the maximum number of points to keep on the plots from an incoming stream. If `maxpoints` is set to *50*, only the newest 50 points will be displayed on the plot.", + "dflt": 500, + "editType": "calc", + "max": 10000, + "min": 0, + "valType": "number" + }, + "role": "object", + "token": { + "description": "The stream id number links a data trace on a plot with a stream. See https://chart-studio.plotly.com/settings for more details.", + "editType": "calc", + "noBlank": true, + "strict": true, + "valType": "string" + } + }, + "subplot": { + "description": "Sets a reference between this trace's data coordinates and a polar subplot. If *polar* (the default value), the data refer to `layout.polar`. If *polar2*, the data refer to `layout.polar2`, and so on.", + "dflt": "polar", + "editType": "calc", + "valType": "subplotid" + }, + "text": { + "arrayOk": true, + "description": "Sets text elements associated with each (x,y) pair. If a single string, the same string appears over all the data points. If an array of string, the items are mapped in order to the this trace's (x,y) coordinates. If trace `hoverinfo` contains a *text* flag and *hovertext* is not set, these elements will be seen in the hover labels.", + "dflt": "", + "editType": "calc", + "valType": "string" + }, + "textfont": { + "color": { + "arrayOk": true, + "editType": "style", + "valType": "color" + }, + "colorsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `color`.", + "editType": "none", + "valType": "string" + }, + "description": "Sets the text font.", + "editType": "calc", + "family": { + "arrayOk": true, + "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", + "editType": "calc", + "noBlank": true, + "strict": true, + "valType": "string" + }, + "familysrc": { + "description": "Sets the source reference on Chart Studio Cloud for `family`.", + "editType": "none", + "valType": "string" + }, + "lineposition": { + "arrayOk": true, + "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", + "dflt": "none", + "editType": "calc", + "extras": [ + "none" + ], + "flags": [ + "under", + "over", + "through" + ], + "valType": "flaglist" + }, + "linepositionsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `lineposition`.", + "editType": "none", + "valType": "string" + }, + "role": "object", + "shadow": { + "arrayOk": true, + "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", + "dflt": "none", + "editType": "calc", + "valType": "string" + }, + "shadowsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `shadow`.", + "editType": "none", + "valType": "string" + }, + "size": { + "arrayOk": true, + "editType": "calc", + "min": 1, + "valType": "number" + }, + "sizesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `size`.", + "editType": "none", + "valType": "string" + }, + "style": { + "arrayOk": true, + "description": "Sets whether a font should be styled with a normal or italic face from its family.", + "dflt": "normal", + "editType": "calc", + "valType": "enumerated", + "values": [ + "normal", + "italic" + ] + }, + "stylesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `style`.", + "editType": "none", + "valType": "string" + }, + "textcase": { + "arrayOk": true, + "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", + "dflt": "normal", + "editType": "calc", + "valType": "enumerated", + "values": [ + "normal", + "word caps", + "upper", + "lower" + ] + }, + "textcasesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `textcase`.", + "editType": "none", + "valType": "string" + }, + "variant": { + "arrayOk": true, + "description": "Sets the variant of the font.", + "dflt": "normal", + "editType": "calc", + "valType": "enumerated", + "values": [ + "normal", + "small-caps", + "all-small-caps", + "all-petite-caps", + "petite-caps", + "unicase" + ] + }, + "variantsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `variant`.", + "editType": "none", + "valType": "string" + }, + "weight": { + "arrayOk": true, + "description": "Sets the weight (or boldness) of the font.", + "dflt": "normal", + "editType": "calc", + "extras": [ + "normal", + "bold" + ], + "max": 1000, + "min": 1, + "valType": "integer" + }, + "weightsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `weight`.", + "editType": "none", + "valType": "string" + } + }, + "textposition": { + "arrayOk": true, + "description": "Sets the positions of the `text` elements with respects to the (x,y) coordinates.", + "dflt": "middle center", + "editType": "calc", + "valType": "enumerated", + "values": [ + "top left", + "top center", + "top right", + "middle left", + "middle center", + "middle right", + "bottom left", + "bottom center", + "bottom right" + ] + }, + "textpositionsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `textposition`.", + "editType": "none", + "valType": "string" + }, + "textsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `text`.", + "editType": "none", + "valType": "string" + }, + "texttemplate": { + "arrayOk": true, + "description": "Template string used for rendering the information text that appears on points. Note that this will override `textinfo`. Variables are inserted using %{variable}, for example \"y: %{y}\". Numbers are formatted using d3-format's syntax %{variable:d3-format}, for example \"Price: %{y:$.2f}\". https://github.com/d3/d3-format/tree/v1.4.5#d3-format for details on the formatting syntax. Dates are formatted using d3-time-format's syntax %{variable|d3-time-format}, for example \"Day: %{2019-01-01|%A}\". https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format for details on the date formatting syntax. Variables that can't be found will be replaced with the specifier. For example, a template of \"data: %{x}, %{y}\" will result in a value of \"data: 1, %{y}\" if x is 1 and y is missing. Variables with an undefined value will be replaced with the fallback value. All attributes that can be specified per-point (the ones that are `arrayOk: true`) are available. Finally, the template string has access to variables `r`, `theta` and `text`.", + "dflt": "", + "editType": "plot", + "valType": "string" + }, + "texttemplatefallback": { + "description": "Fallback string that's displayed when a variable referenced in a template is missing. If the boolean value 'false' is passed in, the specifier with the missing variable will be displayed.", + "dflt": "-", + "editType": "plot", + "valType": "any" + }, + "texttemplatesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `texttemplate`.", + "editType": "none", + "valType": "string" + }, + "theta": { + "description": "Sets the angular coordinates", + "editType": "calc+clearAxisTypes", + "valType": "data_array" + }, + "theta0": { + "description": "Alternate to `theta`. Builds a linear space of theta coordinates. Use with `dtheta` where `theta0` is the starting coordinate and `dtheta` the step.", + "dflt": 0, + "editType": "calc+clearAxisTypes", + "valType": "any" + }, + "thetasrc": { + "description": "Sets the source reference on Chart Studio Cloud for `theta`.", + "editType": "none", + "valType": "string" + }, + "thetaunit": { + "description": "Sets the unit of input *theta* values. Has an effect only when on *linear* angular axes.", + "dflt": "degrees", + "editType": "calc+clearAxisTypes", + "valType": "enumerated", + "values": [ + "radians", + "degrees", + "gradians" + ] + }, + "type": "scatterpolar", + "uid": { + "description": "Assign an id to this trace, Use this to provide object constancy between traces during animations and transitions.", + "editType": "plot", + "valType": "string" + }, + "uirevision": { + "description": "Controls persistence of some user-driven changes to the trace: `constraintrange` in `parcoords` traces, as well as some `editable: true` modifications such as `name` and `colorbar.title`. Defaults to `layout.uirevision`. Note that other user-driven trace attribute changes are controlled by `layout` attributes: `trace.visible` is controlled by `layout.legend.uirevision`, `selectedpoints` is controlled by `layout.selectionrevision`, and `colorbar.(x|y)` (accessible with `config: {editable: true}`) is controlled by `layout.editrevision`. Trace changes are tracked by `uid`, which only falls back on trace index if no `uid` is provided. So if your app can add/remove traces before the end of the `data` array, such that the same trace has a different index, you can still preserve user-driven changes if you give each trace a `uid` that stays with it as it moves.", + "editType": "none", + "valType": "any" + }, + "unselected": { + "editType": "style", + "marker": { + "color": { + "description": "Sets the marker color of unselected points, applied only when a selection exists.", + "editType": "style", + "valType": "color" + }, + "editType": "style", + "opacity": { + "description": "Sets the marker opacity of unselected points, applied only when a selection exists.", + "editType": "style", + "max": 1, + "min": 0, + "valType": "number" + }, + "role": "object", + "size": { + "description": "Sets the marker size of unselected points, applied only when a selection exists.", + "editType": "style", + "min": 0, + "valType": "number" + } + }, + "role": "object", + "textfont": { + "color": { + "description": "Sets the text font color of unselected points, applied only when a selection exists.", + "editType": "style", + "valType": "color" + }, + "editType": "style", + "role": "object" + } + }, + "visible": { + "description": "Determines whether or not this trace is visible. If *legendonly*, the trace is not drawn, but can appear as a legend item (provided that the legend itself is visible).", + "dflt": true, + "editType": "calc", + "valType": "enumerated", + "values": [ + true, + false, + "legendonly" + ] + } + }, + "categories": [ + "polar", + "symbols", + "showLegend", + "scatter-like" + ], + "meta": { + "description": "The scatterpolar trace type encompasses line charts, scatter charts, text charts, and bubble charts in polar coordinates. The data visualized as scatter point or lines is set in `r` (radial) and `theta` (angular) coordinates Text (appearing either on the chart or on hover only) is via `text`. Bubble charts are achieved by setting `marker.size` and/or `marker.color` to numerical arrays.", + "hrName": "scatter_polar" + }, + "type": "scatterpolar" + }, + "scatterpolargl": { + "animatable": false, + "attributes": { + "connectgaps": { + "description": "Determines whether or not gaps (i.e. {nan} or missing values) in the provided data arrays are connected.", + "dflt": false, + "editType": "calc", + "valType": "boolean" + }, + "customdata": { + "description": "Assigns extra data each datum. This may be useful when listening to hover, click and selection events. Note that, *scatter* traces also appends customdata items in the markers DOM elements", + "editType": "calc", + "valType": "data_array" + }, + "customdatasrc": { + "description": "Sets the source reference on Chart Studio Cloud for `customdata`.", + "editType": "none", + "valType": "string" + }, + "dr": { + "description": "Sets the r coordinate step.", + "dflt": 1, + "editType": "calc", + "valType": "number" + }, + "dtheta": { + "description": "Sets the theta coordinate step. By default, the `dtheta` step equals the subplot's period divided by the length of the `r` coordinates.", + "editType": "calc", + "valType": "number" + }, + "fill": { + "description": "Sets the area to fill with a solid color. Defaults to *none* unless this trace is stacked, then it gets *tonexty* (*tonextx*) if `orientation` is *v* (*h*) Use with `fillcolor` if not *none*. *tozerox* and *tozeroy* fill to x=0 and y=0 respectively. *tonextx* and *tonexty* fill between the endpoints of this trace and the endpoints of the trace before it, connecting those endpoints with straight lines (to make a stacked area graph); if there is no trace before it, they behave like *tozerox* and *tozeroy*. *toself* connects the endpoints of the trace (or each segment of the trace if it has gaps) into a closed shape. *tonext* fills the space between two traces if one completely encloses the other (eg consecutive contour lines), and behaves like *toself* if there is no trace before it. *tonext* should not be used if one trace does not enclose the other. Traces in a `stackgroup` will only fill to (or be filled to) other traces in the same group. With multiple `stackgroup`s or some traces stacked and some not, if fill-linked traces are not already consecutive, the later ones will be pushed down in the drawing order.", + "dflt": "none", + "editType": "calc", + "valType": "enumerated", + "values": [ + "none", + "tozeroy", + "tozerox", + "tonexty", + "tonextx", + "toself", + "tonext" + ] + }, + "fillcolor": { + "description": "Sets the fill color. Defaults to a half-transparent variant of the line color, marker color, or marker line color, whichever is available.", + "editType": "calc", + "valType": "color" + }, + "hoverinfo": { + "arrayOk": true, + "description": "Determines which trace information appear on hover. If `none` or `skip` are set, no information is displayed upon hovering. But, if `none` is set, click and hover events are still fired.", + "dflt": "all", + "editType": "none", + "extras": [ + "all", + "none", + "skip" + ], + "flags": [ + "r", + "theta", + "text", + "name" + ], + "valType": "flaglist" + }, + "hoverinfosrc": { + "description": "Sets the source reference on Chart Studio Cloud for `hoverinfo`.", + "editType": "none", + "valType": "string" + }, + "hoverlabel": { + "align": { + "arrayOk": true, + "description": "Sets the horizontal alignment of the text content within hover label box. Has an effect only if the hover label text spans more two or more lines", + "dflt": "auto", + "editType": "none", + "valType": "enumerated", + "values": [ + "left", + "right", + "auto" + ] + }, + "alignsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `align`.", + "editType": "none", + "valType": "string" + }, + "bgcolor": { + "arrayOk": true, + "description": "Sets the background color of the hover labels for this trace", + "editType": "none", + "valType": "color" + }, + "bgcolorsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `bgcolor`.", + "editType": "none", + "valType": "string" + }, + "bordercolor": { + "arrayOk": true, + "description": "Sets the border color of the hover labels for this trace.", + "editType": "none", + "valType": "color" + }, + "bordercolorsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `bordercolor`.", + "editType": "none", + "valType": "string" + }, + "editType": "none", + "font": { + "color": { + "arrayOk": true, + "editType": "none", + "valType": "color" + }, + "colorsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `color`.", + "editType": "none", + "valType": "string" + }, + "description": "Sets the font used in hover labels.", + "editType": "none", + "family": { + "arrayOk": true, + "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", + "editType": "none", + "noBlank": true, + "strict": true, + "valType": "string" + }, + "familysrc": { + "description": "Sets the source reference on Chart Studio Cloud for `family`.", + "editType": "none", + "valType": "string" + }, + "lineposition": { + "arrayOk": true, + "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", + "dflt": "none", + "editType": "none", + "extras": [ + "none" + ], + "flags": [ + "under", + "over", + "through" + ], + "valType": "flaglist" + }, + "linepositionsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `lineposition`.", + "editType": "none", + "valType": "string" + }, + "role": "object", + "shadow": { + "arrayOk": true, + "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", + "dflt": "none", + "editType": "none", + "valType": "string" + }, + "shadowsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `shadow`.", + "editType": "none", + "valType": "string" + }, + "size": { + "arrayOk": true, + "editType": "none", + "min": 1, + "valType": "number" + }, + "sizesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `size`.", + "editType": "none", + "valType": "string" + }, + "style": { + "arrayOk": true, + "description": "Sets whether a font should be styled with a normal or italic face from its family.", + "dflt": "normal", + "editType": "none", + "valType": "enumerated", + "values": [ + "normal", + "italic" + ] + }, + "stylesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `style`.", + "editType": "none", + "valType": "string" + }, + "textcase": { + "arrayOk": true, + "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", + "dflt": "normal", + "editType": "none", + "valType": "enumerated", + "values": [ + "normal", + "word caps", + "upper", + "lower" + ] + }, + "textcasesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `textcase`.", + "editType": "none", + "valType": "string" + }, + "variant": { + "arrayOk": true, + "description": "Sets the variant of the font.", + "dflt": "normal", + "editType": "none", + "valType": "enumerated", + "values": [ + "normal", + "small-caps", + "all-small-caps", + "all-petite-caps", + "petite-caps", + "unicase" + ] + }, + "variantsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `variant`.", + "editType": "none", + "valType": "string" + }, + "weight": { + "arrayOk": true, + "description": "Sets the weight (or boldness) of the font.", + "dflt": "normal", + "editType": "none", + "extras": [ + "normal", + "bold" + ], + "max": 1000, + "min": 1, + "valType": "integer" + }, + "weightsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `weight`.", + "editType": "none", + "valType": "string" + } + }, + "namelength": { + "arrayOk": true, + "description": "Sets the default length (in number of characters) of the trace name in the hover labels for all traces. -1 shows the whole name regardless of length. 0-3 shows the first 0-3 characters, and an integer >3 will show the whole name if it is less than that many characters, but if it is longer, will truncate to `namelength - 3` characters and add an ellipsis.", + "dflt": 15, + "editType": "none", + "min": -1, + "valType": "integer" + }, + "namelengthsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `namelength`.", "editType": "none", "valType": "string" + }, + "role": "object", + "showarrow": { + "description": "Sets whether or not to show the hover label arrow/triangle pointing to the data point.", + "dflt": true, + "editType": "none", + "valType": "boolean" } }, - "meta": { + "hovertemplate": { "arrayOk": true, - "description": "Assigns extra meta information associated with this trace that can be used in various text attributes. Attributes such as trace `name`, graph, axis and colorbar `title.text`, annotation `text` `rangeselector`, `updatemenues` and `sliders` `label` text all support `meta`. To access the trace `meta` values in an attribute in the same trace, simply use `%{meta[i]}` where `i` is the index or key of the `meta` item in question. To access trace `meta` in layout attributes, use `%{data[n[.meta[i]}` where `i` is the index or key of the `meta` and `n` is the trace index.", - "editType": "plot", + "description": "Template string used for rendering the information that appear on hover box. Note that this will override `hoverinfo`. Variables are inserted using %{variable}, for example \"y: %{y}\" as well as %{xother}, {%_xother}, {%_xother_}, {%xother_}. When showing info for several points, *xother* will be added to those with different x positions from the first point. An underscore before or after *(x|y)other* will add a space on that side, only when this field is shown. Numbers are formatted using d3-format's syntax %{variable:d3-format}, for example \"Price: %{y:$.2f}\". https://github.com/d3/d3-format/tree/v1.4.5#d3-format for details on the formatting syntax. Dates are formatted using d3-time-format's syntax %{variable|d3-time-format}, for example \"Day: %{2019-01-01|%A}\". https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format for details on the date formatting syntax. Variables that can't be found will be replaced with the specifier. For example, a template of \"data: %{x}, %{y}\" will result in a value of \"data: 1, %{y}\" if x is 1 and y is missing. Variables with an undefined value will be replaced with the fallback value. The variables available in `hovertemplate` are the ones emitted as event data described at this link https://plotly.com/javascript/plotlyjs-events/#event-data. Additionally, all attributes that can be specified per-point (the ones that are `arrayOk: true`) are available. Anything contained in tag `` is displayed in the secondary box, for example `%{fullData.name}`. To hide the secondary box completely, use an empty tag ``.", + "dflt": "", + "editType": "none", + "valType": "string" + }, + "hovertemplatefallback": { + "description": "Fallback string that's displayed when a variable referenced in a template is missing. If the boolean value 'false' is passed in, the specifier with the missing variable will be displayed.", + "dflt": "-", + "editType": "none", "valType": "any" }, - "metasrc": { - "description": "Sets the source reference on Chart Studio Cloud for `meta`.", + "hovertemplatesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `hovertemplate`.", "editType": "none", "valType": "string" }, - "mode": { - "description": "Determines the drawing mode for this scatter trace. If the provided `mode` includes *text* then the `text` elements appear at the coordinates. Otherwise, the `text` elements appear on hover. If there are less than 20 points and the trace is not stacked then the default is *lines+markers*. Otherwise, *lines*.", + "hovertext": { + "arrayOk": true, + "description": "Sets hover text elements associated with each (x,y) pair. If a single string, the same string appears over all the data points. If an array of string, the items are mapped in order to the this trace's (x,y) coordinates. To be seen, trace `hoverinfo` must contain a *text* flag.", + "dflt": "", + "editType": "style", + "valType": "string" + }, + "hovertextsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `hovertext`.", + "editType": "none", + "valType": "string" + }, + "ids": { + "description": "Assigns id labels to each datum. These ids for object constancy of data points during animation. Should be an array of strings, not numbers or any other type.", "editType": "calc", - "extras": [ - "none" - ], - "flags": [ - "lines", - "markers", - "text" - ], - "valType": "flaglist" + "valType": "data_array" }, - "name": { - "description": "Sets the trace name. The trace name appears as the legend item and on hover.", + "idssrc": { + "description": "Sets the source reference on Chart Studio Cloud for `ids`.", + "editType": "none", + "valType": "string" + }, + "legend": { + "description": "Sets the reference to a legend to show this trace in. References to these legends are *legend*, *legend2*, *legend3*, etc. Settings for these legends are set in the layout, under `layout.legend`, `layout.legend2`, etc.", + "dflt": "legend", + "editType": "style", + "valType": "subplotid" + }, + "legendgroup": { + "description": "Sets the legend group for this trace. Traces and shapes part of the same legend group hide/show at the same time when toggling legend items.", + "dflt": "", "editType": "style", "valType": "string" }, - "opacity": { - "description": "Sets the opacity of the trace.", - "dflt": 1, + "legendgrouptitle": { "editType": "style", - "max": 1, - "min": 0, - "valType": "number" + "font": { + "color": { + "editType": "style", + "valType": "color" + }, + "description": "Sets this legend group's title font.", + "editType": "style", + "family": { + "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", + "editType": "style", + "noBlank": true, + "strict": true, + "valType": "string" + }, + "lineposition": { + "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", + "dflt": "none", + "editType": "style", + "extras": [ + "none" + ], + "flags": [ + "under", + "over", + "through" + ], + "valType": "flaglist" + }, + "role": "object", + "shadow": { + "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", + "dflt": "none", + "editType": "style", + "valType": "string" + }, + "size": { + "editType": "style", + "min": 1, + "valType": "number" + }, + "style": { + "description": "Sets whether a font should be styled with a normal or italic face from its family.", + "dflt": "normal", + "editType": "style", + "valType": "enumerated", + "values": [ + "normal", + "italic" + ] + }, + "textcase": { + "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", + "dflt": "normal", + "editType": "style", + "valType": "enumerated", + "values": [ + "normal", + "word caps", + "upper", + "lower" + ] + }, + "variant": { + "description": "Sets the variant of the font.", + "dflt": "normal", + "editType": "style", + "valType": "enumerated", + "values": [ + "normal", + "small-caps", + "all-small-caps", + "all-petite-caps", + "petite-caps", + "unicase" + ] + }, + "weight": { + "description": "Sets the weight (or boldness) of the font.", + "dflt": "normal", + "editType": "style", + "extras": [ + "normal", + "bold" + ], + "max": 1000, + "min": 1, + "valType": "integer" + } + }, + "role": "object", + "text": { + "description": "Sets the title of the legend group.", + "dflt": "", + "editType": "style", + "valType": "string" + } }, - "r": { - "description": "Sets the radial coordinates", - "editType": "calc+clearAxisTypes", - "valType": "data_array" + "legendrank": { + "description": "Sets the legend rank for this trace. Items and groups with smaller ranks are presented on top/left side while with *reversed* `legend.traceorder` they are on bottom/right side. The default legendrank is 1000, so that you can use ranks less than 1000 to place certain items before all unranked items, and ranks greater than 1000 to go after all unranked items. When having unranked or equal rank items shapes would be displayed after traces i.e. according to their order in data and layout.", + "dflt": 1000, + "editType": "style", + "valType": "number" }, - "r0": { - "description": "Alternate to `r`. Builds a linear space of r coordinates. Use with `dr` where `r0` is the starting coordinate and `dr` the step.", - "dflt": 0, - "editType": "calc+clearAxisTypes", - "valType": "any" + "legendwidth": { + "description": "Sets the width (in px or fraction) of the legend for this trace.", + "editType": "style", + "min": 0, + "valType": "number" }, - "rsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `r`.", - "editType": "none", - "valType": "string" + "line": { + "color": { + "description": "Sets the line color.", + "editType": "calc", + "valType": "color" + }, + "dash": { + "description": "Sets the style of the lines.", + "dflt": "solid", + "editType": "calc", + "valType": "enumerated", + "values": [ + "dash", + "dashdot", + "dot", + "longdash", + "longdashdot", + "solid" + ] + }, + "editType": "calc", + "role": "object", + "width": { + "description": "Sets the line width (in px).", + "dflt": 2, + "editType": "calc", + "min": 0, + "valType": "number" + } }, - "selected": { - "editType": "style", - "marker": { - "color": { - "description": "Sets the marker color of selected points.", - "editType": "style", + "marker": { + "angle": { + "arrayOk": true, + "description": "Sets the marker angle in respect to `angleref`.", + "dflt": 0, + "editType": "calc", + "valType": "angle" + }, + "anglesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `angle`.", + "editType": "none", + "valType": "string" + }, + "autocolorscale": { + "description": "Determines whether the colorscale is a default palette (`autocolorscale: true`) or the palette determined by `marker.colorscale`. Has an effect only if in `marker.color` is set to a numerical array. In case `colorscale` is unspecified or `autocolorscale` is true, the default palette will be chosen according to whether numbers in the `color` array are all positive, all negative or mixed.", + "dflt": true, + "editType": "calc", + "impliedEdits": {}, + "valType": "boolean" + }, + "cauto": { + "description": "Determines whether or not the color domain is computed with respect to the input data (here in `marker.color`) or the bounds set in `marker.cmin` and `marker.cmax` Has an effect only if in `marker.color` is set to a numerical array. Defaults to `false` when `marker.cmin` and `marker.cmax` are set by the user.", + "dflt": true, + "editType": "calc", + "impliedEdits": {}, + "valType": "boolean" + }, + "cmax": { + "description": "Sets the upper bound of the color domain. Has an effect only if in `marker.color` is set to a numerical array. Value should have the same units as in `marker.color` and if set, `marker.cmin` must be set as well.", + "dflt": null, + "editType": "calc", + "impliedEdits": { + "cauto": false + }, + "valType": "number" + }, + "cmid": { + "description": "Sets the mid-point of the color domain by scaling `marker.cmin` and/or `marker.cmax` to be equidistant to this point. Has an effect only if in `marker.color` is set to a numerical array. Value should have the same units as in `marker.color`. Has no effect when `marker.cauto` is `false`.", + "dflt": null, + "editType": "calc", + "impliedEdits": {}, + "valType": "number" + }, + "cmin": { + "description": "Sets the lower bound of the color domain. Has an effect only if in `marker.color` is set to a numerical array. Value should have the same units as in `marker.color` and if set, `marker.cmax` must be set as well.", + "dflt": null, + "editType": "calc", + "impliedEdits": { + "cauto": false + }, + "valType": "number" + }, + "color": { + "arrayOk": true, + "description": "Sets the marker color. It accepts either a specific color or an array of numbers that are mapped to the colorscale relative to the max and min values of the array or relative to `marker.cmin` and `marker.cmax` if set.", + "editType": "calc", + "valType": "color" + }, + "coloraxis": { + "description": "Sets a reference to a shared color axis. References to these shared color axes are *coloraxis*, *coloraxis2*, *coloraxis3*, etc. Settings for these shared color axes are set in the layout, under `layout.coloraxis`, `layout.coloraxis2`, etc. Note that multiple color scales can be linked to the same color axis.", + "dflt": null, + "editType": "calc", + "regex": "/^coloraxis([2-9]|[1-9][0-9]+)?$/", + "valType": "subplotid" + }, + "colorbar": { + "bgcolor": { + "description": "Sets the color of padded area.", + "dflt": "rgba(0,0,0,0)", + "editType": "calc", "valType": "color" }, - "editType": "style", - "opacity": { - "description": "Sets the marker opacity of selected points.", - "editType": "style", - "max": 1, + "bordercolor": { + "description": "Sets the axis line color.", + "dflt": "#444", + "editType": "calc", + "valType": "color" + }, + "borderwidth": { + "description": "Sets the width (in px) or the border enclosing this color bar.", + "dflt": 0, + "editType": "calc", + "min": 0, + "valType": "number" + }, + "dtick": { + "description": "Sets the step in-between ticks on this axis. Use with `tick0`. Must be a positive number, or special strings available to *log* and *date* axes. If the axis `type` is *log*, then ticks are set every 10^(n*dtick) where n is the tick number. For example, to set a tick mark at 1, 10, 100, 1000, ... set dtick to 1. To set tick marks at 1, 100, 10000, ... set dtick to 2. To set tick marks at 1, 5, 25, 125, 625, 3125, ... set dtick to log_10(5), or 0.69897000433. *log* has several special values; *L*, where `f` is a positive number, gives ticks linearly spaced in value (but not position). For example `tick0` = 0.1, `dtick` = *L0.5* will put ticks at 0.1, 0.6, 1.1, 1.6 etc. To show powers of 10 plus small digits between, use *D1* (all digits) or *D2* (only 2 and 5). `tick0` is ignored for *D1* and *D2*. If the axis `type` is *date*, then you must convert the time to milliseconds. For example, to set the interval between ticks to one day, set `dtick` to 86400000.0. *date* also has special values *M* gives ticks spaced by a number of months. `n` must be a positive integer. To set ticks on the 15th of every third month, set `tick0` to *2000-01-15* and `dtick` to *M3*. To set ticks every 4 years, set `dtick` to *M48*", + "editType": "calc", + "impliedEdits": { + "tickmode": "linear" + }, + "valType": "any" + }, + "editType": "calc", + "exponentformat": { + "description": "Determines a formatting rule for the tick exponents. For example, consider the number 1,000,000,000. If *none*, it appears as 1,000,000,000. If *e*, 1e+9. If *E*, 1E+9. If *power*, 1x10^9 (with 9 in a super script). If *SI*, 1G. If *B*, 1B. *SI* uses prefixes from \"femto\" f (10^-15) to \"tera\" T (10^12). *SI extended* covers instead the full SI range from \"quecto\" q (10^-30) to \"quetta\" Q (10^30). If *SI* or *SI extended* is used and the exponent is beyond the above ranges, the formatting rule will automatically be switched to the power notation.", + "dflt": "B", + "editType": "calc", + "valType": "enumerated", + "values": [ + "none", + "e", + "E", + "power", + "SI", + "B", + "SI extended" + ] + }, + "labelalias": { + "description": "Replacement text for specific tick or hover labels. For example using {US: 'USA', CA: 'Canada'} changes US to USA and CA to Canada. The labels we would have shown must match the keys exactly, after adding any tickprefix or ticksuffix. For negative numbers the minus sign symbol used (U+2212) is wider than the regular ascii dash. That means you need to use −1 instead of -1. labelalias can be used with any axis type, and both keys (if needed) and values (if desired) can include html-like tags or MathJax.", + "dflt": false, + "editType": "calc", + "valType": "any" + }, + "len": { + "description": "Sets the length of the color bar This measure excludes the padding of both ends. That is, the color bar length is this length minus the padding on both ends.", + "dflt": 1, + "editType": "calc", + "min": 0, + "valType": "number" + }, + "lenmode": { + "description": "Determines whether this color bar's length (i.e. the measure in the color variation direction) is set in units of plot *fraction* or in *pixels. Use `len` to set the value.", + "dflt": "fraction", + "editType": "calc", + "valType": "enumerated", + "values": [ + "fraction", + "pixels" + ] + }, + "minexponent": { + "description": "Hide SI prefix for 10^n if |n| is below this number. This only has an effect when `tickformat` is *SI* or *B*.", + "dflt": 3, + "editType": "calc", + "min": 0, + "valType": "number" + }, + "nticks": { + "description": "Specifies the maximum number of ticks for the particular axis. The actual number of ticks will be chosen automatically to be less than or equal to `nticks`. Has an effect only if `tickmode` is set to *auto*.", + "dflt": 0, + "editType": "calc", + "min": 0, + "valType": "integer" + }, + "orientation": { + "description": "Sets the orientation of the colorbar.", + "dflt": "v", + "editType": "calc", + "valType": "enumerated", + "values": [ + "h", + "v" + ] + }, + "outlinecolor": { + "description": "Sets the axis line color.", + "dflt": "#444", + "editType": "calc", + "valType": "color" + }, + "outlinewidth": { + "description": "Sets the width (in px) of the axis line.", + "dflt": 1, + "editType": "calc", + "min": 0, + "valType": "number" + }, + "role": "object", + "separatethousands": { + "description": "If \"true\", even 4-digit integers are separated", + "dflt": false, + "editType": "calc", + "valType": "boolean" + }, + "showexponent": { + "description": "If *all*, all exponents are shown besides their significands. If *first*, only the exponent of the first tick is shown. If *last*, only the exponent of the last tick is shown. If *none*, no exponents appear.", + "dflt": "all", + "editType": "calc", + "valType": "enumerated", + "values": [ + "all", + "first", + "last", + "none" + ] + }, + "showticklabels": { + "description": "Determines whether or not the tick labels are drawn.", + "dflt": true, + "editType": "calc", + "valType": "boolean" + }, + "showtickprefix": { + "description": "If *all*, all tick labels are displayed with a prefix. If *first*, only the first tick is displayed with a prefix. If *last*, only the last tick is displayed with a suffix. If *none*, tick prefixes are hidden.", + "dflt": "all", + "editType": "calc", + "valType": "enumerated", + "values": [ + "all", + "first", + "last", + "none" + ] + }, + "showticksuffix": { + "description": "Same as `showtickprefix` but for tick suffixes.", + "dflt": "all", + "editType": "calc", + "valType": "enumerated", + "values": [ + "all", + "first", + "last", + "none" + ] + }, + "thickness": { + "description": "Sets the thickness of the color bar This measure excludes the size of the padding, ticks and labels.", + "dflt": 30, + "editType": "calc", "min": 0, "valType": "number" }, - "role": "object", - "size": { - "description": "Sets the marker size of selected points.", - "editType": "style", - "min": 0, - "valType": "number" - } - }, - "role": "object", - "textfont": { - "color": { - "description": "Sets the text font color of selected points.", - "editType": "style", - "valType": "color" + "thicknessmode": { + "description": "Determines whether this color bar's thickness (i.e. the measure in the constant color direction) is set in units of plot *fraction* or in *pixels*. Use `thickness` to set the value.", + "dflt": "pixels", + "editType": "calc", + "valType": "enumerated", + "values": [ + "fraction", + "pixels" + ] + }, + "tick0": { + "description": "Sets the placement of the first tick on this axis. Use with `dtick`. If the axis `type` is *log*, then you must take the log of your starting tick (e.g. to set the starting tick to 100, set the `tick0` to 2) except when `dtick`=*L* (see `dtick` for more info). If the axis `type` is *date*, it should be a date string, like date data. If the axis `type` is *category*, it should be a number, using the scale where each category is assigned a serial number from zero in the order it appears.", + "editType": "calc", + "impliedEdits": { + "tickmode": "linear" + }, + "valType": "any" }, - "editType": "style", - "role": "object" - } - }, - "selectedpoints": { - "description": "Array containing integer indices of selected points. Has an effect only for traces that support selections. Note that an empty array means an empty selection where the `unselected` are turned on for all points, whereas, any other non-array values means no selection all where the `selected` and `unselected` styles have no effect.", - "editType": "calc", - "valType": "any" - }, - "showlegend": { - "description": "Determines whether or not an item corresponding to this trace is shown in the legend.", - "dflt": true, - "editType": "style", - "valType": "boolean" - }, - "stream": { - "editType": "calc", - "maxpoints": { - "description": "Sets the maximum number of points to keep on the plots from an incoming stream. If `maxpoints` is set to *50*, only the newest 50 points will be displayed on the plot.", - "dflt": 500, - "editType": "calc", - "max": 10000, - "min": 0, - "valType": "number" - }, - "role": "object", - "token": { - "description": "The stream id number links a data trace on a plot with a stream. See https://chart-studio.plotly.com/settings for more details.", - "editType": "calc", - "noBlank": true, - "strict": true, - "valType": "string" - } - }, - "subplot": { - "description": "Sets a reference between this trace's data coordinates and a polar subplot. If *polar* (the default value), the data refer to `layout.polar`. If *polar2*, the data refer to `layout.polar2`, and so on.", - "dflt": "polar", - "editType": "calc", - "valType": "subplotid" - }, - "text": { - "arrayOk": true, - "description": "Sets text elements associated with each (x,y) pair. If a single string, the same string appears over all the data points. If an array of string, the items are mapped in order to the this trace's (x,y) coordinates. If trace `hoverinfo` contains a *text* flag and *hovertext* is not set, these elements will be seen in the hover labels.", - "dflt": "", - "editType": "calc", - "valType": "string" - }, - "textfont": { - "color": { - "arrayOk": true, - "editType": "calc", - "valType": "color" - }, - "colorsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `color`.", - "editType": "none", - "valType": "string" - }, - "description": "Sets the text font.", - "editType": "calc", - "family": { - "arrayOk": true, - "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", - "editType": "calc", - "noBlank": true, - "strict": true, - "valType": "string" - }, - "familysrc": { - "description": "Sets the source reference on Chart Studio Cloud for `family`.", - "editType": "none", - "valType": "string" - }, - "role": "object", - "size": { - "arrayOk": true, - "editType": "calc", - "min": 1, - "valType": "number" - }, - "sizesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `size`.", - "editType": "none", - "valType": "string" - }, - "style": { - "arrayOk": true, - "description": "Sets whether a font should be styled with a normal or italic face from its family.", - "dflt": "normal", - "editType": "calc", - "valType": "enumerated", - "values": [ - "normal", - "italic" - ] - }, - "stylesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `style`.", - "editType": "none", - "valType": "string" - }, - "variant": { - "arrayOk": true, - "description": "Sets the variant of the font.", - "dflt": "normal", - "editType": "calc", - "valType": "enumerated", - "values": [ - "normal", - "small-caps" - ] - }, - "variantsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `variant`.", - "editType": "none", - "valType": "string" - }, - "weight": { - "arrayOk": true, - "description": "Sets the weight (or boldness) of the font.", - "dflt": "normal", - "editType": "calc", - "valType": "enumerated", - "values": [ - "normal", - "bold" - ] - }, - "weightsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `weight`.", - "editType": "none", - "valType": "string" - } - }, - "textposition": { - "arrayOk": true, - "description": "Sets the positions of the `text` elements with respects to the (x,y) coordinates.", - "dflt": "middle center", - "editType": "calc", - "valType": "enumerated", - "values": [ - "top left", - "top center", - "top right", - "middle left", - "middle center", - "middle right", - "bottom left", - "bottom center", - "bottom right" - ] - }, - "textpositionsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `textposition`.", - "editType": "none", - "valType": "string" - }, - "textsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `text`.", - "editType": "none", - "valType": "string" - }, - "texttemplate": { - "arrayOk": true, - "description": "Template string used for rendering the information text that appears on points. Note that this will override `textinfo`. Variables are inserted using %{variable}, for example \"y: %{y}\". Numbers are formatted using d3-format's syntax %{variable:d3-format}, for example \"Price: %{y:$.2f}\". https://github.com/d3/d3-format/tree/v1.4.5#d3-format for details on the formatting syntax. Dates are formatted using d3-time-format's syntax %{variable|d3-time-format}, for example \"Day: %{2019-01-01|%A}\". https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format for details on the date formatting syntax. Variables that can't be found will be replaced with the specifier. For example, a template of \"data: %{x}, %{y}\" will result in a value of \"data: 1, %{y}\" if x is 1 and y is missing. Variables with an undefined value will be replaced with the fallback value. All attributes that can be specified per-point (the ones that are `arrayOk: true`) are available. Finally, the template string has access to variables `r`, `theta` and `text`.", - "dflt": "", - "editType": "plot", - "valType": "string" - }, - "texttemplatefallback": { - "description": "Fallback string that's displayed when a variable referenced in a template is missing. If the boolean value 'false' is passed in, the specifier with the missing variable will be displayed.", - "dflt": "-", - "editType": "plot", - "valType": "any" - }, - "texttemplatesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `texttemplate`.", - "editType": "none", - "valType": "string" - }, - "theta": { - "description": "Sets the angular coordinates", - "editType": "calc+clearAxisTypes", - "valType": "data_array" - }, - "theta0": { - "description": "Alternate to `theta`. Builds a linear space of theta coordinates. Use with `dtheta` where `theta0` is the starting coordinate and `dtheta` the step.", - "dflt": 0, - "editType": "calc+clearAxisTypes", - "valType": "any" - }, - "thetasrc": { - "description": "Sets the source reference on Chart Studio Cloud for `theta`.", - "editType": "none", - "valType": "string" - }, - "thetaunit": { - "description": "Sets the unit of input *theta* values. Has an effect only when on *linear* angular axes.", - "dflt": "degrees", - "editType": "calc+clearAxisTypes", - "valType": "enumerated", - "values": [ - "radians", - "degrees", - "gradians" - ] - }, - "type": "scatterpolargl", - "uid": { - "description": "Assign an id to this trace, Use this to provide object constancy between traces during animations and transitions.", - "editType": "plot", - "valType": "string" - }, - "uirevision": { - "description": "Controls persistence of some user-driven changes to the trace: `constraintrange` in `parcoords` traces, as well as some `editable: true` modifications such as `name` and `colorbar.title`. Defaults to `layout.uirevision`. Note that other user-driven trace attribute changes are controlled by `layout` attributes: `trace.visible` is controlled by `layout.legend.uirevision`, `selectedpoints` is controlled by `layout.selectionrevision`, and `colorbar.(x|y)` (accessible with `config: {editable: true}`) is controlled by `layout.editrevision`. Trace changes are tracked by `uid`, which only falls back on trace index if no `uid` is provided. So if your app can add/remove traces before the end of the `data` array, such that the same trace has a different index, you can still preserve user-driven changes if you give each trace a `uid` that stays with it as it moves.", - "editType": "none", - "valType": "any" - }, - "unselected": { - "editType": "style", - "marker": { - "color": { - "description": "Sets the marker color of unselected points, applied only when a selection exists.", - "editType": "style", + "tickangle": { + "description": "Sets the angle of the tick labels with respect to the horizontal. For example, a `tickangle` of -90 draws the tick labels vertically.", + "dflt": "auto", + "editType": "calc", + "valType": "angle" + }, + "tickcolor": { + "description": "Sets the tick color.", + "dflt": "#444", + "editType": "calc", "valType": "color" }, - "editType": "style", - "opacity": { - "description": "Sets the marker opacity of unselected points, applied only when a selection exists.", - "editType": "style", - "max": 1, - "min": 0, - "valType": "number" + "tickfont": { + "color": { + "editType": "calc", + "valType": "color" + }, + "description": "Sets the color bar's tick label font", + "editType": "calc", + "family": { + "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", + "editType": "calc", + "noBlank": true, + "strict": true, + "valType": "string" + }, + "lineposition": { + "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", + "dflt": "none", + "editType": "calc", + "extras": [ + "none" + ], + "flags": [ + "under", + "over", + "through" + ], + "valType": "flaglist" + }, + "role": "object", + "shadow": { + "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", + "dflt": "none", + "editType": "calc", + "valType": "string" + }, + "size": { + "editType": "calc", + "min": 1, + "valType": "number" + }, + "style": { + "description": "Sets whether a font should be styled with a normal or italic face from its family.", + "dflt": "normal", + "editType": "calc", + "valType": "enumerated", + "values": [ + "normal", + "italic" + ] + }, + "textcase": { + "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", + "dflt": "normal", + "editType": "calc", + "valType": "enumerated", + "values": [ + "normal", + "word caps", + "upper", + "lower" + ] + }, + "variant": { + "description": "Sets the variant of the font.", + "dflt": "normal", + "editType": "calc", + "valType": "enumerated", + "values": [ + "normal", + "small-caps", + "all-small-caps", + "all-petite-caps", + "petite-caps", + "unicase" + ] + }, + "weight": { + "description": "Sets the weight (or boldness) of the font.", + "dflt": "normal", + "editType": "calc", + "extras": [ + "normal", + "bold" + ], + "max": 1000, + "min": 1, + "valType": "integer" + } }, - "role": "object", - "size": { - "description": "Sets the marker size of unselected points, applied only when a selection exists.", - "editType": "style", - "min": 0, - "valType": "number" - } - }, - "role": "object", - "textfont": { - "color": { - "description": "Sets the text font color of unselected points, applied only when a selection exists.", - "editType": "style", - "valType": "color" + "tickformat": { + "description": "Sets the tick label formatting rule using d3 formatting mini-languages which are very similar to those in Python. For numbers, see: https://github.com/d3/d3-format/tree/v1.4.5#d3-format. And for dates see: https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format. We add two items to d3's date formatter: *%h* for half of the year as a decimal number as well as *%{n}f* for fractional seconds with n digits. For example, *2016-10-13 09:15:23.456* with tickformat *%H~%M~%S.%2f* would display *09~15~23.46*", + "dflt": "", + "editType": "calc", + "valType": "string" }, - "editType": "style", - "role": "object" - } - }, - "visible": { - "description": "Determines whether or not this trace is visible. If *legendonly*, the trace is not drawn, but can appear as a legend item (provided that the legend itself is visible).", - "dflt": true, - "editType": "calc", - "valType": "enumerated", - "values": [ - true, - false, - "legendonly" - ] - } - }, - "categories": [ - "gl", - "regl", - "polar", - "symbols", - "showLegend", - "scatter-like" - ], - "meta": { - "description": "The scatterpolargl trace type encompasses line charts, scatter charts, and bubble charts in polar coordinates using the WebGL plotting engine. The data visualized as scatter point or lines is set in `r` (radial) and `theta` (angular) coordinates Bubble charts are achieved by setting `marker.size` and/or `marker.color` to numerical arrays.", - "hrName": "scatter_polar_gl" - }, - "type": "scatterpolargl" - }, - "quiver": { - "animatable": true, - "attributes": { - "angle": { - "description": "Angle of arrowhead in radians. Default = π/9", - "dflt": 0.3490658503988659, - "editType": "calc", - "max": 1.5707963267948966, - "min": 0, - "valType": "number" - }, - "arrow_scale": { - "description": "Value multiplied to length of barb to get length of arrowhead. Default = 0.3", - "dflt": 0.3, - "editType": "calc", - "max": 1, - "min": 0, - "valType": "number" - }, - "customdata": { - "description": "Assigns extra data each datum. This may be useful when listening to hover, click and selection events. Note that, *scatter* traces also appends customdata items in the markers DOM elements", - "editType": "calc", - "valType": "data_array" - }, - "customdatasrc": { - "description": "Sets the source reference on Chart Studio Cloud for `customdata`.", - "editType": "none", - "valType": "string" - }, - "hoverdistance": { - "description": "Maximum distance (in pixels) to look for nearby arrows on hover.", - "dflt": 20, - "editType": "calc", - "min": -1, - "valType": "number" - }, - "hoverinfo": { - "arrayOk": true, - "description": "Determines which trace information appear on hover. If `none` or `skip` are set, no information is displayed upon hovering. But, if `none` is set, click and hover events are still fired.", - "dflt": "all", - "editType": "none", - "extras": [ - "all", - "none", - "skip" - ], - "flags": [ - "x", - "y", - "u", - "v", - "text", - "name" - ], - "valType": "flaglist" - }, - "hoverinfosrc": { - "description": "Sets the source reference on Chart Studio Cloud for `hoverinfo`.", - "editType": "none", - "valType": "string" - }, - "hoverlabel": { - "align": { - "arrayOk": true, - "description": "Sets the horizontal alignment of the text content within hover label box. Has an effect only if the hover label text spans more two or more lines", - "dflt": "auto", - "editType": "none", - "valType": "enumerated", - "values": [ - "left", - "right", - "auto" - ] - }, - "alignsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `align`.", - "editType": "none", - "valType": "string" - }, - "bgcolor": { - "arrayOk": true, - "description": "Sets the background color of the hover labels for this trace", - "editType": "none", - "valType": "color" - }, - "bgcolorsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `bgcolor`.", - "editType": "none", - "valType": "string" - }, - "bordercolor": { - "arrayOk": true, - "description": "Sets the border color of the hover labels for this trace.", - "editType": "none", - "valType": "color" - }, - "bordercolorsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `bordercolor`.", - "editType": "none", - "valType": "string" - }, - "editType": "none", - "font": { - "color": { - "arrayOk": true, - "editType": "none", - "valType": "color" + "tickformatstops": { + "items": { + "tickformatstop": { + "dtickrange": { + "description": "range [*min*, *max*], where *min*, *max* - dtick values which describe some zoom level, it is possible to omit *min* or *max* value by passing *null*", + "editType": "calc", + "items": [ + { + "editType": "calc", + "valType": "any" + }, + { + "editType": "calc", + "valType": "any" + } + ], + "valType": "info_array" + }, + "editType": "calc", + "enabled": { + "description": "Determines whether or not this stop is used. If `false`, this stop is ignored even within its `dtickrange`.", + "dflt": true, + "editType": "calc", + "valType": "boolean" + }, + "name": { + "description": "When used in a template, named items are created in the output figure in addition to any items the figure already has in this array. You can modify these items in the output figure by making your own item with `templateitemname` matching this `name` alongside your modifications (including `visible: false` or `enabled: false` to hide it). Has no effect outside of a template.", + "editType": "calc", + "valType": "string" + }, + "role": "object", + "templateitemname": { + "description": "Used to refer to a named item in this array in the template. Named items from the template will be created even without a matching item in the input figure, but you can modify one by making an item with `templateitemname` matching its `name`, alongside your modifications (including `visible: false` or `enabled: false` to hide it). If there is no template or no matching item, this item will be hidden unless you explicitly show it with `visible: true`.", + "editType": "calc", + "valType": "string" + }, + "value": { + "description": "string - dtickformat for described zoom level, the same as *tickformat*", + "dflt": "", + "editType": "calc", + "valType": "string" + } + } + }, + "role": "object" }, - "colorsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `color`.", - "editType": "none", - "valType": "string" + "ticklabeloverflow": { + "description": "Determines how we handle tick labels that would overflow either the graph div or the domain of the axis. The default value for inside tick labels is *hide past domain*. In other cases the default is *hide past div*.", + "editType": "calc", + "valType": "enumerated", + "values": [ + "allow", + "hide past div", + "hide past domain" + ] }, - "description": "Sets the font used in hover labels.", - "editType": "none", - "family": { - "arrayOk": true, - "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", - "editType": "none", - "noBlank": true, - "strict": true, - "valType": "string" + "ticklabelposition": { + "description": "Determines where tick labels are drawn relative to the ticks. Left and right options are used when `orientation` is *h*, top and bottom when `orientation` is *v*.", + "dflt": "outside", + "editType": "calc", + "valType": "enumerated", + "values": [ + "outside", + "inside", + "outside top", + "inside top", + "outside left", + "inside left", + "outside right", + "inside right", + "outside bottom", + "inside bottom" + ] }, - "familysrc": { - "description": "Sets the source reference on Chart Studio Cloud for `family`.", - "editType": "none", + "ticklabelstep": { + "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", + "dflt": 1, + "editType": "calc", + "min": 1, + "valType": "integer" + }, + "ticklen": { + "description": "Sets the tick length (in px).", + "dflt": 5, + "editType": "calc", + "min": 0, + "valType": "number" + }, + "tickmode": { + "description": "Sets the tick mode for this axis. If *auto*, the number of ticks is set via `nticks`. If *linear*, the placement of the ticks is determined by a starting position `tick0` and a tick step `dtick` (*linear* is the default value if `tick0` and `dtick` are provided). If *array*, the placement of the ticks is set via `tickvals` and the tick text is `ticktext`. (*array* is the default value if `tickvals` is provided).", + "editType": "calc", + "impliedEdits": {}, + "valType": "enumerated", + "values": [ + "auto", + "linear", + "array" + ] + }, + "tickprefix": { + "description": "Sets a tick label prefix.", + "dflt": "", + "editType": "calc", "valType": "string" }, - "lineposition": { - "arrayOk": true, - "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", - "dflt": "none", - "editType": "none", - "extras": [ - "none" - ], - "flags": [ - "under", - "over", - "through" - ], - "valType": "flaglist" + "ticks": { + "description": "Determines whether ticks are drawn or not. If **, this axis' ticks are not drawn. If *outside* (*inside*), this axis' are drawn outside (inside) the axis lines.", + "dflt": "", + "editType": "calc", + "valType": "enumerated", + "values": [ + "outside", + "inside", + "" + ] }, - "linepositionsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `lineposition`.", - "editType": "none", + "ticksuffix": { + "description": "Sets a tick label suffix.", + "dflt": "", + "editType": "calc", "valType": "string" }, - "role": "object", - "shadow": { - "arrayOk": true, - "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", - "dflt": "none", + "ticktext": { + "description": "Sets the text displayed at the ticks position via `tickvals`. Only has an effect if `tickmode` is set to *array*. Used with `tickvals`.", + "editType": "calc", + "valType": "data_array" + }, + "ticktextsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `ticktext`.", "editType": "none", "valType": "string" }, - "shadowsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `shadow`.", + "tickvals": { + "description": "Sets the values at which ticks on this axis appear. Only has an effect if `tickmode` is set to *array*. Used with `ticktext`.", + "editType": "calc", + "valType": "data_array" + }, + "tickvalssrc": { + "description": "Sets the source reference on Chart Studio Cloud for `tickvals`.", "editType": "none", "valType": "string" }, - "size": { - "arrayOk": true, - "editType": "none", - "min": 1, + "tickwidth": { + "description": "Sets the tick width (in px).", + "dflt": 1, + "editType": "calc", + "min": 0, + "valType": "number" + }, + "title": { + "editType": "calc", + "font": { + "color": { + "editType": "calc", + "valType": "color" + }, + "description": "Sets this color bar's title font.", + "editType": "calc", + "family": { + "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", + "editType": "calc", + "noBlank": true, + "strict": true, + "valType": "string" + }, + "lineposition": { + "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", + "dflt": "none", + "editType": "calc", + "extras": [ + "none" + ], + "flags": [ + "under", + "over", + "through" + ], + "valType": "flaglist" + }, + "role": "object", + "shadow": { + "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", + "dflt": "none", + "editType": "calc", + "valType": "string" + }, + "size": { + "editType": "calc", + "min": 1, + "valType": "number" + }, + "style": { + "description": "Sets whether a font should be styled with a normal or italic face from its family.", + "dflt": "normal", + "editType": "calc", + "valType": "enumerated", + "values": [ + "normal", + "italic" + ] + }, + "textcase": { + "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", + "dflt": "normal", + "editType": "calc", + "valType": "enumerated", + "values": [ + "normal", + "word caps", + "upper", + "lower" + ] + }, + "variant": { + "description": "Sets the variant of the font.", + "dflt": "normal", + "editType": "calc", + "valType": "enumerated", + "values": [ + "normal", + "small-caps", + "all-small-caps", + "all-petite-caps", + "petite-caps", + "unicase" + ] + }, + "weight": { + "description": "Sets the weight (or boldness) of the font.", + "dflt": "normal", + "editType": "calc", + "extras": [ + "normal", + "bold" + ], + "max": 1000, + "min": 1, + "valType": "integer" + } + }, + "role": "object", + "side": { + "description": "Determines the location of color bar's title with respect to the color bar. Defaults to *top* when `orientation` if *v* and defaults to *right* when `orientation` if *h*.", + "editType": "calc", + "valType": "enumerated", + "values": [ + "right", + "top", + "bottom" + ] + }, + "text": { + "description": "Sets the title of the color bar.", + "editType": "calc", + "valType": "string" + } + }, + "x": { + "description": "Sets the x position with respect to `xref` of the color bar (in plot fraction). When `xref` is *paper*, defaults to 1.02 when `orientation` is *v* and 0.5 when `orientation` is *h*. When `xref` is *container*, defaults to *1* when `orientation` is *v* and 0.5 when `orientation` is *h*. Must be between *0* and *1* if `xref` is *container* and between *-2* and *3* if `xref` is *paper*.", + "editType": "calc", "valType": "number" }, - "sizesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `size`.", - "editType": "none", - "valType": "string" - }, - "style": { - "arrayOk": true, - "description": "Sets whether a font should be styled with a normal or italic face from its family.", - "dflt": "normal", - "editType": "none", + "xanchor": { + "description": "Sets this color bar's horizontal position anchor. This anchor binds the `x` position to the *left*, *center* or *right* of the color bar. Defaults to *left* when `orientation` is *v* and *center* when `orientation` is *h*.", + "editType": "calc", "valType": "enumerated", "values": [ - "normal", - "italic" + "left", + "center", + "right" ] }, - "stylesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `style`.", - "editType": "none", - "valType": "string" + "xpad": { + "description": "Sets the amount of padding (in px) along the x direction.", + "dflt": 10, + "editType": "calc", + "min": 0, + "valType": "number" }, - "textcase": { - "arrayOk": true, - "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", - "dflt": "normal", - "editType": "none", + "xref": { + "description": "Sets the container `x` refers to. *container* spans the entire `width` of the plot. *paper* refers to the width of the plotting area only.", + "dflt": "paper", + "editType": "calc", "valType": "enumerated", "values": [ - "normal", - "word caps", - "upper", - "lower" + "container", + "paper" ] }, - "textcasesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `textcase`.", - "editType": "none", - "valType": "string" + "y": { + "description": "Sets the y position with respect to `yref` of the color bar (in plot fraction). When `yref` is *paper*, defaults to 0.5 when `orientation` is *v* and 1.02 when `orientation` is *h*. When `yref` is *container*, defaults to 0.5 when `orientation` is *v* and 1 when `orientation` is *h*. Must be between *0* and *1* if `yref` is *container* and between *-2* and *3* if `yref` is *paper*.", + "editType": "calc", + "valType": "number" }, - "variant": { - "arrayOk": true, - "description": "Sets the variant of the font.", - "dflt": "normal", - "editType": "none", + "yanchor": { + "description": "Sets this color bar's vertical position anchor This anchor binds the `y` position to the *top*, *middle* or *bottom* of the color bar. Defaults to *middle* when `orientation` is *v* and *bottom* when `orientation` is *h*.", + "editType": "calc", "valType": "enumerated", "values": [ - "normal", - "small-caps", - "all-small-caps", - "all-petite-caps", - "petite-caps", - "unicase" + "top", + "middle", + "bottom" ] }, - "variantsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `variant`.", - "editType": "none", - "valType": "string" - }, - "weight": { - "arrayOk": true, - "description": "Sets the weight (or boldness) of the font.", - "dflt": "normal", - "editType": "none", - "extras": [ - "normal", - "bold" - ], - "max": 1000, - "min": 1, - "valType": "integer" + "ypad": { + "description": "Sets the amount of padding (in px) along the y direction.", + "dflt": 10, + "editType": "calc", + "min": 0, + "valType": "number" }, - "weightsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `weight`.", - "editType": "none", - "valType": "string" + "yref": { + "description": "Sets the container `y` refers to. *container* spans the entire `height` of the plot. *paper* refers to the height of the plotting area only.", + "dflt": "paper", + "editType": "calc", + "valType": "enumerated", + "values": [ + "container", + "paper" + ] } }, - "namelength": { - "arrayOk": true, - "description": "Sets the default length (in number of characters) of the trace name in the hover labels for all traces. -1 shows the whole name regardless of length. 0-3 shows the first 0-3 characters, and an integer >3 will show the whole name if it is less than that many characters, but if it is longer, will truncate to `namelength - 3` characters and add an ellipsis.", - "dflt": 15, - "editType": "none", - "min": -1, - "valType": "integer" + "colorscale": { + "description": "Sets the colorscale. Has an effect only if in `marker.color` is set to a numerical array. The colorscale must be an array containing arrays mapping a normalized value to an rgb, rgba, hex, hsl, hsv, or named color string. At minimum, a mapping for the lowest (0) and highest (1) values are required. For example, `[[0, 'rgb(0,0,255)'], [1, 'rgb(255,0,0)']]`. To control the bounds of the colorscale in color space, use `marker.cmin` and `marker.cmax`. Alternatively, `colorscale` may be a palette name string of the following list: Blackbody,Bluered,Blues,Cividis,Earth,Electric,Greens,Greys,Hot,Jet,Picnic,Portland,Rainbow,RdBu,Reds,Viridis,YlGnBu,YlOrRd.", + "dflt": null, + "editType": "calc", + "impliedEdits": { + "autocolorscale": false + }, + "valType": "colorscale" }, - "namelengthsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `namelength`.", + "colorsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `color`.", "editType": "none", "valType": "string" }, - "role": "object", - "showarrow": { - "description": "Sets whether or not to show the hover label arrow/triangle pointing to the data point.", - "dflt": true, - "editType": "none", - "valType": "boolean" - } - }, - "hovertemplate": { - "arrayOk": true, - "description": "Template string used for rendering the information that appear on hover box. Note that this will override `hoverinfo`. Variables are inserted using %{variable}, for example \"y: %{y}\" as well as %{xother}, {%_xother}, {%_xother_}, {%xother_}. When showing info for several points, *xother* will be added to those with different x positions from the first point. An underscore before or after *(x|y)other* will add a space on that side, only when this field is shown. Numbers are formatted using d3-format's syntax %{variable:d3-format}, for example \"Price: %{y:$.2f}\". https://github.com/d3/d3-format/tree/v1.4.5#d3-format for details on the formatting syntax. Dates are formatted using d3-time-format's syntax %{variable|d3-time-format}, for example \"Day: %{2019-01-01|%A}\". https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format for details on the date formatting syntax. The variables available in `hovertemplate` are the ones emitted as event data described at this link https://plotly.com/javascript/plotlyjs-events/#event-data. Additionally, every attributes that can be specified per-point (the ones that are `arrayOk: true`) are available. Finally, the template string has access to variables `x`, `y`, `u`, `v`, `text` and `name`. Anything contained in tag `` is displayed in the secondary box, for example `%{fullData.name}`. To hide the secondary box completely, use an empty tag ``.", - "dflt": "", - "editType": "none", - "valType": "string" - }, - "hovertemplatesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `hovertemplate`.", - "editType": "none", - "valType": "string" - }, - "ids": { - "anim": true, - "description": "Assigns id labels to each datum. These ids for object constancy of data points during animation. Should be an array of strings, not numbers or any other type.", "editType": "calc", - "valType": "data_array" - }, - "idssrc": { - "description": "Sets the source reference on Chart Studio Cloud for `ids`.", - "editType": "none", - "valType": "string" - }, - "legend": { - "description": "Sets the reference to a legend to show this trace in. References to these legends are *legend*, *legend2*, *legend3*, etc. Settings for these legends are set in the layout, under `layout.legend`, `layout.legend2`, etc.", - "dflt": "legend", - "editType": "style", - "valType": "subplotid" - }, - "legendgroup": { - "description": "Sets the legend group for this trace. Traces and shapes part of the same legend group hide/show at the same time when toggling legend items.", - "dflt": "", - "editType": "style", - "valType": "string" - }, - "legendgrouptitle": { - "editType": "style", - "font": { + "line": { + "autocolorscale": { + "description": "Determines whether the colorscale is a default palette (`autocolorscale: true`) or the palette determined by `marker.line.colorscale`. Has an effect only if in `marker.line.color` is set to a numerical array. In case `colorscale` is unspecified or `autocolorscale` is true, the default palette will be chosen according to whether numbers in the `color` array are all positive, all negative or mixed.", + "dflt": true, + "editType": "calc", + "impliedEdits": {}, + "valType": "boolean" + }, + "cauto": { + "description": "Determines whether or not the color domain is computed with respect to the input data (here in `marker.line.color`) or the bounds set in `marker.line.cmin` and `marker.line.cmax` Has an effect only if in `marker.line.color` is set to a numerical array. Defaults to `false` when `marker.line.cmin` and `marker.line.cmax` are set by the user.", + "dflt": true, + "editType": "calc", + "impliedEdits": {}, + "valType": "boolean" + }, + "cmax": { + "description": "Sets the upper bound of the color domain. Has an effect only if in `marker.line.color` is set to a numerical array. Value should have the same units as in `marker.line.color` and if set, `marker.line.cmin` must be set as well.", + "dflt": null, + "editType": "calc", + "impliedEdits": { + "cauto": false + }, + "valType": "number" + }, + "cmid": { + "description": "Sets the mid-point of the color domain by scaling `marker.line.cmin` and/or `marker.line.cmax` to be equidistant to this point. Has an effect only if in `marker.line.color` is set to a numerical array. Value should have the same units as in `marker.line.color`. Has no effect when `marker.line.cauto` is `false`.", + "dflt": null, + "editType": "calc", + "impliedEdits": {}, + "valType": "number" + }, + "cmin": { + "description": "Sets the lower bound of the color domain. Has an effect only if in `marker.line.color` is set to a numerical array. Value should have the same units as in `marker.line.color` and if set, `marker.line.cmax` must be set as well.", + "dflt": null, + "editType": "calc", + "impliedEdits": { + "cauto": false + }, + "valType": "number" + }, "color": { - "editType": "style", + "arrayOk": true, + "description": "Sets the marker.line color. It accepts either a specific color or an array of numbers that are mapped to the colorscale relative to the max and min values of the array or relative to `marker.line.cmin` and `marker.line.cmax` if set.", + "editType": "calc", "valType": "color" }, - "description": "Sets this legend group's title font.", - "editType": "style", - "family": { - "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", - "editType": "style", - "noBlank": true, - "strict": true, + "coloraxis": { + "description": "Sets a reference to a shared color axis. References to these shared color axes are *coloraxis*, *coloraxis2*, *coloraxis3*, etc. Settings for these shared color axes are set in the layout, under `layout.coloraxis`, `layout.coloraxis2`, etc. Note that multiple color scales can be linked to the same color axis.", + "dflt": null, + "editType": "calc", + "regex": "/^coloraxis([2-9]|[1-9][0-9]+)?$/", + "valType": "subplotid" + }, + "colorscale": { + "description": "Sets the colorscale. Has an effect only if in `marker.line.color` is set to a numerical array. The colorscale must be an array containing arrays mapping a normalized value to an rgb, rgba, hex, hsl, hsv, or named color string. At minimum, a mapping for the lowest (0) and highest (1) values are required. For example, `[[0, 'rgb(0,0,255)'], [1, 'rgb(255,0,0)']]`. To control the bounds of the colorscale in color space, use `marker.line.cmin` and `marker.line.cmax`. Alternatively, `colorscale` may be a palette name string of the following list: Blackbody,Bluered,Blues,Cividis,Earth,Electric,Greens,Greys,Hot,Jet,Picnic,Portland,Rainbow,RdBu,Reds,Viridis,YlGnBu,YlOrRd.", + "dflt": null, + "editType": "calc", + "impliedEdits": { + "autocolorscale": false + }, + "valType": "colorscale" + }, + "colorsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `color`.", + "editType": "none", "valType": "string" }, - "lineposition": { - "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", - "dflt": "none", - "editType": "style", - "extras": [ - "none" - ], - "flags": [ - "under", - "over", - "through" - ], - "valType": "flaglist" + "editType": "calc", + "reversescale": { + "description": "Reverses the color mapping if true. Has an effect only if in `marker.line.color` is set to a numerical array. If true, `marker.line.cmin` will correspond to the last color in the array and `marker.line.cmax` will correspond to the first color.", + "dflt": false, + "editType": "calc", + "valType": "boolean" }, "role": "object", - "shadow": { - "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", - "dflt": "none", - "editType": "style", - "valType": "string" - }, - "size": { - "editType": "style", - "min": 1, + "width": { + "arrayOk": true, + "description": "Sets the width (in px) of the lines bounding the marker points.", + "editType": "calc", + "min": 0, "valType": "number" }, - "style": { - "description": "Sets whether a font should be styled with a normal or italic face from its family.", - "dflt": "normal", - "editType": "style", - "valType": "enumerated", - "values": [ - "normal", - "italic" - ] - }, - "textcase": { - "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", - "dflt": "normal", - "editType": "style", - "valType": "enumerated", - "values": [ - "normal", - "word caps", - "upper", - "lower" - ] - }, - "variant": { - "description": "Sets the variant of the font.", - "dflt": "normal", - "editType": "style", - "valType": "enumerated", - "values": [ - "normal", - "small-caps", - "all-small-caps", - "all-petite-caps", - "petite-caps", - "unicase" - ] - }, - "weight": { - "description": "Sets the weight (or boldness) of the font.", - "dflt": "normal", - "editType": "style", - "extras": [ - "normal", - "bold" - ], - "max": 1000, - "min": 1, - "valType": "integer" + "widthsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `width`.", + "editType": "none", + "valType": "string" } }, - "role": "object", - "text": { - "description": "Sets the title of the legend group.", - "dflt": "", - "editType": "style", + "opacity": { + "arrayOk": true, + "description": "Sets the marker opacity.", + "editType": "calc", + "max": 1, + "min": 0, + "valType": "number" + }, + "opacitysrc": { + "description": "Sets the source reference on Chart Studio Cloud for `opacity`.", + "editType": "none", "valType": "string" - } - }, - "legendrank": { - "description": "Sets the legend rank for this trace. Items and groups with smaller ranks are presented on top/left side while with *reversed* `legend.traceorder` they are on bottom/right side. The default legendrank is 1000, so that you can use ranks less than 1000 to place certain items before all unranked items, and ranks greater than 1000 to go after all unranked items. When having unranked or equal rank items shapes would be displayed after traces i.e. according to their order in data and layout.", - "dflt": 1000, - "editType": "style", - "valType": "number" - }, - "legendwidth": { - "description": "Sets the width (in px or fraction) of the legend for this trace.", - "editType": "style", - "min": 0, - "valType": "number" - }, - "line": { - "color": { - "description": "Sets the color of the arrow lines.", - "dflt": "#000", - "editType": "style", - "valType": "color" }, - "dash": { - "description": "Sets the dash style of lines. Set to a dash type string (*solid*, *dot*, *dash*, *longdash*, *dashdot*, or *longdashdot*) or a dash length list in px (eg *5px,10px,2px,2px*).", - "dflt": "solid", - "editType": "style", - "valType": "string", + "reversescale": { + "description": "Reverses the color mapping if true. Has an effect only if in `marker.color` is set to a numerical array. If true, `marker.cmin` will correspond to the last color in the array and `marker.cmax` will correspond to the first color.", + "dflt": false, + "editType": "calc", + "valType": "boolean" + }, + "role": "object", + "showscale": { + "description": "Determines whether or not a colorbar is displayed for this trace. Has an effect only if in `marker.color` is set to a numerical array.", + "dflt": false, + "editType": "calc", + "valType": "boolean" + }, + "size": { + "arrayOk": true, + "description": "Sets the marker size (in px).", + "dflt": 6, + "editType": "calc", + "min": 0, + "valType": "number" + }, + "sizemin": { + "description": "Has an effect only if `marker.size` is set to a numerical array. Sets the minimum size (in px) of the rendered marker points.", + "dflt": 0, + "editType": "calc", + "min": 0, + "valType": "number" + }, + "sizemode": { + "description": "Has an effect only if `marker.size` is set to a numerical array. Sets the rule for which the data in `size` is converted to pixels.", + "dflt": "diameter", + "editType": "calc", + "valType": "enumerated", "values": [ - "solid", - "dot", - "dash", - "longdash", - "dashdot", - "longdashdot" + "diameter", + "area" ] }, - "editType": "style", - "role": "object", - "shape": { - "description": "Determines the line shape.", - "dflt": "linear", - "editType": "plot", + "sizeref": { + "description": "Has an effect only if `marker.size` is set to a numerical array. Sets the scale factor used to determine the rendered size of marker points. Use with `sizemin` and `sizemode`.", + "dflt": 1, + "editType": "calc", + "valType": "number" + }, + "sizesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `size`.", + "editType": "none", + "valType": "string" + }, + "symbol": { + "arrayOk": true, + "description": "Sets the marker symbol type. Adding 100 is equivalent to appending *-open* to a symbol name. Adding 200 is equivalent to appending *-dot* to a symbol name. Adding 300 is equivalent to appending *-open-dot* or *dot-open* to a symbol name.", + "dflt": "circle", + "editType": "calc", "valType": "enumerated", "values": [ - "linear", - "spline", - "hv", - "vh", - "hvh", - "vhv" + 0, + "0", + "circle", + 100, + "100", + "circle-open", + 200, + "200", + "circle-dot", + 300, + "300", + "circle-open-dot", + 1, + "1", + "square", + 101, + "101", + "square-open", + 201, + "201", + "square-dot", + 301, + "301", + "square-open-dot", + 2, + "2", + "diamond", + 102, + "102", + "diamond-open", + 202, + "202", + "diamond-dot", + 302, + "302", + "diamond-open-dot", + 3, + "3", + "cross", + 103, + "103", + "cross-open", + 203, + "203", + "cross-dot", + 303, + "303", + "cross-open-dot", + 4, + "4", + "x", + 104, + "104", + "x-open", + 204, + "204", + "x-dot", + 304, + "304", + "x-open-dot", + 5, + "5", + "triangle-up", + 105, + "105", + "triangle-up-open", + 205, + "205", + "triangle-up-dot", + 305, + "305", + "triangle-up-open-dot", + 6, + "6", + "triangle-down", + 106, + "106", + "triangle-down-open", + 206, + "206", + "triangle-down-dot", + 306, + "306", + "triangle-down-open-dot", + 7, + "7", + "triangle-left", + 107, + "107", + "triangle-left-open", + 207, + "207", + "triangle-left-dot", + 307, + "307", + "triangle-left-open-dot", + 8, + "8", + "triangle-right", + 108, + "108", + "triangle-right-open", + 208, + "208", + "triangle-right-dot", + 308, + "308", + "triangle-right-open-dot", + 9, + "9", + "triangle-ne", + 109, + "109", + "triangle-ne-open", + 209, + "209", + "triangle-ne-dot", + 309, + "309", + "triangle-ne-open-dot", + 10, + "10", + "triangle-se", + 110, + "110", + "triangle-se-open", + 210, + "210", + "triangle-se-dot", + 310, + "310", + "triangle-se-open-dot", + 11, + "11", + "triangle-sw", + 111, + "111", + "triangle-sw-open", + 211, + "211", + "triangle-sw-dot", + 311, + "311", + "triangle-sw-open-dot", + 12, + "12", + "triangle-nw", + 112, + "112", + "triangle-nw-open", + 212, + "212", + "triangle-nw-dot", + 312, + "312", + "triangle-nw-open-dot", + 13, + "13", + "pentagon", + 113, + "113", + "pentagon-open", + 213, + "213", + "pentagon-dot", + 313, + "313", + "pentagon-open-dot", + 14, + "14", + "hexagon", + 114, + "114", + "hexagon-open", + 214, + "214", + "hexagon-dot", + 314, + "314", + "hexagon-open-dot", + 15, + "15", + "hexagon2", + 115, + "115", + "hexagon2-open", + 215, + "215", + "hexagon2-dot", + 315, + "315", + "hexagon2-open-dot", + 16, + "16", + "octagon", + 116, + "116", + "octagon-open", + 216, + "216", + "octagon-dot", + 316, + "316", + "octagon-open-dot", + 17, + "17", + "star", + 117, + "117", + "star-open", + 217, + "217", + "star-dot", + 317, + "317", + "star-open-dot", + 18, + "18", + "hexagram", + 118, + "118", + "hexagram-open", + 218, + "218", + "hexagram-dot", + 318, + "318", + "hexagram-open-dot", + 19, + "19", + "star-triangle-up", + 119, + "119", + "star-triangle-up-open", + 219, + "219", + "star-triangle-up-dot", + 319, + "319", + "star-triangle-up-open-dot", + 20, + "20", + "star-triangle-down", + 120, + "120", + "star-triangle-down-open", + 220, + "220", + "star-triangle-down-dot", + 320, + "320", + "star-triangle-down-open-dot", + 21, + "21", + "star-square", + 121, + "121", + "star-square-open", + 221, + "221", + "star-square-dot", + 321, + "321", + "star-square-open-dot", + 22, + "22", + "star-diamond", + 122, + "122", + "star-diamond-open", + 222, + "222", + "star-diamond-dot", + 322, + "322", + "star-diamond-open-dot", + 23, + "23", + "diamond-tall", + 123, + "123", + "diamond-tall-open", + 223, + "223", + "diamond-tall-dot", + 323, + "323", + "diamond-tall-open-dot", + 24, + "24", + "diamond-wide", + 124, + "124", + "diamond-wide-open", + 224, + "224", + "diamond-wide-dot", + 324, + "324", + "diamond-wide-open-dot", + 25, + "25", + "hourglass", + 125, + "125", + "hourglass-open", + 26, + "26", + "bowtie", + 126, + "126", + "bowtie-open", + 27, + "27", + "circle-cross", + 127, + "127", + "circle-cross-open", + 28, + "28", + "circle-x", + 128, + "128", + "circle-x-open", + 29, + "29", + "square-cross", + 129, + "129", + "square-cross-open", + 30, + "30", + "square-x", + 130, + "130", + "square-x-open", + 31, + "31", + "diamond-cross", + 131, + "131", + "diamond-cross-open", + 32, + "32", + "diamond-x", + 132, + "132", + "diamond-x-open", + 33, + "33", + "cross-thin", + 133, + "133", + "cross-thin-open", + 34, + "34", + "x-thin", + 134, + "134", + "x-thin-open", + 35, + "35", + "asterisk", + 135, + "135", + "asterisk-open", + 36, + "36", + "hash", + 136, + "136", + "hash-open", + 236, + "236", + "hash-dot", + 336, + "336", + "hash-open-dot", + 37, + "37", + "y-up", + 137, + "137", + "y-up-open", + 38, + "38", + "y-down", + 138, + "138", + "y-down-open", + 39, + "39", + "y-left", + 139, + "139", + "y-left-open", + 40, + "40", + "y-right", + 140, + "140", + "y-right-open", + 41, + "41", + "line-ew", + 141, + "141", + "line-ew-open", + 42, + "42", + "line-ns", + 142, + "142", + "line-ns-open", + 43, + "43", + "line-ne", + 143, + "143", + "line-ne-open", + 44, + "44", + "line-nw", + 144, + "144", + "line-nw-open", + 45, + "45", + "arrow-up", + 145, + "145", + "arrow-up-open", + 46, + "46", + "arrow-down", + 146, + "146", + "arrow-down-open", + 47, + "47", + "arrow-left", + 147, + "147", + "arrow-left-open", + 48, + "48", + "arrow-right", + 148, + "148", + "arrow-right-open", + 49, + "49", + "arrow-bar-up", + 149, + "149", + "arrow-bar-up-open", + 50, + "50", + "arrow-bar-down", + 150, + "150", + "arrow-bar-down-open", + 51, + "51", + "arrow-bar-left", + 151, + "151", + "arrow-bar-left-open", + 52, + "52", + "arrow-bar-right", + 152, + "152", + "arrow-bar-right-open", + 53, + "53", + "arrow", + 153, + "153", + "arrow-open", + 54, + "54", + "arrow-wide", + 154, + "154", + "arrow-wide-open" ] }, - "simplify": { - "description": "Simplifies lines by removing nearly-overlapping points.", - "dflt": true, - "editType": "plot", - "valType": "boolean" - }, - "smoothing": { - "description": "Has an effect only if `shape` is set to *spline*. Sets the amount of smoothing.", - "dflt": 1, - "editType": "plot", - "max": 1.3, - "min": 0, - "valType": "number" - }, - "width": { - "description": "Sets the width (in px) of the arrow lines.", - "dflt": 1, - "editType": "style", - "min": 0, - "valType": "number" + "symbolsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `symbol`.", + "editType": "none", + "valType": "string" } }, "meta": { @@ -22097,67 +25525,67 @@ "editType": "none", "valType": "string" }, - "name": { - "description": "Sets the trace name. The trace name appears as the legend item and on hover.", - "editType": "style", - "valType": "string" - }, - "opacity": { - "description": "Sets the opacity of the trace.", - "dflt": 1, - "editType": "style", - "max": 1, - "min": 0, - "valType": "number" - }, - "sizemode": { - "description": "Determines whether `sizeref` is set as a *scaled* (unitless) scalar (normalized by the max u/v norm in the vector field), as an *absolute* value (in the same units as the vector field), or *raw* to use the raw vector lengths.", - "dflt": "scaled", - "editType": "calc", - "valType": "enumerated", - "values": [ - "scaled", - "absolute", - "raw" - ] - }, - "sizeref": { - "description": "Adjusts the arrow size scaling. The arrow length is determined by the vector norm multiplied by `sizeref`, optionally normalized when `sizemode` is *scaled*.", + "mode": { + "description": "Determines the drawing mode for this scatter trace. If the provided `mode` includes *text* then the `text` elements appear at the coordinates. Otherwise, the `text` elements appear on hover. If there are less than 20 points and the trace is not stacked then the default is *lines+markers*. Otherwise, *lines*.", "editType": "calc", - "min": 0, - "valType": "number" + "extras": [ + "none" + ], + "flags": [ + "lines", + "markers", + "text" + ], + "valType": "flaglist" }, - "anchor": { - "description": "Sets the arrows' anchor with respect to their (x,y) positions. Use *tail* to place (x,y) at the base, *tip* to place (x,y) at the head, or *cm*/*center*/*middle* to center the arrow on (x,y).", - "dflt": "tail", - "editType": "calc", - "valType": "enumerated", - "values": [ - "tip", - "tail", - "cm", - "center", - "middle" - ] + "name": { + "description": "Sets the trace name. The trace name appears as the legend item and on hover.", + "editType": "style", + "valType": "string" }, - "scaleratio": { - "description": "The ratio between the scale of the y-axis and the scale of the x-axis (scale_y / scale_x). Default = null, the scale ratio is not fixed.", - "editType": "calc", + "opacity": { + "description": "Sets the opacity of the trace.", + "dflt": 1, + "editType": "style", + "max": 1, "min": 0, "valType": "number" }, + "r": { + "description": "Sets the radial coordinates", + "editType": "calc+clearAxisTypes", + "valType": "data_array" + }, + "r0": { + "description": "Alternate to `r`. Builds a linear space of r coordinates. Use with `dr` where `r0` is the starting coordinate and `dr` the step.", + "dflt": 0, + "editType": "calc+clearAxisTypes", + "valType": "any" + }, + "rsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `r`.", + "editType": "none", + "valType": "string" + }, "selected": { "editType": "style", - "line": { + "marker": { "color": { - "description": "Sets the line color of selected points.", + "description": "Sets the marker color of selected points.", "editType": "style", "valType": "color" }, "editType": "style", + "opacity": { + "description": "Sets the marker opacity of selected points.", + "editType": "style", + "max": 1, + "min": 0, + "valType": "number" + }, "role": "object", - "width": { - "description": "Sets the line width of selected points.", + "size": { + "description": "Sets the marker size of selected points.", "editType": "style", "min": 0, "valType": "number" @@ -22166,7 +25594,7 @@ "role": "object", "textfont": { "color": { - "description": "Sets the text font color of selected points, applied only when a selection exists.", + "description": "Sets the text font color of selected points.", "editType": "style", "valType": "color" }, @@ -22204,16 +25632,23 @@ "valType": "string" } }, + "subplot": { + "description": "Sets a reference between this trace's data coordinates and a polar subplot. If *polar* (the default value), the data refer to `layout.polar`. If *polar2*, the data refer to `layout.polar2`, and so on.", + "dflt": "polar", + "editType": "calc", + "valType": "subplotid" + }, "text": { - "anim": true, - "description": "Sets text elements associated with each (x,y) pair.", + "arrayOk": true, + "description": "Sets text elements associated with each (x,y) pair. If a single string, the same string appears over all the data points. If an array of string, the items are mapped in order to the this trace's (x,y) coordinates. If trace `hoverinfo` contains a *text* flag and *hovertext* is not set, these elements will be seen in the hover labels.", + "dflt": "", "editType": "calc", - "valType": "data_array" + "valType": "string" }, "textfont": { "color": { "arrayOk": true, - "editType": "style", + "editType": "calc", "valType": "color" }, "colorsrc": { @@ -22236,39 +25671,7 @@ "editType": "none", "valType": "string" }, - "lineposition": { - "arrayOk": true, - "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", - "dflt": "none", - "editType": "calc", - "extras": [ - "none" - ], - "flags": [ - "under", - "over", - "through" - ], - "valType": "flaglist" - }, - "linepositionsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `lineposition`.", - "editType": "none", - "valType": "string" - }, "role": "object", - "shadow": { - "arrayOk": true, - "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", - "dflt": "none", - "editType": "calc", - "valType": "string" - }, - "shadowsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `shadow`.", - "editType": "none", - "valType": "string" - }, "size": { "arrayOk": true, "editType": "calc", @@ -22296,24 +25699,6 @@ "editType": "none", "valType": "string" }, - "textcase": { - "arrayOk": true, - "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", - "dflt": "normal", - "editType": "calc", - "valType": "enumerated", - "values": [ - "normal", - "word caps", - "upper", - "lower" - ] - }, - "textcasesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `textcase`.", - "editType": "none", - "valType": "string" - }, "variant": { "arrayOk": true, "description": "Sets the variant of the font.", @@ -22322,11 +25707,7 @@ "valType": "enumerated", "values": [ "normal", - "small-caps", - "all-small-caps", - "all-petite-caps", - "petite-caps", - "unicase" + "small-caps" ] }, "variantsrc": { @@ -22339,13 +25720,11 @@ "description": "Sets the weight (or boldness) of the font.", "dflt": "normal", "editType": "calc", - "extras": [ + "valType": "enumerated", + "values": [ "normal", "bold" - ], - "max": 1000, - "min": 1, - "valType": "integer" + ] }, "weightsrc": { "description": "Sets the source reference on Chart Studio Cloud for `weight`.", @@ -22354,6 +25733,7 @@ } }, "textposition": { + "arrayOk": true, "description": "Sets the positions of the `text` elements with respects to the (x,y) coordinates.", "dflt": "middle center", "editType": "calc", @@ -22370,20 +25750,63 @@ "bottom right" ] }, + "textpositionsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `textposition`.", + "editType": "none", + "valType": "string" + }, "textsrc": { "description": "Sets the source reference on Chart Studio Cloud for `text`.", "editType": "none", "valType": "string" }, - "type": "quiver", - "u": { - "anim": true, - "description": "Sets the x components of the arrow vectors.", - "editType": "calc", + "texttemplate": { + "arrayOk": true, + "description": "Template string used for rendering the information text that appears on points. Note that this will override `textinfo`. Variables are inserted using %{variable}, for example \"y: %{y}\". Numbers are formatted using d3-format's syntax %{variable:d3-format}, for example \"Price: %{y:$.2f}\". https://github.com/d3/d3-format/tree/v1.4.5#d3-format for details on the formatting syntax. Dates are formatted using d3-time-format's syntax %{variable|d3-time-format}, for example \"Day: %{2019-01-01|%A}\". https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format for details on the date formatting syntax. Variables that can't be found will be replaced with the specifier. For example, a template of \"data: %{x}, %{y}\" will result in a value of \"data: 1, %{y}\" if x is 1 and y is missing. Variables with an undefined value will be replaced with the fallback value. All attributes that can be specified per-point (the ones that are `arrayOk: true`) are available. Finally, the template string has access to variables `r`, `theta` and `text`.", + "dflt": "", + "editType": "plot", + "valType": "string" + }, + "texttemplatefallback": { + "description": "Fallback string that's displayed when a variable referenced in a template is missing. If the boolean value 'false' is passed in, the specifier with the missing variable will be displayed.", + "dflt": "-", + "editType": "plot", + "valType": "any" + }, + "texttemplatesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `texttemplate`.", + "editType": "none", + "valType": "string" + }, + "theta": { + "description": "Sets the angular coordinates", + "editType": "calc+clearAxisTypes", "valType": "data_array" }, + "theta0": { + "description": "Alternate to `theta`. Builds a linear space of theta coordinates. Use with `dtheta` where `theta0` is the starting coordinate and `dtheta` the step.", + "dflt": 0, + "editType": "calc+clearAxisTypes", + "valType": "any" + }, + "thetasrc": { + "description": "Sets the source reference on Chart Studio Cloud for `theta`.", + "editType": "none", + "valType": "string" + }, + "thetaunit": { + "description": "Sets the unit of input *theta* values. Has an effect only when on *linear* angular axes.", + "dflt": "degrees", + "editType": "calc+clearAxisTypes", + "valType": "enumerated", + "values": [ + "radians", + "degrees", + "gradians" + ] + }, + "type": "scatterpolargl", "uid": { - "anim": true, "description": "Assign an id to this trace, Use this to provide object constancy between traces during animations and transitions.", "editType": "plot", "valType": "string" @@ -22395,16 +25818,23 @@ }, "unselected": { "editType": "style", - "line": { + "marker": { "color": { - "description": "Sets the line color of unselected points.", + "description": "Sets the marker color of unselected points, applied only when a selection exists.", "editType": "style", "valType": "color" }, "editType": "style", + "opacity": { + "description": "Sets the marker opacity of unselected points, applied only when a selection exists.", + "editType": "style", + "max": 1, + "min": 0, + "valType": "number" + }, "role": "object", - "width": { - "description": "Sets the line width of unselected points.", + "size": { + "description": "Sets the marker size of unselected points, applied only when a selection exists.", "editType": "style", "min": 0, "valType": "number" @@ -22421,17 +25851,6 @@ "role": "object" } }, - "usrc": { - "description": "Sets the source reference on Chart Studio Cloud for `u`.", - "editType": "none", - "valType": "string" - }, - "v": { - "anim": true, - "description": "Sets the y components of the arrow vectors.", - "editType": "calc", - "valType": "data_array" - }, "visible": { "description": "Determines whether or not this trace is visible. If *legendonly*, the trace is not drawn, but can appear as a legend item (provided that the legend itself is visible).", "dflt": true, @@ -22442,58 +25861,21 @@ false, "legendonly" ] - }, - "vsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `v`.", - "editType": "none", - "valType": "string" - }, - "x": { - "anim": true, - "description": "Sets the x coordinates of the arrow locations.", - "editType": "calc+clearAxisTypes", - "valType": "data_array" - }, - "xaxis": { - "description": "Sets a reference between this trace's x coordinates and a 2D cartesian x axis. If *x* (the default value), the x coordinates refer to `layout.xaxis`. If *x2*, the x coordinates refer to `layout.xaxis2`, and so on.", - "dflt": "x", - "editType": "calc+clearAxisTypes", - "valType": "subplotid" - }, - "xsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `x`.", - "editType": "none", - "valType": "string" - }, - "y": { - "anim": true, - "description": "Sets the y coordinates of the arrow locations.", - "editType": "calc+clearAxisTypes", - "valType": "data_array" - }, - "yaxis": { - "description": "Sets a reference between this trace's y coordinates and a 2D cartesian y axis. If *y* (the default value), the y coordinates refer to `layout.yaxis`. If *y2*, the y coordinates refer to `layout.yaxis2`, and so on.", - "dflt": "y", - "editType": "calc+clearAxisTypes", - "valType": "subplotid" - }, - "ysrc": { - "description": "Sets the source reference on Chart Studio Cloud for `y`.", - "editType": "none", - "valType": "string" } }, "categories": [ - "cartesian", - "svg", + "gl", + "regl", + "polar", + "symbols", "showLegend", - "scatter-like", - "zoomScale" + "scatter-like" ], "meta": { - "description": "The quiver trace type visualizes vector fields using arrows. Specify a vector field using 4 1D arrays: 2 position arrays `x`, `y` and 2 vector component arrays `u`, `v`. The arrows are drawn exactly at the positions given by `x` and `y`. Arrow length and direction are determined by `u` and `v` components." + "description": "The scatterpolargl trace type encompasses line charts, scatter charts, and bubble charts in polar coordinates using the WebGL plotting engine. The data visualized as scatter point or lines is set in `r` (radial) and `theta` (angular) coordinates Bubble charts are achieved by setting `marker.size` and/or `marker.color` to numerical arrays.", + "hrName": "scatter_polar_gl" }, - "type": "quiver" + "type": "scatterpolargl" }, "scattersmith": { "animatable": false, From 1d8d74e73d892d3fe5028bfebab31b1e8ccbf9b9 Mon Sep 17 00:00:00 2001 From: John Degner Date: Tue, 11 Nov 2025 12:14:48 -0800 Subject: [PATCH 06/46] Derive scaling from axes --- src/traces/quiver/attributes.js | 6 ------ src/traces/quiver/defaults.js | 1 - src/traces/quiver/plot.js | 5 ++++- 3 files changed, 4 insertions(+), 8 deletions(-) diff --git a/src/traces/quiver/attributes.js b/src/traces/quiver/attributes.js index a0e64eb74a9..0e2ef465a25 100644 --- a/src/traces/quiver/attributes.js +++ b/src/traces/quiver/attributes.js @@ -73,12 +73,6 @@ var attrs = { editType: 'calc', description: 'Angle of arrowhead in radians. Default = π/9' }, - scaleratio: { - valType: 'number', - min: 0, - editType: 'calc', - description: 'The ratio between the scale of the y-axis and the scale of the x-axis (scale_y / scale_x). Default = null, the scale ratio is not fixed.' - }, hoverdistance: { valType: 'number', min: -1, diff --git a/src/traces/quiver/defaults.js b/src/traces/quiver/defaults.js index 2d8e81554c1..eec5dae89ed 100644 --- a/src/traces/quiver/defaults.js +++ b/src/traces/quiver/defaults.js @@ -46,7 +46,6 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout // back-compat coerce('arrow_scale'); coerce('angle', Math.PI / 9); - coerce('scaleratio'); coerce('hoverdistance', 20); // Line styling diff --git a/src/traces/quiver/plot.js b/src/traces/quiver/plot.js index c6fbe470371..82fc6bfb2ca 100644 --- a/src/traces/quiver/plot.js +++ b/src/traces/quiver/plot.js @@ -106,7 +106,10 @@ function plotOne(gd, idx, plotinfo, cdscatter, cdscatterAll, element, transition } // Compute arrow in data space - var scaleRatio = trace.scaleratio || 1; + // Derive pixel-per-data scaling from axes at this point + var pxPerX = Math.abs(xa.c2p(cdi.x + 1) - xa.c2p(cdi.x)); + var pxPerY = Math.abs(ya.c2p(cdi.y + 1) - ya.c2p(cdi.y)); + var scaleRatio = (pxPerX && pxPerY) ? (pxPerY / pxPerX) : 1; var baseHeadScale = 0.2; var arrowScale = (trace.arrowsize !== undefined) ? (baseHeadScale * trace.arrowsize) From 3dd208d26602cb034321c9175d1ae914b5e889a3 Mon Sep 17 00:00:00 2001 From: John Degner Date: Tue, 11 Nov 2025 12:29:40 -0800 Subject: [PATCH 07/46] Remove angle attribute --- src/traces/quiver/attributes.js | 8 -------- src/traces/quiver/defaults.js | 1 - src/traces/quiver/plot.js | 9 ++++++--- 3 files changed, 6 insertions(+), 12 deletions(-) diff --git a/src/traces/quiver/attributes.js b/src/traces/quiver/attributes.js index 0e2ef465a25..937e31bb0df 100644 --- a/src/traces/quiver/attributes.js +++ b/src/traces/quiver/attributes.js @@ -65,14 +65,6 @@ var attrs = { 'or *cm*/*center*/*middle* to center the arrow on (x,y).' ].join(' ') }, - angle: { - valType: 'number', - dflt: Math.PI / 9, - min: 0, - max: Math.PI / 2, - editType: 'calc', - description: 'Angle of arrowhead in radians. Default = π/9' - }, hoverdistance: { valType: 'number', min: -1, diff --git a/src/traces/quiver/defaults.js b/src/traces/quiver/defaults.js index eec5dae89ed..43d7a633ec4 100644 --- a/src/traces/quiver/defaults.js +++ b/src/traces/quiver/defaults.js @@ -45,7 +45,6 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout coerce('arrowsize', 1); // back-compat coerce('arrow_scale'); - coerce('angle', Math.PI / 9); coerce('hoverdistance', 20); // Line styling diff --git a/src/traces/quiver/plot.js b/src/traces/quiver/plot.js index 82fc6bfb2ca..c90ba980c87 100644 --- a/src/traces/quiver/plot.js +++ b/src/traces/quiver/plot.js @@ -114,7 +114,10 @@ function plotOne(gd, idx, plotinfo, cdscatter, cdscatterAll, element, transition var arrowScale = (trace.arrowsize !== undefined) ? (baseHeadScale * trace.arrowsize) : (trace.arrow_scale !== undefined ? trace.arrow_scale : baseHeadScale); - var angle = trace.angle || Math.PI / 12; // small default + // Fixed arrowhead wedge angle (radians). + // Arrow direction is fully determined by u,v (see barbAng below); + // this constant only controls the opening of the head. + var headAngle = Math.PI / 12; var u = (trace.u && trace.u[cdi.i]) || 0; var v = (trace.v && trace.v[cdi.i]) || 0; @@ -138,8 +141,8 @@ function plotOne(gd, idx, plotinfo, cdscatter, cdscatterAll, element, transition var arrowLen = barbLen * arrowScale; var barbAng = Math.atan2(dy, dx / scaleRatio); - var ang1 = barbAng + angle; - var ang2 = barbAng - angle; + var ang1 = barbAng + headAngle; + var ang2 = barbAng - headAngle; var x0, y0, x1, y1; if (anchor === 'tip') { From ec5f85037f1e25e9203f1b1e7352591785fdd81d Mon Sep 17 00:00:00 2001 From: John Degner Date: Tue, 11 Nov 2025 12:37:42 -0800 Subject: [PATCH 08/46] Include colorscale attributes in quiver --- src/traces/quiver/attributes.js | 11 +++++++++++ src/traces/quiver/defaults.js | 23 +++++++++++++++++++++++ src/traces/quiver/plot.js | 12 ++++++++++++ 3 files changed, 46 insertions(+) diff --git a/src/traces/quiver/attributes.js b/src/traces/quiver/attributes.js index 937e31bb0df..15c85784745 100644 --- a/src/traces/quiver/attributes.js +++ b/src/traces/quiver/attributes.js @@ -6,6 +6,7 @@ var fontAttrs = require('../../plots/font_attributes'); var dash = require('../../components/drawing/attributes').dash; var extendFlat = require('../../lib/extend').extendFlat; +var colorScaleAttrs = require('../../components/colorscale/attributes'); var attrs = { x: { @@ -223,6 +224,16 @@ var attrs = { // Extend with base attributes (includes hoverinfo, etc.) extendFlat(attrs, baseAttrs); +// Colorscale attributes to color arrows by |(u,v)| magnitude +extendFlat( + attrs, + colorScaleAttrs('', { + colorAttr: 'u/v norm', + showScaleDflt: true, + editTypeOverride: 'calc' + }) +); + // Add hoverinfo with proper flags for quiver // We need to create a new object to avoid mutating the shared base attributes attrs.hoverinfo = extendFlat({}, baseAttrs.hoverinfo, { diff --git a/src/traces/quiver/defaults.js b/src/traces/quiver/defaults.js index 43d7a633ec4..54e243c8497 100644 --- a/src/traces/quiver/defaults.js +++ b/src/traces/quiver/defaults.js @@ -2,6 +2,9 @@ var Lib = require('../../lib'); var attributes = require('./attributes'); +var Colorscale = require('../../components/colorscale'); +var colorscaleDefaults = Colorscale.handleDefaults; +var hasColorscale = Colorscale.hasColorscale; module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout) { // Selection styling - use coerce to set proper defaults @@ -61,6 +64,26 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout // traceOut.hoverinfo will be set by Lib.coerceHoverinfo in plots.js traceOut.hovertemplate = traceIn.hovertemplate; + // Colorscale for magnitude coloring: compute cmin/cmax from |(u,v)| + var cmin = Infinity; + var cmax = -Infinity; + for (var k = 0; k < len; k++) { + var uu = (traceOut.u && traceOut.u[k]) || (traceIn.u && traceIn.u[k]) || 0; + var vv = (traceOut.v && traceOut.v[k]) || (traceIn.v && traceIn.v[k]) || 0; + var nrm = Math.sqrt(uu * uu + vv * vv); + if (isFinite(nrm)) { + if (nrm < cmin) cmin = nrm; + if (nrm > cmax) cmax = nrm; + } + } + if (!isFinite(cmin)) cmin = 0; + if (!isFinite(cmax)) cmax = 1; + if (traceIn.cmin === undefined && traceOut.cmin === undefined) traceOut.cmin = cmin; + if (traceIn.cmax === undefined && traceOut.cmax === undefined) traceOut.cmax = cmax; + // Flag colorscale and apply defaults (adds colorscale, showscale, colorbar, etc.) + traceOut._hasColorscale = hasColorscale(traceIn) || true; + colorscaleDefaults(traceIn, traceOut, layout, coerce, { prefix: '', cLetter: 'c' }); + // Text traceOut.text = traceIn.text; traceOut.textposition = traceIn.textposition || 'middle center'; diff --git a/src/traces/quiver/plot.js b/src/traces/quiver/plot.js index c90ba980c87..b2be39b449a 100644 --- a/src/traces/quiver/plot.js +++ b/src/traces/quiver/plot.js @@ -5,6 +5,7 @@ var d3 = require('@plotly/d3'); var Registry = require('../../registry'); var Lib = require('../../lib'); var Drawing = require('../../components/drawing'); +var Colorscale = require('../../components/colorscale'); module.exports = function plot(gd, plotinfo, cdscatter, scatterLayer, transitionOpts, makeOnCompleteCallback) { var join, onComplete; @@ -184,6 +185,17 @@ function plotOne(gd, idx, plotinfo, cdscatter, cdscatterAll, element, transition // Apply styling using Plotly's standard styling system Drawing.lineGroupStyle(lineSegments, trace.line && trace.line.width, trace.line && trace.line.color, trace.line && trace.line.dash); + // If colorscale present, color arrows by magnitude |(u,v)| + if (trace._hasColorscale) { + var colorFunc = Colorscale.makeColorScaleFuncFromTrace(trace); + lineSegments.style('stroke', function(cdi) { + var uVal = (trace.u && trace.u[cdi.i]) || 0; + var vVal = (trace.v && trace.v[cdi.i]) || 0; + var nVal = Math.sqrt(uVal * uVal + vVal * vVal); + return colorFunc(nVal); + }); + } + // Handle transitions if(transitionOpts && transitionOpts.duration > 0) { var transition = d3.transition() From 5534667626520c6697ae955aa3e92f3c89f22a27 Mon Sep 17 00:00:00 2001 From: John Degner Date: Tue, 11 Nov 2025 13:06:44 -0800 Subject: [PATCH 09/46] Add support for coloring by an independent scalar array --- src/traces/quiver/attributes.js | 7 +++++++ src/traces/quiver/calc.js | 32 ++++++++++++++++++++++++++++++++ src/traces/quiver/defaults.js | 19 ++----------------- src/traces/quiver/plot.js | 14 ++++++++++---- 4 files changed, 51 insertions(+), 21 deletions(-) diff --git a/src/traces/quiver/attributes.js b/src/traces/quiver/attributes.js index 15c85784745..88eb603a999 100644 --- a/src/traces/quiver/attributes.js +++ b/src/traces/quiver/attributes.js @@ -33,6 +33,13 @@ var attrs = { anim: true, description: 'Sets the y components of the arrow vectors.' }, + // Optional scalar field used for colorscale mapping. If omitted, |(u,v)| is used. + c: { + valType: 'data_array', + editType: 'calc', + anim: true, + description: 'Sets the scalar values used to map colors via the colorscale. If not provided, the magnitude sqrt(u^2 + v^2) is used.' + }, sizemode: { valType: 'enumerated', values: ['scaled', 'absolute', 'raw'], diff --git a/src/traces/quiver/calc.js b/src/traces/quiver/calc.js index 1fd8877bef7..4484de6960b 100644 --- a/src/traces/quiver/calc.js +++ b/src/traces/quiver/calc.js @@ -5,6 +5,7 @@ var Axes = require('../../plots/cartesian/axes'); var isNumeric = require('fast-isnumeric'); var BADNUM = require('../../constants/numerical').BADNUM; var scatterCalc = require('../scatter/calc'); +var colorscaleCalc = require('../../components/colorscale/calc'); /** * Main calculation function for quiver trace @@ -24,6 +25,12 @@ module.exports = function calc(gd, trace) { trace._length = len; var cd = new Array(len); + var normMin = Infinity; + var normMax = -Infinity; + var cMin = Infinity; + var cMax = -Infinity; + var hasC = Array.isArray(trace.c); + for(var i = 0; i < len; i++) { var cdi = cd[i] = { i: i }; var xValid = isNumeric(xVals[i]); @@ -36,11 +43,36 @@ module.exports = function calc(gd, trace) { cdi.x = BADNUM; cdi.y = BADNUM; } + + // track ranges for colorscale + if(hasC) { + var ci = trace.c[i]; + if(isNumeric(ci)) { + if(ci < cMin) cMin = ci; + if(ci > cMax) cMax = ci; + } + } else { + var ui = (trace.u && trace.u[i]) || 0; + var vi = (trace.v && trace.v[i]) || 0; + var n = Math.sqrt(ui * ui + vi * vi); + if(isFinite(n)) { + if(n < normMin) normMin = n; + if(n > normMax) normMax = n; + } + } } // Ensure axes are expanded and categories registered like scatter traces do scatterCalc.calcAxisExpansion(gd, trace, xa, ya, xVals, yVals); + // Colorscale cmin/cmax computation: prefer provided c, else magnitude + var vals = hasC ? [cMin, cMax] : [normMin, normMax]; + colorscaleCalc(gd, trace, { + vals: vals, + containerStr: '', + cLetter: 'c' + }); + return cd; }; diff --git a/src/traces/quiver/defaults.js b/src/traces/quiver/defaults.js index 54e243c8497..e03df991d97 100644 --- a/src/traces/quiver/defaults.js +++ b/src/traces/quiver/defaults.js @@ -64,23 +64,8 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout // traceOut.hoverinfo will be set by Lib.coerceHoverinfo in plots.js traceOut.hovertemplate = traceIn.hovertemplate; - // Colorscale for magnitude coloring: compute cmin/cmax from |(u,v)| - var cmin = Infinity; - var cmax = -Infinity; - for (var k = 0; k < len; k++) { - var uu = (traceOut.u && traceOut.u[k]) || (traceIn.u && traceIn.u[k]) || 0; - var vv = (traceOut.v && traceOut.v[k]) || (traceIn.v && traceIn.v[k]) || 0; - var nrm = Math.sqrt(uu * uu + vv * vv); - if (isFinite(nrm)) { - if (nrm < cmin) cmin = nrm; - if (nrm > cmax) cmax = nrm; - } - } - if (!isFinite(cmin)) cmin = 0; - if (!isFinite(cmax)) cmax = 1; - if (traceIn.cmin === undefined && traceOut.cmin === undefined) traceOut.cmin = cmin; - if (traceIn.cmax === undefined && traceOut.cmax === undefined) traceOut.cmax = cmax; - // Flag colorscale and apply defaults (adds colorscale, showscale, colorbar, etc.) + // Colorscale defaults (adds colorscale, showscale, colorbar, etc.) + // Keep colorscale enabled by default for quiver traceOut._hasColorscale = hasColorscale(traceIn) || true; colorscaleDefaults(traceIn, traceOut, layout, coerce, { prefix: '', cLetter: 'c' }); diff --git a/src/traces/quiver/plot.js b/src/traces/quiver/plot.js index b2be39b449a..c092e0e40ed 100644 --- a/src/traces/quiver/plot.js +++ b/src/traces/quiver/plot.js @@ -189,10 +189,16 @@ function plotOne(gd, idx, plotinfo, cdscatter, cdscatterAll, element, transition if (trace._hasColorscale) { var colorFunc = Colorscale.makeColorScaleFuncFromTrace(trace); lineSegments.style('stroke', function(cdi) { - var uVal = (trace.u && trace.u[cdi.i]) || 0; - var vVal = (trace.v && trace.v[cdi.i]) || 0; - var nVal = Math.sqrt(uVal * uVal + vVal * vVal); - return colorFunc(nVal); + var cArr = trace.c; + var value; + if (Array.isArray(cArr) && cArr.length > cdi.i && isFinite(cArr[cdi.i])) { + value = cArr[cdi.i]; + } else { + var uVal = (trace.u && trace.u[cdi.i]) || 0; + var vVal = (trace.v && trace.v[cdi.i]) || 0; + value = Math.sqrt(uVal * uVal + vVal * vVal); + } + return colorFunc(value); }); } From 5302654c8f0732e932242954dc1029b34f00e994 Mon Sep 17 00:00:00 2001 From: John Degner Date: Tue, 11 Nov 2025 13:19:56 -0800 Subject: [PATCH 10/46] Run npm run schema --- test/plot-schema.json | 697 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 684 insertions(+), 13 deletions(-) diff --git a/test/plot-schema.json b/test/plot-schema.json index 932fd5f0bf6..9c6775175b0 100644 --- a/test/plot-schema.json +++ b/test/plot-schema.json @@ -17096,14 +17096,6 @@ "middle" ] }, - "angle": { - "description": "Angle of arrowhead in radians. Default = π/9", - "dflt": 0.3490658503988659, - "editType": "calc", - "max": 1.5707963267948966, - "min": 0, - "valType": "number" - }, "arrow_scale": { "description": "Deprecated alias for `arrowsize`-based sizing. Prefer using `arrowsize`.", "editType": "calc", @@ -17124,6 +17116,679 @@ "min": 0.1, "valType": "number" }, + "autocolorscale": { + "description": "Determines whether the colorscale is a default palette (`autocolorscale: true`) or the palette determined by `colorscale`. In case `colorscale` is unspecified or `autocolorscale` is true, the default palette will be chosen according to whether numbers in the `color` array are all positive, all negative or mixed.", + "dflt": true, + "editType": "calc", + "impliedEdits": {}, + "valType": "boolean" + }, + "c": { + "anim": true, + "description": "Sets the scalar values used to map colors via the colorscale. If not provided, the magnitude sqrt(u^2 + v^2) is used.", + "editType": "calc", + "valType": "data_array" + }, + "cauto": { + "description": "Determines whether or not the color domain is computed with respect to the input data (here u/v norm) or the bounds set in `cmin` and `cmax` Defaults to `false` when `cmin` and `cmax` are set by the user.", + "dflt": true, + "editType": "calc", + "impliedEdits": {}, + "valType": "boolean" + }, + "cmax": { + "description": "Sets the upper bound of the color domain. Value should have the same units as u/v norm and if set, `cmin` must be set as well.", + "dflt": null, + "editType": "calc", + "impliedEdits": { + "cauto": false + }, + "valType": "number" + }, + "cmid": { + "description": "Sets the mid-point of the color domain by scaling `cmin` and/or `cmax` to be equidistant to this point. Value should have the same units as u/v norm. Has no effect when `cauto` is `false`.", + "dflt": null, + "editType": "calc", + "impliedEdits": {}, + "valType": "number" + }, + "cmin": { + "description": "Sets the lower bound of the color domain. Value should have the same units as u/v norm and if set, `cmax` must be set as well.", + "dflt": null, + "editType": "calc", + "impliedEdits": { + "cauto": false + }, + "valType": "number" + }, + "coloraxis": { + "description": "Sets a reference to a shared color axis. References to these shared color axes are *coloraxis*, *coloraxis2*, *coloraxis3*, etc. Settings for these shared color axes are set in the layout, under `layout.coloraxis`, `layout.coloraxis2`, etc. Note that multiple color scales can be linked to the same color axis.", + "dflt": null, + "editType": "calc", + "regex": "/^coloraxis([2-9]|[1-9][0-9]+)?$/", + "valType": "subplotid" + }, + "colorbar": { + "bgcolor": { + "description": "Sets the color of padded area.", + "dflt": "rgba(0,0,0,0)", + "editType": "colorbars", + "valType": "color" + }, + "bordercolor": { + "description": "Sets the axis line color.", + "dflt": "#444", + "editType": "colorbars", + "valType": "color" + }, + "borderwidth": { + "description": "Sets the width (in px) or the border enclosing this color bar.", + "dflt": 0, + "editType": "colorbars", + "min": 0, + "valType": "number" + }, + "dtick": { + "description": "Sets the step in-between ticks on this axis. Use with `tick0`. Must be a positive number, or special strings available to *log* and *date* axes. If the axis `type` is *log*, then ticks are set every 10^(n*dtick) where n is the tick number. For example, to set a tick mark at 1, 10, 100, 1000, ... set dtick to 1. To set tick marks at 1, 100, 10000, ... set dtick to 2. To set tick marks at 1, 5, 25, 125, 625, 3125, ... set dtick to log_10(5), or 0.69897000433. *log* has several special values; *L*, where `f` is a positive number, gives ticks linearly spaced in value (but not position). For example `tick0` = 0.1, `dtick` = *L0.5* will put ticks at 0.1, 0.6, 1.1, 1.6 etc. To show powers of 10 plus small digits between, use *D1* (all digits) or *D2* (only 2 and 5). `tick0` is ignored for *D1* and *D2*. If the axis `type` is *date*, then you must convert the time to milliseconds. For example, to set the interval between ticks to one day, set `dtick` to 86400000.0. *date* also has special values *M* gives ticks spaced by a number of months. `n` must be a positive integer. To set ticks on the 15th of every third month, set `tick0` to *2000-01-15* and `dtick` to *M3*. To set ticks every 4 years, set `dtick` to *M48*", + "editType": "colorbars", + "impliedEdits": { + "tickmode": "linear" + }, + "valType": "any" + }, + "editType": "colorbars", + "exponentformat": { + "description": "Determines a formatting rule for the tick exponents. For example, consider the number 1,000,000,000. If *none*, it appears as 1,000,000,000. If *e*, 1e+9. If *E*, 1E+9. If *power*, 1x10^9 (with 9 in a super script). If *SI*, 1G. If *B*, 1B. *SI* uses prefixes from \"femto\" f (10^-15) to \"tera\" T (10^12). *SI extended* covers instead the full SI range from \"quecto\" q (10^-30) to \"quetta\" Q (10^30). If *SI* or *SI extended* is used and the exponent is beyond the above ranges, the formatting rule will automatically be switched to the power notation.", + "dflt": "B", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "none", + "e", + "E", + "power", + "SI", + "B", + "SI extended" + ] + }, + "labelalias": { + "description": "Replacement text for specific tick or hover labels. For example using {US: 'USA', CA: 'Canada'} changes US to USA and CA to Canada. The labels we would have shown must match the keys exactly, after adding any tickprefix or ticksuffix. For negative numbers the minus sign symbol used (U+2212) is wider than the regular ascii dash. That means you need to use −1 instead of -1. labelalias can be used with any axis type, and both keys (if needed) and values (if desired) can include html-like tags or MathJax.", + "dflt": false, + "editType": "colorbars", + "valType": "any" + }, + "len": { + "description": "Sets the length of the color bar This measure excludes the padding of both ends. That is, the color bar length is this length minus the padding on both ends.", + "dflt": 1, + "editType": "colorbars", + "min": 0, + "valType": "number" + }, + "lenmode": { + "description": "Determines whether this color bar's length (i.e. the measure in the color variation direction) is set in units of plot *fraction* or in *pixels. Use `len` to set the value.", + "dflt": "fraction", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "fraction", + "pixels" + ] + }, + "minexponent": { + "description": "Hide SI prefix for 10^n if |n| is below this number. This only has an effect when `tickformat` is *SI* or *B*.", + "dflt": 3, + "editType": "colorbars", + "min": 0, + "valType": "number" + }, + "nticks": { + "description": "Specifies the maximum number of ticks for the particular axis. The actual number of ticks will be chosen automatically to be less than or equal to `nticks`. Has an effect only if `tickmode` is set to *auto*.", + "dflt": 0, + "editType": "colorbars", + "min": 0, + "valType": "integer" + }, + "orientation": { + "description": "Sets the orientation of the colorbar.", + "dflt": "v", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "h", + "v" + ] + }, + "outlinecolor": { + "description": "Sets the axis line color.", + "dflt": "#444", + "editType": "colorbars", + "valType": "color" + }, + "outlinewidth": { + "description": "Sets the width (in px) of the axis line.", + "dflt": 1, + "editType": "colorbars", + "min": 0, + "valType": "number" + }, + "role": "object", + "separatethousands": { + "description": "If \"true\", even 4-digit integers are separated", + "dflt": false, + "editType": "colorbars", + "valType": "boolean" + }, + "showexponent": { + "description": "If *all*, all exponents are shown besides their significands. If *first*, only the exponent of the first tick is shown. If *last*, only the exponent of the last tick is shown. If *none*, no exponents appear.", + "dflt": "all", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "all", + "first", + "last", + "none" + ] + }, + "showticklabels": { + "description": "Determines whether or not the tick labels are drawn.", + "dflt": true, + "editType": "colorbars", + "valType": "boolean" + }, + "showtickprefix": { + "description": "If *all*, all tick labels are displayed with a prefix. If *first*, only the first tick is displayed with a prefix. If *last*, only the last tick is displayed with a suffix. If *none*, tick prefixes are hidden.", + "dflt": "all", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "all", + "first", + "last", + "none" + ] + }, + "showticksuffix": { + "description": "Same as `showtickprefix` but for tick suffixes.", + "dflt": "all", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "all", + "first", + "last", + "none" + ] + }, + "thickness": { + "description": "Sets the thickness of the color bar This measure excludes the size of the padding, ticks and labels.", + "dflt": 30, + "editType": "colorbars", + "min": 0, + "valType": "number" + }, + "thicknessmode": { + "description": "Determines whether this color bar's thickness (i.e. the measure in the constant color direction) is set in units of plot *fraction* or in *pixels*. Use `thickness` to set the value.", + "dflt": "pixels", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "fraction", + "pixels" + ] + }, + "tick0": { + "description": "Sets the placement of the first tick on this axis. Use with `dtick`. If the axis `type` is *log*, then you must take the log of your starting tick (e.g. to set the starting tick to 100, set the `tick0` to 2) except when `dtick`=*L* (see `dtick` for more info). If the axis `type` is *date*, it should be a date string, like date data. If the axis `type` is *category*, it should be a number, using the scale where each category is assigned a serial number from zero in the order it appears.", + "editType": "colorbars", + "impliedEdits": { + "tickmode": "linear" + }, + "valType": "any" + }, + "tickangle": { + "description": "Sets the angle of the tick labels with respect to the horizontal. For example, a `tickangle` of -90 draws the tick labels vertically.", + "dflt": "auto", + "editType": "colorbars", + "valType": "angle" + }, + "tickcolor": { + "description": "Sets the tick color.", + "dflt": "#444", + "editType": "colorbars", + "valType": "color" + }, + "tickfont": { + "color": { + "editType": "colorbars", + "valType": "color" + }, + "description": "Sets the color bar's tick label font", + "editType": "colorbars", + "family": { + "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", + "editType": "colorbars", + "noBlank": true, + "strict": true, + "valType": "string" + }, + "lineposition": { + "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", + "dflt": "none", + "editType": "colorbars", + "extras": [ + "none" + ], + "flags": [ + "under", + "over", + "through" + ], + "valType": "flaglist" + }, + "role": "object", + "shadow": { + "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", + "dflt": "none", + "editType": "colorbars", + "valType": "string" + }, + "size": { + "editType": "colorbars", + "min": 1, + "valType": "number" + }, + "style": { + "description": "Sets whether a font should be styled with a normal or italic face from its family.", + "dflt": "normal", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "normal", + "italic" + ] + }, + "textcase": { + "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", + "dflt": "normal", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "normal", + "word caps", + "upper", + "lower" + ] + }, + "variant": { + "description": "Sets the variant of the font.", + "dflt": "normal", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "normal", + "small-caps", + "all-small-caps", + "all-petite-caps", + "petite-caps", + "unicase" + ] + }, + "weight": { + "description": "Sets the weight (or boldness) of the font.", + "dflt": "normal", + "editType": "colorbars", + "extras": [ + "normal", + "bold" + ], + "max": 1000, + "min": 1, + "valType": "integer" + } + }, + "tickformat": { + "description": "Sets the tick label formatting rule using d3 formatting mini-languages which are very similar to those in Python. For numbers, see: https://github.com/d3/d3-format/tree/v1.4.5#d3-format. And for dates see: https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format. We add two items to d3's date formatter: *%h* for half of the year as a decimal number as well as *%{n}f* for fractional seconds with n digits. For example, *2016-10-13 09:15:23.456* with tickformat *%H~%M~%S.%2f* would display *09~15~23.46*", + "dflt": "", + "editType": "colorbars", + "valType": "string" + }, + "tickformatstops": { + "items": { + "tickformatstop": { + "dtickrange": { + "description": "range [*min*, *max*], where *min*, *max* - dtick values which describe some zoom level, it is possible to omit *min* or *max* value by passing *null*", + "editType": "colorbars", + "items": [ + { + "editType": "colorbars", + "valType": "any" + }, + { + "editType": "colorbars", + "valType": "any" + } + ], + "valType": "info_array" + }, + "editType": "colorbars", + "enabled": { + "description": "Determines whether or not this stop is used. If `false`, this stop is ignored even within its `dtickrange`.", + "dflt": true, + "editType": "colorbars", + "valType": "boolean" + }, + "name": { + "description": "When used in a template, named items are created in the output figure in addition to any items the figure already has in this array. You can modify these items in the output figure by making your own item with `templateitemname` matching this `name` alongside your modifications (including `visible: false` or `enabled: false` to hide it). Has no effect outside of a template.", + "editType": "colorbars", + "valType": "string" + }, + "role": "object", + "templateitemname": { + "description": "Used to refer to a named item in this array in the template. Named items from the template will be created even without a matching item in the input figure, but you can modify one by making an item with `templateitemname` matching its `name`, alongside your modifications (including `visible: false` or `enabled: false` to hide it). If there is no template or no matching item, this item will be hidden unless you explicitly show it with `visible: true`.", + "editType": "colorbars", + "valType": "string" + }, + "value": { + "description": "string - dtickformat for described zoom level, the same as *tickformat*", + "dflt": "", + "editType": "colorbars", + "valType": "string" + } + } + }, + "role": "object" + }, + "ticklabeloverflow": { + "description": "Determines how we handle tick labels that would overflow either the graph div or the domain of the axis. The default value for inside tick labels is *hide past domain*. In other cases the default is *hide past div*.", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "allow", + "hide past div", + "hide past domain" + ] + }, + "ticklabelposition": { + "description": "Determines where tick labels are drawn relative to the ticks. Left and right options are used when `orientation` is *h*, top and bottom when `orientation` is *v*.", + "dflt": "outside", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "outside", + "inside", + "outside top", + "inside top", + "outside left", + "inside left", + "outside right", + "inside right", + "outside bottom", + "inside bottom" + ] + }, + "ticklabelstep": { + "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", + "dflt": 1, + "editType": "colorbars", + "min": 1, + "valType": "integer" + }, + "ticklen": { + "description": "Sets the tick length (in px).", + "dflt": 5, + "editType": "colorbars", + "min": 0, + "valType": "number" + }, + "tickmode": { + "description": "Sets the tick mode for this axis. If *auto*, the number of ticks is set via `nticks`. If *linear*, the placement of the ticks is determined by a starting position `tick0` and a tick step `dtick` (*linear* is the default value if `tick0` and `dtick` are provided). If *array*, the placement of the ticks is set via `tickvals` and the tick text is `ticktext`. (*array* is the default value if `tickvals` is provided).", + "editType": "colorbars", + "impliedEdits": {}, + "valType": "enumerated", + "values": [ + "auto", + "linear", + "array" + ] + }, + "tickprefix": { + "description": "Sets a tick label prefix.", + "dflt": "", + "editType": "colorbars", + "valType": "string" + }, + "ticks": { + "description": "Determines whether ticks are drawn or not. If **, this axis' ticks are not drawn. If *outside* (*inside*), this axis' are drawn outside (inside) the axis lines.", + "dflt": "", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "outside", + "inside", + "" + ] + }, + "ticksuffix": { + "description": "Sets a tick label suffix.", + "dflt": "", + "editType": "colorbars", + "valType": "string" + }, + "ticktext": { + "description": "Sets the text displayed at the ticks position via `tickvals`. Only has an effect if `tickmode` is set to *array*. Used with `tickvals`.", + "editType": "colorbars", + "valType": "data_array" + }, + "ticktextsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `ticktext`.", + "editType": "none", + "valType": "string" + }, + "tickvals": { + "description": "Sets the values at which ticks on this axis appear. Only has an effect if `tickmode` is set to *array*. Used with `ticktext`.", + "editType": "colorbars", + "valType": "data_array" + }, + "tickvalssrc": { + "description": "Sets the source reference on Chart Studio Cloud for `tickvals`.", + "editType": "none", + "valType": "string" + }, + "tickwidth": { + "description": "Sets the tick width (in px).", + "dflt": 1, + "editType": "colorbars", + "min": 0, + "valType": "number" + }, + "title": { + "editType": "colorbars", + "font": { + "color": { + "editType": "colorbars", + "valType": "color" + }, + "description": "Sets this color bar's title font.", + "editType": "colorbars", + "family": { + "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", + "editType": "colorbars", + "noBlank": true, + "strict": true, + "valType": "string" + }, + "lineposition": { + "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", + "dflt": "none", + "editType": "colorbars", + "extras": [ + "none" + ], + "flags": [ + "under", + "over", + "through" + ], + "valType": "flaglist" + }, + "role": "object", + "shadow": { + "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", + "dflt": "none", + "editType": "colorbars", + "valType": "string" + }, + "size": { + "editType": "colorbars", + "min": 1, + "valType": "number" + }, + "style": { + "description": "Sets whether a font should be styled with a normal or italic face from its family.", + "dflt": "normal", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "normal", + "italic" + ] + }, + "textcase": { + "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", + "dflt": "normal", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "normal", + "word caps", + "upper", + "lower" + ] + }, + "variant": { + "description": "Sets the variant of the font.", + "dflt": "normal", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "normal", + "small-caps", + "all-small-caps", + "all-petite-caps", + "petite-caps", + "unicase" + ] + }, + "weight": { + "description": "Sets the weight (or boldness) of the font.", + "dflt": "normal", + "editType": "colorbars", + "extras": [ + "normal", + "bold" + ], + "max": 1000, + "min": 1, + "valType": "integer" + } + }, + "role": "object", + "side": { + "description": "Determines the location of color bar's title with respect to the color bar. Defaults to *top* when `orientation` if *v* and defaults to *right* when `orientation` if *h*.", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "right", + "top", + "bottom" + ] + }, + "text": { + "description": "Sets the title of the color bar.", + "editType": "colorbars", + "valType": "string" + } + }, + "x": { + "description": "Sets the x position with respect to `xref` of the color bar (in plot fraction). When `xref` is *paper*, defaults to 1.02 when `orientation` is *v* and 0.5 when `orientation` is *h*. When `xref` is *container*, defaults to *1* when `orientation` is *v* and 0.5 when `orientation` is *h*. Must be between *0* and *1* if `xref` is *container* and between *-2* and *3* if `xref` is *paper*.", + "editType": "colorbars", + "valType": "number" + }, + "xanchor": { + "description": "Sets this color bar's horizontal position anchor. This anchor binds the `x` position to the *left*, *center* or *right* of the color bar. Defaults to *left* when `orientation` is *v* and *center* when `orientation` is *h*.", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "left", + "center", + "right" + ] + }, + "xpad": { + "description": "Sets the amount of padding (in px) along the x direction.", + "dflt": 10, + "editType": "colorbars", + "min": 0, + "valType": "number" + }, + "xref": { + "description": "Sets the container `x` refers to. *container* spans the entire `width` of the plot. *paper* refers to the width of the plotting area only.", + "dflt": "paper", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "container", + "paper" + ] + }, + "y": { + "description": "Sets the y position with respect to `yref` of the color bar (in plot fraction). When `yref` is *paper*, defaults to 0.5 when `orientation` is *v* and 1.02 when `orientation` is *h*. When `yref` is *container*, defaults to 0.5 when `orientation` is *v* and 1 when `orientation` is *h*. Must be between *0* and *1* if `yref` is *container* and between *-2* and *3* if `yref` is *paper*.", + "editType": "colorbars", + "valType": "number" + }, + "yanchor": { + "description": "Sets this color bar's vertical position anchor This anchor binds the `y` position to the *top*, *middle* or *bottom* of the color bar. Defaults to *middle* when `orientation` is *v* and *bottom* when `orientation` is *h*.", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "top", + "middle", + "bottom" + ] + }, + "ypad": { + "description": "Sets the amount of padding (in px) along the y direction.", + "dflt": 10, + "editType": "colorbars", + "min": 0, + "valType": "number" + }, + "yref": { + "description": "Sets the container `y` refers to. *container* spans the entire `height` of the plot. *paper* refers to the height of the plotting area only.", + "dflt": "paper", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "container", + "paper" + ] + } + }, + "colorscale": { + "description": "Sets the colorscale. The colorscale must be an array containing arrays mapping a normalized value to an rgb, rgba, hex, hsl, hsv, or named color string. At minimum, a mapping for the lowest (0) and highest (1) values are required. For example, `[[0, 'rgb(0,0,255)'], [1, 'rgb(255,0,0)']]`. To control the bounds of the colorscale in color space, use `cmin` and `cmax`. Alternatively, `colorscale` may be a palette name string of the following list: Blackbody,Bluered,Blues,Cividis,Earth,Electric,Greens,Greys,Hot,Jet,Picnic,Portland,Rainbow,RdBu,Reds,Viridis,YlGnBu,YlOrRd.", + "dflt": null, + "editType": "calc", + "impliedEdits": { + "autocolorscale": false + }, + "valType": "colorscale" + }, + "csrc": { + "description": "Sets the source reference on Chart Studio Cloud for `c`.", + "editType": "none", + "valType": "string" + }, "customdata": { "description": "Assigns extra data each datum. This may be useful when listening to hover, click and selection events. Note that, *scatter* traces also appends customdata items in the markers DOM elements", "editType": "calc", @@ -17600,11 +18265,11 @@ "min": 0, "valType": "number" }, - "scaleratio": { - "description": "The ratio between the scale of the y-axis and the scale of the x-axis (scale_y / scale_x). Default = null, the scale ratio is not fixed.", - "editType": "calc", - "min": 0, - "valType": "number" + "reversescale": { + "description": "Reverses the color mapping if true. If true, `cmin` will correspond to the last color in the array and `cmax` will correspond to the first color.", + "dflt": false, + "editType": "plot", + "valType": "boolean" }, "selected": { "editType": "style", @@ -17645,6 +18310,12 @@ "editType": "style", "valType": "boolean" }, + "showscale": { + "description": "Determines whether or not a colorbar is displayed for this trace.", + "dflt": true, + "editType": "calc", + "valType": "boolean" + }, "sizemode": { "description": "Determines whether `sizeref` is set as a *scaled* (unitless) scalar (normalized by the max u/v norm in the vector field), as an *absolute* value (in the same units as the vector field), or *raw* to use the raw vector lengths.", "dflt": "scaled", From 9d8fa149008d069b4e37d1999363bd62769e4826 Mon Sep 17 00:00:00 2001 From: John Degner Date: Tue, 18 Nov 2025 20:52:51 -0800 Subject: [PATCH 11/46] Use isArrayOrTypedArray --- src/traces/quiver/attributes.js | 2 -- src/traces/quiver/calc.js | 4 +--- src/traces/quiver/defaults.js | 11 +++++------ src/traces/quiver/event_data.js | 2 -- src/traces/quiver/format_labels.js | 25 +++++++++++++++++++++++++ src/traces/quiver/hover.js | 2 -- src/traces/quiver/index.js | 2 -- src/traces/quiver/plot.js | 4 +--- src/traces/quiver/select_points.js | 2 -- src/traces/quiver/style.js | 2 -- 10 files changed, 32 insertions(+), 24 deletions(-) create mode 100644 src/traces/quiver/format_labels.js diff --git a/src/traces/quiver/attributes.js b/src/traces/quiver/attributes.js index 88eb603a999..966344561ca 100644 --- a/src/traces/quiver/attributes.js +++ b/src/traces/quiver/attributes.js @@ -254,5 +254,3 @@ attrs.hovertemplate = extendFlat({}, hovertemplateAttrs({}, { })); module.exports = attrs; - - diff --git a/src/traces/quiver/calc.js b/src/traces/quiver/calc.js index 4484de6960b..1bee1abefd9 100644 --- a/src/traces/quiver/calc.js +++ b/src/traces/quiver/calc.js @@ -29,7 +29,7 @@ module.exports = function calc(gd, trace) { var normMax = -Infinity; var cMin = Infinity; var cMax = -Infinity; - var hasC = Array.isArray(trace.c); + var hasC = Lib.isArrayOrTypedArray(trace.c); for(var i = 0; i < len; i++) { var cdi = cd[i] = { i: i }; @@ -75,5 +75,3 @@ module.exports = function calc(gd, trace) { return cd; }; - - diff --git a/src/traces/quiver/defaults.js b/src/traces/quiver/defaults.js index e03df991d97..b1766539c26 100644 --- a/src/traces/quiver/defaults.js +++ b/src/traces/quiver/defaults.js @@ -19,19 +19,20 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout var v = coerce('v'); // Simple validation - check if we have the required arrays - if(!x || !Array.isArray(x) || x.length === 0 || - !y || !Array.isArray(y) || y.length === 0) { + // Use Lib.isArrayOrTypedArray to support both regular arrays and typed arrays + if(!x || !Lib.isArrayOrTypedArray(x) || x.length === 0 || + !y || !Lib.isArrayOrTypedArray(y) || y.length === 0) { traceOut.visible = false; return; } // If u/v are missing, default to zeros so the trace participates in calc/category logic var len = Math.min(x.length, y.length); - if(!Array.isArray(u) || u.length === 0) { + if(!Lib.isArrayOrTypedArray(u) || u.length === 0) { traceOut.u = new Array(len); for(var i = 0; i < len; i++) traceOut.u[i] = 0; } - if(!Array.isArray(v) || v.length === 0) { + if(!Lib.isArrayOrTypedArray(v) || v.length === 0) { traceOut.v = new Array(len); for(var j = 0; j < len; j++) traceOut.v[j] = 0; } @@ -86,5 +87,3 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout // Set the data length traceOut._length = len; }; - - diff --git a/src/traces/quiver/event_data.js b/src/traces/quiver/event_data.js index c744a23a152..faecde95abb 100644 --- a/src/traces/quiver/event_data.js +++ b/src/traces/quiver/event_data.js @@ -8,5 +8,3 @@ module.exports = function eventData(out, pt, trace, cd, pointNumber) { out.pointNumber = pointNumber; out.trace = trace; }; - - diff --git a/src/traces/quiver/format_labels.js b/src/traces/quiver/format_labels.js new file mode 100644 index 00000000000..8b56f67c2bf --- /dev/null +++ b/src/traces/quiver/format_labels.js @@ -0,0 +1,25 @@ +'use strict'; + +var Axes = require('../../plots/cartesian/axes'); + +module.exports = function formatLabels(cdi, trace, fullLayout) { + var labels = {}; + + var xa = Axes.getFromId({ _fullLayout: fullLayout }, trace.xaxis || 'x'); + var ya = Axes.getFromId({ _fullLayout: fullLayout }, trace.yaxis || 'y'); + + var x = cdi.x; + var y = cdi.y; + + labels.xLabel = Axes.tickText(xa, xa.c2l(x), true).text; + labels.yLabel = Axes.tickText(ya, ya.c2l(y), true).text; + + var u = trace.u ? trace.u[cdi.i] : 0; + var v = trace.v ? trace.v[cdi.i] : 0; + + // Format u and v as plain numbers + labels.uLabel = String(u); + labels.vLabel = String(v); + + return labels; +}; diff --git a/src/traces/quiver/hover.js b/src/traces/quiver/hover.js index d9a3d4573fb..21bfaccb68b 100644 --- a/src/traces/quiver/hover.js +++ b/src/traces/quiver/hover.js @@ -73,5 +73,3 @@ module.exports = function hoverPoints(pointData, xval, yval, hovermode) { return [hoverPoint]; }; - - diff --git a/src/traces/quiver/index.js b/src/traces/quiver/index.js index 82850f0840b..066d1e774f3 100644 --- a/src/traces/quiver/index.js +++ b/src/traces/quiver/index.js @@ -29,5 +29,3 @@ module.exports = { ].join(' ') } }; - - diff --git a/src/traces/quiver/plot.js b/src/traces/quiver/plot.js index c092e0e40ed..ee03ad0334c 100644 --- a/src/traces/quiver/plot.js +++ b/src/traces/quiver/plot.js @@ -191,7 +191,7 @@ function plotOne(gd, idx, plotinfo, cdscatter, cdscatterAll, element, transition lineSegments.style('stroke', function(cdi) { var cArr = trace.c; var value; - if (Array.isArray(cArr) && cArr.length > cdi.i && isFinite(cArr[cdi.i])) { + if (Lib.isArrayOrTypedArray(cArr) && cArr.length > cdi.i && isFinite(cArr[cdi.i])) { value = cArr[cdi.i]; } else { var uVal = (trace.u && trace.u[cdi.i]) || 0; @@ -212,5 +212,3 @@ function plotOne(gd, idx, plotinfo, cdscatter, cdscatterAll, element, transition .style('opacity', 1); } } - - diff --git a/src/traces/quiver/select_points.js b/src/traces/quiver/select_points.js index d2dfa2d1dab..e169b1b9517 100644 --- a/src/traces/quiver/select_points.js +++ b/src/traces/quiver/select_points.js @@ -37,5 +37,3 @@ module.exports = function selectPoints(searchInfo, selectionTester) { return selection; }; - - diff --git a/src/traces/quiver/style.js b/src/traces/quiver/style.js index 30da22034c9..deb72e21718 100644 --- a/src/traces/quiver/style.js +++ b/src/traces/quiver/style.js @@ -14,5 +14,3 @@ module.exports = function style(gd, calcTrace) { s.selectAll('path.js-line') .call(Drawing.lineGroupStyle, trace.line || {}); }; - - From 7c2055f3ec54ba1d5fa6a4aaa9b041a3af606cd5 Mon Sep 17 00:00:00 2001 From: John Degner Date: Mon, 17 Nov 2025 08:58:02 -0800 Subject: [PATCH 12/46] Add quiver jasmine and image tests --- src/traces/quiver/defaults.js | 3 + src/traces/quiver/event_data.js | 8 +- src/traces/quiver/hover.js | 105 +++--- src/traces/quiver/index.js | 1 + test/image/mocks/quiver_anchor.json | 92 +++++ test/image/mocks/quiver_arrow-styling.json | 66 ++++ test/image/mocks/quiver_categorical.json | 23 ++ test/image/mocks/quiver_colorscale.json | 32 ++ .../image/mocks/quiver_custom-colorscale.json | 39 +++ test/image/mocks/quiver_simple.json | 27 ++ test/image/mocks/quiver_sizemode.json | 92 +++++ test/image/mocks/quiver_wind.json | 53 +++ test/image/mocks/quiver_zero-vectors.json | 31 ++ test/jasmine/tests/quiver_test.js | 322 ++++++++++++++++++ 14 files changed, 832 insertions(+), 62 deletions(-) create mode 100644 test/image/mocks/quiver_anchor.json create mode 100644 test/image/mocks/quiver_arrow-styling.json create mode 100644 test/image/mocks/quiver_categorical.json create mode 100644 test/image/mocks/quiver_colorscale.json create mode 100644 test/image/mocks/quiver_custom-colorscale.json create mode 100644 test/image/mocks/quiver_simple.json create mode 100644 test/image/mocks/quiver_sizemode.json create mode 100644 test/image/mocks/quiver_wind.json create mode 100644 test/image/mocks/quiver_zero-vectors.json create mode 100644 test/jasmine/tests/quiver_test.js diff --git a/src/traces/quiver/defaults.js b/src/traces/quiver/defaults.js index b1766539c26..e7e5c0e86fd 100644 --- a/src/traces/quiver/defaults.js +++ b/src/traces/quiver/defaults.js @@ -17,6 +17,9 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout var y = coerce('y'); var u = coerce('u'); var v = coerce('v'); + + // Optional scalar field for colorscale + coerce('c'); // Simple validation - check if we have the required arrays // Use Lib.isArrayOrTypedArray to support both regular arrays and typed arrays diff --git a/src/traces/quiver/event_data.js b/src/traces/quiver/event_data.js index faecde95abb..bd8507a676c 100644 --- a/src/traces/quiver/event_data.js +++ b/src/traces/quiver/event_data.js @@ -3,8 +3,8 @@ module.exports = function eventData(out, pt, trace, cd, pointNumber) { out.x = pt.x; out.y = pt.y; - out.u = trace.u[pointNumber]; - out.v = trace.v[pointNumber]; - out.pointNumber = pointNumber; - out.trace = trace; + out.u = trace.u ? trace.u[pointNumber] : undefined; + out.v = trace.v ? trace.v[pointNumber] : undefined; + + return out; }; diff --git a/src/traces/quiver/hover.js b/src/traces/quiver/hover.js index 21bfaccb68b..41c7735f145 100644 --- a/src/traces/quiver/hover.js +++ b/src/traces/quiver/hover.js @@ -2,7 +2,7 @@ var Lib = require('../../lib'); var Fx = require('../../components/fx'); -var Registry = require('../../registry'); +var getTraceColor = require('../scatter/get_trace_color'); module.exports = function hoverPoints(pointData, xval, yval, hovermode) { var cd = pointData.cd; @@ -12,64 +12,53 @@ module.exports = function hoverPoints(pointData, xval, yval, hovermode) { var xpx = xa.c2p(xval); var ypx = ya.c2p(yval); - // Find the closest arrow base point to the hover point - var minDistance = Infinity; - var closestPoint = null; - var closestIndex = -1; - - // Each cd[i] is a calcdata point object with x/y - for(var i = 0; i < cd.length; i++) { - var cdi = cd[i]; - if(cdi.x === undefined || cdi.y === undefined) continue; - - var px = xa.c2p(cdi.x); - var py = ya.c2p(cdi.y); - - var distance = Math.sqrt((xpx - px) * (xpx - px) + (ypx - py) * (ypx - py)); - - if(distance < minDistance) { - minDistance = distance; - closestPoint = cdi; - closestIndex = i; - } - } - - var maxHoverDist = pointData.distance === Infinity ? Infinity : (trace.hoverdistance || 20); - if(!closestPoint || minDistance > maxHoverDist) return; - - // Create hover point data with proper label values and spikeline support - var hoverPoint = { - x: closestPoint.x, - y: closestPoint.y, - u: trace.u ? trace.u[closestIndex] : undefined, - v: trace.v ? trace.v[closestIndex] : undefined, - text: Array.isArray(trace.text) ? trace.text[closestIndex] : trace.text, - name: trace.name || '', - trace: trace, - index: closestIndex, - // Label values for formatting - xLabelVal: closestPoint.x, - yLabelVal: closestPoint.y, - uLabelVal: trace.u ? trace.u[closestIndex] : undefined, - vLabelVal: trace.v ? trace.v[closestIndex] : undefined, - // Spikeline support - xa: pointData.xa, - ya: pointData.ya, - x0: closestPoint.x, - x1: closestPoint.x, - y0: closestPoint.y, - y1: closestPoint.y, - distance: minDistance, - spikeDistance: minDistance, - curveNumber: trace.index, - color: trace.line ? trace.line.color : 'blue' + var distfn = function(di) { + var x = xa.c2p(di.x) - xpx; + var y = ya.c2p(di.y) - ypx; + return Math.max(Math.sqrt(x * x + y * y), 1 - 3 / Math.max(3, di.mrc || 0)); }; - // Set hover text - var hovertext = trace.hovertext || trace.text; - if(hovertext && hovertext[closestIndex]) { - hoverPoint.hovertext = hovertext[closestIndex]; - } + Fx.getClosest(cd, distfn, pointData); - return [hoverPoint]; + // skip if we didn't find a close point + if(pointData.index === false) return; + + // the closest data point + var di = cd[pointData.index]; + var xc = xa.c2p(di.x, true); + var yc = ya.c2p(di.y, true); + + // now we're done using the whole `calcdata` array, replace the + // index with the original index + pointData.index = di.i; + + var u = trace.u ? trace.u[di.i] : 0; + var v = trace.v ? trace.v[di.i] : 0; + + // Build extraText to show u and v values + var extraText = 'u: ' + u + ', v: ' + v; + + Lib.extendFlat(pointData, { + color: getTraceColor(trace, di), + + x0: xc - 3, + x1: xc + 3, + xLabelVal: di.x, + + y0: yc - 3, + y1: yc + 3, + yLabelVal: di.y, + + uLabelVal: u, + vLabelVal: v, + + extraText: extraText, + + spikeDistance: Math.sqrt((xpx - xc) * (xpx - xc) + (ypx - yc) * (ypx - yc)), + hovertemplate: trace.hovertemplate + }); + + Lib.fillText(di, trace, pointData); + + return [pointData]; }; diff --git a/src/traces/quiver/index.js b/src/traces/quiver/index.js index 066d1e774f3..4237fcf810a 100644 --- a/src/traces/quiver/index.js +++ b/src/traces/quiver/index.js @@ -15,6 +15,7 @@ module.exports = { style: require('./style'), styleOnSelect: require('../scatter/style').styleOnSelect, hoverPoints: require('./hover'), + formatLabels: require('./format_labels'), eventData: require('./event_data'), selectPoints: require('./select_points'), animatable: true, diff --git a/test/image/mocks/quiver_anchor.json b/test/image/mocks/quiver_anchor.json new file mode 100644 index 00000000000..dc0a157e889 --- /dev/null +++ b/test/image/mocks/quiver_anchor.json @@ -0,0 +1,92 @@ +{ + "data": [ + { + "type": "quiver", + "name": "tail anchor", + "x": [1, 1, 1], + "y": [0, 0, 0], + "u": [1, 0, -1], + "v": [1, 1, 1], + "sizemode": "scaled", + "sizeref": 0.5, + "anchor": "tail", + "line": { + "color": "red", + "width": 2 + }, + "showscale": false, + "xaxis": "x", + "yaxis": "y" + }, + { + "type": "quiver", + "name": "tip anchor", + "x": [1, 1, 1], + "y": [1, 1, 1], + "u": [1, 0, -1], + "v": [1, 1, 1], + "sizemode": "scaled", + "sizeref": 0.5, + "anchor": "tip", + "line": { + "color": "blue", + "width": 2 + }, + "showscale": false, + "xaxis": "x2", + "yaxis": "y2" + }, + { + "type": "quiver", + "name": "center anchor", + "x": [1, 1, 1], + "y": [2, 2, 2], + "u": [1, 0, -1], + "v": [1, 1, 1], + "sizemode": "scaled", + "sizeref": 0.5, + "anchor": "center", + "line": { + "color": "green", + "width": 2 + }, + "showscale": false, + "xaxis": "x3", + "yaxis": "y3" + } + ], + "layout": { + "width": 900, + "height": 400, + "showlegend": true, + "xaxis": { + "domain": [0, 0.3], + "range": [-0.5, 2.5], + "title": {"text": "tail anchor"} + }, + "yaxis": { + "domain": [0, 1], + "range": [-0.5, 1.5] + }, + "xaxis2": { + "domain": [0.35, 0.65], + "range": [-0.5, 2.5], + "title": {"text": "tip anchor"} + }, + "yaxis2": { + "domain": [0, 1], + "anchor": "x2", + "range": [0, 2] + }, + "xaxis3": { + "domain": [0.7, 1], + "range": [-0.5, 2.5], + "title": {"text": "center anchor"} + }, + "yaxis3": { + "domain": [0, 1], + "anchor": "x3", + "range": [1, 3] + } + } +} diff --git a/test/image/mocks/quiver_arrow-styling.json b/test/image/mocks/quiver_arrow-styling.json new file mode 100644 index 00000000000..d080d62515c --- /dev/null +++ b/test/image/mocks/quiver_arrow-styling.json @@ -0,0 +1,66 @@ +{ + "data": [ + { + "type": "quiver", + "name": "small arrows", + "x": [0, 1, 2], + "y": [0, 0, 0], + "u": [1, 1, 1], + "v": [1, 1, 1], + "sizemode": "scaled", + "sizeref": 0.5, + "arrowsize": 0.5, + "anchor": "tail", + "line": { + "color": "red", + "width": 1 + }, + "showscale": false + }, + { + "type": "quiver", + "name": "medium arrows", + "x": [0, 1, 2], + "y": [1, 1, 1], + "u": [1, 1, 1], + "v": [1, 1, 1], + "sizemode": "scaled", + "sizeref": 0.5, + "arrowsize": 1.0, + "anchor": "tail", + "line": { + "color": "blue", + "width": 2 + }, + "showscale": false + }, + { + "type": "quiver", + "name": "large arrows", + "x": [0, 1, 2], + "y": [2, 2, 2], + "u": [1, 1, 1], + "v": [1, 1, 1], + "sizemode": "scaled", + "sizeref": 0.5, + "arrowsize": 2.0, + "anchor": "tail", + "line": { + "color": "green", + "width": 3 + }, + "showscale": false + } + ], + "layout": { + "width": 500, + "height": 600, + "showlegend": true, + "xaxis": { + "range": [-0.5, 2.5] + }, + "yaxis": { + "range": [-0.5, 2.5] + } + } +} diff --git a/test/image/mocks/quiver_categorical.json b/test/image/mocks/quiver_categorical.json new file mode 100644 index 00000000000..776b03ccd3b --- /dev/null +++ b/test/image/mocks/quiver_categorical.json @@ -0,0 +1,23 @@ +{ + "data": [ + { + "type": "quiver", + "x": ["A", "B", "C", "A", "B", "C", "A", "B", "C"], + "y": ["X", "X", "X", "Y", "Y", "Y", "Z", "Z", "Z"], + "u": [1, 0, -1, 1, 0, -1, 1, 0, -1], + "v": [1, 1, 1, 0, 0, 0, -1, -1, -1], + "sizemode": "scaled", + "sizeref": 0.5, + "anchor": "tail", + "line": { + "width": 2 + }, + "showscale": false + } + ], + "layout": { + "title": {"text": "Quiver with Categorical Axes"}, + "width": 500, + "height": 500 + } +} diff --git a/test/image/mocks/quiver_colorscale.json b/test/image/mocks/quiver_colorscale.json new file mode 100644 index 00000000000..40987cc87c7 --- /dev/null +++ b/test/image/mocks/quiver_colorscale.json @@ -0,0 +1,32 @@ +{ + "data": [ + { + "type": "quiver", + "x": [0, 1, 2, 0, 1, 2, 0, 1, 2], + "y": [0, 0, 0, 1, 1, 1, 2, 2, 2], + "u": [1, 2, 3, 1, 2, 3, 1, 2, 3], + "v": [1, 1, 1, 2, 2, 2, 3, 3, 3], + "sizemode": "scaled", + "sizeref": 0.3, + "anchor": "tail", + "colorscale": "Viridis", + "showscale": true, + "line": { + "width": 2 + }, + "colorbar": { + "title": {"text": "Magnitude"} + } + } + ], + "layout": { + "width": 600, + "height": 500, + "xaxis": { + "range": [-0.5, 2.5] + }, + "yaxis": { + "range": [-0.5, 2.5] + } + } +} diff --git a/test/image/mocks/quiver_custom-colorscale.json b/test/image/mocks/quiver_custom-colorscale.json new file mode 100644 index 00000000000..5a29f3e315b --- /dev/null +++ b/test/image/mocks/quiver_custom-colorscale.json @@ -0,0 +1,39 @@ +{ + "data": [ + { + "type": "quiver", + "x": [0, 1, 2, 0, 1, 2, 0, 1, 2], + "y": [0, 0, 0, 1, 1, 1, 2, 2, 2], + "u": [0.5, 1.5, 2.5, 0.5, 1.5, 2.5, 0.5, 1.5, 2.5], + "v": [0.5, 0.5, 0.5, 1.5, 1.5, 1.5, 2.5, 2.5, 2.5], + "c": [1, 2, 3, 2, 3, 4, 3, 4, 5], + "sizemode": "scaled", + "sizeref": 0.25, + "anchor": "tail", + "colorscale": [ + [0, "rgb(0,0,255)"], + [0.5, "rgb(0,255,0)"], + [1, "rgb(255,0,0)"] + ], + "showscale": true, + "line": { + "width": 2 + }, + "colorbar": { + "title": {"text": "Custom Field"}, + "x": 1.02 + } + } + ], + "layout": { + "title": {"text": "Quiver with Custom Scalar Field (c)"}, + "width": 600, + "height": 500, + "xaxis": { + "range": [-0.5, 2.5] + }, + "yaxis": { + "range": [-0.5, 2.5] + } + } +} diff --git a/test/image/mocks/quiver_simple.json b/test/image/mocks/quiver_simple.json new file mode 100644 index 00000000000..3b9edbf5f78 --- /dev/null +++ b/test/image/mocks/quiver_simple.json @@ -0,0 +1,27 @@ +{ + "data": [ + { + "type": "quiver", + "x": [0, 1, 2, 0, 1, 2, 0, 1, 2], + "y": [0, 0, 0, 1, 1, 1, 2, 2, 2], + "u": [1, 0, -1, 1, 0, -1, 1, 0, -1], + "v": [0, 1, 0, 0, 1, 0, 0, 1, 0], + "sizemode": "scaled", + "sizeref": 0.5, + "anchor": "tail", + "line": { + "width": 2 + } + } + ], + "layout": { + "width": 500, + "height": 500, + "xaxis": { + "range": [-0.5, 2.5] + }, + "yaxis": { + "range": [-0.5, 2.5] + } + } +} diff --git a/test/image/mocks/quiver_sizemode.json b/test/image/mocks/quiver_sizemode.json new file mode 100644 index 00000000000..4a8ade18ebd --- /dev/null +++ b/test/image/mocks/quiver_sizemode.json @@ -0,0 +1,92 @@ +{ + "data": [ + { + "type": "quiver", + "name": "scaled", + "x": [0, 1, 2], + "y": [0, 0, 0], + "u": [1, 2, 3], + "v": [1, 1, 1], + "sizemode": "scaled", + "sizeref": 0.3, + "anchor": "tail", + "line": { + "color": "red", + "width": 2 + }, + "showscale": false, + "xaxis": "x", + "yaxis": "y" + }, + { + "type": "quiver", + "name": "absolute", + "x": [0, 1, 2], + "y": [1, 1, 1], + "u": [1, 2, 3], + "v": [1, 1, 1], + "sizemode": "absolute", + "sizeref": 0.3, + "anchor": "tail", + "line": { + "color": "blue", + "width": 2 + }, + "showscale": false, + "xaxis": "x2", + "yaxis": "y2" + }, + { + "type": "quiver", + "name": "raw", + "x": [0, 1, 2], + "y": [2, 2, 2], + "u": [0.3, 0.6, 0.9], + "v": [0.3, 0.3, 0.3], + "sizemode": "raw", + "sizeref": 1, + "anchor": "tail", + "line": { + "color": "green", + "width": 2 + }, + "showscale": false, + "xaxis": "x3", + "yaxis": "y3" + } + ], + "layout": { + "width": 800, + "height": 400, + "showlegend": true, + "xaxis": { + "domain": [0, 0.3], + "range": [-0.5, 2.5], + "title": {"text": "scaled"} + }, + "yaxis": { + "domain": [0, 1], + "range": [-0.5, 0.5] + }, + "xaxis2": { + "domain": [0.35, 0.65], + "range": [-0.5, 2.5], + "title": {"text": "absolute"} + }, + "yaxis2": { + "domain": [0, 1], + "anchor": "x2", + "range": [0.5, 1.5] + }, + "xaxis3": { + "domain": [0.7, 1], + "range": [-0.5, 2.5], + "title": {"text": "raw"} + }, + "yaxis3": { + "domain": [0, 1], + "anchor": "x3", + "range": [1.5, 2.5] + } + } +} diff --git a/test/image/mocks/quiver_wind.json b/test/image/mocks/quiver_wind.json new file mode 100644 index 00000000000..9ae94159d0e --- /dev/null +++ b/test/image/mocks/quiver_wind.json @@ -0,0 +1,53 @@ +{ + "data": [ + { + "type": "quiver", + "name": "Wind field", + "x": [0, 0.5, 1, 1.5, 2, 2.5, 3, + 0, 0.5, 1, 1.5, 2, 2.5, 3, + 0, 0.5, 1, 1.5, 2, 2.5, 3, + 0, 0.5, 1, 1.5, 2, 2.5, 3, + 0, 0.5, 1, 1.5, 2, 2.5, 3], + "y": [0, 0, 0, 0, 0, 0, 0, + 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, + 1, 1, 1, 1, 1, 1, 1, + 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, + 2, 2, 2, 2, 2, 2, 2], + "u": [1, 1.5, 2, 2.5, 3, 2.5, 2, + 0.8, 1.2, 1.8, 2.2, 2.8, 2.2, 1.8, + 0.5, 1, 1.5, 2, 2.5, 2, 1.5, + 0.3, 0.8, 1.2, 1.8, 2.2, 1.8, 1.2, + 0.1, 0.5, 1, 1.5, 2, 1.5, 1], + "v": [0.2, 0.3, 0.5, 0.8, 1, 0.8, 0.5, + 0.5, 0.8, 1, 1.2, 1.5, 1.2, 1, + 0.8, 1.2, 1.5, 1.8, 2, 1.8, 1.5, + 0.5, 0.8, 1.2, 1.5, 1.8, 1.5, 1.2, + 0.2, 0.5, 0.8, 1.2, 1.5, 1.2, 0.8], + "sizemode": "scaled", + "sizeref": 0.2, + "anchor": "center", + "colorscale": "Jet", + "showscale": true, + "line": { + "width": 1.5 + }, + "colorbar": { + "title": {"text": "Speed"}, + "x": 1.02 + } + } + ], + "layout": { + "title": {"text": "Vector Wind Field Visualization"}, + "width": 700, + "height": 600, + "xaxis": { + "title": {"text": "X"}, + "range": [-0.2, 3.2] + }, + "yaxis": { + "title": {"text": "Y"}, + "range": [-0.2, 2.2] + } + } +} diff --git a/test/image/mocks/quiver_zero-vectors.json b/test/image/mocks/quiver_zero-vectors.json new file mode 100644 index 00000000000..aeb8760aeb2 --- /dev/null +++ b/test/image/mocks/quiver_zero-vectors.json @@ -0,0 +1,31 @@ +{ + "data": [ + { + "type": "quiver", + "name": "Mixed vectors", + "x": [0, 1, 2, 3, 4], + "y": [1, 1, 1, 1, 1], + "u": [1, 0, 0, 1, 2], + "v": [1, 0, 0, 1, 2], + "sizemode": "scaled", + "sizeref": 0.5, + "anchor": "tail", + "line": { + "color": "purple", + "width": 2 + }, + "showscale": false + } + ], + "layout": { + "title": {"text": "Quiver with Zero-Length Vectors"}, + "width": 600, + "height": 400, + "xaxis": { + "range": [-0.5, 4.5] + }, + "yaxis": { + "range": [0, 2] + } + } +} diff --git a/test/jasmine/tests/quiver_test.js b/test/jasmine/tests/quiver_test.js new file mode 100644 index 00000000000..377e34db6c4 --- /dev/null +++ b/test/jasmine/tests/quiver_test.js @@ -0,0 +1,322 @@ +var Plotly = require('../../../lib/index'); +var Lib = require('../../../src/lib'); +var d3Select = require('../../strict-d3').select; + +var supplyAllDefaults = require('../assets/supply_defaults'); +var createGraphDiv = require('../assets/create_graph_div'); +var destroyGraphDiv = require('../assets/destroy_graph_div'); + +var delay = require('../assets/delay'); +var mouseEvent = require('../assets/mouse_event'); + +var customAssertions = require('../assets/custom_assertions'); +var assertHoverLabelContent = customAssertions.assertHoverLabelContent; + +describe('Test quiver defaults', function() { + var gd; + + function makeGD() { + return { + data: [{ + type: 'quiver', + x: [1, 2], + y: [1, 2], + u: [1, 2], + v: [1, 2] + }], + layout: {} + }; + } + + it('should not set `visible: false` for traces with x,y arrays', function() { + gd = makeGD(); + supplyAllDefaults(gd); + expect(gd._fullData[0].visible).toBe(true); + }); + + it('should set `visible: false` for traces missing x or y arrays', function() { + var keysToDelete = ['x', 'y']; + + keysToDelete.forEach(function(k) { + gd = makeGD(); + delete gd.data[0][k]; + + supplyAllDefaults(gd); + expect(gd._fullData[0].visible).toBe(false, 'missing array ' + k); + }); + }); + + it('should set `visible: false` for traces with empty x or y arrays', function() { + var keysToEmpty = ['x', 'y']; + + keysToEmpty.forEach(function(k) { + gd = makeGD(); + gd.data[0][k] = []; + + supplyAllDefaults(gd); + expect(gd._fullData[0].visible).toBe(false, 'empty array ' + k); + }); + }); + + it('should default u,v to zeros when missing', function() { + gd = { + data: [{ + type: 'quiver', + x: [1, 2, 3], + y: [1, 2, 3] + }], + layout: {} + }; + + supplyAllDefaults(gd); + expect(gd._fullData[0].visible).toBe(true); + expect(gd._fullData[0].u).toEqual([0, 0, 0]); + expect(gd._fullData[0].v).toEqual([0, 0, 0]); + }); + + it('should default u,v to zeros when empty', function() { + gd = { + data: [{ + type: 'quiver', + x: [1, 2, 3], + y: [1, 2, 3], + u: [], + v: [] + }], + layout: {} + }; + + supplyAllDefaults(gd); + expect(gd._fullData[0].visible).toBe(true); + expect(gd._fullData[0].u).toEqual([0, 0, 0]); + expect(gd._fullData[0].v).toEqual([0, 0, 0]); + }); + + it('should set sizemode and sizeref defaults correctly', function() { + gd = makeGD(); + supplyAllDefaults(gd); + expect(gd._fullData[0].sizemode).toBe('scaled'); + expect(gd._fullData[0].sizeref).toBe(0.5); + }); + + it('should set sizeref to 1 when sizemode is raw', function() { + gd = makeGD(); + gd.data[0].sizemode = 'raw'; + supplyAllDefaults(gd); + expect(gd._fullData[0].sizemode).toBe('raw'); + expect(gd._fullData[0].sizeref).toBe(1); + }); + + it('should set anchor default to tail', function() { + gd = makeGD(); + supplyAllDefaults(gd); + expect(gd._fullData[0].anchor).toBe('tail'); + }); +}); + +describe('Test quiver calc', function() { + var gd; + + beforeEach(function() { + gd = createGraphDiv(); + }); + + afterEach(function() { + Plotly.purge(gd); + destroyGraphDiv(); + }); + + it('should calculate data correctly for simple vectors', function(done) { + Plotly.newPlot(gd, [{ + type: 'quiver', + x: [0, 1, 2], + y: [0, 1, 2], + u: [1, 0, -1], + v: [0, 1, 0] + }]).then(function() { + var calcData = gd.calcdata[0]; + expect(calcData.length).toBe(3); + expect(calcData[0].x).toBe(0); + expect(calcData[0].y).toBe(0); + expect(calcData[1].x).toBe(1); + expect(calcData[1].y).toBe(1); + expect(calcData[2].x).toBe(2); + expect(calcData[2].y).toBe(2); + }) + .then(done, done.fail); + }); +}); + +describe('Test quiver interactions', function() { + var gd; + + beforeEach(function() { + gd = createGraphDiv(); + }); + + afterEach(function() { + Plotly.purge(gd); + destroyGraphDiv(); + }); + + it('should add/clear svg objects correctly', function(done) { + Plotly.newPlot(gd, [{ + type: 'quiver', + x: [1, 2], + y: [1, 2], + u: [1, 0], + v: [0, 1] + }, { + type: 'quiver', + x: [3, 4], + y: [3, 4], + u: [1, 1], + v: [1, 1] + }]).then(function() { + var quiverLayers = gd._fullLayout._plots.xy.plot.selectAll('.trace.quiver'); + expect(quiverLayers.size()).toBe(2); + + return Plotly.deleteTraces(gd, [0]); + }) + .then(function() { + var quiverLayers = gd._fullLayout._plots.xy.plot.selectAll('.trace.quiver'); + expect(quiverLayers.size()).toBe(1); + + return Plotly.deleteTraces(gd, [0]); + }) + .then(function() { + var quiverLayers = gd._fullLayout._plots.xy.plot.selectAll('.trace.quiver'); + expect(quiverLayers.size()).toBe(0); + }) + .then(done, done.fail); + }); + + it('should restyle arrow properties', function(done) { + Plotly.newPlot(gd, [{ + type: 'quiver', + x: [1, 2], + y: [1, 2], + u: [1, 0], + v: [0, 1], + sizeref: 0.5 + }]).then(function() { + expect(gd._fullData[0].sizeref).toBe(0.5); + return Plotly.restyle(gd, 'sizeref', 1.5); + }) + .then(function() { + expect(gd._fullData[0].sizeref).toBe(1.5); + return Plotly.restyle(gd, 'anchor', 'tip'); + }) + .then(function() { + expect(gd._fullData[0].anchor).toBe('tip'); + }) + .then(done, done.fail); + }); + + it('should display hover labels', function(done) { + var fig = { + data: [{ + type: 'quiver', + x: [1, 2, 3], + y: [1, 2, 3], + u: [1, 0, -1], + v: [0, 1, 0], + showscale: false + }], + layout: { + margin: {l: 0, t: 0, r: 0, b: 0}, + width: 400, + height: 400 + } + }; + + Plotly.newPlot(gd, fig) + .then(function() { + mouseEvent('mousemove', 200, 200); + }) + .then(delay(20)) + .then(function() { + assertHoverLabelContent({ + nums: '(2, 2)\nu: 0, v: 1' + }); + }) + .then(done, done.fail); + }); + + it('should render multiple quiver traces', function(done) { + Plotly.newPlot(gd, [{ + type: 'quiver', + name: 'trace A', + x: [1, 2], + y: [1, 2], + u: [1, 0], + v: [0, 1], + line: {color: 'red'}, + showscale: false + }, { + type: 'quiver', + name: 'trace B', + x: [3, 4], + y: [3, 4], + u: [-1, 0], + v: [0, -1], + line: {color: 'blue'}, + showscale: false + }], { + margin: {l: 0, t: 0, r: 0, b: 0}, + width: 400, + height: 400 + }) + .then(function() { + var quiverLayers = gd._fullLayout._plots.xy.plot.selectAll('.trace.quiver'); + expect(quiverLayers.size()).toBe(2); + }) + .then(done, done.fail); + }); + + it('should handle sizemode changes', function(done) { + Plotly.newPlot(gd, [{ + type: 'quiver', + x: [0, 1, 2], + y: [0, 1, 2], + u: [1, 2, 3], + v: [1, 2, 3], + sizemode: 'scaled', + sizeref: 0.5 + }]).then(function() { + expect(gd._fullData[0].sizemode).toBe('scaled'); + return Plotly.restyle(gd, 'sizemode', 'absolute'); + }) + .then(function() { + expect(gd._fullData[0].sizemode).toBe('absolute'); + return Plotly.restyle(gd, 'sizemode', 'raw'); + }) + .then(function() { + expect(gd._fullData[0].sizemode).toBe('raw'); + }) + .then(done, done.fail); + }); + + it('should handle anchor changes', function(done) { + Plotly.newPlot(gd, [{ + type: 'quiver', + x: [1, 2], + y: [1, 2], + u: [1, 1], + v: [1, 1], + anchor: 'tail' + }]).then(function() { + expect(gd._fullData[0].anchor).toBe('tail'); + return Plotly.restyle(gd, 'anchor', 'tip'); + }) + .then(function() { + expect(gd._fullData[0].anchor).toBe('tip'); + return Plotly.restyle(gd, 'anchor', 'center'); + }) + .then(function() { + expect(gd._fullData[0].anchor).toBe('center'); + }) + .then(done, done.fail); + }); +}); + From 00638de29922cd26ddbd09e761e697d14390337b Mon Sep 17 00:00:00 2001 From: John Degner Date: Mon, 17 Nov 2025 10:50:04 -0800 Subject: [PATCH 13/46] Generate baseline images for quiver tests --- test/image/baselines/quiver_anchor.png | Bin 0 -> 26453 bytes test/image/baselines/quiver_arrow-styling.png | Bin 0 -> 22306 bytes test/image/baselines/quiver_categorical.png | Bin 0 -> 14784 bytes test/image/baselines/quiver_colorscale.png | Bin 0 -> 17292 bytes .../baselines/quiver_custom-colorscale.png | Bin 0 -> 21053 bytes test/image/baselines/quiver_simple.png | Bin 0 -> 13934 bytes test/image/baselines/quiver_sizemode.png | Bin 0 -> 28492 bytes test/image/baselines/quiver_wind.png | Bin 0 -> 32997 bytes test/image/baselines/quiver_zero-vectors.png | Bin 0 -> 14882 bytes 9 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 test/image/baselines/quiver_anchor.png create mode 100644 test/image/baselines/quiver_arrow-styling.png create mode 100644 test/image/baselines/quiver_categorical.png create mode 100644 test/image/baselines/quiver_colorscale.png create mode 100644 test/image/baselines/quiver_custom-colorscale.png create mode 100644 test/image/baselines/quiver_simple.png create mode 100644 test/image/baselines/quiver_sizemode.png create mode 100644 test/image/baselines/quiver_wind.png create mode 100644 test/image/baselines/quiver_zero-vectors.png diff --git a/test/image/baselines/quiver_anchor.png b/test/image/baselines/quiver_anchor.png new file mode 100644 index 0000000000000000000000000000000000000000..463f0fb85dfaf6f6b16f0edc8dba648db3e7567d GIT binary patch literal 26453 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 literal 0 HcmV?d00001 diff --git a/test/image/baselines/quiver_arrow-styling.png b/test/image/baselines/quiver_arrow-styling.png new file mode 100644 index 0000000000000000000000000000000000000000..d6fe39cceb5344f9f2e41d921f097468789f2f3e GIT binary patch literal 22306 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 ip$qxHREOoIm$|cinZryZFIcA@BR{UAuO@ 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 literal 0 HcmV?d00001 diff --git a/test/image/baselines/quiver_simple.png b/test/image/baselines/quiver_simple.png new file mode 100644 index 0000000000000000000000000000000000000000..fb0a7e451f9db87f045c4e133b48f50821218847 GIT binary patch literal 13934 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 literal 0 HcmV?d00001 diff --git a/test/image/baselines/quiver_sizemode.png b/test/image/baselines/quiver_sizemode.png new file mode 100644 index 0000000000000000000000000000000000000000..b914c5129b97027134f23a773feb0ec0072e9bed GIT binary patch literal 28492 zcmeFZS6Ecr)-7t4r4m$v1SOVGh-3pna*>mOC?ZO7`AnzoUqBQHRSQ5RtF3lKcqUwbb^$tl zjpyaxzZLdMK>(9(Q#9bL9RX8>kpoFGdLOy;n>Y8VMI%ufo$yscj3T;3yp_GuP{gLH5Mx&V&^5tUgpdTp+1#)T^f0^$} zH1A5}i^%Scs@Ng&I|vA)6Bg*hGTZNUet1}*Q)Z@FWLP(QMaI2JS@d*P#5!F%jKM}& zky8qaC(B~?oZMC%$?#bB>m5co{>#k#a8w42vh5jOP=n-c_?dQK&@0rdPswZV@nl~e zO8s-;|F`9-Uw)sR;#;#;)+4glVRYs=7@Ifn==@}Rjj!P_?3h_y3@IK}B&83_p!m(e zPX^hHxeIF|T6m&DOzbyHLhP3>At{a&e`4hF7-l;7_Ol8SJVD5_xWyb|V$onRimnZ8mNnY#KoL{OOW>(|$>`FEo&L>AJ?d|=}kEd+0`8uv`O!33!DL!Tb74}p0 zcB8TK8jueU&BFyZFdOyOVN^V&>EQzHyd$PJwCwvbH2PGC5$@~w7IpB8hLr$19U%lhEg9Ld!r3Rn=a$Z#b=(aOx4}HTiy3 zaOa1F?RFPmB^W>(I3IY%yf*6M@p+%OlWDmf?JQ|#E72xCa!8|Q((yapWxHe=aE-TE z#OFwRp*x8!V(=Y%+goYm8zOo;N<;T&b5lu9-TaRmS#9JyW^C|e_qM^D+wMcB1D!tK z#S0SM0w3&chTHJw)WW4F2?Q=$|9Ci-rHfc4oxH-uo%g!G>?9`jyuTgFC2L( z4(77LN8e~M!uKcKQh4mf-9OBr&t?*=3rnc&s#3Rllm(U$m2t0Z-9uxBG?F#ss!z5$ zl3rSo{IJYUGP4~m*ZJj;5SV?NqpM48OM)DRAoK8ZFu4)Qq!3rd%uOZkyVEP9g})rD zW$2)6x888>Ydul3%eq3D2ZgG#mu5Ol4#On*7#IWrwH@~b;Nn2A`YQ`^s^YWoo+ zGge`13(jWr!yci2-tiX_UMmHas{?Av=)9tOPku-*6>*sBqBr=K%A)$CcC5C^wV~eu z*9BT>v!#||n3Y|vkvr6HQDmG&9w~AUQl`|OHY}ihf(TVi;NGOvi==x9lG_#_sQOd-kZ(X0=-HqmgU0KZB`xAJq&32aux2YdJ;f7_r_&MdVK+AmVXzks-MX_&on6-JR(D7>7 zx^CQC3(EYJLQMDfa9V56AD_@P;It?i<5x(h9h5;L9_lWn9;*-by0uAB8qAt5)a_3? z^`!|Ff{kmJ)Jmae^AfB;!C{J=(;_zwlZkp%q{U=XedlhbY8@CF<$B=L9^w7+Aw#cg zkT!ak0&501T3UPO##?&P$+g1NXVa+?frZ@3_3nPVc}CT}L_Yisa4BWw=NE8ig}9^u z7@{I0A$T<>9JBkcy^)?q!!?FTpsIM&hbb2!Z7JkDx1Zd2S?Y76CV9ZBX=XM?xo|e^ zHp?3Or)D9I&{@gd>!K$w_%bqQ-uusO_=_V?N(vPbbCy3oiLsFr3xDvK4rYGLr#Z^{ zyH9~j3Tbsw_*V&@toTz%p29tDTXC=bO6wuJ>bP<5?Jhgd*Lzz-8zj(aJ{`Ouqe;mQ zx|gNokuCIo<6Qy$Wcm8NX*9Mv*gUPG=MPSQ1`ySFcwV7-fug1Z$JLS8zJc?_{azXR z0>?bwsWnzjA;nw0&a`#f+4>g^(B#hDr*QwbjYdyC08~O?*=bj7{4Wvjs<|o|L)4tAs?etcM zCXzc_$^PR2!$*Do)#7jCl+_eRvmu7_X)KJR5;~%zgO?lJ$MpKmIh#-itvCpCS7LrHU!e98-Sx{r373u~+k z&~amB{F2Wo^N9yezrVF4@eJ?Gl}47g7A}WI>QM42&xE@rC5`Z-jtM;ZySrb+3DtKK)%%?}=)a6y>bNrZ;=cAPx^N#& z#`pr%V$MUtEzro*?3k@T!jlaOe+iJ+I-i*) zOcJxbINEoVv;3L|?tA<$t>ki(=r)2R#bf?fb zk%&zK9ZCobqN`7k5~}LSA6zH(oDDAj5vyWBlD}uV-j^BbMHKX=oTsUv+0PTI;d3kj zYx0XXC#mt9w`9O_L(|qSyM$Sac?*2|)MyFjdB_$2R z+Lm?k#*VqnkNTs?1lf2}Qlu82Ro&nbgthA;jTIRg;U#9A=dLY}pwZ{qY)J_q#w6*J zr8C`EYGl29g?_;l)`VM~n-KgKk-R99NW6!kD9QKbuN0+`q)-JNT8JDzXY@CKe}ZxQ z@j3}U1Yb;e>^`_~`~T^}O$h@%n<>W*4%cRKEi(2`yr|yq6q%aDk*XcCbZcVBEfkpt zIjl(;Nn6(@y996Vgw}v0D@Pu=~-swXX>`B6)2`-%lQ&Uc`PI?z-FTr zI2|^++hYOj9&`4wG?mzL_=?XwoRw&&d$>;|yc6k_GC?9kqjG2-Nay)E$#Xf!?j0h9 zBr*Xu8znSMs=8`E!J75r@*BSimmxF&W5Z+i4YvE^P7z)2?|(zwqGD3< zp)I2PFyFqEonm)-ykE&tIsO2R8h7qj+yh{vT7@dMIg}D}UcX+mLIAx8VZoDbUC@SHI1 zqF(2x`{2nac6owWX9G}V9u0st(Y~ig)!Nl*D$x^eQxo81*nXTWRP9KB{YE5eGv#|+ zaJr=I$2uNZuD|GHCDA1&*m&Q{BM1b+Sa`T{?&KF<-F z#sg0XM-OW1jer6H^qM2|Y%4G%H zh1L*Hb76jc7f<%~T~CoK(CJ(5s26xa^o!urotg%RpS3dnnF5oA*UbL<=+s@pRe$hR zx6;n`;^nKw_f5X56STHQF-|yVyG?quEDz=_Nb_9?QO_1YX-^qS|a(yddTu&&e)>xs3om zLQY}W6o$B6{BE#A2U(ttF*MBNxUDf-ZfSx8aix1Kp)Pe&+G#qu2@?1^rx?sOPFaHQL1qnAUTifreT$b9pjo$`-Q5x6#JLL)l zKP8}v1BoPM3|$A<7!Bu8G$espkACP~2M1i60`WcybzG%(Y)Xr{f> z{i($Il-;Sp&`HjTLIXj+AHve&NTIKsF;Bo+1xx=Yca!V_=@p2uuRqLk3<)xoP`1yD z+glsc+n(=IBV}L1h1Mua7=(1%-MdnJW-Q+Uh8V zBuJc)xX$17=ISkDkclUOG^ayJcvqd8$LgIhU;va{naa#RI=qRQ(zB~>F07uX8bV># zYdUZl4#?Fp$LG(!y%||Z@w1bmby0stz4*%pFX&3^>+2wwNw8Q-A_BvVVF$x3Kx%<3 zys}t7{eqG2VP;Ik__X%vm**b!p0W^~N4q9^k9H-jtJcjlD?MCOg0vdM%NXD_N;{`{ zB-c+Xv(%RatVT*R$G(X57psGGY`&rxTj)qD;QZn|WsX!FNuhW=5Z9SvvMXr+p1=I` zXt!*#&TDM5h2ChyP2^~iF=lodb2y)9?^^0L{48)J*=v2NNs=fU7mxQB7Ct(K7gWzD zxPsJo%--)<4;=PuX(q2wlJO57f>$sqxnpnGiS%)}sSxs_>f%`PbGW5x*fs)A1 zLXBMCHFfMl-Z5!pb6LGhX~~QBKEL|20h?YZW&PZ_V8^nXw&3%gw;RRmctKh0R?du- z-4YwkQQnK5Ijr=amf5_nktkCiDw9HH3Oyu+AKxH_FNcTGQ4e2A0!MyToG!i5X1S=s z^U4WVr|8}swQMR;EZD$S5`ovz+uedaN+O4*V*naY96wj$pCcP{9kW#=dVjRPVGjU7 z!~}?qN|7dPc(OLPaC3RbWC!MQQz!SLF$Hce2%4Jv?RBrKYrGdNM*v+lpJnvir{44a zCDYCQ{?+V-^~y_XBIQhF@l$=;B`XEJ&AL0nqstYYlVfvQ&Z*7paL=^-9L~{lF{z(xtC=|RFvbX7T@+CwW#l(4Esz`UX)B<68or`eHbwuQ zzm_yIicyBM?D*$Qgs2@za6caBdn(6dJ+pi@vyRztWpp_5JqKKaZK7>O365NI1)yVe z>THjX8GfGv%qagpl=N92Deot%alVYE!`-FNZZlz{pYTEjUbSmv8 zR7pcuijCRDhd#ILSANvS7cW(5@TqL~TSjxGs6^z}-Ij(#y|tEnl75Rd+C4Z>n$Rf| zEK6J2BqWX6kwbQf({b)e$Zh!c;YW!7|>!^#gT|?^0&`xD6$KtDb$`^ZhBmhLw1qqn(muVXx8p<8|xv zeZTVsNo@vF6EP%1C)MAkGz`N{=^Dm5s+uBkK_1Mh;TUA+*48-W z4i)BMbkfv`gXEBi%~2B0%9z+fdIQSn(A>;Bhd;{MY!^SNa;DQC<%37kEb47SnC)Y= zJLZC}$tzINj8_F`9&`u10a*M%>1odT1LOVE%=4iJw1t6xzNMaLkaOcD%3(myT3w-Y z|CAU_{@)B#8#mCX?_ty!X7pgT?*M|H>UM9f>x4~C{hQ4^kzb0zoFU&rnBXej?mb~| z!Ksaw8VWGg&%6^nlrn^%KXMXw&}`^KZ8^OAOAD|VSeTh#zn|{8&+-Q4zMjTJURZ;Y zwLur30MPK_fzZ=07pMW-bAynpnY8XVsH8yARy3yY;5AtjVOV`NzAVOXSDac z3QbE)0yM<9(9Z-znkt6F&z`kep^G$lvhCNuJ!3-<2cXnr2@Ech1|?waWwB0rYgVuB z^VQvVtHr*t@U72khr{*Bh-HB|K(2*jQ3X%-$%&yqBS;4@*>Zr}473G6%@>;W_JQpv zH{VGi_3bbVbuPAOqQQrgqE_Voe0A;A76k37rTMA_;=`yFhGL)h({+D zB_~R!p%GyE-Cv)vF%e@>`Hw})?`qp8YPN9*$snuX@F#-M=N#~uJBpd#Fnjh8lnxA_BkPf!E~JEhKxb0#2er zhTf-Ky8Y=)`)@+I{ABQQ#_81$_Tb>4{1G z`Ps2+2S;U9-Pvx2&+ng&S$uc2xDK%$qK<3U-`U}8F+@?laO^E##8G}(cWFW8_Z`Jy2yLwnw&IHERRDW-7kj@6-|Rm-8x1cz^3vNXh}Zf7)duK*Ipt3c3yd;c_eRVy`_?uftgzXt)$bB)H(H4(yv5Dt2lL=pCt=gx zi*dOd_+rSAk;F%C{KQ~zy)n9B?jOCk+G0Jh&cupEqfY~_X}udvj0ZM2~H*CCc|k2yjSxfK;L9^PSZqf~mjH`e31yR2dIz&XHWIVZb@ zvT1fwD2Lv8YA%>Lxi~`P=&3Zb*wAb_nY&jP-yHuTZFn3D1u)v9}@NGckP zsy$lHb3IH)Tp`Dr`QuRD{&R= zisX|5Xia;4UY2i0KxUNYxLetFW=UHAoJ5icM^6I zKHmZPOeAvf<(jQEZIJx>lC7e(;7&k6P0ei~FlULm+y|U$#s1l!7O%A~ld*@5TQ=6r z=P$ULu?lp?!h)U=Xo~a~I?_8xZ4Wy6^^oO%-L1HkQg7m9NM%LXkg%$x+t7c6bzV8s z^eYInA~)Sx?9C!MBIK%lkx6uWt3WI7JL1u!H!RwRk1>5Rh9lhHX-Ko4GA+`u`2;ayh2|d#yi^TxwmS`mZ!BMogpNaL)aQJ`Jz5;Wp<^gp#s$6hpKoQ z!o`rPuJ1AfHG*1h@b05~MMDD-zKM_^nYAC%PR=6)K@T#rOA-ih0n|+*V;^NP>Ywau zv6+&Lw5-|$^#DV=_q&l2*BvlsICcVW+1JEO3ONaiGHzj($u(K}OGyG6+3Xfpk6S%v zGTFh5(ycb$q4F(~d7;r~0*1eXn@m1)=nD+yo+Yg4#@Hh0g!@v;N287ud(lQN1~2I% z4r#tryLLae`y)31OeDcGZni7)3(by*{A`M~j$?d2tR=-( z|9(5tNaKzx(9$iX(x2%=6NE5IAA?OgqB_Z9?;F{1jnoGg<8E;4%&l2aYSe()Pju=##3C+|to z>8KsykIUAKbaI?|swBkpTQ5=UQx7!}bgxHmbIKWI*wKKSJ=!XN%m%pfn7HCLT&apB zFCO5jXfUS{rRk;_KMC7jz7&lh8B8Jhbcs^YySkiOA~rxOFo9wA`1rJqkC3YsO#V>M zOOX*Gj@UXAXjKg90{V^G8w%nSFamXF)L{(sFin^{obFOx zt2kkhG6>3@tj#mK=kGZ_ZXBtCw20G(`MO{e`Ob9vVjFQJ-i^QU_<(mmh>LKf#N|{j zV@sR~XCBQ#EmQ`q(n2-%38nilv^Ai&FEv$qzbiv=>zDqRe@m}ZQbn`*Q{fW@n6T~_ zLYKQx(vaGQDnR04Q(=f#-tY2IogW@`$JL6oQz)K8H}6hACznTxx60@cw7T`%{#sEU z`C6HBs3R2e`$0E@tBR6=F}M?{f~*Lb-Bv1@8!g~q&cyL#?;hUegM2t|bgxWWpT1?J z397;M>vua^9?S~wb-mvo5Yh7h0$$2=zf4{Cp>llwdSoI zM_yPH;ru5tpxHR^A(WLpyh{mgdUg=PL#NQ3uCx-4wHbREBooEOG6f}76=@ek#&v!` zJ3AcqOsiC$3asmj3x#;!k8N85&-F&we-=w7vQe+%BJv4aPvp49K01&_6vc(RJ6F7^ z+b@<%^3uk!JA1^}JK|Bw5PS}L9g0YT&6}1^Q|>kGK{9T6$9VJn)Z$af= zy#LpgX{bk=?jGQTchcE>F}CEoW(lHk%wV1t5k&5V;uDuSu+n&5c>lSRTA zA#2WtJlT*?e~FurHeGroj#ir!1soJ}OEX2JYIHl1s+je_h0mC;Qr6sKU9)B*)!Zo0V?Dmm)%+2vngA6y`{S!Qwys+v3-~ zhpJj_kzi1rej8H9mg9JOCldo9BoSC^PVxv2t@l1K#N6ws>0)C7*_<|+PUv)#$+!vc zK8GS&7wry*vv6L%-WGZR8cmtim-`C!PE#bLmkO3~Q$1ePyabj(Hpi$5ahOgeiP&gx z#m^tJQnaqoFtV=trJ1*iz-whCA(@Wqv9dQw8zocC6PYm|AbSKgxX zNlC~_Ndc`0WqZ90q+h0~RklcENC%(Wo-v+mPP>c^^ufjirA@fB5NmUK0MDR$o=_8G zywRVF0_tY55$|CcszQ?|MI&kBK{994jX-o@{dpX)pCo3rKcEl%&b$+ay()l!Ef-J~nV6<7+>lu(2B90u0 zhg~W3zW`n$N|tvhcEj4?EaeotGP5p6GMq5R8fZ7#NLa`rIzmo090$g#nKtYv#?y}Z zx6ztJ>>wfZEv7nhT9z3>&l~2TI0v32CCq0O@ zJfSV43fa20(E@{y8|A~oFKQuisi!rWIMO-b7)Qb)5LyDxi%+`}c-Z(EZo?!?OBNG* zCO&`n?_o}m7KrOSw#>9yMjLb_Y;4KoRZ7R}K9odSh21NM^H12QoU)`9f7yvYu-iH{^ zwV{fv(ZO8Qbd(@Jbb3RVHC`5+Yaf)@;5bczBP0FM0f%mRG04PX+3}5_3>UVUm5Yzo zYP2Wf$gQ6tXhcu#wKLsiAD6d!Z|2`x-`Fj$80q$7eUd<~W19QoH;S%E5en~W@ElY{O*HjGdhYS9GCeVS`GQG-QWYxOrM zpby9*X#x_O(l?7-OPe2>57)Y-xD6)Qou5DU(|ijm>;cPL3y<00_uFOeLO$%z`vLgV zd4y&9BrbHMou1sl;u%d6nZ{UnHBu94{4RnRs#@mmtS2zN*^$Pafcp(6<^q^Ji!viT z!GCuy-YB7BJl1BGBE@=$ZOvDsy*V3|FDrzg5(V#Z>{hQ$_HFFv7FVfnZ%|~{)*dh` zfqAqC+T*^t9{__mk_h2^m7cXz#84+OvHfSYFjNyOy~w4e;1-2%ibHCJ1J)bLLXP)= za&btt8b}uzI-OM^Ih^zfcA2jit9v6(+%$xG~mS!x0 z3<;^+nw7hRFgyIs1W$+&S(uBeIB3aaq~jRXj^WrZmTovGNXgI)28c!?*%^kr?lzo_ zETZ5@C&0z?P+_$X)Qj9^KM)0hAUTbIsv3xt_s3EsuJr6G0|H$k83{<>=hLZZI$dv( z?M8+1ZtZBIHD`?=TUV`1v=ANg)UPK#q>x|(kq{2}=xg(J_uv*cPJS1?@`^ipJ0;SI z2b2-|8=w~Klr-xUhk%k|yg{yqSl4Akcm4sX)C!<_h~v=1CU}ZWM-e{QZVa{kMH%zan{11g{?HpQ1^U2# z)H!i$(PVFsk+Iw8!RVv%jfX1C^pLg?Z!%pZf-b=-GlzkEy0<;SrX-N(Xzn^w zKc6>YYi&;dYMzWtji0Cfj+UO!!*jLg;*C8r$WjLS*JL=jVKuHK8fcGVC{2HtL^!840bDCc+1M1g0(;%S&E>4O&qD+^er28^809v_qoOE zFFna84s*|Y&G!~`sw5At4gzZwiED5yzASb&y#g97EhL|+02UrWYb5;OYnZe5@z<*7 zB4(js*vjyW`}go=)30Y9E4>$AFni7j*NKVH#c%z3iB}7wTes!TvpGCLwSVN3+OJx? zO|F2uhY0t0mXJVSJ@vWnb1&+`-tX8|Or8tPK+C9IgJPqI%vEOH4=7Vb5pbF)37zqc z&(|5)Hc5nbVC;2Eb2zaKI~&ZkzY5cf=zPX~j}H3Vd#1btTqaxwEMFM)`>B-zIyd-U zHXCUqd%KJ-Bv?bpaiZi2bUI_^nOuv>-dZRZ7aOfGZ+ZAd*GeU?y)v_vLfT)kPmb>t z$s$Yd(&xayuGUU`c!saHrPdrIlVp~s7sDa1C*&xc9tnN0u+6pBafK~If={u!uUL@{ zls*cv4o~T=k1^A>T?WUKhT{+O|G1GQEJIxA%}8x!O2Ok-dNV51(^1wow=d0N;+fTD zTYj|IcAFciZ&_4K3Scdt(C^>Nmx`EP=hhj|ds((1aRJg6s2V(&BZn+yr3XiY>*n28 zDD`fMA~6BoGh;@*vh#JUN0BdJKJ1vVWv6`EcOY%K-Uw3S;1+5Vn{GDJhz|1$C&vUkYTL!-$zW!d0L0(8CNTP<-P0t>g%r~CWPXrLVM8WKUCk(R50@X7L{7j7$vrMu}a zs+pc^Z>%Vx(N{ctq6{6|n0OtgCG~uE2mg>ogUZdkgQ-KVI(cM%M+?}J*3(gvNXNd- zxo?cCn0P~-tg-@ZUUp1)xYr&!%V3CAN#?Nw7ASOwh4;rza3ybHAgE^PeljePOCXD# zGs%Rirn{Gy->Gve`#!2v>HF=g|GsktI1#a!7@PJVEfZbQXM$SGMc6)p)sh&DidCh; z((3vy5I~Fp9gH!(-$@Bj5)WS{qO$?#_qHT@{+`Aq#L8C50~|EY(cEYfo>md=I3#G@ zIj{d&n4a@3<(?v>J2q>gM!QAKt7s8w`8Ev8pGNJQI0^A%Kr-hl-Uwnbi7hCOQzS5f>h*J`U3vJ2vZ>U$={mRmqhh@;r zrr&|&5J#l)0(i}K9BrsOW}4@VeKBD~ex$nRTOW(x%6IPZy`D;-FDv}!^X+WE<1%Mw zgAOcBRiFzMVrjU^D-mCN6oe9uSsBKw7q46|KVHZ52wST1g9@xIpyAL36{D=Ou1xS0 z-=mz}wK2Z!t=nI4&t_UB2GyDLV6fh^%Gh(zZN|_btEb>B&!{GKH9X*0HwGX^ zKO880aU{Q+B97v3OO?uDgWS6J6oqrbfLozrp{fn*J=6F1Wm+nfVkkgz;29y4!ALhK zDCYvv>E%t?P2elLj!_WUdvP9Ku*fF|EuL`wMbXH1CP5@@+Mlf@w2KXR1LQ>>yOm)fp;Q5 z?crj_PSs3!8BiHvO0(Y7@2b|;?Txa@YT=|(`98;c>m9-!K!Z@FgcR}qwi?!Z2jak| za4oTF-|3aROkhNYpRhx8*IADfk3x%C9qWA0`bZCzn{L0169JXPAq}_16FIzApf_Bh zyR#_JzSSzj`O?Y!^eN$_=O{(}CcWMRx4oX}lEXssjm_2|_gRr5nCVeR(dfQ%xPe__ zk7rjx4axO_u;m}-@&0=bDa`%mLjSHYe6>w2AbAgVWf}Xd1ij<@JLQ6PK%1X=aj9ns zDu87?E{4sH^`4{c>Ac#r!f9*?{XP$W6qjm{An)sK(cR^oD0t;#7~iDJ1A&>6zvbqb z!Ig+Woflm?Z{RlZoaz=oP*NzKuVEHh=C2E`K27MuRg^{}L^XvPJFRjW++VK!UJJ#3 zp%{VYnbY&>bck4vHd74bqzp#bgq?X*@_3w1wD(jN>zV5nAKs~WT4ppnt=a6ATXlA{ zGKLcgs~7U%2Ng0aGVK`Pgc;N}#V-?;Mu4y5u@WY?-MLYVe%Sw+7H6Hch21s2(}2N^ z!?Dg_ne~TxMyGCTMk8tTY^HgJ{dcf?L=EWcAi}x&xN=&#Sq~Sd-WW5E$CaO)o!py9 zWU8K!k{XzZgl2Kp?_%}Vsrmv+0Hu3;l^%gr?h!TJ!``ICD6J@AUxW(hPmYfGY@hNe zi`o|viBv_qr1OmF9oJ*3tS!+D3Nm(ka*>iZ$}Moa=2KT!(I8NLAGU~|Jp%LuOh z1Kut_at?krff5S1>*{cCfkIo2chE~ahMLoz4?KmKrZ$(T=m9XDSpiqc6)@0 z4ToGdn^qikI}h0lsz)$+u4eoL)Cfa3eL;N07E=&o?zb_1k3k4g=f+!Lh{(k~|pTrh#84S_7Z}BOe*{B;LspK(QpCOC?(gMJxnyF7_!FYZ?wYC6II7Ej< zKM@FqOJ*OF|G|?%|HhNS5KL9F*Ma<$37ES6GJM$p!xuv**FP7!{Ifj&ycGXz1)OB; zpRMr!>U?CkhJ4_*j5hE+oWmI|SN@a)VFBuxdvLbXuRI3AxV7lX?|=dzOm!Vlkr}y@ zXhWKB4u?1X@FJv1M7;%Oj`gaU>;2cJfWF=uIJxr&3-sLh4bRW^8`j#GQ_4ZMq#e&` zunI&Rjzj8yh6}s5&9ry3#)0$Dx&oQ!pnKQh zZQD1f0|weV*P*0uyyDX13jQF#uLH%8AV^*E-8LrofCXjr75Clt~@; zynv%~ZPdERWtWQ2ZuQl30H)Weu4)iRKAAmj3R6Ua( zRtFes#s-%beZOTs48Wlsus+n$7xPGpA^lVLNrCg%zdGOlT>idIuW&aXCpmA#E~%=$W0AW z|FBwAe5bM=2A*6R+0$^KgYv8Zj>jWND5@%uxkl@=R*~Vod6A2Za1qORnS3Cu05*Us z5+dR1u2^uR(Z57Pr#&Lao!vs)k1;^Q8n8?gCj3K-3G%ZE$HSBDl=Ia$Ma;^{ zwVgXeT{2U^Oq>tq!n5~MDwJX*Cp&pLS->(G6EZ)2#OWE5pKS^Rh8Y__#HKC7%j~Rx zT$&8w8}w;e>$csU9quBrfXl%mTfpXNI%ZSW^`KwW`Qa9DsBrKpZoZ~8EVeGJ{vP%S zJo0eY#niwW=Aa|Lx#2&6sx459mf$pTZj10uZUdQ2U@j4xKE9s&r$=!r)u1y0D>m03 z36ksj8$hFO1{6pOfX|o5SoZ^|t`z`b*HJ*d5e1o%pZwkdN(O z(P~ijyMBNA#&qQmzA4AI@svQ8j%JX*@u((Gpt>B<@GA6b?XHN~lbTyWr< zwvC+Q=8i#mkXFAwklQyI8u`v4;LBP#GwlR=Jj_xR(rc_8Mzsz$a$y~gLj~Dihjchi z_2XkBk2&(=p@y^Pz-yA)F(-PqNfbYHLs_U7KgjooPrM@;@kH$%;A^ZUWBt?Ds6x*b zhZ+YybUT7b=`|kRT$fpgg`!t{`Dwzkkxr=RaU(&p ze;OY=i$xn}bJDw)7bQi$#+hxY!#C+Z^WdZNHA{yzU_M?w(-*Y>%bcCKLYI5*5*wL^ zs6&~+rIk+s*Bujuofm&JzI-=sz4J^e6zlWDj3ADv{g*MgjOI9BniCLTH?%ks2Je0a zTElhMMo-}6T`TS2bW%3qaj^!5qDsvI-I3iPqm3;iR>tdivYK2iDWY1Bp=nERshT65 zEhyO)+jPCw&=bzmr%8nz!N&naB8yqV$&T$Tb~lasW$1vnzLHJzufq{oWrljBscnJT zE@#SW^piC0j@NFF-&wyfT=3v$z$vQWHUX6MYF+#nydcWX=j0hSmn3zt0wFjAU%s0< zDfel@eMeHxsdx94oSGE(_-C%&$=IJZ#`J5`VH!{qPQirq$=7H4~N( zz??B?b+xR=4jYgqK+PnElRFlI76O?HR|x&VwoV!O0z{`JX5^4y9;d@fL0(APc}%RP zA}phPOJxz;#0q~s|8vG0F9^5XaQLrbbDjqP*qi-L(7_02X_Rur8C_KVGU?y`Y%X{Q zTErR;zrTFKi_}@Jr&2$J`Gvs1cfitu6)2p@_wZ< z;K$XUgH3G?Sa+6UCd0l;A1{-V7Ds3b%oIc9-TS& zt|URwCt{Am3k1pnr6d7Y9PfCP3W8QhZAukTwSVMyTAdE%az%CXFMK5T2deC%)$i2y z+^69{IMs6ou)7}U;_%-Fx(5zFUtSr#-$G*o3;{SV!oZ!!@1KIuHAx`&1;>SRHJp?J zz(WGrbpL=8=$Q2++j8ht?A+wB`TTze`^AJ-^2-~(*I3+IJ= z0PRzjs7Bmp!X^Sr$N_32iU0+OV_YK@01m@q4u61ND@iY>zsmr%Q6)`}VFmO7C^TV! z6nhnyNO;6Yu7Xr*odu`aiCZBAcBZgF;9#=^QI-liy=f%|Y>Y}I%b*Zc35r0yz{)or zeg-_^YawifFNU-Rw?MOu5zq_95c2093U8?w_b%<6hbB5v>Fd z_d{VdaI|LO>qVLnNBTcyABkzY1Lu!C3cJN?GfZ$vl97>0&U<%IYhrgGPm7D05jYC) z;s|lc0@q6tVy^cctg=~`WGQ_`y3Cd)*t2?;VNmz3xoPw z8GQFC4V-kFW5TJ_fF?cQb`I4e=%4bw@C3;J?EtSH@uH*Y$-j|&Q=P~5yxm0FSwXJ{ zew)bg>WsAV&X4bIOa0jqVK?u8bsK)V37GbUBMp|ve%lbSQ~6V!29kP(pegaGloFbm z=ekJExF01ZEu*-8R3P~-%Ex8E)lt{FjCx{mxfX}|kecDCg%%}oaPYN{?CZO&)>udg**~MTvD-yduH}s=3chzt*yrGY0hW%2AJx}5n^B>HQUh6Rd{~r#a z>wy3GN8gfhPd3|EjyQjR(gJs1+648kV3tbI6L475DCe@ zL8?<_{TS0>dEkpPXAP*Rb%K^1!h*kE-H3}h5&BA=4-5hK-Z6Qku>%80E>?FgOF;f7 zI$VBeu*mNecqV>G1a$WFFwsF++7v!L4HHKayotWS!Sny3PWH!=cd-*OCz_= z)ibqjKv?QNl9fu85Xj!Xbs#_qoep(={|Ha^=DJRJ2+$-M{7vSKCoBIViUyE53S@tE z8N*v12@eJr8vS!25Ul>QJb$#F`~Ur=Fcoa@7WmIr&F{z{u#Aj8F_Zsn^Bidl#gnbr z?#K@KkG8!?IT9pNo|TsS@_#n39l3)-Nybe9(ZvX`Xg$-_uLc^7(UKNAYhe5jTUDE# z8vkEaC5QAkpLOB72;wN%_RTb@(0s7@T|rkDZH((0!wGlh#4KO}8#$|INpW59a13p@ z6NuOfm|nEa#9s)@8~`jQE02mk5>RxW-+)z9;T^Mh*40CCwDBpvN5MJc}&u%l`%b zBjc3~PFll>LvUT;_J&P}0G0PN7+qN09E^e4=>9jo9q>%8d&?BJyb_t`}I z^L5H>4u1c_Hu(8jgI+E;qvReSk*nwh!i*yzEDDwJ}qtwC^hP2cehif&E|6hE?IlnE~fI!H4^WbVR~sn}6R4YDw(f zSCaQ4J~cRpp)26WwUX71t*0th5s!JXg<@|6Qg#r(IxOTZwXpDeJL(}(L3s0(^;+Uz%JN;K+l&fS4OH194~ zQ{rzvJ7^Id1=L{j+`#2Sn`)2F1aRkb@WXttyX}r-;}oj#gRuMh0AFSW^4ZKkIY<_E zUDc-Mv-_Cjd$bhGEQ;$dhnJ3JHmiP@2o?`Cu}E=SnWN&ih@2bP8W93ViqK0=$@idl zQ!5Ab7{_xfWz%aZcGQ3ln}iNW(ZVvo&Y7W#X|*tUnagOvl=u;kIxA_AJ9ES6{3xEs zesbK$AJ=IsxXv}M!;ys<@;}-;^RT3{K8_1f(`G3xmX_jDrlvNNN@=7fVp?dWPK9D+ zS_n#+f^V85Wu@l0wT~^PDXuWqz~quL^E5M>*<&tYDn?Uk7@=iqg`w~7w9K3Tzkd#Y z-RJjQF83bJJ?FQ4&*wB}>qP|Tu2s^jqVFD}CB{2Ybsr|)kU9P#ixE@i2Z(^6MqiJ; zaEAAzA*s`@lY^*3$h&;9jIvku4tcX{>wGOpR7PbxhEbQ|({C31#T z2b^OD0&m@_Ic}!BlMBvqwpXF``BF){d%~~H6a#mu@22X?PO7(W)Mu%~+Lyhnx&?6C zKFksN&Jh|D9Q!c+83pAyyOw;GX8?(n?`c}m`P5N~o~?D;NYIrM<>nE(g>kOSH3!fv zbUt{t4U>(-@S25_ ztQ*MyD>$CoFp2%_5&;(w=hoerY&C)5*Cf#I$;9 z%$j61GvNW7$USsYBmUd81g(FXwr1X%r^%+_09FynH3Kol!9XNajlweZM;3*bPrvxj zoMXHLSlgQ6)7_Au;MWHHm>1Rb)9N}z;10fgHR^MhI}ck>Jg~@v)+V2`(GSqV7OWtk z0vH|Oxl`XoU&emyZVgDGp1w2V-D-e5nP>0|O$eAuh>}zgMNl~(O6GVuVuye-Q`vkP zz8vCT*f;q3pSOp>QnAS0xEyMi#E2frgyv@in3dkx>w&5k5s1t8`f;q%x*DdvmjG51 z0imyBVk}{z38fYQzFgZ4;F|$C$~YnP53K8F!18u(oxfftaEiJ}DH@211-^ye+9k8-K9Q38Xf&y|UlB7b-7C?+%(zRhUEI`3UBnWKym&U+Lpvi0F z5$Kjvc!np7tXn$TB_Ee|4}<5_<)zin8h_Hc z>cHc5W5C1?UcIleXkAdd60%-wG)E&O&L}j2FzPjZaVH#bB$Xlr;TN zggXVFfWv0y2{(;|(RY2U&WuYT85E-th@~_x)cpd0Zy1hT098CHP$548;#8?aC&TpZ zexmGPVl@|q%!4^8Je?K(@P-%fTRy}kfmipDyk{FcrT-+tgo87Ad+VrbcW{17}^2lBAY$V5w^0#^zo<7#i0 zwj}Vw_P5KINnbpxT8|XV9vg_x=)X`w2~r#nj;Hs_Wirdt+E=#E)iN8wrvm}L0}8cg zceq4rYTrJN8>lLC#F|t#Yj;6&Tm4F74SNbcuhG(GL~k zu-3mi#jO3a^lU^(B!@J*td{(gc{4pLgp#pAiTv@AH`HqIR+pSdb?u-84X0~Q($bfx zaG1c40>(#Bal6gFbHtp|+u&98UYW>?S3_a53vSq`8eoK09=3;m2b!Tx93&}G)-x#d z0~8|bYJmsswWr7tnRshxAZWL?D!seNOOj zZO+J?8|8eqN@;ir{N_~E@7Bq?GXhSIEWtc8S@jJnMm2kwP=Oj*d0 zD;%k(9rmUPW@}tbXPEhzW-wvb;soIS+Kk#JyuZgYo1uO5!wd!O44EbJiH~=8H%-U? zM>7pc#)qr(l)pfp?^j4cRmhEIR8XiuxoM84m*Nd(;s{$@VTT>_`6qt+@cxYoVJLl0 za^>+c!~!!Sy$2MHA`oFz7gjz@IG%vb(1O!Pz|)od`knHTdg$&0>RzW$(-ux;%9RQ z7YRMyCW_nLwy`1(GzZV>GGcDZYvN)IKwOPtoPm8CTl4Jj79B-2(Cw}=?~C=i6f#o^ zq75QlKg+K%u-UE=WFUtZTX?1<-61?V!4ulkt+Ks#h#4X`Z0^?4sk0Vd{6RkKG=wO| zTixlY+XEv{6gTBSCuR5eU~RIR6%xwR1CZ{v%{fZYNrol;_)UD1h{C>nP|n<8tIu3L z$t*d0QeaPYQ`(m#+*LNEJHA-)c6j@nhxW9*k)_#9L3EdBL+uQsSVgXVOBRn&Th({( z`6=lY#qznB6p>qKc}Mo@AAl}jsocOa_wxp@co)n7R#SUm1mO~0{8PzpL?^t?0_t6T zASoHB6u_<-b4nvK<2@tbIf49?8D|;TI)5dd#r#EjVGBXW>gWR18uLBv9DdTi>|+Jr zu&Qd!2$uTx&51Sw+qSd8q!q0>VWd36-nh{isEfltjXHuGrLGjg~i}RO5+s$e!?DUK7kO_;+?r}`iEym z69-w}9g5%P<0sbAOpFgsSWYEtzBiHIJ{%SES6C~*((!bftUlQ0ESoFJ`~XDC$f$Ns zIMuh@j6~ZUz=7x45_`xg{84#Be^Abmp%jC(yE8Vj8}32^+{*b%kJ~IZOaEcx6pTM% z3m(VB>!d{w56b1F*-8i=S%nmYvKJ`$kDO)lv1eZcS9IiyP%LDOUvdbDEc<~B#6h-xkHs8mg&~MxG+}&@4t7f zoeBrQ!Jkv#tnTk~CtA^>g{&Tk1iA6s+dbGb&+}>hwBoAi^qlWcXH^@we?{fDxq8VB2Tv6%%U`cUFfC)wZm<^fy(O^=&&k^m&Y<*K^ohCX0p&pV7xUB zrT{nMwqgTovAa?zin=1~2MFgyZd1$tJQu<=EXdFK*i8*$p_}PZB)SM-2rZIesNv65 zr?sre=j*WEt|gg082pLb(lUHkCXD*_;I%ZJSMd73cCDPfSCJY>bflRHBV6s*33O9r z7s}b*(TVvMwAhkT+Ze&TWVRyK~j!`%C_;;BN8U)0SA(b${mv4jokVNIU_-PU)$xKtfqFI7wh?Z4l~)-jf^jNI zebZrAy*2Y(2f6(0ZDs_=48ui=T%Mr`Ly#=o zB@-ZLqRc=CVWFl|Dj zaa@kk(%QYKPtKtapE~CHs5Pxq2ZO~;*CDv@v@lrgAK!dA1luDVuAUN+4E8T4V4hC- zatO9?EH>o20~vksla;6S`pY4*Ibbk1w;Gsyyz<8rTzK#PITsEt@w7UMv~@rIG&(_N X75!SQl}aelf{&-WH(9u0_p$#15aZD> literal 0 HcmV?d00001 diff --git a/test/image/baselines/quiver_wind.png b/test/image/baselines/quiver_wind.png new file mode 100644 index 0000000000000000000000000000000000000000..3e799eb8a8b87092332e0fc1566b6cf6db7966e4 GIT binary patch literal 32997 zcmeFadstH0|2C|dI%BC*O<5jt%IWARm3dB?rkR{Fv!kY@Xqu#gm?okqXr@k?+EFW0 zYs^j_P*F$$@sL@0AT>om0W(Dd1SLS_^z6RJd4JFE`#kUUT<>+ge?0x+b;)M$wLfd^ zwb%Nrd)@cV_x_{Ck@&i(v->*b|led>~LA8h>Y#|InHdsps_*!07L zjlZ8+dKA3rkEbp_$Nu~se(85-Z|(TiV1?VYYZsCihcGvyp4*NFJ<%d>a89b<2il7r zVg4ei@MbUGx7h9Elu#(#z5e?LI{I6G)-^hkw&eS#eM|IPAZ4~)F-L(<|M((YUk7Bk z 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�E2DfB+hma`Jbm9Pi@lL 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

iZRV*Fxu7L?)S1oxrA~lHfGEiCOZr= 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 literal 0 HcmV?d00001 From df33638d1cd8120d1b87aa954186a499a0b4bee9 Mon Sep 17 00:00:00 2001 From: John Degner Date: Sat, 29 Nov 2025 18:32:56 -0800 Subject: [PATCH 14/46] Run npm run schema --- test/plot-schema.json | 17882 ++-------------------------------------- 1 file changed, 876 insertions(+), 17006 deletions(-) diff --git a/test/plot-schema.json b/test/plot-schema.json index 9c6775175b0..c869e669c43 100644 --- a/test/plot-schema.json +++ b/test/plot-schema.json @@ -14179,17024 +14179,894 @@ "description": "If *normal*, the range is computed in relation to the extrema of the input data. If *tozero*, the range extends to 0, regardless of the input data If *nonnegative*, the range is non-negative, regardless of the input data. Applies only to linear axes.", "dflt": "normal", "editType": "plot", -<<<<<<< HEAD "valType": "enumerated", "values": [ "normal", "tozero", "nonnegative" -======= - "valType": "any" - }, - { - "editType": "plot", - "valType": "any" - } - ], - "valType": "info_array" - }, - "description": "The dimensions (variables) of the parallel coordinates chart. 2..60 dimensions are supported.", - "editType": "calc", - "label": { - "description": "The shown name of the dimension.", - "editType": "plot", - "valType": "string" - }, - "multiselect": { - "description": "Do we allow multiple selection ranges or just a single range?", - "dflt": true, - "editType": "plot", - "valType": "boolean" - }, - "name": { - "description": "When used in a template, named items are created in the output figure in addition to any items the figure already has in this array. You can modify these items in the output figure by making your own item with `templateitemname` matching this `name` alongside your modifications (including `visible: false` or `enabled: false` to hide it). Has no effect outside of a template.", - "editType": "none", - "valType": "string" - }, - "range": { - "description": "The domain range that represents the full, shown axis extent. Defaults to the `values` extent. Must be an array of `[fromValue, toValue]` with finite numbers as elements.", - "editType": "plot", - "items": [ - { - "editType": "plot", - "valType": "number" - }, - { - "editType": "plot", - "valType": "number" - } - ], - "valType": "info_array" - }, - "role": "object", - "templateitemname": { - "description": "Used to refer to a named item in this array in the template. Named items from the template will be created even without a matching item in the input figure, but you can modify one by making an item with `templateitemname` matching its `name`, alongside your modifications (including `visible: false` or `enabled: false` to hide it). If there is no template or no matching item, this item will be hidden unless you explicitly show it with `visible: true`.", - "editType": "calc", - "valType": "string" - }, - "tickformat": { - "description": "Sets the tick label formatting rule using d3 formatting mini-languages which are very similar to those in Python. For numbers, see: https://github.com/d3/d3-format/tree/v1.4.5#d3-format. And for dates see: https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format. We add two items to d3's date formatter: *%h* for half of the year as a decimal number as well as *%{n}f* for fractional seconds with n digits. For example, *2016-10-13 09:15:23.456* with tickformat *%H~%M~%S.%2f* would display *09~15~23.46*", - "dflt": "", - "editType": "plot", - "valType": "string" - }, - "ticktext": { - "description": "Sets the text displayed at the ticks position via `tickvals`.", - "editType": "plot", - "valType": "data_array" - }, - "ticktextsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `ticktext`.", - "editType": "none", - "valType": "string" - }, - "tickvals": { - "description": "Sets the values at which ticks on this axis appear.", - "editType": "plot", - "valType": "data_array" - }, - "tickvalssrc": { - "description": "Sets the source reference on Chart Studio Cloud for `tickvals`.", - "editType": "none", - "valType": "string" - }, - "values": { - "description": "Dimension values. `values[n]` represents the value of the `n`th point in the dataset, therefore the `values` vector for all dimensions must be the same (longer vectors will be truncated). Each value must be a finite number.", - "editType": "calc", - "valType": "data_array" - }, - "valuessrc": { - "description": "Sets the source reference on Chart Studio Cloud for `values`.", - "editType": "none", - "valType": "string" - }, - "visible": { - "description": "Shows the dimension when set to `true` (the default). Hides the dimension for `false`.", - "dflt": true, - "editType": "plot", - "valType": "boolean" - } - } - }, - "role": "object" - }, - "domain": { - "column": { - "description": "If there is a layout grid, use the domain for this column in the grid for this parcoords trace .", - "dflt": 0, - "editType": "plot", - "min": 0, - "valType": "integer" - }, - "editType": "plot", - "role": "object", - "row": { - "description": "If there is a layout grid, use the domain for this row in the grid for this parcoords trace .", - "dflt": 0, - "editType": "plot", - "min": 0, - "valType": "integer" - }, - "x": { - "description": "Sets the horizontal domain of this parcoords trace (in plot fraction).", - "dflt": [ - 0, - 1 - ], - "editType": "plot", - "items": [ - { - "editType": "plot", - "max": 1, - "min": 0, - "valType": "number" - }, - { - "editType": "plot", - "max": 1, - "min": 0, - "valType": "number" - } - ], - "valType": "info_array" - }, - "y": { - "description": "Sets the vertical domain of this parcoords trace (in plot fraction).", - "dflt": [ - 0, - 1 - ], - "editType": "plot", - "items": [ - { - "editType": "plot", - "max": 1, - "min": 0, - "valType": "number" - }, - { - "editType": "plot", - "max": 1, - "min": 0, - "valType": "number" - } - ], - "valType": "info_array" - } - }, - "ids": { - "description": "Assigns id labels to each datum. These ids for object constancy of data points during animation. Should be an array of strings, not numbers or any other type.", - "editType": "calc", - "valType": "data_array" - }, - "idssrc": { - "description": "Sets the source reference on Chart Studio Cloud for `ids`.", - "editType": "none", - "valType": "string" - }, - "labelangle": { - "description": "Sets the angle of the labels with respect to the horizontal. For example, a `tickangle` of -90 draws the labels vertically. Tilted labels with *labelangle* may be positioned better inside margins when `labelposition` is set to *bottom*.", - "dflt": 0, - "editType": "plot", - "valType": "angle" - }, - "labelfont": { - "color": { - "editType": "plot", - "valType": "color" - }, - "description": "Sets the font for the `dimension` labels.", - "editType": "plot", - "family": { - "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", - "editType": "plot", - "noBlank": true, - "strict": true, - "valType": "string" - }, - "lineposition": { - "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", - "dflt": "none", - "editType": "plot", - "extras": [ - "none" - ], - "flags": [ - "under", - "over", - "through" - ], - "valType": "flaglist" - }, - "role": "object", - "shadow": { - "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", - "dflt": "none", - "editType": "plot", - "valType": "string" - }, - "size": { - "editType": "plot", - "min": 1, - "valType": "number" - }, - "style": { - "description": "Sets whether a font should be styled with a normal or italic face from its family.", - "dflt": "normal", - "editType": "plot", - "valType": "enumerated", - "values": [ - "normal", - "italic" - ] - }, - "textcase": { - "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", - "dflt": "normal", - "editType": "plot", - "valType": "enumerated", - "values": [ - "normal", - "word caps", - "upper", - "lower" - ] - }, - "variant": { - "description": "Sets the variant of the font.", - "dflt": "normal", - "editType": "plot", - "valType": "enumerated", - "values": [ - "normal", - "small-caps", - "all-small-caps", - "all-petite-caps", - "petite-caps", - "unicase" - ] - }, - "weight": { - "description": "Sets the weight (or boldness) of the font.", - "dflt": "normal", - "editType": "plot", - "extras": [ - "normal", - "bold" - ], - "max": 1000, - "min": 1, - "valType": "integer" - } - }, - "labelside": { - "description": "Specifies the location of the `label`. *top* positions labels above, next to the title *bottom* positions labels below the graph Tilted labels with *labelangle* may be positioned better inside margins when `labelposition` is set to *bottom*.", - "dflt": "top", - "editType": "plot", - "valType": "enumerated", - "values": [ - "top", - "bottom" - ] - }, - "legend": { - "description": "Sets the reference to a legend to show this trace in. References to these legends are *legend*, *legend2*, *legend3*, etc. Settings for these legends are set in the layout, under `layout.legend`, `layout.legend2`, etc.", - "dflt": "legend", - "editType": "style", - "valType": "subplotid" - }, - "legendgrouptitle": { - "editType": "style", - "font": { - "color": { - "editType": "style", - "valType": "color" - }, - "description": "Sets this legend group's title font.", - "editType": "style", - "family": { - "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", - "editType": "style", - "noBlank": true, - "strict": true, - "valType": "string" - }, - "lineposition": { - "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", - "dflt": "none", - "editType": "style", - "extras": [ - "none" - ], - "flags": [ - "under", - "over", - "through" - ], - "valType": "flaglist" - }, - "role": "object", - "shadow": { - "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", - "dflt": "none", - "editType": "style", - "valType": "string" - }, - "size": { - "editType": "style", - "min": 1, - "valType": "number" - }, - "style": { - "description": "Sets whether a font should be styled with a normal or italic face from its family.", - "dflt": "normal", - "editType": "style", - "valType": "enumerated", - "values": [ - "normal", - "italic" - ] - }, - "textcase": { - "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", - "dflt": "normal", - "editType": "style", - "valType": "enumerated", - "values": [ - "normal", - "word caps", - "upper", - "lower" - ] - }, - "variant": { - "description": "Sets the variant of the font.", - "dflt": "normal", - "editType": "style", - "valType": "enumerated", - "values": [ - "normal", - "small-caps", - "all-small-caps", - "all-petite-caps", - "petite-caps", - "unicase" - ] - }, - "weight": { - "description": "Sets the weight (or boldness) of the font.", - "dflt": "normal", - "editType": "style", - "extras": [ - "normal", - "bold" - ], - "max": 1000, - "min": 1, - "valType": "integer" - } - }, - "role": "object", - "text": { - "description": "Sets the title of the legend group.", - "dflt": "", - "editType": "style", - "valType": "string" - } - }, - "legendrank": { - "description": "Sets the legend rank for this trace. Items and groups with smaller ranks are presented on top/left side while with *reversed* `legend.traceorder` they are on bottom/right side. The default legendrank is 1000, so that you can use ranks less than 1000 to place certain items before all unranked items, and ranks greater than 1000 to go after all unranked items. When having unranked or equal rank items shapes would be displayed after traces i.e. according to their order in data and layout.", - "dflt": 1000, - "editType": "style", - "valType": "number" - }, - "legendwidth": { - "description": "Sets the width (in px or fraction) of the legend for this trace.", - "editType": "style", - "min": 0, - "valType": "number" - }, - "line": { - "autocolorscale": { - "description": "Determines whether the colorscale is a default palette (`autocolorscale: true`) or the palette determined by `line.colorscale`. Has an effect only if in `line.color` is set to a numerical array. In case `colorscale` is unspecified or `autocolorscale` is true, the default palette will be chosen according to whether numbers in the `color` array are all positive, all negative or mixed.", - "dflt": false, - "editType": "calc", - "impliedEdits": {}, - "valType": "boolean" - }, - "cauto": { - "description": "Determines whether or not the color domain is computed with respect to the input data (here in `line.color`) or the bounds set in `line.cmin` and `line.cmax` Has an effect only if in `line.color` is set to a numerical array. Defaults to `false` when `line.cmin` and `line.cmax` are set by the user.", - "dflt": true, - "editType": "calc", - "impliedEdits": {}, - "valType": "boolean" - }, - "cmax": { - "description": "Sets the upper bound of the color domain. Has an effect only if in `line.color` is set to a numerical array. Value should have the same units as in `line.color` and if set, `line.cmin` must be set as well.", - "dflt": null, - "editType": "calc", - "impliedEdits": { - "cauto": false - }, - "valType": "number" - }, - "cmid": { - "description": "Sets the mid-point of the color domain by scaling `line.cmin` and/or `line.cmax` to be equidistant to this point. Has an effect only if in `line.color` is set to a numerical array. Value should have the same units as in `line.color`. Has no effect when `line.cauto` is `false`.", - "dflt": null, - "editType": "calc", - "impliedEdits": {}, - "valType": "number" - }, - "cmin": { - "description": "Sets the lower bound of the color domain. Has an effect only if in `line.color` is set to a numerical array. Value should have the same units as in `line.color` and if set, `line.cmax` must be set as well.", - "dflt": null, - "editType": "calc", - "impliedEdits": { - "cauto": false - }, - "valType": "number" - }, - "color": { - "arrayOk": true, - "description": "Sets the line color. It accepts either a specific color or an array of numbers that are mapped to the colorscale relative to the max and min values of the array or relative to `line.cmin` and `line.cmax` if set.", - "editType": "calc", - "valType": "color" - }, - "coloraxis": { - "description": "Sets a reference to a shared color axis. References to these shared color axes are *coloraxis*, *coloraxis2*, *coloraxis3*, etc. Settings for these shared color axes are set in the layout, under `layout.coloraxis`, `layout.coloraxis2`, etc. Note that multiple color scales can be linked to the same color axis.", - "dflt": null, - "editType": "calc", - "regex": "/^coloraxis([2-9]|[1-9][0-9]+)?$/", - "valType": "subplotid" - }, - "colorbar": { - "bgcolor": { - "description": "Sets the color of padded area.", - "dflt": "rgba(0,0,0,0)", - "editType": "colorbars", - "valType": "color" - }, - "bordercolor": { - "description": "Sets the axis line color.", - "dflt": "#444", - "editType": "colorbars", - "valType": "color" - }, - "borderwidth": { - "description": "Sets the width (in px) or the border enclosing this color bar.", - "dflt": 0, - "editType": "colorbars", - "min": 0, - "valType": "number" - }, - "dtick": { - "description": "Sets the step in-between ticks on this axis. Use with `tick0`. Must be a positive number, or special strings available to *log* and *date* axes. If the axis `type` is *log*, then ticks are set every 10^(n*dtick) where n is the tick number. For example, to set a tick mark at 1, 10, 100, 1000, ... set dtick to 1. To set tick marks at 1, 100, 10000, ... set dtick to 2. To set tick marks at 1, 5, 25, 125, 625, 3125, ... set dtick to log_10(5), or 0.69897000433. *log* has several special values; *L*, where `f` is a positive number, gives ticks linearly spaced in value (but not position). For example `tick0` = 0.1, `dtick` = *L0.5* will put ticks at 0.1, 0.6, 1.1, 1.6 etc. To show powers of 10 plus small digits between, use *D1* (all digits) or *D2* (only 2 and 5). `tick0` is ignored for *D1* and *D2*. If the axis `type` is *date*, then you must convert the time to milliseconds. For example, to set the interval between ticks to one day, set `dtick` to 86400000.0. *date* also has special values *M* gives ticks spaced by a number of months. `n` must be a positive integer. To set ticks on the 15th of every third month, set `tick0` to *2000-01-15* and `dtick` to *M3*. To set ticks every 4 years, set `dtick` to *M48*", - "editType": "colorbars", - "impliedEdits": { - "tickmode": "linear" - }, - "valType": "any" - }, - "editType": "colorbars", - "exponentformat": { - "description": "Determines a formatting rule for the tick exponents. For example, consider the number 1,000,000,000. If *none*, it appears as 1,000,000,000. If *e*, 1e+9. If *E*, 1E+9. If *power*, 1x10^9 (with 9 in a super script). If *SI*, 1G. If *B*, 1B. *SI* uses prefixes from \"femto\" f (10^-15) to \"tera\" T (10^12). *SI extended* covers instead the full SI range from \"quecto\" q (10^-30) to \"quetta\" Q (10^30). If *SI* or *SI extended* is used and the exponent is beyond the above ranges, the formatting rule will automatically be switched to the power notation.", - "dflt": "B", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "none", - "e", - "E", - "power", - "SI", - "B", - "SI extended" - ] - }, - "labelalias": { - "description": "Replacement text for specific tick or hover labels. For example using {US: 'USA', CA: 'Canada'} changes US to USA and CA to Canada. The labels we would have shown must match the keys exactly, after adding any tickprefix or ticksuffix. For negative numbers the minus sign symbol used (U+2212) is wider than the regular ascii dash. That means you need to use −1 instead of -1. labelalias can be used with any axis type, and both keys (if needed) and values (if desired) can include html-like tags or MathJax.", - "dflt": false, - "editType": "colorbars", - "valType": "any" - }, - "len": { - "description": "Sets the length of the color bar This measure excludes the padding of both ends. That is, the color bar length is this length minus the padding on both ends.", - "dflt": 1, - "editType": "colorbars", - "min": 0, - "valType": "number" - }, - "lenmode": { - "description": "Determines whether this color bar's length (i.e. the measure in the color variation direction) is set in units of plot *fraction* or in *pixels. Use `len` to set the value.", - "dflt": "fraction", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "fraction", - "pixels" - ] - }, - "minexponent": { - "description": "Hide SI prefix for 10^n if |n| is below this number. This only has an effect when `tickformat` is *SI* or *B*.", - "dflt": 3, - "editType": "colorbars", - "min": 0, - "valType": "number" - }, - "nticks": { - "description": "Specifies the maximum number of ticks for the particular axis. The actual number of ticks will be chosen automatically to be less than or equal to `nticks`. Has an effect only if `tickmode` is set to *auto*.", - "dflt": 0, - "editType": "colorbars", - "min": 0, - "valType": "integer" - }, - "orientation": { - "description": "Sets the orientation of the colorbar.", - "dflt": "v", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "h", - "v" - ] - }, - "outlinecolor": { - "description": "Sets the axis line color.", - "dflt": "#444", - "editType": "colorbars", - "valType": "color" - }, - "outlinewidth": { - "description": "Sets the width (in px) of the axis line.", - "dflt": 1, - "editType": "colorbars", - "min": 0, - "valType": "number" - }, - "role": "object", - "separatethousands": { - "description": "If \"true\", even 4-digit integers are separated", - "dflt": false, - "editType": "colorbars", - "valType": "boolean" - }, - "showexponent": { - "description": "If *all*, all exponents are shown besides their significands. If *first*, only the exponent of the first tick is shown. If *last*, only the exponent of the last tick is shown. If *none*, no exponents appear.", - "dflt": "all", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "all", - "first", - "last", - "none" - ] - }, - "showticklabels": { - "description": "Determines whether or not the tick labels are drawn.", - "dflt": true, - "editType": "colorbars", - "valType": "boolean" - }, - "showtickprefix": { - "description": "If *all*, all tick labels are displayed with a prefix. If *first*, only the first tick is displayed with a prefix. If *last*, only the last tick is displayed with a suffix. If *none*, tick prefixes are hidden.", - "dflt": "all", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "all", - "first", - "last", - "none" - ] - }, - "showticksuffix": { - "description": "Same as `showtickprefix` but for tick suffixes.", - "dflt": "all", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "all", - "first", - "last", - "none" - ] - }, - "thickness": { - "description": "Sets the thickness of the color bar This measure excludes the size of the padding, ticks and labels.", - "dflt": 30, - "editType": "colorbars", - "min": 0, - "valType": "number" - }, - "thicknessmode": { - "description": "Determines whether this color bar's thickness (i.e. the measure in the constant color direction) is set in units of plot *fraction* or in *pixels*. Use `thickness` to set the value.", - "dflt": "pixels", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "fraction", - "pixels" - ] - }, - "tick0": { - "description": "Sets the placement of the first tick on this axis. Use with `dtick`. If the axis `type` is *log*, then you must take the log of your starting tick (e.g. to set the starting tick to 100, set the `tick0` to 2) except when `dtick`=*L* (see `dtick` for more info). If the axis `type` is *date*, it should be a date string, like date data. If the axis `type` is *category*, it should be a number, using the scale where each category is assigned a serial number from zero in the order it appears.", - "editType": "colorbars", - "impliedEdits": { - "tickmode": "linear" - }, - "valType": "any" - }, - "tickangle": { - "description": "Sets the angle of the tick labels with respect to the horizontal. For example, a `tickangle` of -90 draws the tick labels vertically.", - "dflt": "auto", - "editType": "colorbars", - "valType": "angle" - }, - "tickcolor": { - "description": "Sets the tick color.", - "dflt": "#444", - "editType": "colorbars", - "valType": "color" - }, - "tickfont": { - "color": { - "editType": "colorbars", - "valType": "color" - }, - "description": "Sets the color bar's tick label font", - "editType": "colorbars", - "family": { - "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", - "editType": "colorbars", - "noBlank": true, - "strict": true, - "valType": "string" - }, - "lineposition": { - "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", - "dflt": "none", - "editType": "colorbars", - "extras": [ - "none" - ], - "flags": [ - "under", - "over", - "through" - ], - "valType": "flaglist" - }, - "role": "object", - "shadow": { - "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", - "dflt": "none", - "editType": "colorbars", - "valType": "string" - }, - "size": { - "editType": "colorbars", - "min": 1, - "valType": "number" - }, - "style": { - "description": "Sets whether a font should be styled with a normal or italic face from its family.", - "dflt": "normal", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "normal", - "italic" - ] - }, - "textcase": { - "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", - "dflt": "normal", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "normal", - "word caps", - "upper", - "lower" - ] - }, - "variant": { - "description": "Sets the variant of the font.", - "dflt": "normal", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "normal", - "small-caps", - "all-small-caps", - "all-petite-caps", - "petite-caps", - "unicase" - ] - }, - "weight": { - "description": "Sets the weight (or boldness) of the font.", - "dflt": "normal", - "editType": "colorbars", - "extras": [ - "normal", - "bold" - ], - "max": 1000, - "min": 1, - "valType": "integer" - } - }, - "tickformat": { - "description": "Sets the tick label formatting rule using d3 formatting mini-languages which are very similar to those in Python. For numbers, see: https://github.com/d3/d3-format/tree/v1.4.5#d3-format. And for dates see: https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format. We add two items to d3's date formatter: *%h* for half of the year as a decimal number as well as *%{n}f* for fractional seconds with n digits. For example, *2016-10-13 09:15:23.456* with tickformat *%H~%M~%S.%2f* would display *09~15~23.46*", - "dflt": "", - "editType": "colorbars", - "valType": "string" - }, - "tickformatstops": { - "items": { - "tickformatstop": { - "dtickrange": { - "description": "range [*min*, *max*], where *min*, *max* - dtick values which describe some zoom level, it is possible to omit *min* or *max* value by passing *null*", - "editType": "colorbars", - "items": [ - { - "editType": "colorbars", - "valType": "any" - }, - { - "editType": "colorbars", - "valType": "any" - } - ], - "valType": "info_array" - }, - "editType": "colorbars", - "enabled": { - "description": "Determines whether or not this stop is used. If `false`, this stop is ignored even within its `dtickrange`.", - "dflt": true, - "editType": "colorbars", - "valType": "boolean" - }, - "name": { - "description": "When used in a template, named items are created in the output figure in addition to any items the figure already has in this array. You can modify these items in the output figure by making your own item with `templateitemname` matching this `name` alongside your modifications (including `visible: false` or `enabled: false` to hide it). Has no effect outside of a template.", - "editType": "colorbars", - "valType": "string" - }, - "role": "object", - "templateitemname": { - "description": "Used to refer to a named item in this array in the template. Named items from the template will be created even without a matching item in the input figure, but you can modify one by making an item with `templateitemname` matching its `name`, alongside your modifications (including `visible: false` or `enabled: false` to hide it). If there is no template or no matching item, this item will be hidden unless you explicitly show it with `visible: true`.", - "editType": "colorbars", - "valType": "string" - }, - "value": { - "description": "string - dtickformat for described zoom level, the same as *tickformat*", - "dflt": "", - "editType": "colorbars", - "valType": "string" - } - } - }, - "role": "object" - }, - "ticklabeloverflow": { - "description": "Determines how we handle tick labels that would overflow either the graph div or the domain of the axis. The default value for inside tick labels is *hide past domain*. In other cases the default is *hide past div*.", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "allow", - "hide past div", - "hide past domain" - ] - }, - "ticklabelposition": { - "description": "Determines where tick labels are drawn relative to the ticks. Left and right options are used when `orientation` is *h*, top and bottom when `orientation` is *v*.", - "dflt": "outside", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "outside", - "inside", - "outside top", - "inside top", - "outside left", - "inside left", - "outside right", - "inside right", - "outside bottom", - "inside bottom" - ] - }, - "ticklabelstep": { - "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", - "dflt": 1, - "editType": "colorbars", - "min": 1, - "valType": "integer" - }, - "ticklen": { - "description": "Sets the tick length (in px).", - "dflt": 5, - "editType": "colorbars", - "min": 0, - "valType": "number" - }, - "tickmode": { - "description": "Sets the tick mode for this axis. If *auto*, the number of ticks is set via `nticks`. If *linear*, the placement of the ticks is determined by a starting position `tick0` and a tick step `dtick` (*linear* is the default value if `tick0` and `dtick` are provided). If *array*, the placement of the ticks is set via `tickvals` and the tick text is `ticktext`. (*array* is the default value if `tickvals` is provided).", - "editType": "colorbars", - "impliedEdits": {}, - "valType": "enumerated", - "values": [ - "auto", - "linear", - "array" - ] - }, - "tickprefix": { - "description": "Sets a tick label prefix.", - "dflt": "", - "editType": "colorbars", - "valType": "string" - }, - "ticks": { - "description": "Determines whether ticks are drawn or not. If **, this axis' ticks are not drawn. If *outside* (*inside*), this axis' are drawn outside (inside) the axis lines.", - "dflt": "", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "outside", - "inside", - "" - ] - }, - "ticksuffix": { - "description": "Sets a tick label suffix.", - "dflt": "", - "editType": "colorbars", - "valType": "string" - }, - "ticktext": { - "description": "Sets the text displayed at the ticks position via `tickvals`. Only has an effect if `tickmode` is set to *array*. Used with `tickvals`.", - "editType": "colorbars", - "valType": "data_array" - }, - "ticktextsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `ticktext`.", - "editType": "none", - "valType": "string" - }, - "tickvals": { - "description": "Sets the values at which ticks on this axis appear. Only has an effect if `tickmode` is set to *array*. Used with `ticktext`.", - "editType": "colorbars", - "valType": "data_array" - }, - "tickvalssrc": { - "description": "Sets the source reference on Chart Studio Cloud for `tickvals`.", - "editType": "none", - "valType": "string" - }, - "tickwidth": { - "description": "Sets the tick width (in px).", - "dflt": 1, - "editType": "colorbars", - "min": 0, - "valType": "number" - }, - "title": { - "editType": "colorbars", - "font": { - "color": { - "editType": "colorbars", - "valType": "color" - }, - "description": "Sets this color bar's title font.", - "editType": "colorbars", - "family": { - "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", - "editType": "colorbars", - "noBlank": true, - "strict": true, - "valType": "string" - }, - "lineposition": { - "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", - "dflt": "none", - "editType": "colorbars", - "extras": [ - "none" - ], - "flags": [ - "under", - "over", - "through" - ], - "valType": "flaglist" - }, - "role": "object", - "shadow": { - "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", - "dflt": "none", - "editType": "colorbars", - "valType": "string" - }, - "size": { - "editType": "colorbars", - "min": 1, - "valType": "number" - }, - "style": { - "description": "Sets whether a font should be styled with a normal or italic face from its family.", - "dflt": "normal", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "normal", - "italic" - ] - }, - "textcase": { - "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", - "dflt": "normal", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "normal", - "word caps", - "upper", - "lower" - ] - }, - "variant": { - "description": "Sets the variant of the font.", - "dflt": "normal", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "normal", - "small-caps", - "all-small-caps", - "all-petite-caps", - "petite-caps", - "unicase" - ] + ] }, - "weight": { - "description": "Sets the weight (or boldness) of the font.", - "dflt": "normal", - "editType": "colorbars", - "extras": [ - "normal", - "bold" - ], - "max": 1000, - "min": 1, - "valType": "integer" - } - }, - "role": "object", - "side": { - "description": "Determines the location of color bar's title with respect to the color bar. Defaults to *top* when `orientation` if *v* and defaults to *right* when `orientation` if *h*.", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "right", - "top", - "bottom" - ] - }, - "text": { - "description": "Sets the title of the color bar.", - "editType": "colorbars", - "valType": "string" - } - }, - "x": { - "description": "Sets the x position with respect to `xref` of the color bar (in plot fraction). When `xref` is *paper*, defaults to 1.02 when `orientation` is *v* and 0.5 when `orientation` is *h*. When `xref` is *container*, defaults to *1* when `orientation` is *v* and 0.5 when `orientation` is *h*. Must be between *0* and *1* if `xref` is *container* and between *-2* and *3* if `xref` is *paper*.", - "editType": "colorbars", - "valType": "number" - }, - "xanchor": { - "description": "Sets this color bar's horizontal position anchor. This anchor binds the `x` position to the *left*, *center* or *right* of the color bar. Defaults to *left* when `orientation` is *v* and *center* when `orientation` is *h*.", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "left", - "center", - "right" - ] - }, - "xpad": { - "description": "Sets the amount of padding (in px) along the x direction.", - "dflt": 10, - "editType": "colorbars", - "min": 0, - "valType": "number" - }, - "xref": { - "description": "Sets the container `x` refers to. *container* spans the entire `width` of the plot. *paper* refers to the width of the plotting area only.", - "dflt": "paper", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "container", - "paper" - ] - }, - "y": { - "description": "Sets the y position with respect to `yref` of the color bar (in plot fraction). When `yref` is *paper*, defaults to 0.5 when `orientation` is *v* and 1.02 when `orientation` is *h*. When `yref` is *container*, defaults to 0.5 when `orientation` is *v* and 1 when `orientation` is *h*. Must be between *0* and *1* if `yref` is *container* and between *-2* and *3* if `yref` is *paper*.", - "editType": "colorbars", - "valType": "number" - }, - "yanchor": { - "description": "Sets this color bar's vertical position anchor This anchor binds the `y` position to the *top*, *middle* or *bottom* of the color bar. Defaults to *middle* when `orientation` is *v* and *bottom* when `orientation` is *h*.", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "top", - "middle", - "bottom" - ] - }, - "ypad": { - "description": "Sets the amount of padding (in px) along the y direction.", - "dflt": 10, - "editType": "colorbars", - "min": 0, - "valType": "number" - }, - "yref": { - "description": "Sets the container `y` refers to. *container* spans the entire `height` of the plot. *paper* refers to the height of the plotting area only.", - "dflt": "paper", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "container", - "paper" - ] - } - }, - "colorscale": { - "description": "Sets the colorscale. Has an effect only if in `line.color` is set to a numerical array. The colorscale must be an array containing arrays mapping a normalized value to an rgb, rgba, hex, hsl, hsv, or named color string. At minimum, a mapping for the lowest (0) and highest (1) values are required. For example, `[[0, 'rgb(0,0,255)'], [1, 'rgb(255,0,0)']]`. To control the bounds of the colorscale in color space, use `line.cmin` and `line.cmax`. Alternatively, `colorscale` may be a palette name string of the following list: Blackbody,Bluered,Blues,Cividis,Earth,Electric,Greens,Greys,Hot,Jet,Picnic,Portland,Rainbow,RdBu,Reds,Viridis,YlGnBu,YlOrRd.", - "dflt": [ - [ - 0, - "#440154" - ], - [ - 0.06274509803921569, - "#48186a" - ], - [ - 0.12549019607843137, - "#472d7b" - ], - [ - 0.18823529411764706, - "#424086" - ], - [ - 0.25098039215686274, - "#3b528b" - ], - [ - 0.3137254901960784, - "#33638d" - ], - [ - 0.3764705882352941, - "#2c728e" - ], - [ - 0.4392156862745098, - "#26828e" - ], - [ - 0.5019607843137255, - "#21918c" - ], - [ - 0.5647058823529412, - "#1fa088" - ], - [ - 0.6274509803921569, - "#28ae80" - ], - [ - 0.6901960784313725, - "#3fbc73" - ], - [ - 0.7529411764705882, - "#5ec962" - ], - [ - 0.8156862745098039, - "#84d44b" - ], - [ - 0.8784313725490196, - "#addc30" - ], - [ - 0.9411764705882353, - "#d8e219" - ], - [ - 1, - "#fde725" - ] - ], - "editType": "calc", - "impliedEdits": { - "autocolorscale": false - }, - "valType": "colorscale" - }, - "colorsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `color`.", - "editType": "none", - "valType": "string" - }, - "editType": "calc", - "reversescale": { - "description": "Reverses the color mapping if true. Has an effect only if in `line.color` is set to a numerical array. If true, `line.cmin` will correspond to the last color in the array and `line.cmax` will correspond to the first color.", - "dflt": false, - "editType": "plot", - "valType": "boolean" - }, - "role": "object", - "showscale": { - "description": "Determines whether or not a colorbar is displayed for this trace. Has an effect only if in `line.color` is set to a numerical array.", - "dflt": false, - "editType": "calc", - "valType": "boolean" - } - }, - "meta": { - "arrayOk": true, - "description": "Assigns extra meta information associated with this trace that can be used in various text attributes. Attributes such as trace `name`, graph, axis and colorbar `title.text`, annotation `text` `rangeselector`, `updatemenues` and `sliders` `label` text all support `meta`. To access the trace `meta` values in an attribute in the same trace, simply use `%{meta[i]}` where `i` is the index or key of the `meta` item in question. To access trace `meta` in layout attributes, use `%{data[n[.meta[i]}` where `i` is the index or key of the `meta` and `n` is the trace index.", - "editType": "plot", - "valType": "any" - }, - "metasrc": { - "description": "Sets the source reference on Chart Studio Cloud for `meta`.", - "editType": "none", - "valType": "string" - }, - "name": { - "description": "Sets the trace name. The trace name appears as the legend item and on hover.", - "editType": "style", - "valType": "string" - }, - "rangefont": { - "color": { - "editType": "plot", - "valType": "color" - }, - "description": "Sets the font for the `dimension` range values.", - "editType": "plot", - "family": { - "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", - "editType": "plot", - "noBlank": true, - "strict": true, - "valType": "string" - }, - "lineposition": { - "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", - "dflt": "none", - "editType": "plot", - "extras": [ - "none" - ], - "flags": [ - "under", - "over", - "through" - ], - "valType": "flaglist" - }, - "role": "object", - "shadow": { - "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", - "dflt": "none", - "editType": "plot", - "valType": "string" - }, - "size": { - "editType": "plot", - "min": 1, - "valType": "number" - }, - "style": { - "description": "Sets whether a font should be styled with a normal or italic face from its family.", - "dflt": "normal", - "editType": "plot", - "valType": "enumerated", - "values": [ - "normal", - "italic" - ] - }, - "textcase": { - "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", - "dflt": "normal", - "editType": "plot", - "valType": "enumerated", - "values": [ - "normal", - "word caps", - "upper", - "lower" - ] - }, - "variant": { - "description": "Sets the variant of the font.", - "dflt": "normal", - "editType": "plot", - "valType": "enumerated", - "values": [ - "normal", - "small-caps", - "all-small-caps", - "all-petite-caps", - "petite-caps", - "unicase" - ] - }, - "weight": { - "description": "Sets the weight (or boldness) of the font.", - "dflt": "normal", - "editType": "plot", - "extras": [ - "normal", - "bold" - ], - "max": 1000, - "min": 1, - "valType": "integer" - } - }, - "stream": { - "editType": "calc", - "maxpoints": { - "description": "Sets the maximum number of points to keep on the plots from an incoming stream. If `maxpoints` is set to *50*, only the newest 50 points will be displayed on the plot.", - "dflt": 500, - "editType": "calc", - "max": 10000, - "min": 0, - "valType": "number" - }, - "role": "object", - "token": { - "description": "The stream id number links a data trace on a plot with a stream. See https://chart-studio.plotly.com/settings for more details.", - "editType": "calc", - "noBlank": true, - "strict": true, - "valType": "string" - } - }, - "tickfont": { - "color": { - "editType": "plot", - "valType": "color" - }, - "description": "Sets the font for the `dimension` tick values.", - "editType": "plot", - "family": { - "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", - "editType": "plot", - "noBlank": true, - "strict": true, - "valType": "string" - }, - "lineposition": { - "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", - "dflt": "none", - "editType": "plot", - "extras": [ - "none" - ], - "flags": [ - "under", - "over", - "through" - ], - "valType": "flaglist" - }, - "role": "object", - "shadow": { - "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", - "dflt": "auto", - "editType": "plot", - "valType": "string" - }, - "size": { - "editType": "plot", - "min": 1, - "valType": "number" - }, - "style": { - "description": "Sets whether a font should be styled with a normal or italic face from its family.", - "dflt": "normal", - "editType": "plot", - "valType": "enumerated", - "values": [ - "normal", - "italic" - ] - }, - "textcase": { - "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", - "dflt": "normal", - "editType": "plot", - "valType": "enumerated", - "values": [ - "normal", - "word caps", - "upper", - "lower" - ] - }, - "variant": { - "description": "Sets the variant of the font.", - "dflt": "normal", - "editType": "plot", - "valType": "enumerated", - "values": [ - "normal", - "small-caps", - "all-small-caps", - "all-petite-caps", - "petite-caps", - "unicase" - ] - }, - "weight": { - "description": "Sets the weight (or boldness) of the font.", - "dflt": "normal", - "editType": "plot", - "extras": [ - "normal", - "bold" - ], - "max": 1000, - "min": 1, - "valType": "integer" - } - }, - "type": "parcoords", - "uid": { - "description": "Assign an id to this trace, Use this to provide object constancy between traces during animations and transitions.", - "editType": "plot", - "valType": "string" - }, - "uirevision": { - "description": "Controls persistence of some user-driven changes to the trace: `constraintrange` in `parcoords` traces, as well as some `editable: true` modifications such as `name` and `colorbar.title`. Defaults to `layout.uirevision`. Note that other user-driven trace attribute changes are controlled by `layout` attributes: `trace.visible` is controlled by `layout.legend.uirevision`, `selectedpoints` is controlled by `layout.selectionrevision`, and `colorbar.(x|y)` (accessible with `config: {editable: true}`) is controlled by `layout.editrevision`. Trace changes are tracked by `uid`, which only falls back on trace index if no `uid` is provided. So if your app can add/remove traces before the end of the `data` array, such that the same trace has a different index, you can still preserve user-driven changes if you give each trace a `uid` that stays with it as it moves.", - "editType": "none", - "valType": "any" - }, - "unselected": { - "editType": "plot", - "line": { - "color": { - "description": "Sets the base color of unselected lines. in connection with `unselected.line.opacity`.", - "dflt": "#7f7f7f", - "editType": "plot", - "valType": "color" - }, - "editType": "plot", - "opacity": { - "description": "Sets the opacity of unselected lines. The default *auto* decreases the opacity smoothly as the number of lines increases. Use *1* to achieve exact `unselected.line.color`.", - "dflt": "auto", - "editType": "plot", - "max": 1, - "min": 0, - "valType": "number" - }, - "role": "object" - }, - "role": "object" - }, - "visible": { - "description": "Determines whether or not this trace is visible. If *legendonly*, the trace is not drawn, but can appear as a legend item (provided that the legend itself is visible).", - "dflt": true, - "editType": "calc", - "valType": "enumerated", - "values": [ - true, - false, - "legendonly" - ] - } - }, - "categories": [ - "gl", - "regl", - "noOpacity", - "noHover" - ], - "meta": { - "description": "Parallel coordinates for multidimensional exploratory data analysis. The samples are specified in `dimensions`. The colors are set in `line.color`." - }, - "type": "parcoords" - }, - "pie": { - "animatable": false, - "attributes": { - "automargin": { - "description": "Determines whether outside text labels can push the margins.", - "dflt": false, - "editType": "plot", - "valType": "boolean" - }, - "customdata": { - "description": "Assigns extra data each datum. This may be useful when listening to hover, click and selection events. Note that, *scatter* traces also appends customdata items in the markers DOM elements", - "editType": "calc", - "valType": "data_array" - }, - "customdatasrc": { - "description": "Sets the source reference on Chart Studio Cloud for `customdata`.", - "editType": "none", - "valType": "string" - }, - "direction": { - "description": "Specifies the direction at which succeeding sectors follow one another.", - "dflt": "counterclockwise", - "editType": "calc", - "valType": "enumerated", - "values": [ - "clockwise", - "counterclockwise" - ] - }, - "dlabel": { - "description": "Sets the label step. See `label0` for more info.", - "dflt": 1, - "editType": "calc", - "valType": "number" - }, - "domain": { - "column": { - "description": "If there is a layout grid, use the domain for this column in the grid for this pie trace .", - "dflt": 0, - "editType": "calc", - "min": 0, - "valType": "integer" - }, - "editType": "calc", - "role": "object", - "row": { - "description": "If there is a layout grid, use the domain for this row in the grid for this pie trace .", - "dflt": 0, - "editType": "calc", - "min": 0, - "valType": "integer" - }, - "x": { - "description": "Sets the horizontal domain of this pie trace (in plot fraction).", - "dflt": [ - 0, - 1 - ], - "editType": "calc", - "items": [ - { - "editType": "calc", - "max": 1, - "min": 0, - "valType": "number" - }, - { - "editType": "calc", - "max": 1, - "min": 0, - "valType": "number" - } - ], - "valType": "info_array" - }, - "y": { - "description": "Sets the vertical domain of this pie trace (in plot fraction).", - "dflt": [ - 0, - 1 - ], - "editType": "calc", - "items": [ - { - "editType": "calc", - "max": 1, - "min": 0, - "valType": "number" - }, - { - "editType": "calc", - "max": 1, - "min": 0, - "valType": "number" - } - ], - "valType": "info_array" - } - }, - "hole": { - "description": "Sets the fraction of the radius to cut out of the pie. Use this to make a donut chart.", - "dflt": 0, - "editType": "calc", - "max": 1, - "min": 0, - "valType": "number" - }, - "hoverinfo": { - "arrayOk": true, - "description": "Determines which trace information appear on hover. If `none` or `skip` are set, no information is displayed upon hovering. But, if `none` is set, click and hover events are still fired.", - "dflt": "all", - "editType": "none", - "extras": [ - "all", - "none", - "skip" - ], - "flags": [ - "label", - "text", - "value", - "percent", - "name" - ], - "valType": "flaglist" - }, - "hoverinfosrc": { - "description": "Sets the source reference on Chart Studio Cloud for `hoverinfo`.", - "editType": "none", - "valType": "string" - }, - "hoverlabel": { - "align": { - "arrayOk": true, - "description": "Sets the horizontal alignment of the text content within hover label box. Has an effect only if the hover label text spans more two or more lines", - "dflt": "auto", - "editType": "none", - "valType": "enumerated", - "values": [ - "left", - "right", - "auto" - ] - }, - "alignsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `align`.", - "editType": "none", - "valType": "string" - }, - "bgcolor": { - "arrayOk": true, - "description": "Sets the background color of the hover labels for this trace", - "editType": "none", - "valType": "color" - }, - "bgcolorsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `bgcolor`.", - "editType": "none", - "valType": "string" - }, - "bordercolor": { - "arrayOk": true, - "description": "Sets the border color of the hover labels for this trace.", - "editType": "none", - "valType": "color" - }, - "bordercolorsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `bordercolor`.", - "editType": "none", - "valType": "string" - }, - "editType": "none", - "font": { - "color": { - "arrayOk": true, - "editType": "none", - "valType": "color" - }, - "colorsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `color`.", - "editType": "none", - "valType": "string" - }, - "description": "Sets the font used in hover labels.", - "editType": "none", - "family": { - "arrayOk": true, - "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", - "editType": "none", - "noBlank": true, - "strict": true, - "valType": "string" - }, - "familysrc": { - "description": "Sets the source reference on Chart Studio Cloud for `family`.", - "editType": "none", - "valType": "string" - }, - "lineposition": { - "arrayOk": true, - "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", - "dflt": "none", - "editType": "none", - "extras": [ - "none" - ], - "flags": [ - "under", - "over", - "through" - ], - "valType": "flaglist" - }, - "linepositionsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `lineposition`.", - "editType": "none", - "valType": "string" - }, - "role": "object", - "shadow": { - "arrayOk": true, - "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", - "dflt": "none", - "editType": "none", - "valType": "string" - }, - "shadowsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `shadow`.", - "editType": "none", - "valType": "string" - }, - "size": { - "arrayOk": true, - "editType": "none", - "min": 1, - "valType": "number" - }, - "sizesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `size`.", - "editType": "none", - "valType": "string" - }, - "style": { - "arrayOk": true, - "description": "Sets whether a font should be styled with a normal or italic face from its family.", - "dflt": "normal", - "editType": "none", - "valType": "enumerated", - "values": [ - "normal", - "italic" - ] - }, - "stylesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `style`.", - "editType": "none", - "valType": "string" - }, - "textcase": { - "arrayOk": true, - "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", - "dflt": "normal", - "editType": "none", - "valType": "enumerated", - "values": [ - "normal", - "word caps", - "upper", - "lower" - ] - }, - "textcasesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `textcase`.", - "editType": "none", - "valType": "string" - }, - "variant": { - "arrayOk": true, - "description": "Sets the variant of the font.", - "dflt": "normal", - "editType": "none", - "valType": "enumerated", - "values": [ - "normal", - "small-caps", - "all-small-caps", - "all-petite-caps", - "petite-caps", - "unicase" - ] - }, - "variantsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `variant`.", - "editType": "none", - "valType": "string" - }, - "weight": { - "arrayOk": true, - "description": "Sets the weight (or boldness) of the font.", - "dflt": "normal", - "editType": "none", - "extras": [ - "normal", - "bold" - ], - "max": 1000, - "min": 1, - "valType": "integer" - }, - "weightsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `weight`.", - "editType": "none", - "valType": "string" - } - }, - "namelength": { - "arrayOk": true, - "description": "Sets the default length (in number of characters) of the trace name in the hover labels for all traces. -1 shows the whole name regardless of length. 0-3 shows the first 0-3 characters, and an integer >3 will show the whole name if it is less than that many characters, but if it is longer, will truncate to `namelength - 3` characters and add an ellipsis.", - "dflt": 15, - "editType": "none", - "min": -1, - "valType": "integer" - }, - "namelengthsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `namelength`.", - "editType": "none", - "valType": "string" - }, - "role": "object", - "showarrow": { - "description": "Sets whether or not to show the hover label arrow/triangle pointing to the data point.", - "dflt": true, - "editType": "none", - "valType": "boolean" - } - }, - "hovertemplate": { - "arrayOk": true, - "description": "Template string used for rendering the information that appear on hover box. Note that this will override `hoverinfo`. Variables are inserted using %{variable}, for example \"y: %{y}\" as well as %{xother}, {%_xother}, {%_xother_}, {%xother_}. When showing info for several points, *xother* will be added to those with different x positions from the first point. An underscore before or after *(x|y)other* will add a space on that side, only when this field is shown. Numbers are formatted using d3-format's syntax %{variable:d3-format}, for example \"Price: %{y:$.2f}\". https://github.com/d3/d3-format/tree/v1.4.5#d3-format for details on the formatting syntax. Dates are formatted using d3-time-format's syntax %{variable|d3-time-format}, for example \"Day: %{2019-01-01|%A}\". https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format for details on the date formatting syntax. Variables that can't be found will be replaced with the specifier. For example, a template of \"data: %{x}, %{y}\" will result in a value of \"data: 1, %{y}\" if x is 1 and y is missing. Variables with an undefined value will be replaced with the fallback value. The variables available in `hovertemplate` are the ones emitted as event data described at this link https://plotly.com/javascript/plotlyjs-events/#event-data. Additionally, all attributes that can be specified per-point (the ones that are `arrayOk: true`) are available. Finally, the template string has access to variables `label`, `color`, `value`, `percent` and `text`. Anything contained in tag `` is displayed in the secondary box, for example `%{fullData.name}`. To hide the secondary box completely, use an empty tag ``.", - "dflt": "", - "editType": "none", - "valType": "string" - }, - "hovertemplatefallback": { - "description": "Fallback string that's displayed when a variable referenced in a template is missing. If the boolean value 'false' is passed in, the specifier with the missing variable will be displayed.", - "dflt": "-", - "editType": "none", - "valType": "any" - }, - "hovertemplatesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `hovertemplate`.", - "editType": "none", - "valType": "string" - }, - "hovertext": { - "arrayOk": true, - "description": "Sets hover text elements associated with each sector. If a single string, the same string appears for all data points. If an array of string, the items are mapped in order of this trace's sectors. To be seen, trace `hoverinfo` must contain a *text* flag.", - "dflt": "", - "editType": "style", - "valType": "string" - }, - "hovertextsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `hovertext`.", - "editType": "none", - "valType": "string" - }, - "ids": { - "description": "Assigns id labels to each datum. These ids for object constancy of data points during animation. Should be an array of strings, not numbers or any other type.", - "editType": "calc", - "valType": "data_array" - }, - "idssrc": { - "description": "Sets the source reference on Chart Studio Cloud for `ids`.", - "editType": "none", - "valType": "string" - }, - "insidetextfont": { - "color": { - "arrayOk": true, - "editType": "plot", - "valType": "color" - }, - "colorsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `color`.", - "editType": "none", - "valType": "string" - }, - "description": "Sets the font used for `textinfo` lying inside the sector.", - "editType": "plot", - "family": { - "arrayOk": true, - "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", - "editType": "plot", - "noBlank": true, - "strict": true, - "valType": "string" - }, - "familysrc": { - "description": "Sets the source reference on Chart Studio Cloud for `family`.", - "editType": "none", - "valType": "string" - }, - "lineposition": { - "arrayOk": true, - "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", - "dflt": "none", - "editType": "plot", - "extras": [ - "none" - ], - "flags": [ - "under", - "over", - "through" - ], - "valType": "flaglist" - }, - "linepositionsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `lineposition`.", - "editType": "none", - "valType": "string" - }, - "role": "object", - "shadow": { - "arrayOk": true, - "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", - "dflt": "none", - "editType": "plot", - "valType": "string" - }, - "shadowsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `shadow`.", - "editType": "none", - "valType": "string" - }, - "size": { - "arrayOk": true, - "editType": "plot", - "min": 1, - "valType": "number" - }, - "sizesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `size`.", - "editType": "none", - "valType": "string" - }, - "style": { - "arrayOk": true, - "description": "Sets whether a font should be styled with a normal or italic face from its family.", - "dflt": "normal", - "editType": "plot", - "valType": "enumerated", - "values": [ - "normal", - "italic" - ] - }, - "stylesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `style`.", - "editType": "none", - "valType": "string" - }, - "textcase": { - "arrayOk": true, - "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", - "dflt": "normal", - "editType": "plot", - "valType": "enumerated", - "values": [ - "normal", - "word caps", - "upper", - "lower" - ] - }, - "textcasesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `textcase`.", - "editType": "none", - "valType": "string" - }, - "variant": { - "arrayOk": true, - "description": "Sets the variant of the font.", - "dflt": "normal", - "editType": "plot", - "valType": "enumerated", - "values": [ - "normal", - "small-caps", - "all-small-caps", - "all-petite-caps", - "petite-caps", - "unicase" - ] - }, - "variantsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `variant`.", - "editType": "none", - "valType": "string" - }, - "weight": { - "arrayOk": true, - "description": "Sets the weight (or boldness) of the font.", - "dflt": "normal", - "editType": "plot", - "extras": [ - "normal", - "bold" - ], - "max": 1000, - "min": 1, - "valType": "integer" - }, - "weightsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `weight`.", - "editType": "none", - "valType": "string" - } - }, - "insidetextorientation": { - "description": "Controls the orientation of the text inside chart sectors. When set to *auto*, text may be oriented in any direction in order to be as big as possible in the middle of a sector. The *horizontal* option orients text to be parallel with the bottom of the chart, and may make text smaller in order to achieve that goal. The *radial* option orients text along the radius of the sector. The *tangential* option orients text perpendicular to the radius of the sector.", - "dflt": "auto", - "editType": "plot", - "valType": "enumerated", - "values": [ - "horizontal", - "radial", - "tangential", - "auto" - ] - }, - "label0": { - "description": "Alternate to `labels`. Builds a numeric set of labels. Use with `dlabel` where `label0` is the starting label and `dlabel` the step.", - "dflt": 0, - "editType": "calc", - "valType": "number" - }, - "labels": { - "description": "Sets the sector labels. If `labels` entries are duplicated, we sum associated `values` or simply count occurrences if `values` is not provided. For other array attributes (including color) we use the first non-empty entry among all occurrences of the label.", - "editType": "calc", - "valType": "data_array" - }, - "labelssrc": { - "description": "Sets the source reference on Chart Studio Cloud for `labels`.", - "editType": "none", - "valType": "string" - }, - "legend": { - "description": "Sets the reference to a legend to show this trace in. References to these legends are *legend*, *legend2*, *legend3*, etc. Settings for these legends are set in the layout, under `layout.legend`, `layout.legend2`, etc.", - "dflt": "legend", - "editType": "style", - "valType": "subplotid" - }, - "legendgroup": { - "description": "Sets the legend group for this trace. Traces and shapes part of the same legend group hide/show at the same time when toggling legend items.", - "dflt": "", - "editType": "style", - "valType": "string" - }, - "legendgrouptitle": { - "editType": "style", - "font": { - "color": { - "editType": "style", - "valType": "color" - }, - "description": "Sets this legend group's title font.", - "editType": "style", - "family": { - "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", - "editType": "style", - "noBlank": true, - "strict": true, - "valType": "string" - }, - "lineposition": { - "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", - "dflt": "none", - "editType": "style", - "extras": [ - "none" - ], - "flags": [ - "under", - "over", - "through" - ], - "valType": "flaglist" - }, - "role": "object", - "shadow": { - "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", - "dflt": "none", - "editType": "style", - "valType": "string" - }, - "size": { - "editType": "style", - "min": 1, - "valType": "number" - }, - "style": { - "description": "Sets whether a font should be styled with a normal or italic face from its family.", - "dflt": "normal", - "editType": "style", - "valType": "enumerated", - "values": [ - "normal", - "italic" - ] - }, - "textcase": { - "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", - "dflt": "normal", - "editType": "style", - "valType": "enumerated", - "values": [ - "normal", - "word caps", - "upper", - "lower" - ] - }, - "variant": { - "description": "Sets the variant of the font.", - "dflt": "normal", - "editType": "style", - "valType": "enumerated", - "values": [ - "normal", - "small-caps", - "all-small-caps", - "all-petite-caps", - "petite-caps", - "unicase" - ] - }, - "weight": { - "description": "Sets the weight (or boldness) of the font.", - "dflt": "normal", - "editType": "style", - "extras": [ - "normal", - "bold" - ], - "max": 1000, - "min": 1, - "valType": "integer" - } - }, - "role": "object", - "text": { - "description": "Sets the title of the legend group.", - "dflt": "", - "editType": "style", - "valType": "string" - } - }, - "legendrank": { - "description": "Sets the legend rank for this trace. Items and groups with smaller ranks are presented on top/left side while with *reversed* `legend.traceorder` they are on bottom/right side. The default legendrank is 1000, so that you can use ranks less than 1000 to place certain items before all unranked items, and ranks greater than 1000 to go after all unranked items. When having unranked or equal rank items shapes would be displayed after traces i.e. according to their order in data and layout.", - "dflt": 1000, - "editType": "style", - "valType": "number" - }, - "legendwidth": { - "description": "Sets the width (in px or fraction) of the legend for this trace.", - "editType": "style", - "min": 0, - "valType": "number" - }, - "marker": { - "colors": { - "description": "Sets the color of each sector. If not specified, the default trace color set is used to pick the sector colors.", - "editType": "calc", - "valType": "data_array" - }, - "colorssrc": { - "description": "Sets the source reference on Chart Studio Cloud for `colors`.", - "editType": "none", - "valType": "string" - }, - "editType": "calc", - "line": { - "color": { - "arrayOk": true, - "description": "Sets the color of the line enclosing each sector.", - "dflt": "#444", - "editType": "style", - "valType": "color" - }, - "colorsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `color`.", - "editType": "none", - "valType": "string" - }, - "editType": "calc", - "role": "object", - "width": { - "arrayOk": true, - "description": "Sets the width (in px) of the line enclosing each sector.", - "dflt": 0, - "editType": "style", - "min": 0, - "valType": "number" - }, - "widthsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `width`.", - "editType": "none", - "valType": "string" - } - }, - "pattern": { - "bgcolor": { - "arrayOk": true, - "description": "When there is no colorscale sets the color of background pattern fill. Defaults to a `marker.color` background when `fillmode` is *overlay*. Otherwise, defaults to a transparent background.", - "editType": "style", - "valType": "color" - }, - "bgcolorsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `bgcolor`.", - "editType": "none", - "valType": "string" - }, - "description": "Sets the pattern within the marker.", - "editType": "style", - "fgcolor": { - "arrayOk": true, - "description": "When there is no colorscale sets the color of foreground pattern fill. Defaults to a `marker.color` background when `fillmode` is *replace*. Otherwise, defaults to dark grey or white to increase contrast with the `bgcolor`.", - "editType": "style", - "valType": "color" - }, - "fgcolorsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `fgcolor`.", - "editType": "none", - "valType": "string" - }, - "fgopacity": { - "description": "Sets the opacity of the foreground pattern fill. Defaults to a 0.5 when `fillmode` is *overlay*. Otherwise, defaults to 1.", - "editType": "style", - "max": 1, - "min": 0, - "valType": "number" - }, - "fillmode": { - "description": "Determines whether `marker.color` should be used as a default to `bgcolor` or a `fgcolor`.", - "dflt": "replace", - "editType": "style", - "valType": "enumerated", - "values": [ - "replace", - "overlay" - ] - }, - "path": { - "arrayOk": true, - "description": "Sets a custom path for pattern fill. Use with no `shape` or `solidity`, provide an SVG path string for the regions of the square from (0,0) to (`size`,`size`) to color.", - "editType": "style", - "valType": "string" - }, - "pathsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `path`.", - "editType": "none", - "valType": "string" - }, - "role": "object", - "shape": { - "arrayOk": true, - "description": "Sets the shape of the pattern fill. By default, no pattern is used for filling the area.", - "dflt": "", - "editType": "style", - "valType": "enumerated", - "values": [ - "", - "/", - "\\", - "x", - "-", - "|", - "+", - "." - ] - }, - "shapesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `shape`.", - "editType": "none", - "valType": "string" - }, - "size": { - "arrayOk": true, - "description": "Sets the size of unit squares of the pattern fill in pixels, which corresponds to the interval of repetition of the pattern.", - "dflt": 8, - "editType": "style", - "min": 0, - "valType": "number" - }, - "sizesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `size`.", - "editType": "none", - "valType": "string" - }, - "solidity": { - "arrayOk": true, - "description": "Sets the solidity of the pattern fill. Solidity is roughly the fraction of the area filled by the pattern. Solidity of 0 shows only the background color without pattern and solidty of 1 shows only the foreground color without pattern.", - "dflt": 0.3, - "editType": "style", - "max": 1, - "min": 0, - "valType": "number" - }, - "soliditysrc": { - "description": "Sets the source reference on Chart Studio Cloud for `solidity`.", - "editType": "none", - "valType": "string" - } - }, - "role": "object" - }, - "meta": { - "arrayOk": true, - "description": "Assigns extra meta information associated with this trace that can be used in various text attributes. Attributes such as trace `name`, graph, axis and colorbar `title.text`, annotation `text` `rangeselector`, `updatemenues` and `sliders` `label` text all support `meta`. To access the trace `meta` values in an attribute in the same trace, simply use `%{meta[i]}` where `i` is the index or key of the `meta` item in question. To access trace `meta` in layout attributes, use `%{data[n[.meta[i]}` where `i` is the index or key of the `meta` and `n` is the trace index.", - "editType": "plot", - "valType": "any" - }, - "metasrc": { - "description": "Sets the source reference on Chart Studio Cloud for `meta`.", - "editType": "none", - "valType": "string" - }, - "name": { - "description": "Sets the trace name. The trace name appears as the legend item and on hover.", - "editType": "style", - "valType": "string" - }, - "opacity": { - "description": "Sets the opacity of the trace.", - "dflt": 1, - "editType": "style", - "max": 1, - "min": 0, - "valType": "number" - }, - "outsidetextfont": { - "color": { - "arrayOk": true, - "editType": "plot", - "valType": "color" - }, - "colorsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `color`.", - "editType": "none", - "valType": "string" - }, - "description": "Sets the font used for `textinfo` lying outside the sector.", - "editType": "plot", - "family": { - "arrayOk": true, - "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", - "editType": "plot", - "noBlank": true, - "strict": true, - "valType": "string" - }, - "familysrc": { - "description": "Sets the source reference on Chart Studio Cloud for `family`.", - "editType": "none", - "valType": "string" - }, - "lineposition": { - "arrayOk": true, - "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", - "dflt": "none", - "editType": "plot", - "extras": [ - "none" - ], - "flags": [ - "under", - "over", - "through" - ], - "valType": "flaglist" - }, - "linepositionsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `lineposition`.", - "editType": "none", - "valType": "string" - }, - "role": "object", - "shadow": { - "arrayOk": true, - "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", - "dflt": "none", - "editType": "plot", - "valType": "string" - }, - "shadowsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `shadow`.", - "editType": "none", - "valType": "string" - }, - "size": { - "arrayOk": true, - "editType": "plot", - "min": 1, - "valType": "number" - }, - "sizesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `size`.", - "editType": "none", - "valType": "string" - }, - "style": { - "arrayOk": true, - "description": "Sets whether a font should be styled with a normal or italic face from its family.", - "dflt": "normal", - "editType": "plot", - "valType": "enumerated", - "values": [ - "normal", - "italic" - ] - }, - "stylesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `style`.", - "editType": "none", - "valType": "string" - }, - "textcase": { - "arrayOk": true, - "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", - "dflt": "normal", - "editType": "plot", - "valType": "enumerated", - "values": [ - "normal", - "word caps", - "upper", - "lower" - ] - }, - "textcasesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `textcase`.", - "editType": "none", - "valType": "string" - }, - "variant": { - "arrayOk": true, - "description": "Sets the variant of the font.", - "dflt": "normal", - "editType": "plot", - "valType": "enumerated", - "values": [ - "normal", - "small-caps", - "all-small-caps", - "all-petite-caps", - "petite-caps", - "unicase" - ] - }, - "variantsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `variant`.", - "editType": "none", - "valType": "string" - }, - "weight": { - "arrayOk": true, - "description": "Sets the weight (or boldness) of the font.", - "dflt": "normal", - "editType": "plot", - "extras": [ - "normal", - "bold" - ], - "max": 1000, - "min": 1, - "valType": "integer" - }, - "weightsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `weight`.", - "editType": "none", - "valType": "string" - } - }, - "pull": { - "arrayOk": true, - "description": "Sets the fraction of larger radius to pull the sectors out from the center. This can be a constant to pull all slices apart from each other equally or an array to highlight one or more slices.", - "dflt": 0, - "editType": "calc", - "max": 1, - "min": 0, - "valType": "number" - }, - "pullsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `pull`.", - "editType": "none", - "valType": "string" - }, - "rotation": { - "description": "Instead of the first slice starting at 12 o'clock, rotate to some other angle.", - "dflt": 0, - "editType": "calc", - "valType": "angle" - }, - "scalegroup": { - "description": "If there are multiple pie charts that should be sized according to their totals, link them by providing a non-empty group id here shared by every trace in the same group.", - "dflt": "", - "editType": "calc", - "valType": "string" - }, - "showlegend": { - "description": "Determines whether or not an item corresponding to this trace is shown in the legend.", - "dflt": true, - "editType": "style", - "valType": "boolean" - }, - "sort": { - "description": "Determines whether or not the sectors are reordered from largest to smallest.", - "dflt": true, - "editType": "calc", - "valType": "boolean" - }, - "stream": { - "editType": "calc", - "maxpoints": { - "description": "Sets the maximum number of points to keep on the plots from an incoming stream. If `maxpoints` is set to *50*, only the newest 50 points will be displayed on the plot.", - "dflt": 500, - "editType": "calc", - "max": 10000, - "min": 0, - "valType": "number" - }, - "role": "object", - "token": { - "description": "The stream id number links a data trace on a plot with a stream. See https://chart-studio.plotly.com/settings for more details.", - "editType": "calc", - "noBlank": true, - "strict": true, - "valType": "string" - } - }, - "text": { - "description": "Sets text elements associated with each sector. If trace `textinfo` contains a *text* flag, these elements will be seen on the chart. If trace `hoverinfo` contains a *text* flag and *hovertext* is not set, these elements will be seen in the hover labels.", - "editType": "plot", - "valType": "data_array" - }, - "textfont": { - "color": { - "arrayOk": true, - "editType": "plot", - "valType": "color" - }, - "colorsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `color`.", - "editType": "none", - "valType": "string" - }, - "description": "Sets the font used for `textinfo`.", - "editType": "plot", - "family": { - "arrayOk": true, - "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", - "editType": "plot", - "noBlank": true, - "strict": true, - "valType": "string" - }, - "familysrc": { - "description": "Sets the source reference on Chart Studio Cloud for `family`.", - "editType": "none", - "valType": "string" - }, - "lineposition": { - "arrayOk": true, - "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", - "dflt": "none", - "editType": "plot", - "extras": [ - "none" - ], - "flags": [ - "under", - "over", - "through" - ], - "valType": "flaglist" - }, - "linepositionsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `lineposition`.", - "editType": "none", - "valType": "string" - }, - "role": "object", - "shadow": { - "arrayOk": true, - "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", - "dflt": "none", - "editType": "plot", - "valType": "string" - }, - "shadowsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `shadow`.", - "editType": "none", - "valType": "string" - }, - "size": { - "arrayOk": true, - "editType": "plot", - "min": 1, - "valType": "number" - }, - "sizesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `size`.", - "editType": "none", - "valType": "string" - }, - "style": { - "arrayOk": true, - "description": "Sets whether a font should be styled with a normal or italic face from its family.", - "dflt": "normal", - "editType": "plot", - "valType": "enumerated", - "values": [ - "normal", - "italic" - ] - }, - "stylesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `style`.", - "editType": "none", - "valType": "string" - }, - "textcase": { - "arrayOk": true, - "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", - "dflt": "normal", - "editType": "plot", - "valType": "enumerated", - "values": [ - "normal", - "word caps", - "upper", - "lower" - ] - }, - "textcasesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `textcase`.", - "editType": "none", - "valType": "string" - }, - "variant": { - "arrayOk": true, - "description": "Sets the variant of the font.", - "dflt": "normal", - "editType": "plot", - "valType": "enumerated", - "values": [ - "normal", - "small-caps", - "all-small-caps", - "all-petite-caps", - "petite-caps", - "unicase" - ] - }, - "variantsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `variant`.", - "editType": "none", - "valType": "string" - }, - "weight": { - "arrayOk": true, - "description": "Sets the weight (or boldness) of the font.", - "dflt": "normal", - "editType": "plot", - "extras": [ - "normal", - "bold" - ], - "max": 1000, - "min": 1, - "valType": "integer" - }, - "weightsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `weight`.", - "editType": "none", - "valType": "string" - } - }, - "textinfo": { - "description": "Determines which trace information appear on the graph.", - "editType": "calc", - "extras": [ - "none" - ], - "flags": [ - "label", - "text", - "value", - "percent" - ], - "valType": "flaglist" - }, - "textposition": { - "arrayOk": true, - "description": "Specifies the location of the `textinfo`.", - "dflt": "auto", - "editType": "plot", - "valType": "enumerated", - "values": [ - "inside", - "outside", - "auto", - "none" - ] - }, - "textpositionsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `textposition`.", - "editType": "none", - "valType": "string" - }, - "textsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `text`.", - "editType": "none", - "valType": "string" - }, - "texttemplate": { - "arrayOk": true, - "description": "Template string used for rendering the information text that appears on points. Note that this will override `textinfo`. Variables are inserted using %{variable}, for example \"y: %{y}\". Numbers are formatted using d3-format's syntax %{variable:d3-format}, for example \"Price: %{y:$.2f}\". https://github.com/d3/d3-format/tree/v1.4.5#d3-format for details on the formatting syntax. Dates are formatted using d3-time-format's syntax %{variable|d3-time-format}, for example \"Day: %{2019-01-01|%A}\". https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format for details on the date formatting syntax. Variables that can't be found will be replaced with the specifier. For example, a template of \"data: %{x}, %{y}\" will result in a value of \"data: 1, %{y}\" if x is 1 and y is missing. Variables with an undefined value will be replaced with the fallback value. All attributes that can be specified per-point (the ones that are `arrayOk: true`) are available. Finally, the template string has access to variables `label`, `color`, `value`, `percent` and `text`.", - "dflt": "", - "editType": "plot", - "valType": "string" - }, - "texttemplatefallback": { - "description": "Fallback string that's displayed when a variable referenced in a template is missing. If the boolean value 'false' is passed in, the specifier with the missing variable will be displayed.", - "dflt": "-", - "editType": "plot", - "valType": "any" - }, - "texttemplatesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `texttemplate`.", - "editType": "none", - "valType": "string" - }, - "title": { - "editType": "plot", - "font": { - "color": { - "arrayOk": true, - "editType": "plot", - "valType": "color" - }, - "colorsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `color`.", - "editType": "none", - "valType": "string" - }, - "description": "Sets the font used for `title`.", - "editType": "plot", - "family": { - "arrayOk": true, - "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", - "editType": "plot", - "noBlank": true, - "strict": true, - "valType": "string" - }, - "familysrc": { - "description": "Sets the source reference on Chart Studio Cloud for `family`.", - "editType": "none", - "valType": "string" - }, - "lineposition": { - "arrayOk": true, - "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", - "dflt": "none", - "editType": "plot", - "extras": [ - "none" - ], - "flags": [ - "under", - "over", - "through" - ], - "valType": "flaglist" - }, - "linepositionsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `lineposition`.", - "editType": "none", - "valType": "string" - }, - "role": "object", - "shadow": { - "arrayOk": true, - "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", - "dflt": "none", - "editType": "plot", - "valType": "string" - }, - "shadowsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `shadow`.", - "editType": "none", - "valType": "string" - }, - "size": { - "arrayOk": true, - "editType": "plot", - "min": 1, - "valType": "number" - }, - "sizesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `size`.", - "editType": "none", - "valType": "string" - }, - "style": { - "arrayOk": true, - "description": "Sets whether a font should be styled with a normal or italic face from its family.", - "dflt": "normal", - "editType": "plot", - "valType": "enumerated", - "values": [ - "normal", - "italic" - ] - }, - "stylesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `style`.", - "editType": "none", - "valType": "string" - }, - "textcase": { - "arrayOk": true, - "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", - "dflt": "normal", - "editType": "plot", - "valType": "enumerated", - "values": [ - "normal", - "word caps", - "upper", - "lower" - ] - }, - "textcasesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `textcase`.", - "editType": "none", - "valType": "string" - }, - "variant": { - "arrayOk": true, - "description": "Sets the variant of the font.", - "dflt": "normal", - "editType": "plot", - "valType": "enumerated", - "values": [ - "normal", - "small-caps", - "all-small-caps", - "all-petite-caps", - "petite-caps", - "unicase" - ] - }, - "variantsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `variant`.", - "editType": "none", - "valType": "string" - }, - "weight": { - "arrayOk": true, - "description": "Sets the weight (or boldness) of the font.", - "dflt": "normal", - "editType": "plot", - "extras": [ - "normal", - "bold" - ], - "max": 1000, - "min": 1, - "valType": "integer" - }, - "weightsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `weight`.", - "editType": "none", - "valType": "string" - } - }, - "position": { - "description": "Specifies the location of the `title`.", - "editType": "plot", - "valType": "enumerated", - "values": [ - "top left", - "top center", - "top right", - "middle center", - "bottom left", - "bottom center", - "bottom right" - ] - }, - "role": "object", - "text": { - "description": "Sets the title of the chart. If it is empty, no title is displayed.", - "dflt": "", - "editType": "plot", - "valType": "string" - } - }, - "type": "pie", - "uid": { - "description": "Assign an id to this trace, Use this to provide object constancy between traces during animations and transitions.", - "editType": "plot", - "valType": "string" - }, - "uirevision": { - "description": "Controls persistence of some user-driven changes to the trace: `constraintrange` in `parcoords` traces, as well as some `editable: true` modifications such as `name` and `colorbar.title`. Defaults to `layout.uirevision`. Note that other user-driven trace attribute changes are controlled by `layout` attributes: `trace.visible` is controlled by `layout.legend.uirevision`, `selectedpoints` is controlled by `layout.selectionrevision`, and `colorbar.(x|y)` (accessible with `config: {editable: true}`) is controlled by `layout.editrevision`. Trace changes are tracked by `uid`, which only falls back on trace index if no `uid` is provided. So if your app can add/remove traces before the end of the `data` array, such that the same trace has a different index, you can still preserve user-driven changes if you give each trace a `uid` that stays with it as it moves.", - "editType": "none", - "valType": "any" - }, - "values": { - "description": "Sets the values of the sectors. If omitted, we count occurrences of each label.", - "editType": "calc", - "valType": "data_array" - }, - "valuessrc": { - "description": "Sets the source reference on Chart Studio Cloud for `values`.", - "editType": "none", - "valType": "string" - }, - "visible": { - "description": "Determines whether or not this trace is visible. If *legendonly*, the trace is not drawn, but can appear as a legend item (provided that the legend itself is visible).", - "dflt": true, - "editType": "calc", - "valType": "enumerated", - "values": [ - true, - false, - "legendonly" - ] - } - }, - "categories": [ - "pie-like", - "pie", - "showLegend" - ], - "layoutAttributes": { - "extendpiecolors": { - "description": "If `true`, the pie slice colors (whether given by `piecolorway` or inherited from `colorway`) will be extended to three times its original length by first repeating every color 20% lighter then each color 20% darker. This is intended to reduce the likelihood of reusing the same color when you have many slices, but you can set `false` to disable. Colors provided in the trace, using `marker.colors`, are never extended.", - "dflt": true, - "editType": "calc", - "valType": "boolean" - }, - "hiddenlabels": { - "description": "hiddenlabels is the funnelarea & pie chart analog of visible:'legendonly' but it can contain many labels, and can simultaneously hide slices from several pies/funnelarea charts", - "editType": "calc", - "valType": "data_array" - }, - "hiddenlabelssrc": { - "description": "Sets the source reference on Chart Studio Cloud for `hiddenlabels`.", - "editType": "none", - "valType": "string" - }, - "piecolorway": { - "description": "Sets the default pie slice colors. Defaults to the main `colorway` used for trace colors. If you specify a new list here it can still be extended with lighter and darker colors, see `extendpiecolors`.", - "editType": "calc", - "valType": "colorlist" - } - }, - "meta": { - "description": "A data visualized by the sectors of the pie is set in `values`. The sector labels are set in `labels`. The sector colors are set in `marker.colors`" - }, - "type": "pie" - }, - "quiver": { - "animatable": true, - "attributes": { - "anchor": { - "description": "Sets the arrows' anchor with respect to their (x,y) positions. Use *tail* to place (x,y) at the base, *tip* to place (x,y) at the head, or *cm*/*center*/*middle* to center the arrow on (x,y).", - "dflt": "tail", - "editType": "calc", - "valType": "enumerated", - "values": [ - "tip", - "tail", - "cm", - "center", - "middle" - ] - }, - "arrow_scale": { - "description": "Deprecated alias for `arrowsize`-based sizing. Prefer using `arrowsize`.", - "editType": "calc", - "max": 1, - "min": 0, - "valType": "number" - }, - "arrowsize": { - "description": "Scales the size of the arrow head relative to a base size. Higher values produce larger heads.", - "dflt": 1, - "editType": "calc", - "min": 0.3, - "valType": "number" - }, - "arrowwidth": { - "description": "Sets the width (in px) of the arrow line (alias of `line.width`).", - "editType": "style", - "min": 0.1, - "valType": "number" - }, - "autocolorscale": { - "description": "Determines whether the colorscale is a default palette (`autocolorscale: true`) or the palette determined by `colorscale`. In case `colorscale` is unspecified or `autocolorscale` is true, the default palette will be chosen according to whether numbers in the `color` array are all positive, all negative or mixed.", - "dflt": true, - "editType": "calc", - "impliedEdits": {}, - "valType": "boolean" - }, - "c": { - "anim": true, - "description": "Sets the scalar values used to map colors via the colorscale. If not provided, the magnitude sqrt(u^2 + v^2) is used.", - "editType": "calc", - "valType": "data_array" - }, - "cauto": { - "description": "Determines whether or not the color domain is computed with respect to the input data (here u/v norm) or the bounds set in `cmin` and `cmax` Defaults to `false` when `cmin` and `cmax` are set by the user.", - "dflt": true, - "editType": "calc", - "impliedEdits": {}, - "valType": "boolean" - }, - "cmax": { - "description": "Sets the upper bound of the color domain. Value should have the same units as u/v norm and if set, `cmin` must be set as well.", - "dflt": null, - "editType": "calc", - "impliedEdits": { - "cauto": false - }, - "valType": "number" - }, - "cmid": { - "description": "Sets the mid-point of the color domain by scaling `cmin` and/or `cmax` to be equidistant to this point. Value should have the same units as u/v norm. Has no effect when `cauto` is `false`.", - "dflt": null, - "editType": "calc", - "impliedEdits": {}, - "valType": "number" - }, - "cmin": { - "description": "Sets the lower bound of the color domain. Value should have the same units as u/v norm and if set, `cmax` must be set as well.", - "dflt": null, - "editType": "calc", - "impliedEdits": { - "cauto": false - }, - "valType": "number" - }, - "coloraxis": { - "description": "Sets a reference to a shared color axis. References to these shared color axes are *coloraxis*, *coloraxis2*, *coloraxis3*, etc. Settings for these shared color axes are set in the layout, under `layout.coloraxis`, `layout.coloraxis2`, etc. Note that multiple color scales can be linked to the same color axis.", - "dflt": null, - "editType": "calc", - "regex": "/^coloraxis([2-9]|[1-9][0-9]+)?$/", - "valType": "subplotid" - }, - "colorbar": { - "bgcolor": { - "description": "Sets the color of padded area.", - "dflt": "rgba(0,0,0,0)", - "editType": "colorbars", - "valType": "color" - }, - "bordercolor": { - "description": "Sets the axis line color.", - "dflt": "#444", - "editType": "colorbars", - "valType": "color" - }, - "borderwidth": { - "description": "Sets the width (in px) or the border enclosing this color bar.", - "dflt": 0, - "editType": "colorbars", - "min": 0, - "valType": "number" - }, - "dtick": { - "description": "Sets the step in-between ticks on this axis. Use with `tick0`. Must be a positive number, or special strings available to *log* and *date* axes. If the axis `type` is *log*, then ticks are set every 10^(n*dtick) where n is the tick number. For example, to set a tick mark at 1, 10, 100, 1000, ... set dtick to 1. To set tick marks at 1, 100, 10000, ... set dtick to 2. To set tick marks at 1, 5, 25, 125, 625, 3125, ... set dtick to log_10(5), or 0.69897000433. *log* has several special values; *L*, where `f` is a positive number, gives ticks linearly spaced in value (but not position). For example `tick0` = 0.1, `dtick` = *L0.5* will put ticks at 0.1, 0.6, 1.1, 1.6 etc. To show powers of 10 plus small digits between, use *D1* (all digits) or *D2* (only 2 and 5). `tick0` is ignored for *D1* and *D2*. If the axis `type` is *date*, then you must convert the time to milliseconds. For example, to set the interval between ticks to one day, set `dtick` to 86400000.0. *date* also has special values *M* gives ticks spaced by a number of months. `n` must be a positive integer. To set ticks on the 15th of every third month, set `tick0` to *2000-01-15* and `dtick` to *M3*. To set ticks every 4 years, set `dtick` to *M48*", - "editType": "colorbars", - "impliedEdits": { - "tickmode": "linear" - }, - "valType": "any" - }, - "editType": "colorbars", - "exponentformat": { - "description": "Determines a formatting rule for the tick exponents. For example, consider the number 1,000,000,000. If *none*, it appears as 1,000,000,000. If *e*, 1e+9. If *E*, 1E+9. If *power*, 1x10^9 (with 9 in a super script). If *SI*, 1G. If *B*, 1B. *SI* uses prefixes from \"femto\" f (10^-15) to \"tera\" T (10^12). *SI extended* covers instead the full SI range from \"quecto\" q (10^-30) to \"quetta\" Q (10^30). If *SI* or *SI extended* is used and the exponent is beyond the above ranges, the formatting rule will automatically be switched to the power notation.", - "dflt": "B", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "none", - "e", - "E", - "power", - "SI", - "B", - "SI extended" - ] - }, - "labelalias": { - "description": "Replacement text for specific tick or hover labels. For example using {US: 'USA', CA: 'Canada'} changes US to USA and CA to Canada. The labels we would have shown must match the keys exactly, after adding any tickprefix or ticksuffix. For negative numbers the minus sign symbol used (U+2212) is wider than the regular ascii dash. That means you need to use −1 instead of -1. labelalias can be used with any axis type, and both keys (if needed) and values (if desired) can include html-like tags or MathJax.", - "dflt": false, - "editType": "colorbars", - "valType": "any" - }, - "len": { - "description": "Sets the length of the color bar This measure excludes the padding of both ends. That is, the color bar length is this length minus the padding on both ends.", - "dflt": 1, - "editType": "colorbars", - "min": 0, - "valType": "number" - }, - "lenmode": { - "description": "Determines whether this color bar's length (i.e. the measure in the color variation direction) is set in units of plot *fraction* or in *pixels. Use `len` to set the value.", - "dflt": "fraction", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "fraction", - "pixels" - ] - }, - "minexponent": { - "description": "Hide SI prefix for 10^n if |n| is below this number. This only has an effect when `tickformat` is *SI* or *B*.", - "dflt": 3, - "editType": "colorbars", - "min": 0, - "valType": "number" - }, - "nticks": { - "description": "Specifies the maximum number of ticks for the particular axis. The actual number of ticks will be chosen automatically to be less than or equal to `nticks`. Has an effect only if `tickmode` is set to *auto*.", - "dflt": 0, - "editType": "colorbars", - "min": 0, - "valType": "integer" - }, - "orientation": { - "description": "Sets the orientation of the colorbar.", - "dflt": "v", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "h", - "v" - ] - }, - "outlinecolor": { - "description": "Sets the axis line color.", - "dflt": "#444", - "editType": "colorbars", - "valType": "color" - }, - "outlinewidth": { - "description": "Sets the width (in px) of the axis line.", - "dflt": 1, - "editType": "colorbars", - "min": 0, - "valType": "number" - }, - "role": "object", - "separatethousands": { - "description": "If \"true\", even 4-digit integers are separated", - "dflt": false, - "editType": "colorbars", - "valType": "boolean" - }, - "showexponent": { - "description": "If *all*, all exponents are shown besides their significands. If *first*, only the exponent of the first tick is shown. If *last*, only the exponent of the last tick is shown. If *none*, no exponents appear.", - "dflt": "all", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "all", - "first", - "last", - "none" - ] - }, - "showticklabels": { - "description": "Determines whether or not the tick labels are drawn.", - "dflt": true, - "editType": "colorbars", - "valType": "boolean" - }, - "showtickprefix": { - "description": "If *all*, all tick labels are displayed with a prefix. If *first*, only the first tick is displayed with a prefix. If *last*, only the last tick is displayed with a suffix. If *none*, tick prefixes are hidden.", - "dflt": "all", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "all", - "first", - "last", - "none" - ] - }, - "showticksuffix": { - "description": "Same as `showtickprefix` but for tick suffixes.", - "dflt": "all", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "all", - "first", - "last", - "none" - ] - }, - "thickness": { - "description": "Sets the thickness of the color bar This measure excludes the size of the padding, ticks and labels.", - "dflt": 30, - "editType": "colorbars", - "min": 0, - "valType": "number" - }, - "thicknessmode": { - "description": "Determines whether this color bar's thickness (i.e. the measure in the constant color direction) is set in units of plot *fraction* or in *pixels*. Use `thickness` to set the value.", - "dflt": "pixels", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "fraction", - "pixels" - ] - }, - "tick0": { - "description": "Sets the placement of the first tick on this axis. Use with `dtick`. If the axis `type` is *log*, then you must take the log of your starting tick (e.g. to set the starting tick to 100, set the `tick0` to 2) except when `dtick`=*L* (see `dtick` for more info). If the axis `type` is *date*, it should be a date string, like date data. If the axis `type` is *category*, it should be a number, using the scale where each category is assigned a serial number from zero in the order it appears.", - "editType": "colorbars", - "impliedEdits": { - "tickmode": "linear" - }, - "valType": "any" - }, - "tickangle": { - "description": "Sets the angle of the tick labels with respect to the horizontal. For example, a `tickangle` of -90 draws the tick labels vertically.", - "dflt": "auto", - "editType": "colorbars", - "valType": "angle" - }, - "tickcolor": { - "description": "Sets the tick color.", - "dflt": "#444", - "editType": "colorbars", - "valType": "color" - }, - "tickfont": { - "color": { - "editType": "colorbars", - "valType": "color" - }, - "description": "Sets the color bar's tick label font", - "editType": "colorbars", - "family": { - "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", - "editType": "colorbars", - "noBlank": true, - "strict": true, - "valType": "string" - }, - "lineposition": { - "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", - "dflt": "none", - "editType": "colorbars", - "extras": [ - "none" - ], - "flags": [ - "under", - "over", - "through" - ], - "valType": "flaglist" - }, - "role": "object", - "shadow": { - "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", - "dflt": "none", - "editType": "colorbars", - "valType": "string" - }, - "size": { - "editType": "colorbars", - "min": 1, - "valType": "number" - }, - "style": { - "description": "Sets whether a font should be styled with a normal or italic face from its family.", - "dflt": "normal", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "normal", - "italic" - ] - }, - "textcase": { - "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", - "dflt": "normal", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "normal", - "word caps", - "upper", - "lower" - ] - }, - "variant": { - "description": "Sets the variant of the font.", - "dflt": "normal", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "normal", - "small-caps", - "all-small-caps", - "all-petite-caps", - "petite-caps", - "unicase" - ] - }, - "weight": { - "description": "Sets the weight (or boldness) of the font.", - "dflt": "normal", - "editType": "colorbars", - "extras": [ - "normal", - "bold" - ], - "max": 1000, - "min": 1, - "valType": "integer" - } - }, - "tickformat": { - "description": "Sets the tick label formatting rule using d3 formatting mini-languages which are very similar to those in Python. For numbers, see: https://github.com/d3/d3-format/tree/v1.4.5#d3-format. And for dates see: https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format. We add two items to d3's date formatter: *%h* for half of the year as a decimal number as well as *%{n}f* for fractional seconds with n digits. For example, *2016-10-13 09:15:23.456* with tickformat *%H~%M~%S.%2f* would display *09~15~23.46*", - "dflt": "", - "editType": "colorbars", - "valType": "string" - }, - "tickformatstops": { - "items": { - "tickformatstop": { - "dtickrange": { - "description": "range [*min*, *max*], where *min*, *max* - dtick values which describe some zoom level, it is possible to omit *min* or *max* value by passing *null*", - "editType": "colorbars", - "items": [ - { - "editType": "colorbars", - "valType": "any" - }, - { - "editType": "colorbars", - "valType": "any" - } - ], - "valType": "info_array" - }, - "editType": "colorbars", - "enabled": { - "description": "Determines whether or not this stop is used. If `false`, this stop is ignored even within its `dtickrange`.", - "dflt": true, - "editType": "colorbars", - "valType": "boolean" - }, - "name": { - "description": "When used in a template, named items are created in the output figure in addition to any items the figure already has in this array. You can modify these items in the output figure by making your own item with `templateitemname` matching this `name` alongside your modifications (including `visible: false` or `enabled: false` to hide it). Has no effect outside of a template.", - "editType": "colorbars", - "valType": "string" - }, - "role": "object", - "templateitemname": { - "description": "Used to refer to a named item in this array in the template. Named items from the template will be created even without a matching item in the input figure, but you can modify one by making an item with `templateitemname` matching its `name`, alongside your modifications (including `visible: false` or `enabled: false` to hide it). If there is no template or no matching item, this item will be hidden unless you explicitly show it with `visible: true`.", - "editType": "colorbars", - "valType": "string" - }, - "value": { - "description": "string - dtickformat for described zoom level, the same as *tickformat*", - "dflt": "", - "editType": "colorbars", - "valType": "string" - } - } - }, - "role": "object" - }, - "ticklabeloverflow": { - "description": "Determines how we handle tick labels that would overflow either the graph div or the domain of the axis. The default value for inside tick labels is *hide past domain*. In other cases the default is *hide past div*.", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "allow", - "hide past div", - "hide past domain" - ] - }, - "ticklabelposition": { - "description": "Determines where tick labels are drawn relative to the ticks. Left and right options are used when `orientation` is *h*, top and bottom when `orientation` is *v*.", - "dflt": "outside", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "outside", - "inside", - "outside top", - "inside top", - "outside left", - "inside left", - "outside right", - "inside right", - "outside bottom", - "inside bottom" - ] - }, - "ticklabelstep": { - "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", - "dflt": 1, - "editType": "colorbars", - "min": 1, - "valType": "integer" - }, - "ticklen": { - "description": "Sets the tick length (in px).", - "dflt": 5, - "editType": "colorbars", - "min": 0, - "valType": "number" - }, - "tickmode": { - "description": "Sets the tick mode for this axis. If *auto*, the number of ticks is set via `nticks`. If *linear*, the placement of the ticks is determined by a starting position `tick0` and a tick step `dtick` (*linear* is the default value if `tick0` and `dtick` are provided). If *array*, the placement of the ticks is set via `tickvals` and the tick text is `ticktext`. (*array* is the default value if `tickvals` is provided).", - "editType": "colorbars", - "impliedEdits": {}, - "valType": "enumerated", - "values": [ - "auto", - "linear", - "array" - ] - }, - "tickprefix": { - "description": "Sets a tick label prefix.", - "dflt": "", - "editType": "colorbars", - "valType": "string" - }, - "ticks": { - "description": "Determines whether ticks are drawn or not. If **, this axis' ticks are not drawn. If *outside* (*inside*), this axis' are drawn outside (inside) the axis lines.", - "dflt": "", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "outside", - "inside", - "" - ] - }, - "ticksuffix": { - "description": "Sets a tick label suffix.", - "dflt": "", - "editType": "colorbars", - "valType": "string" - }, - "ticktext": { - "description": "Sets the text displayed at the ticks position via `tickvals`. Only has an effect if `tickmode` is set to *array*. Used with `tickvals`.", - "editType": "colorbars", - "valType": "data_array" - }, - "ticktextsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `ticktext`.", - "editType": "none", - "valType": "string" - }, - "tickvals": { - "description": "Sets the values at which ticks on this axis appear. Only has an effect if `tickmode` is set to *array*. Used with `ticktext`.", - "editType": "colorbars", - "valType": "data_array" - }, - "tickvalssrc": { - "description": "Sets the source reference on Chart Studio Cloud for `tickvals`.", - "editType": "none", - "valType": "string" - }, - "tickwidth": { - "description": "Sets the tick width (in px).", - "dflt": 1, - "editType": "colorbars", - "min": 0, - "valType": "number" - }, - "title": { - "editType": "colorbars", - "font": { - "color": { - "editType": "colorbars", - "valType": "color" - }, - "description": "Sets this color bar's title font.", - "editType": "colorbars", - "family": { - "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", - "editType": "colorbars", - "noBlank": true, - "strict": true, - "valType": "string" - }, - "lineposition": { - "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", - "dflt": "none", - "editType": "colorbars", - "extras": [ - "none" - ], - "flags": [ - "under", - "over", - "through" - ], - "valType": "flaglist" - }, - "role": "object", - "shadow": { - "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", - "dflt": "none", - "editType": "colorbars", - "valType": "string" - }, - "size": { - "editType": "colorbars", - "min": 1, - "valType": "number" - }, - "style": { - "description": "Sets whether a font should be styled with a normal or italic face from its family.", - "dflt": "normal", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "normal", - "italic" - ] - }, - "textcase": { - "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", - "dflt": "normal", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "normal", - "word caps", - "upper", - "lower" - ] - }, - "variant": { - "description": "Sets the variant of the font.", - "dflt": "normal", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "normal", - "small-caps", - "all-small-caps", - "all-petite-caps", - "petite-caps", - "unicase" - ] - }, - "weight": { - "description": "Sets the weight (or boldness) of the font.", - "dflt": "normal", - "editType": "colorbars", - "extras": [ - "normal", - "bold" - ], - "max": 1000, - "min": 1, - "valType": "integer" - } - }, - "role": "object", - "side": { - "description": "Determines the location of color bar's title with respect to the color bar. Defaults to *top* when `orientation` if *v* and defaults to *right* when `orientation` if *h*.", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "right", - "top", - "bottom" - ] - }, - "text": { - "description": "Sets the title of the color bar.", - "editType": "colorbars", - "valType": "string" - } - }, - "x": { - "description": "Sets the x position with respect to `xref` of the color bar (in plot fraction). When `xref` is *paper*, defaults to 1.02 when `orientation` is *v* and 0.5 when `orientation` is *h*. When `xref` is *container*, defaults to *1* when `orientation` is *v* and 0.5 when `orientation` is *h*. Must be between *0* and *1* if `xref` is *container* and between *-2* and *3* if `xref` is *paper*.", - "editType": "colorbars", - "valType": "number" - }, - "xanchor": { - "description": "Sets this color bar's horizontal position anchor. This anchor binds the `x` position to the *left*, *center* or *right* of the color bar. Defaults to *left* when `orientation` is *v* and *center* when `orientation` is *h*.", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "left", - "center", - "right" - ] - }, - "xpad": { - "description": "Sets the amount of padding (in px) along the x direction.", - "dflt": 10, - "editType": "colorbars", - "min": 0, - "valType": "number" - }, - "xref": { - "description": "Sets the container `x` refers to. *container* spans the entire `width` of the plot. *paper* refers to the width of the plotting area only.", - "dflt": "paper", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "container", - "paper" - ] - }, - "y": { - "description": "Sets the y position with respect to `yref` of the color bar (in plot fraction). When `yref` is *paper*, defaults to 0.5 when `orientation` is *v* and 1.02 when `orientation` is *h*. When `yref` is *container*, defaults to 0.5 when `orientation` is *v* and 1 when `orientation` is *h*. Must be between *0* and *1* if `yref` is *container* and between *-2* and *3* if `yref` is *paper*.", - "editType": "colorbars", - "valType": "number" - }, - "yanchor": { - "description": "Sets this color bar's vertical position anchor This anchor binds the `y` position to the *top*, *middle* or *bottom* of the color bar. Defaults to *middle* when `orientation` is *v* and *bottom* when `orientation` is *h*.", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "top", - "middle", - "bottom" - ] - }, - "ypad": { - "description": "Sets the amount of padding (in px) along the y direction.", - "dflt": 10, - "editType": "colorbars", - "min": 0, - "valType": "number" - }, - "yref": { - "description": "Sets the container `y` refers to. *container* spans the entire `height` of the plot. *paper* refers to the height of the plotting area only.", - "dflt": "paper", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "container", - "paper" - ] - } - }, - "colorscale": { - "description": "Sets the colorscale. The colorscale must be an array containing arrays mapping a normalized value to an rgb, rgba, hex, hsl, hsv, or named color string. At minimum, a mapping for the lowest (0) and highest (1) values are required. For example, `[[0, 'rgb(0,0,255)'], [1, 'rgb(255,0,0)']]`. To control the bounds of the colorscale in color space, use `cmin` and `cmax`. Alternatively, `colorscale` may be a palette name string of the following list: Blackbody,Bluered,Blues,Cividis,Earth,Electric,Greens,Greys,Hot,Jet,Picnic,Portland,Rainbow,RdBu,Reds,Viridis,YlGnBu,YlOrRd.", - "dflt": null, - "editType": "calc", - "impliedEdits": { - "autocolorscale": false - }, - "valType": "colorscale" - }, - "csrc": { - "description": "Sets the source reference on Chart Studio Cloud for `c`.", - "editType": "none", - "valType": "string" - }, - "customdata": { - "description": "Assigns extra data each datum. This may be useful when listening to hover, click and selection events. Note that, *scatter* traces also appends customdata items in the markers DOM elements", - "editType": "calc", - "valType": "data_array" - }, - "customdatasrc": { - "description": "Sets the source reference on Chart Studio Cloud for `customdata`.", - "editType": "none", - "valType": "string" - }, - "hoverdistance": { - "description": "Maximum distance (in pixels) to look for nearby arrows on hover.", - "dflt": 20, - "editType": "calc", - "min": -1, - "valType": "number" - }, - "hoverinfo": { - "arrayOk": true, - "description": "Determines which trace information appear on hover. If `none` or `skip` are set, no information is displayed upon hovering. But, if `none` is set, click and hover events are still fired.", - "dflt": "all", - "editType": "none", - "extras": [ - "all", - "none", - "skip" - ], - "flags": [ - "x", - "y", - "u", - "v", - "text", - "name" - ], - "valType": "flaglist" - }, - "hoverinfosrc": { - "description": "Sets the source reference on Chart Studio Cloud for `hoverinfo`.", - "editType": "none", - "valType": "string" - }, - "hoverlabel": { - "align": { - "arrayOk": true, - "description": "Sets the horizontal alignment of the text content within hover label box. Has an effect only if the hover label text spans more two or more lines", - "dflt": "auto", - "editType": "none", - "valType": "enumerated", - "values": [ - "left", - "right", - "auto" - ] - }, - "alignsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `align`.", - "editType": "none", - "valType": "string" - }, - "bgcolor": { - "arrayOk": true, - "description": "Sets the background color of the hover labels for this trace", - "editType": "none", - "valType": "color" - }, - "bgcolorsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `bgcolor`.", - "editType": "none", - "valType": "string" - }, - "bordercolor": { - "arrayOk": true, - "description": "Sets the border color of the hover labels for this trace.", - "editType": "none", - "valType": "color" - }, - "bordercolorsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `bordercolor`.", - "editType": "none", - "valType": "string" - }, - "editType": "none", - "font": { - "color": { - "arrayOk": true, - "editType": "none", - "valType": "color" - }, - "colorsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `color`.", - "editType": "none", - "valType": "string" - }, - "description": "Sets the font used in hover labels.", - "editType": "none", - "family": { - "arrayOk": true, - "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", - "editType": "none", - "noBlank": true, - "strict": true, - "valType": "string" - }, - "familysrc": { - "description": "Sets the source reference on Chart Studio Cloud for `family`.", - "editType": "none", - "valType": "string" - }, - "lineposition": { - "arrayOk": true, - "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", - "dflt": "none", - "editType": "none", - "extras": [ - "none" - ], - "flags": [ - "under", - "over", - "through" - ], - "valType": "flaglist" - }, - "linepositionsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `lineposition`.", - "editType": "none", - "valType": "string" - }, - "role": "object", - "shadow": { - "arrayOk": true, - "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", - "dflt": "none", - "editType": "none", - "valType": "string" - }, - "shadowsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `shadow`.", - "editType": "none", - "valType": "string" - }, - "size": { - "arrayOk": true, - "editType": "none", - "min": 1, - "valType": "number" - }, - "sizesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `size`.", - "editType": "none", - "valType": "string" - }, - "style": { - "arrayOk": true, - "description": "Sets whether a font should be styled with a normal or italic face from its family.", - "dflt": "normal", - "editType": "none", - "valType": "enumerated", - "values": [ - "normal", - "italic" - ] - }, - "stylesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `style`.", - "editType": "none", - "valType": "string" - }, - "textcase": { - "arrayOk": true, - "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", - "dflt": "normal", - "editType": "none", - "valType": "enumerated", - "values": [ - "normal", - "word caps", - "upper", - "lower" - ] - }, - "textcasesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `textcase`.", - "editType": "none", - "valType": "string" - }, - "variant": { - "arrayOk": true, - "description": "Sets the variant of the font.", - "dflt": "normal", - "editType": "none", - "valType": "enumerated", - "values": [ - "normal", - "small-caps", - "all-small-caps", - "all-petite-caps", - "petite-caps", - "unicase" - ] - }, - "variantsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `variant`.", - "editType": "none", - "valType": "string" - }, - "weight": { - "arrayOk": true, - "description": "Sets the weight (or boldness) of the font.", - "dflt": "normal", - "editType": "none", - "extras": [ - "normal", - "bold" - ], - "max": 1000, - "min": 1, - "valType": "integer" - }, - "weightsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `weight`.", - "editType": "none", - "valType": "string" - } - }, - "namelength": { - "arrayOk": true, - "description": "Sets the default length (in number of characters) of the trace name in the hover labels for all traces. -1 shows the whole name regardless of length. 0-3 shows the first 0-3 characters, and an integer >3 will show the whole name if it is less than that many characters, but if it is longer, will truncate to `namelength - 3` characters and add an ellipsis.", - "dflt": 15, - "editType": "none", - "min": -1, - "valType": "integer" - }, - "namelengthsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `namelength`.", - "editType": "none", - "valType": "string" - }, - "role": "object", - "showarrow": { - "description": "Sets whether or not to show the hover label arrow/triangle pointing to the data point.", - "dflt": true, - "editType": "none", - "valType": "boolean" - } - }, - "hovertemplate": { - "arrayOk": true, - "description": "Template string used for rendering the information that appear on hover box. Note that this will override `hoverinfo`. Variables are inserted using %{variable}, for example \"y: %{y}\" as well as %{xother}, {%_xother}, {%_xother_}, {%xother_}. When showing info for several points, *xother* will be added to those with different x positions from the first point. An underscore before or after *(x|y)other* will add a space on that side, only when this field is shown. Numbers are formatted using d3-format's syntax %{variable:d3-format}, for example \"Price: %{y:$.2f}\". https://github.com/d3/d3-format/tree/v1.4.5#d3-format for details on the formatting syntax. Dates are formatted using d3-time-format's syntax %{variable|d3-time-format}, for example \"Day: %{2019-01-01|%A}\". https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format for details on the date formatting syntax. Variables that can't be found will be replaced with the specifier. For example, a template of \"data: %{x}, %{y}\" will result in a value of \"data: 1, %{y}\" if x is 1 and y is missing. Variables with an undefined value will be replaced with the fallback value. The variables available in `hovertemplate` are the ones emitted as event data described at this link https://plotly.com/javascript/plotlyjs-events/#event-data. Additionally, all attributes that can be specified per-point (the ones that are `arrayOk: true`) are available. Finally, the template string has access to variables `x`, `y`, `u`, `v`, `text` and `name`. Anything contained in tag `` is displayed in the secondary box, for example `%{fullData.name}`. To hide the secondary box completely, use an empty tag ``.", - "dflt": "", - "editType": "none", - "valType": "string" - }, - "hovertemplatesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `hovertemplate`.", - "editType": "none", - "valType": "string" - }, - "ids": { - "anim": true, - "description": "Assigns id labels to each datum. These ids for object constancy of data points during animation. Should be an array of strings, not numbers or any other type.", - "editType": "calc", - "valType": "data_array" - }, - "idssrc": { - "description": "Sets the source reference on Chart Studio Cloud for `ids`.", - "editType": "none", - "valType": "string" - }, - "legend": { - "description": "Sets the reference to a legend to show this trace in. References to these legends are *legend*, *legend2*, *legend3*, etc. Settings for these legends are set in the layout, under `layout.legend`, `layout.legend2`, etc.", - "dflt": "legend", - "editType": "style", - "valType": "subplotid" - }, - "legendgroup": { - "description": "Sets the legend group for this trace. Traces and shapes part of the same legend group hide/show at the same time when toggling legend items.", - "dflt": "", - "editType": "style", - "valType": "string" - }, - "legendgrouptitle": { - "editType": "style", - "font": { - "color": { - "editType": "style", - "valType": "color" - }, - "description": "Sets this legend group's title font.", - "editType": "style", - "family": { - "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", - "editType": "style", - "noBlank": true, - "strict": true, - "valType": "string" - }, - "lineposition": { - "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", - "dflt": "none", - "editType": "style", - "extras": [ - "none" - ], - "flags": [ - "under", - "over", - "through" - ], - "valType": "flaglist" - }, - "role": "object", - "shadow": { - "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", - "dflt": "none", - "editType": "style", - "valType": "string" - }, - "size": { - "editType": "style", - "min": 1, - "valType": "number" - }, - "style": { - "description": "Sets whether a font should be styled with a normal or italic face from its family.", - "dflt": "normal", - "editType": "style", - "valType": "enumerated", - "values": [ - "normal", - "italic" - ] - }, - "textcase": { - "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", - "dflt": "normal", - "editType": "style", - "valType": "enumerated", - "values": [ - "normal", - "word caps", - "upper", - "lower" - ] - }, - "variant": { - "description": "Sets the variant of the font.", - "dflt": "normal", - "editType": "style", - "valType": "enumerated", - "values": [ - "normal", - "small-caps", - "all-small-caps", - "all-petite-caps", - "petite-caps", - "unicase" - ] - }, - "weight": { - "description": "Sets the weight (or boldness) of the font.", - "dflt": "normal", - "editType": "style", - "extras": [ - "normal", - "bold" - ], - "max": 1000, - "min": 1, - "valType": "integer" - } - }, - "role": "object", - "text": { - "description": "Sets the title of the legend group.", - "dflt": "", - "editType": "style", - "valType": "string" - } - }, - "legendrank": { - "description": "Sets the legend rank for this trace. Items and groups with smaller ranks are presented on top/left side while with *reversed* `legend.traceorder` they are on bottom/right side. The default legendrank is 1000, so that you can use ranks less than 1000 to place certain items before all unranked items, and ranks greater than 1000 to go after all unranked items. When having unranked or equal rank items shapes would be displayed after traces i.e. according to their order in data and layout.", - "dflt": 1000, - "editType": "style", - "valType": "number" - }, - "legendwidth": { - "description": "Sets the width (in px or fraction) of the legend for this trace.", - "editType": "style", - "min": 0, - "valType": "number" - }, - "line": { - "color": { - "description": "Sets the color of the arrow lines.", - "dflt": "#000", - "editType": "style", - "valType": "color" - }, - "dash": { - "description": "Sets the dash style of lines. Set to a dash type string (*solid*, *dot*, *dash*, *longdash*, *dashdot*, or *longdashdot*) or a dash length list in px (eg *5px,10px,2px,2px*).", - "dflt": "solid", - "editType": "style", - "valType": "string", - "values": [ - "solid", - "dot", - "dash", - "longdash", - "dashdot", - "longdashdot" - ] - }, - "editType": "style", - "role": "object", - "shape": { - "description": "Determines the line shape.", - "dflt": "linear", - "editType": "plot", - "valType": "enumerated", - "values": [ - "linear", - "spline", - "hv", - "vh", - "hvh", - "vhv" - ] - }, - "simplify": { - "description": "Simplifies lines by removing nearly-overlapping points.", - "dflt": true, - "editType": "plot", - "valType": "boolean" - }, - "smoothing": { - "description": "Has an effect only if `shape` is set to *spline*. Sets the amount of smoothing.", - "dflt": 1, - "editType": "plot", - "max": 1.3, - "min": 0, - "valType": "number" - }, - "width": { - "description": "Sets the width (in px) of the arrow lines.", - "dflt": 1, - "editType": "style", - "min": 0, - "valType": "number" - } - }, - "meta": { - "arrayOk": true, - "description": "Assigns extra meta information associated with this trace that can be used in various text attributes. Attributes such as trace `name`, graph, axis and colorbar `title.text`, annotation `text` `rangeselector`, `updatemenues` and `sliders` `label` text all support `meta`. To access the trace `meta` values in an attribute in the same trace, simply use `%{meta[i]}` where `i` is the index or key of the `meta` item in question. To access trace `meta` in layout attributes, use `%{data[n[.meta[i]}` where `i` is the index or key of the `meta` and `n` is the trace index.", - "editType": "plot", - "valType": "any" - }, - "metasrc": { - "description": "Sets the source reference on Chart Studio Cloud for `meta`.", - "editType": "none", - "valType": "string" - }, - "name": { - "description": "Sets the trace name. The trace name appears as the legend item and on hover.", - "editType": "style", - "valType": "string" - }, - "opacity": { - "description": "Sets the opacity of the trace.", - "dflt": 1, - "editType": "style", - "max": 1, - "min": 0, - "valType": "number" - }, - "reversescale": { - "description": "Reverses the color mapping if true. If true, `cmin` will correspond to the last color in the array and `cmax` will correspond to the first color.", - "dflt": false, - "editType": "plot", - "valType": "boolean" - }, - "selected": { - "editType": "style", - "line": { - "color": { - "description": "Sets the line color of selected points.", - "editType": "style", - "valType": "color" - }, - "editType": "style", - "role": "object", - "width": { - "description": "Sets the line width of selected points.", - "editType": "style", - "min": 0, - "valType": "number" - } - }, - "role": "object", - "textfont": { - "color": { - "description": "Sets the text font color of selected points, applied only when a selection exists.", - "editType": "style", - "valType": "color" - }, - "editType": "style", - "role": "object" - } - }, - "selectedpoints": { - "description": "Array containing integer indices of selected points. Has an effect only for traces that support selections. Note that an empty array means an empty selection where the `unselected` are turned on for all points, whereas, any other non-array values means no selection all where the `selected` and `unselected` styles have no effect.", - "editType": "calc", - "valType": "any" - }, - "showlegend": { - "description": "Determines whether or not an item corresponding to this trace is shown in the legend.", - "dflt": true, - "editType": "style", - "valType": "boolean" - }, - "showscale": { - "description": "Determines whether or not a colorbar is displayed for this trace.", - "dflt": true, - "editType": "calc", - "valType": "boolean" - }, - "sizemode": { - "description": "Determines whether `sizeref` is set as a *scaled* (unitless) scalar (normalized by the max u/v norm in the vector field), as an *absolute* value (in the same units as the vector field), or *raw* to use the raw vector lengths.", - "dflt": "scaled", - "editType": "calc", - "valType": "enumerated", - "values": [ - "scaled", - "absolute", - "raw" - ] - }, - "sizeref": { - "description": "Adjusts the arrow size scaling. The arrow length is determined by the vector norm multiplied by `sizeref`, optionally normalized when `sizemode` is *scaled*.", - "editType": "calc", - "min": 0, - "valType": "number" - }, - "stream": { - "editType": "calc", - "maxpoints": { - "description": "Sets the maximum number of points to keep on the plots from an incoming stream. If `maxpoints` is set to *50*, only the newest 50 points will be displayed on the plot.", - "dflt": 500, - "editType": "calc", - "max": 10000, - "min": 0, - "valType": "number" - }, - "role": "object", - "token": { - "description": "The stream id number links a data trace on a plot with a stream. See https://chart-studio.plotly.com/settings for more details.", - "editType": "calc", - "noBlank": true, - "strict": true, - "valType": "string" - } - }, - "text": { - "anim": true, - "description": "Sets text elements associated with each (x,y) pair.", - "editType": "calc", - "valType": "data_array" - }, - "textfont": { - "color": { - "arrayOk": true, - "editType": "style", - "valType": "color" - }, - "colorsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `color`.", - "editType": "none", - "valType": "string" - }, - "description": "Sets the text font.", - "editType": "calc", - "family": { - "arrayOk": true, - "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", - "editType": "calc", - "noBlank": true, - "strict": true, - "valType": "string" - }, - "familysrc": { - "description": "Sets the source reference on Chart Studio Cloud for `family`.", - "editType": "none", - "valType": "string" - }, - "lineposition": { - "arrayOk": true, - "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", - "dflt": "none", - "editType": "calc", - "extras": [ - "none" - ], - "flags": [ - "under", - "over", - "through" - ], - "valType": "flaglist" - }, - "linepositionsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `lineposition`.", - "editType": "none", - "valType": "string" - }, - "role": "object", - "shadow": { - "arrayOk": true, - "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", - "dflt": "none", - "editType": "calc", - "valType": "string" - }, - "shadowsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `shadow`.", - "editType": "none", - "valType": "string" - }, - "size": { - "arrayOk": true, - "editType": "calc", - "min": 1, - "valType": "number" - }, - "sizesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `size`.", - "editType": "none", - "valType": "string" - }, - "style": { - "arrayOk": true, - "description": "Sets whether a font should be styled with a normal or italic face from its family.", - "dflt": "normal", - "editType": "calc", - "valType": "enumerated", - "values": [ - "normal", - "italic" - ] - }, - "stylesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `style`.", - "editType": "none", - "valType": "string" - }, - "textcase": { - "arrayOk": true, - "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", - "dflt": "normal", - "editType": "calc", - "valType": "enumerated", - "values": [ - "normal", - "word caps", - "upper", - "lower" - ] - }, - "textcasesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `textcase`.", - "editType": "none", - "valType": "string" - }, - "variant": { - "arrayOk": true, - "description": "Sets the variant of the font.", - "dflt": "normal", - "editType": "calc", - "valType": "enumerated", - "values": [ - "normal", - "small-caps", - "all-small-caps", - "all-petite-caps", - "petite-caps", - "unicase" - ] - }, - "variantsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `variant`.", - "editType": "none", - "valType": "string" - }, - "weight": { - "arrayOk": true, - "description": "Sets the weight (or boldness) of the font.", - "dflt": "normal", - "editType": "calc", - "extras": [ - "normal", - "bold" - ], - "max": 1000, - "min": 1, - "valType": "integer" - }, - "weightsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `weight`.", - "editType": "none", - "valType": "string" - } - }, - "textposition": { - "description": "Sets the positions of the `text` elements with respects to the (x,y) coordinates.", - "dflt": "middle center", - "editType": "calc", - "valType": "enumerated", - "values": [ - "top left", - "top center", - "top right", - "middle left", - "middle center", - "middle right", - "bottom left", - "bottom center", - "bottom right" - ] - }, - "textsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `text`.", - "editType": "none", - "valType": "string" - }, - "type": "quiver", - "u": { - "anim": true, - "description": "Sets the x components of the arrow vectors.", - "editType": "calc", - "valType": "data_array" - }, - "uid": { - "anim": true, - "description": "Assign an id to this trace, Use this to provide object constancy between traces during animations and transitions.", - "editType": "plot", - "valType": "string" - }, - "uirevision": { - "description": "Controls persistence of some user-driven changes to the trace: `constraintrange` in `parcoords` traces, as well as some `editable: true` modifications such as `name` and `colorbar.title`. Defaults to `layout.uirevision`. Note that other user-driven trace attribute changes are controlled by `layout` attributes: `trace.visible` is controlled by `layout.legend.uirevision`, `selectedpoints` is controlled by `layout.selectionrevision`, and `colorbar.(x|y)` (accessible with `config: {editable: true}`) is controlled by `layout.editrevision`. Trace changes are tracked by `uid`, which only falls back on trace index if no `uid` is provided. So if your app can add/remove traces before the end of the `data` array, such that the same trace has a different index, you can still preserve user-driven changes if you give each trace a `uid` that stays with it as it moves.", - "editType": "none", - "valType": "any" - }, - "unselected": { - "editType": "style", - "line": { - "color": { - "description": "Sets the line color of unselected points.", - "editType": "style", - "valType": "color" - }, - "editType": "style", - "role": "object", - "width": { - "description": "Sets the line width of unselected points.", - "editType": "style", - "min": 0, - "valType": "number" - } - }, - "role": "object", - "textfont": { - "color": { - "description": "Sets the text font color of unselected points, applied only when a selection exists.", - "editType": "style", - "valType": "color" - }, - "editType": "style", - "role": "object" - } - }, - "usrc": { - "description": "Sets the source reference on Chart Studio Cloud for `u`.", - "editType": "none", - "valType": "string" - }, - "v": { - "anim": true, - "description": "Sets the y components of the arrow vectors.", - "editType": "calc", - "valType": "data_array" - }, - "visible": { - "description": "Determines whether or not this trace is visible. If *legendonly*, the trace is not drawn, but can appear as a legend item (provided that the legend itself is visible).", - "dflt": true, - "editType": "calc", - "valType": "enumerated", - "values": [ - true, - false, - "legendonly" - ] - }, - "vsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `v`.", - "editType": "none", - "valType": "string" - }, - "x": { - "anim": true, - "description": "Sets the x coordinates of the arrow locations.", - "editType": "calc+clearAxisTypes", - "valType": "data_array" - }, - "xaxis": { - "description": "Sets a reference between this trace's x coordinates and a 2D cartesian x axis. If *x* (the default value), the x coordinates refer to `layout.xaxis`. If *x2*, the x coordinates refer to `layout.xaxis2`, and so on.", - "dflt": "x", - "editType": "calc+clearAxisTypes", - "valType": "subplotid" - }, - "xsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `x`.", - "editType": "none", - "valType": "string" - }, - "y": { - "anim": true, - "description": "Sets the y coordinates of the arrow locations.", - "editType": "calc+clearAxisTypes", - "valType": "data_array" - }, - "yaxis": { - "description": "Sets a reference between this trace's y coordinates and a 2D cartesian y axis. If *y* (the default value), the y coordinates refer to `layout.yaxis`. If *y2*, the y coordinates refer to `layout.yaxis2`, and so on.", - "dflt": "y", - "editType": "calc+clearAxisTypes", - "valType": "subplotid" - }, - "ysrc": { - "description": "Sets the source reference on Chart Studio Cloud for `y`.", - "editType": "none", - "valType": "string" - } - }, - "categories": [ - "cartesian", - "svg", - "showLegend", - "scatter-like", - "zoomScale" - ], - "meta": { - "description": "The quiver trace type visualizes vector fields using arrows. Specify a vector field using 4 1D arrays: 2 position arrays `x`, `y` and 2 vector component arrays `u`, `v`. The arrows are drawn exactly at the positions given by `x` and `y`. Arrow length and direction are determined by `u` and `v` components." - }, - "type": "quiver" - }, - "sankey": { - "animatable": false, - "attributes": { - "arrangement": { - "description": "If value is `snap` (the default), the node arrangement is assisted by automatic snapping of elements to preserve space between nodes specified via `nodepad`. If value is `perpendicular`, the nodes can only move along a line perpendicular to the flow. If value is `freeform`, the nodes can freely move on the plane. If value is `fixed`, the nodes are stationary.", - "dflt": "snap", - "editType": "calc", - "valType": "enumerated", - "values": [ - "snap", - "perpendicular", - "freeform", - "fixed" - ] - }, - "customdata": { - "description": "Assigns extra data each datum. This may be useful when listening to hover, click and selection events. Note that, *scatter* traces also appends customdata items in the markers DOM elements", - "editType": "calc", - "valType": "data_array" - }, - "customdatasrc": { - "description": "Sets the source reference on Chart Studio Cloud for `customdata`.", - "editType": "none", - "valType": "string" - }, - "domain": { - "column": { - "description": "If there is a layout grid, use the domain for this column in the grid for this sankey trace .", - "dflt": 0, - "editType": "calc", - "min": 0, - "valType": "integer" - }, - "editType": "calc", - "role": "object", - "row": { - "description": "If there is a layout grid, use the domain for this row in the grid for this sankey trace .", - "dflt": 0, - "editType": "calc", - "min": 0, - "valType": "integer" - }, - "x": { - "description": "Sets the horizontal domain of this sankey trace (in plot fraction).", - "dflt": [ - 0, - 1 - ], - "editType": "calc", - "items": [ - { - "editType": "calc", - "max": 1, - "min": 0, - "valType": "number" - }, - { - "editType": "calc", - "max": 1, - "min": 0, - "valType": "number" - } - ], - "valType": "info_array" - }, - "y": { - "description": "Sets the vertical domain of this sankey trace (in plot fraction).", - "dflt": [ - 0, - 1 - ], - "editType": "calc", - "items": [ - { - "editType": "calc", - "max": 1, - "min": 0, - "valType": "number" - }, - { - "editType": "calc", - "max": 1, - "min": 0, - "valType": "number" - } - ], - "valType": "info_array" - } - }, - "hoverinfo": { - "arrayOk": false, - "description": "Determines which trace information appear on hover. If `none` or `skip` are set, no information is displayed upon hovering. But, if `none` is set, click and hover events are still fired. Note that this attribute is superseded by `node.hoverinfo` and `node.hoverinfo` for nodes and links respectively.", - "dflt": "all", - "editType": "calc", - "extras": [ - "all", - "none", - "skip" - ], - "flags": [], - "valType": "flaglist" - }, - "hoverlabel": { - "align": { - "arrayOk": true, - "description": "Sets the horizontal alignment of the text content within hover label box. Has an effect only if the hover label text spans more two or more lines", - "dflt": "auto", - "editType": "calc", - "valType": "enumerated", - "values": [ - "left", - "right", - "auto" - ] - }, - "alignsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `align`.", - "editType": "none", - "valType": "string" - }, - "bgcolor": { - "arrayOk": true, - "description": "Sets the background color of the hover labels for this trace", - "editType": "calc", - "valType": "color" - }, - "bgcolorsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `bgcolor`.", - "editType": "none", - "valType": "string" - }, - "bordercolor": { - "arrayOk": true, - "description": "Sets the border color of the hover labels for this trace.", - "editType": "calc", - "valType": "color" - }, - "bordercolorsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `bordercolor`.", - "editType": "none", - "valType": "string" - }, - "editType": "calc", - "font": { - "color": { - "arrayOk": true, - "editType": "calc", - "valType": "color" - }, - "colorsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `color`.", - "editType": "none", - "valType": "string" - }, - "description": "Sets the font used in hover labels.", - "editType": "calc", - "family": { - "arrayOk": true, - "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", - "editType": "calc", - "noBlank": true, - "strict": true, - "valType": "string" - }, - "familysrc": { - "description": "Sets the source reference on Chart Studio Cloud for `family`.", - "editType": "none", - "valType": "string" - }, - "lineposition": { - "arrayOk": true, - "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", - "dflt": "none", - "editType": "calc", - "extras": [ - "none" - ], - "flags": [ - "under", - "over", - "through" - ], - "valType": "flaglist" - }, - "linepositionsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `lineposition`.", - "editType": "none", - "valType": "string" - }, - "role": "object", - "shadow": { - "arrayOk": true, - "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", - "dflt": "none", - "editType": "calc", - "valType": "string" - }, - "shadowsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `shadow`.", - "editType": "none", - "valType": "string" - }, - "size": { - "arrayOk": true, - "editType": "calc", - "min": 1, - "valType": "number" - }, - "sizesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `size`.", - "editType": "none", - "valType": "string" - }, - "style": { - "arrayOk": true, - "description": "Sets whether a font should be styled with a normal or italic face from its family.", - "dflt": "normal", - "editType": "calc", - "valType": "enumerated", - "values": [ - "normal", - "italic" - ] - }, - "stylesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `style`.", - "editType": "none", - "valType": "string" - }, - "textcase": { - "arrayOk": true, - "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", - "dflt": "normal", - "editType": "calc", - "valType": "enumerated", - "values": [ - "normal", - "word caps", - "upper", - "lower" - ] - }, - "textcasesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `textcase`.", - "editType": "none", - "valType": "string" - }, - "variant": { - "arrayOk": true, - "description": "Sets the variant of the font.", - "dflt": "normal", - "editType": "calc", - "valType": "enumerated", - "values": [ - "normal", - "small-caps", - "all-small-caps", - "all-petite-caps", - "petite-caps", - "unicase" - ] - }, - "variantsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `variant`.", - "editType": "none", - "valType": "string" - }, - "weight": { - "arrayOk": true, - "description": "Sets the weight (or boldness) of the font.", - "dflt": "normal", - "editType": "calc", - "extras": [ - "normal", - "bold" - ], - "max": 1000, - "min": 1, - "valType": "integer" - }, - "weightsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `weight`.", - "editType": "none", - "valType": "string" - } - }, - "namelength": { - "arrayOk": true, - "description": "Sets the default length (in number of characters) of the trace name in the hover labels for all traces. -1 shows the whole name regardless of length. 0-3 shows the first 0-3 characters, and an integer >3 will show the whole name if it is less than that many characters, but if it is longer, will truncate to `namelength - 3` characters and add an ellipsis.", - "dflt": 15, - "editType": "calc", - "min": -1, - "valType": "integer" - }, - "namelengthsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `namelength`.", - "editType": "none", - "valType": "string" - }, - "role": "object", - "showarrow": { - "description": "Sets whether or not to show the hover label arrow/triangle pointing to the data point.", - "dflt": true, - "editType": "calc", - "valType": "boolean" - } - }, - "ids": { - "description": "Assigns id labels to each datum. These ids for object constancy of data points during animation. Should be an array of strings, not numbers or any other type.", - "editType": "calc", - "valType": "data_array" - }, - "idssrc": { - "description": "Sets the source reference on Chart Studio Cloud for `ids`.", - "editType": "none", - "valType": "string" - }, - "legend": { - "description": "Sets the reference to a legend to show this trace in. References to these legends are *legend*, *legend2*, *legend3*, etc. Settings for these legends are set in the layout, under `layout.legend`, `layout.legend2`, etc.", - "dflt": "legend", - "editType": "style", - "valType": "subplotid" - }, - "legendgrouptitle": { - "editType": "style", - "font": { - "color": { - "editType": "style", - "valType": "color" - }, - "description": "Sets this legend group's title font.", - "editType": "style", - "family": { - "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", - "editType": "style", - "noBlank": true, - "strict": true, - "valType": "string" - }, - "lineposition": { - "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", - "dflt": "none", - "editType": "style", - "extras": [ - "none" - ], - "flags": [ - "under", - "over", - "through" - ], - "valType": "flaglist" - }, - "role": "object", - "shadow": { - "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", - "dflt": "none", - "editType": "style", - "valType": "string" - }, - "size": { - "editType": "style", - "min": 1, - "valType": "number" - }, - "style": { - "description": "Sets whether a font should be styled with a normal or italic face from its family.", - "dflt": "normal", - "editType": "style", - "valType": "enumerated", - "values": [ - "normal", - "italic" - ] - }, - "textcase": { - "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", - "dflt": "normal", - "editType": "style", - "valType": "enumerated", - "values": [ - "normal", - "word caps", - "upper", - "lower" - ] - }, - "variant": { - "description": "Sets the variant of the font.", - "dflt": "normal", - "editType": "style", - "valType": "enumerated", - "values": [ - "normal", - "small-caps", - "all-small-caps", - "all-petite-caps", - "petite-caps", - "unicase" - ] - }, - "weight": { - "description": "Sets the weight (or boldness) of the font.", - "dflt": "normal", - "editType": "style", - "extras": [ - "normal", - "bold" - ], - "max": 1000, - "min": 1, - "valType": "integer" - } - }, - "role": "object", - "text": { - "description": "Sets the title of the legend group.", - "dflt": "", - "editType": "style", - "valType": "string" - } - }, - "legendrank": { - "description": "Sets the legend rank for this trace. Items and groups with smaller ranks are presented on top/left side while with *reversed* `legend.traceorder` they are on bottom/right side. The default legendrank is 1000, so that you can use ranks less than 1000 to place certain items before all unranked items, and ranks greater than 1000 to go after all unranked items. When having unranked or equal rank items shapes would be displayed after traces i.e. according to their order in data and layout.", - "dflt": 1000, - "editType": "style", - "valType": "number" - }, - "legendwidth": { - "description": "Sets the width (in px or fraction) of the legend for this trace.", - "editType": "style", - "min": 0, - "valType": "number" - }, - "link": { - "arrowlen": { - "description": "Sets the length (in px) of the links arrow, if 0 no arrow will be drawn.", - "dflt": 0, - "editType": "calc", - "min": 0, - "valType": "number" - }, - "color": { - "arrayOk": true, - "description": "Sets the `link` color. It can be a single value, or an array for specifying color for each `link`. If `link.color` is omitted, then by default, a translucent grey link will be used.", - "editType": "calc", - "valType": "color" - }, - "colorscales": { - "items": { - "concentrationscales": { - "cmax": { - "description": "Sets the upper bound of the color domain.", - "dflt": 1, - "editType": "calc", - "valType": "number" - }, - "cmin": { - "description": "Sets the lower bound of the color domain.", - "dflt": 0, - "editType": "calc", - "valType": "number" - }, - "colorscale": { - "description": "Sets the colorscale. The colorscale must be an array containing arrays mapping a normalized value to an rgb, rgba, hex, hsl, hsv, or named color string. At minimum, a mapping for the lowest (0) and highest (1) values are required. For example, `[[0, 'rgb(0,0,255)'], [1, 'rgb(255,0,0)']]`. To control the bounds of the colorscale in color space, use `cmin` and `cmax`. Alternatively, `colorscale` may be a palette name string of the following list: Blackbody,Bluered,Blues,Cividis,Earth,Electric,Greens,Greys,Hot,Jet,Picnic,Portland,Rainbow,RdBu,Reds,Viridis,YlGnBu,YlOrRd.", - "dflt": [ - [ - 0, - "white" - ], - [ - 1, - "black" ->>>>>>> b50bcc3af (Match arrowhead attributes for annotations) - ] - }, - "rangeselector": { - "activecolor": { - "description": "Sets the background color of the active range selector button.", - "editType": "plot", - "valType": "color" - }, - "bgcolor": { - "description": "Sets the background color of the range selector buttons.", - "dflt": "#eee", - "editType": "plot", - "valType": "color" - }, - "bordercolor": { - "description": "Sets the color of the border enclosing the range selector.", - "dflt": "#444", - "editType": "plot", - "valType": "color" - }, - "borderwidth": { - "description": "Sets the width (in px) of the border enclosing the range selector.", - "dflt": 0, - "editType": "plot", - "min": 0, - "valType": "number" - }, - "buttons": { - "items": { - "button": { - "count": { - "description": "Sets the number of steps to take to update the range. Use with `step` to specify the update interval.", - "dflt": 1, - "editType": "plot", - "min": 0, - "valType": "number" - }, - "description": "Sets the specifications for each buttons. By default, a range selector comes with no buttons.", - "editType": "plot", - "label": { - "description": "Sets the text label to appear on the button.", - "editType": "plot", - "valType": "string" - }, - "name": { - "description": "When used in a template, named items are created in the output figure in addition to any items the figure already has in this array. You can modify these items in the output figure by making your own item with `templateitemname` matching this `name` alongside your modifications (including `visible: false` or `enabled: false` to hide it). Has no effect outside of a template.", - "editType": "none", - "valType": "string" - }, - "role": "object", - "step": { - "description": "The unit of measurement that the `count` value will set the range by.", - "dflt": "month", - "editType": "plot", - "valType": "enumerated", - "values": [ - "month", - "year", - "day", - "hour", - "minute", - "second", - "all" - ] - }, - "stepmode": { - "description": "Sets the range update mode. If *backward*, the range update shifts the start of range back *count* times *step* milliseconds. If *todate*, the range update shifts the start of range back to the first timestamp from *count* times *step* milliseconds back. For example, with `step` set to *year* and `count` set to *1* the range update shifts the start of the range back to January 01 of the current year. Month and year *todate* are currently available only for the built-in (Gregorian) calendar.", - "dflt": "backward", - "editType": "plot", - "valType": "enumerated", - "values": [ - "backward", - "todate" - ] - }, - "templateitemname": { - "description": "Used to refer to a named item in this array in the template. Named items from the template will be created even without a matching item in the input figure, but you can modify one by making an item with `templateitemname` matching its `name`, alongside your modifications (including `visible: false` or `enabled: false` to hide it). If there is no template or no matching item, this item will be hidden unless you explicitly show it with `visible: true`.", - "editType": "calc", - "valType": "string" - }, - "visible": { - "description": "Determines whether or not this button is visible.", - "dflt": true, - "editType": "plot", - "valType": "boolean" - } - } - }, - "role": "object" - }, - "editType": "plot", - "font": { - "color": { - "editType": "plot", - "valType": "color" - }, - "description": "Sets the font of the range selector button text.", - "editType": "plot", - "family": { - "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", - "editType": "plot", - "noBlank": true, - "strict": true, - "valType": "string" - }, - "lineposition": { - "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", - "dflt": "none", - "editType": "plot", - "extras": [ - "none" - ], - "flags": [ - "under", - "over", - "through" - ], - "valType": "flaglist" - }, - "role": "object", - "shadow": { - "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", - "dflt": "none", - "editType": "plot", - "valType": "string" - }, - "size": { - "editType": "plot", - "min": 1, - "valType": "number" - }, - "style": { - "description": "Sets whether a font should be styled with a normal or italic face from its family.", - "dflt": "normal", - "editType": "plot", - "valType": "enumerated", - "values": [ - "normal", - "italic" - ] - }, - "textcase": { - "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", - "dflt": "normal", - "editType": "plot", - "valType": "enumerated", - "values": [ - "normal", - "word caps", - "upper", - "lower" - ] - }, - "variant": { - "description": "Sets the variant of the font.", - "dflt": "normal", - "editType": "plot", - "valType": "enumerated", - "values": [ - "normal", - "small-caps", - "all-small-caps", - "all-petite-caps", - "petite-caps", - "unicase" - ] - }, - "weight": { - "description": "Sets the weight (or boldness) of the font.", - "dflt": "normal", - "editType": "plot", - "extras": [ - "normal", - "bold" - ], - "max": 1000, - "min": 1, - "valType": "integer" - } - }, - "role": "object", - "visible": { - "description": "Determines whether or not this range selector is visible. Note that range selectors are only available for x axes of `type` set to or auto-typed to *date*.", - "editType": "plot", - "valType": "boolean" - }, - "x": { - "description": "Sets the x position (in normalized coordinates) of the range selector.", - "editType": "plot", - "max": 3, - "min": -2, - "valType": "number" - }, - "xanchor": { - "description": "Sets the range selector's horizontal position anchor. This anchor binds the `x` position to the *left*, *center* or *right* of the range selector.", - "dflt": "left", - "editType": "plot", - "valType": "enumerated", - "values": [ - "auto", - "left", - "center", - "right" - ] - }, - "y": { - "description": "Sets the y position (in normalized coordinates) of the range selector.", - "editType": "plot", - "max": 3, - "min": -2, - "valType": "number" - }, - "yanchor": { - "description": "Sets the range selector's vertical position anchor This anchor binds the `y` position to the *top*, *middle* or *bottom* of the range selector.", - "dflt": "bottom", - "editType": "plot", - "valType": "enumerated", - "values": [ - "auto", - "top", - "middle", - "bottom" - ] - } - }, - "rangeslider": { - "autorange": { - "description": "Determines whether or not the range slider range is computed in relation to the input data. If `range` is provided, then `autorange` is set to *false*.", - "dflt": true, - "editType": "calc", - "impliedEdits": {}, - "valType": "boolean" - }, - "bgcolor": { - "description": "Sets the background color of the range slider.", - "dflt": "#fff", - "editType": "plot", - "valType": "color" - }, - "bordercolor": { - "description": "Sets the border color of the range slider.", - "dflt": "#444", - "editType": "plot", - "valType": "color" - }, - "borderwidth": { - "description": "Sets the border width of the range slider.", - "dflt": 0, - "editType": "plot", - "min": 0, - "valType": "integer" - }, - "editType": "calc", - "range": { - "description": "Sets the range of the range slider. If not set, defaults to the full xaxis range. If the axis `type` is *log*, then you must take the log of your desired range. If the axis `type` is *date*, it should be date strings, like date data, though Date objects and unix milliseconds will be accepted and converted to strings. If the axis `type` is *category*, it should be numbers, using the scale where each category is assigned a serial number from zero in the order it appears.", - "editType": "calc", - "impliedEdits": { - "autorange": false - }, - "items": [ - { - "editType": "calc", - "impliedEdits": { - "^autorange": false - }, - "valType": "any" - }, - { - "editType": "calc", - "impliedEdits": { - "^autorange": false - }, - "valType": "any" - } - ], - "valType": "info_array" - }, - "role": "object", - "thickness": { - "description": "The height of the range slider as a fraction of the total plot area height.", - "dflt": 0.15, - "editType": "plot", - "max": 1, - "min": 0, - "valType": "number" - }, - "visible": { - "description": "Determines whether or not the range slider will be visible. If visible, perpendicular axes will be set to `fixedrange`", - "dflt": true, - "editType": "calc", - "valType": "boolean" - }, - "yaxis": { - "_isSubplotObj": true, - "editType": "calc", - "range": { - "description": "Sets the range of this axis for the rangeslider.", - "editType": "plot", - "items": [ - { - "editType": "plot", - "valType": "any" - }, - { - "editType": "plot", - "valType": "any" - } - ], - "valType": "info_array" - }, - "rangemode": { - "description": "Determines whether or not the range of this axis in the rangeslider use the same value than in the main plot when zooming in/out. If *auto*, the autorange will be used. If *fixed*, the `range` is used. If *match*, the current range of the corresponding y-axis on the main subplot is used.", - "dflt": "match", - "editType": "calc", - "valType": "enumerated", - "values": [ - "auto", - "fixed", - "match" - ] - }, - "role": "object" - } - }, - "role": "object", - "scaleanchor": { - "description": "If set to another axis id (e.g. `x2`, `y`), the range of this axis changes together with the range of the corresponding axis such that the scale of pixels per unit is in a constant ratio. Both axes are still zoomable, but when you zoom one, the other will zoom the same amount, keeping a fixed midpoint. `constrain` and `constraintoward` determine how we enforce the constraint. You can chain these, ie `yaxis: {scaleanchor: *x*}, xaxis2: {scaleanchor: *y*}` but you can only link axes of the same `type`. The linked axis can have the opposite letter (to constrain the aspect ratio) or the same letter (to match scales across subplots). Loops (`yaxis: {scaleanchor: *x*}, xaxis: {scaleanchor: *y*}` or longer) are redundant and the last constraint encountered will be ignored to avoid possible inconsistent constraints via `scaleratio`. Note that setting axes simultaneously in both a `scaleanchor` and a `matches` constraint is currently forbidden. Setting `false` allows to remove a default constraint (occasionally, you may need to prevent a default `scaleanchor` constraint from being applied, eg. when having an image trace `yaxis: {scaleanchor: \"x\"}` is set automatically in order for pixels to be rendered as squares, setting `yaxis: {scaleanchor: false}` allows to remove the constraint).", - "editType": "plot", - "valType": "enumerated", - "values": [ - "/^x([2-9]|[1-9][0-9]+)?( domain)?$/", - "/^y([2-9]|[1-9][0-9]+)?( domain)?$/", - false - ] - }, - "scaleratio": { - "description": "If this axis is linked to another by `scaleanchor`, this determines the pixel to unit scale ratio. For example, if this value is 10, then every unit on this axis spans 10 times the number of pixels as a unit on the linked axis. Use this for example to create an elevation profile where the vertical scale is exaggerated a fixed amount with respect to the horizontal.", - "dflt": 1, - "editType": "plot", - "min": 0, - "valType": "number" - }, - "separatethousands": { - "description": "If \"true\", even 4-digit integers are separated", - "dflt": false, - "editType": "ticks", - "valType": "boolean" - }, - "showdividers": { - "description": "Determines whether or not a dividers are drawn between the category levels of this axis. Only has an effect on *multicategory* axes.", - "dflt": true, - "editType": "ticks", - "valType": "boolean" - }, - "showexponent": { - "description": "If *all*, all exponents are shown besides their significands. If *first*, only the exponent of the first tick is shown. If *last*, only the exponent of the last tick is shown. If *none*, no exponents appear.", - "dflt": "all", - "editType": "ticks", - "valType": "enumerated", - "values": [ - "all", - "first", - "last", - "none" - ] - }, - "showgrid": { - "description": "Determines whether or not grid lines are drawn. If *true*, the grid lines are drawn at every tick mark.", - "editType": "ticks", - "valType": "boolean" - }, - "showline": { - "description": "Determines whether or not a line bounding this axis is drawn.", - "dflt": false, - "editType": "ticks+layoutstyle", - "valType": "boolean" - }, - "showspikes": { - "description": "Determines whether or not spikes (aka droplines) are drawn for this axis. Note: This only takes affect when hovermode = closest", - "dflt": false, - "editType": "modebar", - "valType": "boolean" - }, - "showticklabels": { - "description": "Determines whether or not the tick labels are drawn.", - "dflt": true, - "editType": "ticks", - "valType": "boolean" - }, - "showtickprefix": { - "description": "If *all*, all tick labels are displayed with a prefix. If *first*, only the first tick is displayed with a prefix. If *last*, only the last tick is displayed with a suffix. If *none*, tick prefixes are hidden.", - "dflt": "all", - "editType": "ticks", - "valType": "enumerated", - "values": [ - "all", - "first", - "last", - "none" - ] - }, - "showticksuffix": { - "description": "Same as `showtickprefix` but for tick suffixes.", - "dflt": "all", - "editType": "ticks", - "valType": "enumerated", - "values": [ - "all", - "first", - "last", - "none" - ] - }, - "side": { - "description": "Determines whether a x (y) axis is positioned at the *bottom* (*left*) or *top* (*right*) of the plotting area.", - "editType": "plot", - "valType": "enumerated", - "values": [ - "top", - "bottom", - "left", - "right" - ] - }, - "spikecolor": { - "description": "Sets the spike color. If undefined, will use the series color", - "dflt": null, - "editType": "none", - "valType": "color" - }, - "spikedash": { - "description": "Sets the dash style of lines. Set to a dash type string (*solid*, *dot*, *dash*, *longdash*, *dashdot*, or *longdashdot*) or a dash length list in px (eg *5px,10px,2px,2px*).", - "dflt": "dash", - "editType": "none", - "valType": "string", - "values": [ - "solid", - "dot", - "dash", - "longdash", - "dashdot", - "longdashdot" - ] - }, - "spikemode": { - "description": "Determines the drawing mode for the spike line If *toaxis*, the line is drawn from the data point to the axis the series is plotted on. If *across*, the line is drawn across the entire plot area, and supercedes *toaxis*. If *marker*, then a marker dot is drawn on the axis the series is plotted on", - "dflt": "toaxis", - "editType": "none", - "flags": [ - "toaxis", - "across", - "marker" - ], - "valType": "flaglist" - }, - "spikesnap": { - "description": "Determines whether spikelines are stuck to the cursor or to the closest datapoints.", - "dflt": "hovered data", - "editType": "none", - "valType": "enumerated", - "values": [ - "data", - "cursor", - "hovered data" - ] - }, - "spikethickness": { - "description": "Sets the width (in px) of the zero line.", - "dflt": 3, - "editType": "none", - "valType": "number" - }, - "tick0": { - "description": "Sets the placement of the first tick on this axis. Use with `dtick`. If the axis `type` is *log*, then you must take the log of your starting tick (e.g. to set the starting tick to 100, set the `tick0` to 2) except when `dtick`=*L* (see `dtick` for more info). If the axis `type` is *date*, it should be a date string, like date data. If the axis `type` is *category*, it should be a number, using the scale where each category is assigned a serial number from zero in the order it appears.", - "editType": "ticks", - "impliedEdits": { - "tickmode": "linear" - }, - "valType": "any" - }, - "tickangle": { - "description": "Sets the angle of the tick labels with respect to the horizontal. For example, a `tickangle` of -90 draws the tick labels vertically.", - "dflt": "auto", - "editType": "ticks", - "valType": "angle" - }, - "tickcolor": { - "description": "Sets the tick color.", - "dflt": "#444", - "editType": "ticks", - "valType": "color" - }, - "tickfont": { - "color": { - "editType": "ticks", - "valType": "color" - }, - "description": "Sets the tick font.", - "editType": "ticks", - "family": { - "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", - "editType": "ticks", - "noBlank": true, - "strict": true, - "valType": "string" - }, - "lineposition": { - "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", - "dflt": "none", - "editType": "ticks", - "extras": [ - "none" - ], - "flags": [ - "under", - "over", - "through" - ], - "valType": "flaglist" - }, - "role": "object", - "shadow": { - "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", - "dflt": "none", - "editType": "ticks", - "valType": "string" - }, - "size": { - "editType": "ticks", - "min": 1, - "valType": "number" - }, - "style": { - "description": "Sets whether a font should be styled with a normal or italic face from its family.", - "dflt": "normal", - "editType": "ticks", - "valType": "enumerated", - "values": [ - "normal", - "italic" - ] - }, - "textcase": { - "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", - "dflt": "normal", - "editType": "ticks", - "valType": "enumerated", - "values": [ - "normal", - "word caps", - "upper", - "lower" - ] - }, - "variant": { - "description": "Sets the variant of the font.", - "dflt": "normal", - "editType": "ticks", - "valType": "enumerated", - "values": [ - "normal", - "small-caps", - "all-small-caps", - "all-petite-caps", - "petite-caps", - "unicase" - ] - }, - "weight": { - "description": "Sets the weight (or boldness) of the font.", - "dflt": "normal", - "editType": "ticks", - "extras": [ - "normal", - "bold" - ], - "max": 1000, - "min": 1, - "valType": "integer" - } - }, - "tickformat": { - "description": "Sets the tick label formatting rule using d3 formatting mini-languages which are very similar to those in Python. For numbers, see: https://github.com/d3/d3-format/tree/v1.4.5#d3-format. And for dates see: https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format. We add two items to d3's date formatter: *%h* for half of the year as a decimal number as well as *%{n}f* for fractional seconds with n digits. For example, *2016-10-13 09:15:23.456* with tickformat *%H~%M~%S.%2f* would display *09~15~23.46*", - "dflt": "", - "editType": "ticks", - "valType": "string" - }, - "tickformatstops": { - "items": { - "tickformatstop": { - "dtickrange": { - "description": "range [*min*, *max*], where *min*, *max* - dtick values which describe some zoom level, it is possible to omit *min* or *max* value by passing *null*", - "editType": "ticks", - "items": [ - { - "editType": "ticks", - "valType": "any" - }, - { - "editType": "ticks", - "valType": "any" - } - ], - "valType": "info_array" - }, - "editType": "ticks", - "enabled": { - "description": "Determines whether or not this stop is used. If `false`, this stop is ignored even within its `dtickrange`.", - "dflt": true, - "editType": "ticks", - "valType": "boolean" - }, - "name": { - "description": "When used in a template, named items are created in the output figure in addition to any items the figure already has in this array. You can modify these items in the output figure by making your own item with `templateitemname` matching this `name` alongside your modifications (including `visible: false` or `enabled: false` to hide it). Has no effect outside of a template.", - "editType": "none", - "valType": "string" - }, - "role": "object", - "templateitemname": { - "description": "Used to refer to a named item in this array in the template. Named items from the template will be created even without a matching item in the input figure, but you can modify one by making an item with `templateitemname` matching its `name`, alongside your modifications (including `visible: false` or `enabled: false` to hide it). If there is no template or no matching item, this item will be hidden unless you explicitly show it with `visible: true`.", - "editType": "calc", - "valType": "string" - }, - "value": { - "description": "string - dtickformat for described zoom level, the same as *tickformat*", - "dflt": "", - "editType": "ticks", - "valType": "string" - } - } - }, - "role": "object" - }, - "ticklabelindex": { - "arrayOk": true, - "description": "Only for axes with `type` *date* or *linear*. Instead of drawing the major tick label, draw the label for the minor tick that is n positions away from the major tick. E.g. to always draw the label for the minor tick before each major tick, choose `ticklabelindex` -1. This is useful for date axes with `ticklabelmode` *period* if you want to label the period that ends with each major tick instead of the period that begins there.", - "editType": "calc", - "valType": "integer" - }, - "ticklabelindexsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `ticklabelindex`.", - "editType": "none", - "valType": "string" - }, - "ticklabelmode": { - "description": "Determines where tick labels are drawn with respect to their corresponding ticks and grid lines. Only has an effect for axes of `type` *date* When set to *period*, tick labels are drawn in the middle of the period between ticks.", - "dflt": "instant", - "editType": "ticks", - "valType": "enumerated", - "values": [ - "instant", - "period" - ] - }, - "ticklabeloverflow": { - "description": "Determines how we handle tick labels that would overflow either the graph div or the domain of the axis. The default value for inside tick labels is *hide past domain*. Otherwise on *category* and *multicategory* axes the default is *allow*. In other cases the default is *hide past div*.", - "editType": "calc", - "valType": "enumerated", - "values": [ - "allow", - "hide past div", - "hide past domain" - ] - }, - "ticklabelposition": { - "description": "Determines where tick labels are drawn with respect to the axis. Please note that top or bottom has no effect on x axes or when `ticklabelmode` is set to *period* or when `tickson` is set to *boundaries*. Similarly, left or right has no effect on y axes or when `ticklabelmode` is set to *period* or when `tickson` is set to *boundaries*. Has no effect on *multicategory* axes. When used on axes linked by `matches` or `scaleanchor`, no extra padding for inside labels would be added by autorange, so that the scales could match.", - "dflt": "outside", - "editType": "calc", - "valType": "enumerated", - "values": [ - "outside", - "inside", - "outside top", - "inside top", - "outside left", - "inside left", - "outside right", - "inside right", - "outside bottom", - "inside bottom" - ] - }, - "ticklabelshift": { - "description": "Shifts the tick labels by the specified number of pixels in parallel to the axis. Positive values move the labels in the positive direction of the axis.", - "dflt": 0, - "editType": "ticks", - "valType": "integer" - }, - "ticklabelstandoff": { - "description": "Sets the standoff distance (in px) between the axis tick labels and their default position. A positive `ticklabelstandoff` moves the labels farther away from the plot area if `ticklabelposition` is *outside*, and deeper into the plot area if `ticklabelposition` is *inside*. A negative `ticklabelstandoff` works in the opposite direction, moving outside ticks towards the plot area and inside ticks towards the outside. If the negative value is large enough, inside ticks can even end up outside and vice versa.", - "dflt": 0, - "editType": "ticks", - "valType": "integer" - }, - "ticklabelstep": { - "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", - "dflt": 1, - "editType": "ticks", - "min": 1, - "valType": "integer" - }, - "ticklen": { - "description": "Sets the tick length (in px).", - "dflt": 5, - "editType": "ticks", - "min": 0, - "valType": "number" - }, - "tickmode": { - "description": "Sets the tick mode for this axis. If *auto*, the number of ticks is set via `nticks`. If *linear*, the placement of the ticks is determined by a starting position `tick0` and a tick step `dtick` (*linear* is the default value if `tick0` and `dtick` are provided). If *array*, the placement of the ticks is set via `tickvals` and the tick text is `ticktext`. (*array* is the default value if `tickvals` is provided). If *sync*, the number of ticks will sync with the overlayed axis set by `overlaying` property.", - "editType": "ticks", - "impliedEdits": {}, - "valType": "enumerated", - "values": [ - "auto", - "linear", - "array", - "sync" - ] - }, - "tickprefix": { - "description": "Sets a tick label prefix.", - "dflt": "", - "editType": "ticks", - "valType": "string" - }, - "ticks": { - "description": "Determines whether ticks are drawn or not. If **, this axis' ticks are not drawn. If *outside* (*inside*), this axis' are drawn outside (inside) the axis lines.", - "editType": "ticks", - "valType": "enumerated", - "values": [ - "outside", - "inside", - "" - ] - }, - "tickson": { - "description": "Determines where ticks and grid lines are drawn with respect to their corresponding tick labels. Only has an effect for axes of `type` *category* or *multicategory*. When set to *boundaries*, ticks and grid lines are drawn half a category to the left/bottom of labels.", - "dflt": "labels", - "editType": "ticks", - "valType": "enumerated", - "values": [ - "labels", - "boundaries" - ] - }, - "ticksuffix": { - "description": "Sets a tick label suffix.", - "dflt": "", - "editType": "ticks", - "valType": "string" - }, - "ticktext": { - "description": "Sets the text displayed at the ticks position via `tickvals`. Only has an effect if `tickmode` is set to *array*. Used with `tickvals`.", - "editType": "ticks", - "valType": "data_array" - }, - "ticktextsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `ticktext`.", - "editType": "none", - "valType": "string" - }, - "tickvals": { - "description": "Sets the values at which ticks on this axis appear. Only has an effect if `tickmode` is set to *array*. Used with `ticktext`.", - "editType": "ticks", - "valType": "data_array" - }, - "tickvalssrc": { - "description": "Sets the source reference on Chart Studio Cloud for `tickvals`.", - "editType": "none", - "valType": "string" - }, - "tickwidth": { - "description": "Sets the tick width (in px).", - "dflt": 1, - "editType": "ticks", - "min": 0, - "valType": "number" - }, - "title": { - "editType": "ticks", - "font": { - "color": { - "editType": "ticks", - "valType": "color" - }, - "description": "Sets this axis' title font.", - "editType": "ticks", - "family": { - "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", - "editType": "ticks", - "noBlank": true, - "strict": true, - "valType": "string" - }, - "lineposition": { - "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", - "dflt": "none", - "editType": "ticks", - "extras": [ - "none" - ], - "flags": [ - "under", - "over", - "through" - ], - "valType": "flaglist" - }, - "role": "object", - "shadow": { - "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", - "dflt": "none", - "editType": "ticks", - "valType": "string" - }, - "size": { - "editType": "ticks", - "min": 1, - "valType": "number" - }, - "style": { - "description": "Sets whether a font should be styled with a normal or italic face from its family.", - "dflt": "normal", - "editType": "ticks", - "valType": "enumerated", - "values": [ - "normal", - "italic" - ] - }, - "textcase": { - "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", - "dflt": "normal", - "editType": "ticks", - "valType": "enumerated", - "values": [ - "normal", - "word caps", - "upper", - "lower" - ] - }, - "variant": { - "description": "Sets the variant of the font.", - "dflt": "normal", - "editType": "ticks", - "valType": "enumerated", - "values": [ - "normal", - "small-caps", - "all-small-caps", - "all-petite-caps", - "petite-caps", - "unicase" - ] - }, - "weight": { - "description": "Sets the weight (or boldness) of the font.", - "dflt": "normal", - "editType": "ticks", - "extras": [ - "normal", - "bold" - ], - "max": 1000, - "min": 1, - "valType": "integer" - } - }, - "role": "object", - "standoff": { - "description": "Sets the standoff distance (in px) between the axis labels and the title text The default value is a function of the axis tick labels, the title `font.size` and the axis `linewidth`. Note that the axis title position is always constrained within the margins, so the actual standoff distance is always less than the set or default value. By setting `standoff` and turning on `automargin`, plotly.js will push the margins to fit the axis title at given standoff distance.", - "editType": "ticks", - "min": 0, - "valType": "number" - }, - "text": { - "description": "Sets the title of this axis.", - "editType": "ticks", - "valType": "string" - } - }, -<<<<<<< HEAD -======= - "role": "object", - "shadow": { - "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", - "dflt": "none", - "editType": "calc", - "valType": "string" - }, - "size": { - "editType": "calc", - "min": 1, - "valType": "number" - }, - "style": { - "description": "Sets whether a font should be styled with a normal or italic face from its family.", - "dflt": "normal", - "editType": "calc", - "valType": "enumerated", - "values": [ - "normal", - "italic" - ] - }, - "textcase": { - "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", - "dflt": "normal", - "editType": "calc", - "valType": "enumerated", - "values": [ - "normal", - "word caps", - "upper", - "lower" - ] - }, - "variant": { - "description": "Sets the variant of the font.", - "dflt": "normal", - "editType": "calc", - "valType": "enumerated", - "values": [ - "normal", - "small-caps", - "all-small-caps", - "all-petite-caps", - "petite-caps", - "unicase" - ] - }, - "weight": { - "description": "Sets the weight (or boldness) of the font.", - "dflt": "normal", - "editType": "calc", - "extras": [ - "normal", - "bold" - ], - "max": 1000, - "min": 1, - "valType": "integer" - } - }, - "role": "object", - "side": { - "description": "Determines the location of color bar's title with respect to the color bar. Defaults to *top* when `orientation` if *v* and defaults to *right* when `orientation` if *h*.", - "editType": "calc", - "valType": "enumerated", - "values": [ - "right", - "top", - "bottom" - ] - }, - "text": { - "description": "Sets the title of the color bar.", - "editType": "calc", - "valType": "string" - } - }, - "x": { - "description": "Sets the x position with respect to `xref` of the color bar (in plot fraction). When `xref` is *paper*, defaults to 1.02 when `orientation` is *v* and 0.5 when `orientation` is *h*. When `xref` is *container*, defaults to *1* when `orientation` is *v* and 0.5 when `orientation` is *h*. Must be between *0* and *1* if `xref` is *container* and between *-2* and *3* if `xref` is *paper*.", - "editType": "calc", - "valType": "number" - }, - "xanchor": { - "description": "Sets this color bar's horizontal position anchor. This anchor binds the `x` position to the *left*, *center* or *right* of the color bar. Defaults to *left* when `orientation` is *v* and *center* when `orientation` is *h*.", - "editType": "calc", - "valType": "enumerated", - "values": [ - "left", - "center", - "right" - ] - }, - "xpad": { - "description": "Sets the amount of padding (in px) along the x direction.", - "dflt": 10, - "editType": "calc", - "min": 0, - "valType": "number" - }, - "xref": { - "description": "Sets the container `x` refers to. *container* spans the entire `width` of the plot. *paper* refers to the width of the plotting area only.", - "dflt": "paper", - "editType": "calc", - "valType": "enumerated", - "values": [ - "container", - "paper" - ] - }, - "y": { - "description": "Sets the y position with respect to `yref` of the color bar (in plot fraction). When `yref` is *paper*, defaults to 0.5 when `orientation` is *v* and 1.02 when `orientation` is *h*. When `yref` is *container*, defaults to 0.5 when `orientation` is *v* and 1 when `orientation` is *h*. Must be between *0* and *1* if `yref` is *container* and between *-2* and *3* if `yref` is *paper*.", - "editType": "calc", - "valType": "number" - }, - "yanchor": { - "description": "Sets this color bar's vertical position anchor This anchor binds the `y` position to the *top*, *middle* or *bottom* of the color bar. Defaults to *middle* when `orientation` is *v* and *bottom* when `orientation` is *h*.", - "editType": "calc", - "valType": "enumerated", - "values": [ - "top", - "middle", - "bottom" - ] - }, - "ypad": { - "description": "Sets the amount of padding (in px) along the y direction.", - "dflt": 10, - "editType": "calc", - "min": 0, - "valType": "number" - }, - "yref": { - "description": "Sets the container `y` refers to. *container* spans the entire `height` of the plot. *paper* refers to the height of the plotting area only.", - "dflt": "paper", - "editType": "calc", - "valType": "enumerated", - "values": [ - "container", - "paper" - ] - } - }, - "colorscale": { - "description": "Sets the colorscale. Has an effect only if in `marker.color` is set to a numerical array. The colorscale must be an array containing arrays mapping a normalized value to an rgb, rgba, hex, hsl, hsv, or named color string. At minimum, a mapping for the lowest (0) and highest (1) values are required. For example, `[[0, 'rgb(0,0,255)'], [1, 'rgb(255,0,0)']]`. To control the bounds of the colorscale in color space, use `marker.cmin` and `marker.cmax`. Alternatively, `colorscale` may be a palette name string of the following list: Blackbody,Bluered,Blues,Cividis,Earth,Electric,Greens,Greys,Hot,Jet,Picnic,Portland,Rainbow,RdBu,Reds,Viridis,YlGnBu,YlOrRd.", - "dflt": null, - "editType": "calc", - "impliedEdits": { - "autocolorscale": false - }, - "valType": "colorscale" - }, - "colorsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `color`.", - "editType": "none", - "valType": "string" - }, - "editType": "calc", - "opacity": { - "arrayOk": true, - "description": "Sets the marker opacity.", - "editType": "calc", - "max": 1, - "min": 0, - "valType": "number" - }, - "opacitysrc": { - "description": "Sets the source reference on Chart Studio Cloud for `opacity`.", - "editType": "none", - "valType": "string" - }, - "reversescale": { - "description": "Reverses the color mapping if true. Has an effect only if in `marker.color` is set to a numerical array. If true, `marker.cmin` will correspond to the last color in the array and `marker.cmax` will correspond to the first color.", - "dflt": false, - "editType": "calc", - "valType": "boolean" - }, - "role": "object", - "showscale": { - "description": "Determines whether or not a colorbar is displayed for this trace. Has an effect only if in `marker.color` is set to a numerical array.", - "dflt": false, - "editType": "calc", - "valType": "boolean" - }, - "size": { - "arrayOk": true, - "description": "Sets the marker size (in px).", - "dflt": 6, - "editType": "calc", - "min": 0, - "valType": "number" - }, - "sizemin": { - "description": "Has an effect only if `marker.size` is set to a numerical array. Sets the minimum size (in px) of the rendered marker points.", - "dflt": 0, - "editType": "calc", - "min": 0, - "valType": "number" - }, - "sizemode": { - "description": "Has an effect only if `marker.size` is set to a numerical array. Sets the rule for which the data in `size` is converted to pixels.", - "dflt": "diameter", - "editType": "calc", - "valType": "enumerated", - "values": [ - "diameter", - "area" - ] - }, - "sizeref": { - "description": "Has an effect only if `marker.size` is set to a numerical array. Sets the scale factor used to determine the rendered size of marker points. Use with `sizemin` and `sizemode`.", - "dflt": 1, - "editType": "calc", - "valType": "number" - }, - "sizesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `size`.", - "editType": "none", - "valType": "string" - }, - "symbol": { - "arrayOk": true, - "description": "Sets the marker symbol. Full list: https://www.mapbox.com/maki-icons/ Note that the array `marker.color` and `marker.size` are only available for *circle* symbols.", - "dflt": "circle", - "editType": "calc", - "valType": "string" - }, - "symbolsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `symbol`.", - "editType": "none", - "valType": "string" - } - }, - "meta": { - "arrayOk": true, - "description": "Assigns extra meta information associated with this trace that can be used in various text attributes. Attributes such as trace `name`, graph, axis and colorbar `title.text`, annotation `text` `rangeselector`, `updatemenues` and `sliders` `label` text all support `meta`. To access the trace `meta` values in an attribute in the same trace, simply use `%{meta[i]}` where `i` is the index or key of the `meta` item in question. To access trace `meta` in layout attributes, use `%{data[n[.meta[i]}` where `i` is the index or key of the `meta` and `n` is the trace index.", - "editType": "plot", - "valType": "any" - }, - "metasrc": { - "description": "Sets the source reference on Chart Studio Cloud for `meta`.", - "editType": "none", - "valType": "string" - }, - "mode": { - "description": "Determines the drawing mode for this scatter trace. If the provided `mode` includes *text* then the `text` elements appear at the coordinates. Otherwise, the `text` elements appear on hover.", - "dflt": "markers", - "editType": "calc", - "extras": [ - "none" - ], - "flags": [ - "lines", - "markers", - "text" - ], - "valType": "flaglist" - }, - "name": { - "description": "Sets the trace name. The trace name appears as the legend item and on hover.", - "editType": "style", - "valType": "string" - }, - "opacity": { - "description": "Sets the opacity of the trace.", - "dflt": 1, - "editType": "style", - "max": 1, - "min": 0, - "valType": "number" - }, - "selected": { - "editType": "calc", - "marker": { - "color": { - "description": "Sets the marker color of selected points.", - "editType": "calc", - "valType": "color" - }, - "editType": "calc", - "opacity": { - "description": "Sets the marker opacity of selected points.", - "editType": "calc", - "max": 1, - "min": 0, - "valType": "number" - }, - "role": "object", - "size": { - "description": "Sets the marker size of selected points.", - "editType": "calc", - "min": 0, - "valType": "number" - } - }, - "role": "object" - }, - "selectedpoints": { - "description": "Array containing integer indices of selected points. Has an effect only for traces that support selections. Note that an empty array means an empty selection where the `unselected` are turned on for all points, whereas, any other non-array values means no selection all where the `selected` and `unselected` styles have no effect.", - "editType": "calc", - "valType": "any" - }, - "showlegend": { - "description": "Determines whether or not an item corresponding to this trace is shown in the legend.", - "dflt": true, - "editType": "style", - "valType": "boolean" - }, - "stream": { - "editType": "calc", - "maxpoints": { - "description": "Sets the maximum number of points to keep on the plots from an incoming stream. If `maxpoints` is set to *50*, only the newest 50 points will be displayed on the plot.", - "dflt": 500, - "editType": "calc", - "max": 10000, - "min": 0, - "valType": "number" - }, - "role": "object", - "token": { - "description": "The stream id number links a data trace on a plot with a stream. See https://chart-studio.plotly.com/settings for more details.", - "editType": "calc", - "noBlank": true, - "strict": true, - "valType": "string" - } - }, - "subplot": { - "description": "Sets a reference between this trace's data coordinates and a map subplot. If *map* (the default value), the data refer to `layout.map`. If *map2*, the data refer to `layout.map2`, and so on.", - "dflt": "map", - "editType": "calc", - "valType": "subplotid" - }, - "text": { - "arrayOk": true, - "description": "Sets text elements associated with each (lon,lat) pair If a single string, the same string appears over all the data points. If an array of string, the items are mapped in order to the this trace's (lon,lat) coordinates. If trace `hoverinfo` contains a *text* flag and *hovertext* is not set, these elements will be seen in the hover labels.", - "dflt": "", - "editType": "calc", - "valType": "string" - }, - "textfont": { - "color": { - "editType": "calc", - "valType": "color" - }, - "description": "Sets the icon text font (color=map.layer.paint.text-color, size=map.layer.layout.text-size). Has an effect only when `type` is set to *symbol*.", - "editType": "calc", - "family": { - "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", - "dflt": "Open Sans Regular, Arial Unicode MS Regular", - "editType": "calc", - "noBlank": true, - "strict": true, - "valType": "string" - }, - "role": "object", - "size": { - "editType": "calc", - "min": 1, - "valType": "number" - }, - "style": { - "description": "Sets whether a font should be styled with a normal or italic face from its family.", - "dflt": "normal", - "editType": "calc", - "valType": "enumerated", - "values": [ - "normal", - "italic" - ] - }, - "weight": { - "description": "Sets the weight (or boldness) of the font.", - "dflt": "normal", - "editType": "calc", - "extras": [ - "normal", - "bold" - ], - "max": 1000, - "min": 1, - "valType": "integer" - } - }, - "textposition": { - "arrayOk": false, - "description": "Sets the positions of the `text` elements with respects to the (x,y) coordinates.", - "dflt": "middle center", - "editType": "calc", - "valType": "enumerated", - "values": [ - "top left", - "top center", - "top right", - "middle left", - "middle center", - "middle right", - "bottom left", - "bottom center", - "bottom right" - ] - }, - "textsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `text`.", - "editType": "none", - "valType": "string" - }, - "texttemplate": { - "arrayOk": true, - "description": "Template string used for rendering the information text that appears on points. Note that this will override `textinfo`. Variables are inserted using %{variable}, for example \"y: %{y}\". Numbers are formatted using d3-format's syntax %{variable:d3-format}, for example \"Price: %{y:$.2f}\". https://github.com/d3/d3-format/tree/v1.4.5#d3-format for details on the formatting syntax. Dates are formatted using d3-time-format's syntax %{variable|d3-time-format}, for example \"Day: %{2019-01-01|%A}\". https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format for details on the date formatting syntax. Variables that can't be found will be replaced with the specifier. For example, a template of \"data: %{x}, %{y}\" will result in a value of \"data: 1, %{y}\" if x is 1 and y is missing. Variables with an undefined value will be replaced with the fallback value. All attributes that can be specified per-point (the ones that are `arrayOk: true`) are available. Finally, the template string has access to variables `lat`, `lon` and `text`.", - "dflt": "", - "editType": "calc", - "valType": "string" - }, - "texttemplatefallback": { - "description": "Fallback string that's displayed when a variable referenced in a template is missing. If the boolean value 'false' is passed in, the specifier with the missing variable will be displayed.", - "dflt": "-", - "editType": "calc", - "valType": "any" - }, - "texttemplatesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `texttemplate`.", - "editType": "none", - "valType": "string" - }, - "type": "scattermap", - "uid": { - "description": "Assign an id to this trace, Use this to provide object constancy between traces during animations and transitions.", - "editType": "plot", - "valType": "string" - }, - "uirevision": { - "description": "Controls persistence of some user-driven changes to the trace: `constraintrange` in `parcoords` traces, as well as some `editable: true` modifications such as `name` and `colorbar.title`. Defaults to `layout.uirevision`. Note that other user-driven trace attribute changes are controlled by `layout` attributes: `trace.visible` is controlled by `layout.legend.uirevision`, `selectedpoints` is controlled by `layout.selectionrevision`, and `colorbar.(x|y)` (accessible with `config: {editable: true}`) is controlled by `layout.editrevision`. Trace changes are tracked by `uid`, which only falls back on trace index if no `uid` is provided. So if your app can add/remove traces before the end of the `data` array, such that the same trace has a different index, you can still preserve user-driven changes if you give each trace a `uid` that stays with it as it moves.", - "editType": "none", - "valType": "any" - }, - "unselected": { - "editType": "calc", - "marker": { - "color": { - "description": "Sets the marker color of unselected points, applied only when a selection exists.", - "editType": "calc", - "valType": "color" - }, - "editType": "calc", - "opacity": { - "description": "Sets the marker opacity of unselected points, applied only when a selection exists.", - "editType": "calc", - "max": 1, - "min": 0, - "valType": "number" - }, - "role": "object", - "size": { - "description": "Sets the marker size of unselected points, applied only when a selection exists.", - "editType": "calc", - "min": 0, - "valType": "number" - } - }, - "role": "object" - }, - "visible": { - "description": "Determines whether or not this trace is visible. If *legendonly*, the trace is not drawn, but can appear as a legend item (provided that the legend itself is visible).", - "dflt": true, - "editType": "calc", - "valType": "enumerated", - "values": [ - true, - false, - "legendonly" - ] - } - }, - "categories": [ - "map", - "gl", - "symbols", - "showLegend", - "scatter-like" - ], - "meta": { - "description": "The data visualized as scatter point, lines or marker symbols on a MapLibre GL geographic map is provided by longitude/latitude pairs in `lon` and `lat`.", - "hrName": "scatter_map" - }, - "type": "scattermap" - }, - "scattermapbox": { - "animatable": false, - "attributes": { - "below": { - "description": "Determines if this scattermapbox trace's layers are to be inserted before the layer with the specified ID. By default, scattermapbox layers are inserted above all the base layers. To place the scattermapbox layers above every other layer, set `below` to *''*.", - "editType": "calc", - "valType": "string" - }, - "cluster": { - "color": { - "arrayOk": true, - "description": "Sets the color for each cluster step.", - "editType": "calc", - "valType": "color" - }, - "colorsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `color`.", - "editType": "none", - "valType": "string" - }, - "editType": "calc", - "enabled": { - "description": "Determines whether clustering is enabled or disabled.", - "editType": "calc", - "valType": "boolean" - }, - "maxzoom": { - "description": "Sets the maximum zoom level. At zoom levels equal to or greater than this, points will never be clustered.", - "dflt": 24, - "editType": "calc", - "max": 24, - "min": 0, - "valType": "number" - }, - "opacity": { - "arrayOk": true, - "description": "Sets the marker opacity.", - "dflt": 1, - "editType": "calc", - "max": 1, - "min": 0, - "valType": "number" - }, - "opacitysrc": { - "description": "Sets the source reference on Chart Studio Cloud for `opacity`.", - "editType": "none", - "valType": "string" - }, - "role": "object", - "size": { - "arrayOk": true, - "description": "Sets the size for each cluster step.", - "dflt": 20, - "editType": "calc", - "min": 0, - "valType": "number" - }, - "sizesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `size`.", - "editType": "none", - "valType": "string" - }, - "step": { - "arrayOk": true, - "description": "Sets how many points it takes to create a cluster or advance to the next cluster step. Use this in conjunction with arrays for `size` and / or `color`. If an integer, steps start at multiples of this number. If an array, each step extends from the given value until one less than the next value.", - "dflt": -1, - "editType": "calc", - "min": -1, - "valType": "number" - }, - "stepsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `step`.", - "editType": "none", - "valType": "string" - } - }, - "connectgaps": { - "description": "Determines whether or not gaps (i.e. {nan} or missing values) in the provided data arrays are connected.", - "dflt": false, - "editType": "calc", - "valType": "boolean" - }, - "customdata": { - "description": "Assigns extra data each datum. This may be useful when listening to hover, click and selection events. Note that, *scatter* traces also appends customdata items in the markers DOM elements", - "editType": "calc", - "valType": "data_array" - }, - "customdatasrc": { - "description": "Sets the source reference on Chart Studio Cloud for `customdata`.", - "editType": "none", - "valType": "string" - }, - "fill": { - "description": "Sets the area to fill with a solid color. Use with `fillcolor` if not *none*. *toself* connects the endpoints of the trace (or each segment of the trace if it has gaps) into a closed shape.", - "dflt": "none", - "editType": "calc", - "valType": "enumerated", - "values": [ - "none", - "toself" - ] - }, - "fillcolor": { - "description": "Sets the fill color. Defaults to a half-transparent variant of the line color, marker color, or marker line color, whichever is available.", - "editType": "calc", - "valType": "color" - }, - "hoverinfo": { - "arrayOk": true, - "description": "Determines which trace information appear on hover. If `none` or `skip` are set, no information is displayed upon hovering. But, if `none` is set, click and hover events are still fired.", - "dflt": "all", - "editType": "calc", - "extras": [ - "all", - "none", - "skip" - ], - "flags": [ - "lon", - "lat", - "text", - "name" - ], - "valType": "flaglist" - }, - "hoverinfosrc": { - "description": "Sets the source reference on Chart Studio Cloud for `hoverinfo`.", - "editType": "none", - "valType": "string" - }, - "hoverlabel": { - "align": { - "arrayOk": true, - "description": "Sets the horizontal alignment of the text content within hover label box. Has an effect only if the hover label text spans more two or more lines", - "dflt": "auto", - "editType": "none", - "valType": "enumerated", - "values": [ - "left", - "right", - "auto" - ] - }, - "alignsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `align`.", - "editType": "none", - "valType": "string" - }, - "bgcolor": { - "arrayOk": true, - "description": "Sets the background color of the hover labels for this trace", - "editType": "none", - "valType": "color" - }, - "bgcolorsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `bgcolor`.", - "editType": "none", - "valType": "string" - }, - "bordercolor": { - "arrayOk": true, - "description": "Sets the border color of the hover labels for this trace.", - "editType": "none", - "valType": "color" - }, - "bordercolorsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `bordercolor`.", - "editType": "none", - "valType": "string" - }, - "editType": "none", - "font": { - "color": { - "arrayOk": true, - "editType": "none", - "valType": "color" - }, - "colorsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `color`.", - "editType": "none", - "valType": "string" - }, - "description": "Sets the font used in hover labels.", - "editType": "none", - "family": { - "arrayOk": true, - "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", - "editType": "none", - "noBlank": true, - "strict": true, - "valType": "string" - }, - "familysrc": { - "description": "Sets the source reference on Chart Studio Cloud for `family`.", - "editType": "none", - "valType": "string" - }, - "lineposition": { - "arrayOk": true, - "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", - "dflt": "none", - "editType": "none", - "extras": [ - "none" - ], - "flags": [ - "under", - "over", - "through" - ], - "valType": "flaglist" - }, - "linepositionsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `lineposition`.", - "editType": "none", - "valType": "string" - }, - "role": "object", - "shadow": { - "arrayOk": true, - "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", - "dflt": "none", - "editType": "none", - "valType": "string" - }, - "shadowsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `shadow`.", - "editType": "none", - "valType": "string" - }, - "size": { - "arrayOk": true, - "editType": "none", - "min": 1, - "valType": "number" - }, - "sizesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `size`.", - "editType": "none", - "valType": "string" - }, - "style": { - "arrayOk": true, - "description": "Sets whether a font should be styled with a normal or italic face from its family.", - "dflt": "normal", - "editType": "none", - "valType": "enumerated", - "values": [ - "normal", - "italic" - ] - }, - "stylesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `style`.", - "editType": "none", - "valType": "string" - }, - "textcase": { - "arrayOk": true, - "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", - "dflt": "normal", - "editType": "none", - "valType": "enumerated", - "values": [ - "normal", - "word caps", - "upper", - "lower" - ] - }, - "textcasesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `textcase`.", - "editType": "none", - "valType": "string" - }, - "variant": { - "arrayOk": true, - "description": "Sets the variant of the font.", - "dflt": "normal", - "editType": "none", - "valType": "enumerated", - "values": [ - "normal", - "small-caps", - "all-small-caps", - "all-petite-caps", - "petite-caps", - "unicase" - ] - }, - "variantsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `variant`.", - "editType": "none", - "valType": "string" - }, - "weight": { - "arrayOk": true, - "description": "Sets the weight (or boldness) of the font.", - "dflt": "normal", - "editType": "none", - "extras": [ - "normal", - "bold" - ], - "max": 1000, - "min": 1, - "valType": "integer" - }, - "weightsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `weight`.", - "editType": "none", - "valType": "string" - } - }, - "namelength": { - "arrayOk": true, - "description": "Sets the default length (in number of characters) of the trace name in the hover labels for all traces. -1 shows the whole name regardless of length. 0-3 shows the first 0-3 characters, and an integer >3 will show the whole name if it is less than that many characters, but if it is longer, will truncate to `namelength - 3` characters and add an ellipsis.", - "dflt": 15, - "editType": "none", - "min": -1, - "valType": "integer" - }, - "namelengthsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `namelength`.", - "editType": "none", - "valType": "string" - }, - "role": "object", - "showarrow": { - "description": "Sets whether or not to show the hover label arrow/triangle pointing to the data point.", - "dflt": true, - "editType": "none", - "valType": "boolean" - } - }, - "hovertemplate": { - "arrayOk": true, - "description": "Template string used for rendering the information that appear on hover box. Note that this will override `hoverinfo`. Variables are inserted using %{variable}, for example \"y: %{y}\" as well as %{xother}, {%_xother}, {%_xother_}, {%xother_}. When showing info for several points, *xother* will be added to those with different x positions from the first point. An underscore before or after *(x|y)other* will add a space on that side, only when this field is shown. Numbers are formatted using d3-format's syntax %{variable:d3-format}, for example \"Price: %{y:$.2f}\". https://github.com/d3/d3-format/tree/v1.4.5#d3-format for details on the formatting syntax. Dates are formatted using d3-time-format's syntax %{variable|d3-time-format}, for example \"Day: %{2019-01-01|%A}\". https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format for details on the date formatting syntax. Variables that can't be found will be replaced with the specifier. For example, a template of \"data: %{x}, %{y}\" will result in a value of \"data: 1, %{y}\" if x is 1 and y is missing. Variables with an undefined value will be replaced with the fallback value. The variables available in `hovertemplate` are the ones emitted as event data described at this link https://plotly.com/javascript/plotlyjs-events/#event-data. Additionally, all attributes that can be specified per-point (the ones that are `arrayOk: true`) are available. Anything contained in tag `` is displayed in the secondary box, for example `%{fullData.name}`. To hide the secondary box completely, use an empty tag ``.", - "dflt": "", - "editType": "calc", - "valType": "string" - }, - "hovertemplatefallback": { - "description": "Fallback string that's displayed when a variable referenced in a template is missing. If the boolean value 'false' is passed in, the specifier with the missing variable will be displayed.", - "dflt": "-", - "editType": "calc", - "valType": "any" - }, - "hovertemplatesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `hovertemplate`.", - "editType": "none", - "valType": "string" - }, - "hovertext": { - "arrayOk": true, - "description": "Sets hover text elements associated with each (lon,lat) pair If a single string, the same string appears over all the data points. If an array of string, the items are mapped in order to the this trace's (lon,lat) coordinates. To be seen, trace `hoverinfo` must contain a *text* flag.", - "dflt": "", - "editType": "calc", - "valType": "string" - }, - "hovertextsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `hovertext`.", - "editType": "none", - "valType": "string" - }, - "ids": { - "description": "Assigns id labels to each datum. These ids for object constancy of data points during animation. Should be an array of strings, not numbers or any other type.", - "editType": "calc", - "valType": "data_array" - }, - "idssrc": { - "description": "Sets the source reference on Chart Studio Cloud for `ids`.", - "editType": "none", - "valType": "string" - }, - "lat": { - "description": "Sets the latitude coordinates (in degrees North).", - "editType": "calc", - "valType": "data_array" - }, - "latsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `lat`.", - "editType": "none", - "valType": "string" - }, - "legend": { - "description": "Sets the reference to a legend to show this trace in. References to these legends are *legend*, *legend2*, *legend3*, etc. Settings for these legends are set in the layout, under `layout.legend`, `layout.legend2`, etc.", - "dflt": "legend", - "editType": "style", - "valType": "subplotid" - }, - "legendgroup": { - "description": "Sets the legend group for this trace. Traces and shapes part of the same legend group hide/show at the same time when toggling legend items.", - "dflt": "", - "editType": "style", - "valType": "string" - }, - "legendgrouptitle": { - "editType": "style", - "font": { - "color": { - "editType": "style", - "valType": "color" - }, - "description": "Sets this legend group's title font.", - "editType": "style", - "family": { - "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", - "editType": "style", - "noBlank": true, - "strict": true, - "valType": "string" - }, - "lineposition": { - "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", - "dflt": "none", - "editType": "style", - "extras": [ - "none" - ], - "flags": [ - "under", - "over", - "through" - ], - "valType": "flaglist" - }, - "role": "object", - "shadow": { - "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", - "dflt": "none", - "editType": "style", - "valType": "string" - }, - "size": { - "editType": "style", - "min": 1, - "valType": "number" - }, - "style": { - "description": "Sets whether a font should be styled with a normal or italic face from its family.", - "dflt": "normal", - "editType": "style", - "valType": "enumerated", - "values": [ - "normal", - "italic" - ] - }, - "textcase": { - "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", - "dflt": "normal", - "editType": "style", - "valType": "enumerated", - "values": [ - "normal", - "word caps", - "upper", - "lower" - ] - }, - "variant": { - "description": "Sets the variant of the font.", - "dflt": "normal", - "editType": "style", - "valType": "enumerated", - "values": [ - "normal", - "small-caps", - "all-small-caps", - "all-petite-caps", - "petite-caps", - "unicase" - ] - }, - "weight": { - "description": "Sets the weight (or boldness) of the font.", - "dflt": "normal", - "editType": "style", - "extras": [ - "normal", - "bold" - ], - "max": 1000, - "min": 1, - "valType": "integer" - } - }, - "role": "object", - "text": { - "description": "Sets the title of the legend group.", - "dflt": "", - "editType": "style", - "valType": "string" - } - }, - "legendrank": { - "description": "Sets the legend rank for this trace. Items and groups with smaller ranks are presented on top/left side while with *reversed* `legend.traceorder` they are on bottom/right side. The default legendrank is 1000, so that you can use ranks less than 1000 to place certain items before all unranked items, and ranks greater than 1000 to go after all unranked items. When having unranked or equal rank items shapes would be displayed after traces i.e. according to their order in data and layout.", - "dflt": 1000, - "editType": "style", - "valType": "number" - }, - "legendwidth": { - "description": "Sets the width (in px or fraction) of the legend for this trace.", - "editType": "style", - "min": 0, - "valType": "number" - }, - "line": { - "color": { - "description": "Sets the line color.", - "editType": "calc", - "valType": "color" - }, - "editType": "calc", - "role": "object", - "width": { - "description": "Sets the line width (in px).", - "dflt": 2, - "editType": "calc", - "min": 0, - "valType": "number" - } - }, - "lon": { - "description": "Sets the longitude coordinates (in degrees East).", - "editType": "calc", - "valType": "data_array" - }, - "lonsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `lon`.", - "editType": "none", - "valType": "string" - }, - "marker": { - "allowoverlap": { - "description": "Flag to draw all symbols, even if they overlap.", - "dflt": false, - "editType": "calc", - "valType": "boolean" - }, - "angle": { - "arrayOk": true, - "description": "Sets the marker orientation from true North, in degrees clockwise. When using the *auto* default, no rotation would be applied in perspective views which is different from using a zero angle.", - "dflt": "auto", - "editType": "calc", - "valType": "number" - }, - "anglesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `angle`.", - "editType": "none", - "valType": "string" - }, - "autocolorscale": { - "description": "Determines whether the colorscale is a default palette (`autocolorscale: true`) or the palette determined by `marker.colorscale`. Has an effect only if in `marker.color` is set to a numerical array. In case `colorscale` is unspecified or `autocolorscale` is true, the default palette will be chosen according to whether numbers in the `color` array are all positive, all negative or mixed.", - "dflt": true, - "editType": "calc", - "impliedEdits": {}, - "valType": "boolean" - }, - "cauto": { - "description": "Determines whether or not the color domain is computed with respect to the input data (here in `marker.color`) or the bounds set in `marker.cmin` and `marker.cmax` Has an effect only if in `marker.color` is set to a numerical array. Defaults to `false` when `marker.cmin` and `marker.cmax` are set by the user.", - "dflt": true, - "editType": "calc", - "impliedEdits": {}, - "valType": "boolean" - }, - "cmax": { - "description": "Sets the upper bound of the color domain. Has an effect only if in `marker.color` is set to a numerical array. Value should have the same units as in `marker.color` and if set, `marker.cmin` must be set as well.", - "dflt": null, - "editType": "calc", - "impliedEdits": { - "cauto": false - }, - "valType": "number" - }, - "cmid": { - "description": "Sets the mid-point of the color domain by scaling `marker.cmin` and/or `marker.cmax` to be equidistant to this point. Has an effect only if in `marker.color` is set to a numerical array. Value should have the same units as in `marker.color`. Has no effect when `marker.cauto` is `false`.", - "dflt": null, - "editType": "calc", - "impliedEdits": {}, - "valType": "number" - }, - "cmin": { - "description": "Sets the lower bound of the color domain. Has an effect only if in `marker.color` is set to a numerical array. Value should have the same units as in `marker.color` and if set, `marker.cmax` must be set as well.", - "dflt": null, - "editType": "calc", - "impliedEdits": { - "cauto": false - }, - "valType": "number" - }, - "color": { - "arrayOk": true, - "description": "Sets the marker color. It accepts either a specific color or an array of numbers that are mapped to the colorscale relative to the max and min values of the array or relative to `marker.cmin` and `marker.cmax` if set.", - "editType": "calc", - "valType": "color" - }, - "coloraxis": { - "description": "Sets a reference to a shared color axis. References to these shared color axes are *coloraxis*, *coloraxis2*, *coloraxis3*, etc. Settings for these shared color axes are set in the layout, under `layout.coloraxis`, `layout.coloraxis2`, etc. Note that multiple color scales can be linked to the same color axis.", - "dflt": null, - "editType": "calc", - "regex": "/^coloraxis([2-9]|[1-9][0-9]+)?$/", - "valType": "subplotid" - }, - "colorbar": { - "bgcolor": { - "description": "Sets the color of padded area.", - "dflt": "rgba(0,0,0,0)", - "editType": "calc", - "valType": "color" - }, - "bordercolor": { - "description": "Sets the axis line color.", - "dflt": "#444", - "editType": "calc", - "valType": "color" - }, - "borderwidth": { - "description": "Sets the width (in px) or the border enclosing this color bar.", - "dflt": 0, - "editType": "calc", - "min": 0, - "valType": "number" - }, - "dtick": { - "description": "Sets the step in-between ticks on this axis. Use with `tick0`. Must be a positive number, or special strings available to *log* and *date* axes. If the axis `type` is *log*, then ticks are set every 10^(n*dtick) where n is the tick number. For example, to set a tick mark at 1, 10, 100, 1000, ... set dtick to 1. To set tick marks at 1, 100, 10000, ... set dtick to 2. To set tick marks at 1, 5, 25, 125, 625, 3125, ... set dtick to log_10(5), or 0.69897000433. *log* has several special values; *L*, where `f` is a positive number, gives ticks linearly spaced in value (but not position). For example `tick0` = 0.1, `dtick` = *L0.5* will put ticks at 0.1, 0.6, 1.1, 1.6 etc. To show powers of 10 plus small digits between, use *D1* (all digits) or *D2* (only 2 and 5). `tick0` is ignored for *D1* and *D2*. If the axis `type` is *date*, then you must convert the time to milliseconds. For example, to set the interval between ticks to one day, set `dtick` to 86400000.0. *date* also has special values *M* gives ticks spaced by a number of months. `n` must be a positive integer. To set ticks on the 15th of every third month, set `tick0` to *2000-01-15* and `dtick` to *M3*. To set ticks every 4 years, set `dtick` to *M48*", - "editType": "calc", - "impliedEdits": { - "tickmode": "linear" - }, - "valType": "any" - }, - "editType": "calc", - "exponentformat": { - "description": "Determines a formatting rule for the tick exponents. For example, consider the number 1,000,000,000. If *none*, it appears as 1,000,000,000. If *e*, 1e+9. If *E*, 1E+9. If *power*, 1x10^9 (with 9 in a super script). If *SI*, 1G. If *B*, 1B. *SI* uses prefixes from \"femto\" f (10^-15) to \"tera\" T (10^12). *SI extended* covers instead the full SI range from \"quecto\" q (10^-30) to \"quetta\" Q (10^30). If *SI* or *SI extended* is used and the exponent is beyond the above ranges, the formatting rule will automatically be switched to the power notation.", - "dflt": "B", - "editType": "calc", - "valType": "enumerated", - "values": [ - "none", - "e", - "E", - "power", - "SI", - "B", - "SI extended" - ] - }, - "labelalias": { - "description": "Replacement text for specific tick or hover labels. For example using {US: 'USA', CA: 'Canada'} changes US to USA and CA to Canada. The labels we would have shown must match the keys exactly, after adding any tickprefix or ticksuffix. For negative numbers the minus sign symbol used (U+2212) is wider than the regular ascii dash. That means you need to use −1 instead of -1. labelalias can be used with any axis type, and both keys (if needed) and values (if desired) can include html-like tags or MathJax.", - "dflt": false, - "editType": "calc", - "valType": "any" - }, - "len": { - "description": "Sets the length of the color bar This measure excludes the padding of both ends. That is, the color bar length is this length minus the padding on both ends.", - "dflt": 1, - "editType": "calc", - "min": 0, - "valType": "number" - }, - "lenmode": { - "description": "Determines whether this color bar's length (i.e. the measure in the color variation direction) is set in units of plot *fraction* or in *pixels. Use `len` to set the value.", - "dflt": "fraction", - "editType": "calc", - "valType": "enumerated", - "values": [ - "fraction", - "pixels" - ] - }, - "minexponent": { - "description": "Hide SI prefix for 10^n if |n| is below this number. This only has an effect when `tickformat` is *SI* or *B*.", - "dflt": 3, - "editType": "calc", - "min": 0, - "valType": "number" - }, - "nticks": { - "description": "Specifies the maximum number of ticks for the particular axis. The actual number of ticks will be chosen automatically to be less than or equal to `nticks`. Has an effect only if `tickmode` is set to *auto*.", - "dflt": 0, - "editType": "calc", - "min": 0, - "valType": "integer" - }, - "orientation": { - "description": "Sets the orientation of the colorbar.", - "dflt": "v", - "editType": "calc", - "valType": "enumerated", - "values": [ - "h", - "v" - ] - }, - "outlinecolor": { - "description": "Sets the axis line color.", - "dflt": "#444", - "editType": "calc", - "valType": "color" - }, - "outlinewidth": { - "description": "Sets the width (in px) of the axis line.", - "dflt": 1, - "editType": "calc", - "min": 0, - "valType": "number" - }, - "role": "object", - "separatethousands": { - "description": "If \"true\", even 4-digit integers are separated", - "dflt": false, - "editType": "calc", - "valType": "boolean" - }, - "showexponent": { - "description": "If *all*, all exponents are shown besides their significands. If *first*, only the exponent of the first tick is shown. If *last*, only the exponent of the last tick is shown. If *none*, no exponents appear.", - "dflt": "all", - "editType": "calc", - "valType": "enumerated", - "values": [ - "all", - "first", - "last", - "none" - ] - }, - "showticklabels": { - "description": "Determines whether or not the tick labels are drawn.", - "dflt": true, - "editType": "calc", - "valType": "boolean" - }, - "showtickprefix": { - "description": "If *all*, all tick labels are displayed with a prefix. If *first*, only the first tick is displayed with a prefix. If *last*, only the last tick is displayed with a suffix. If *none*, tick prefixes are hidden.", - "dflt": "all", - "editType": "calc", - "valType": "enumerated", - "values": [ - "all", - "first", - "last", - "none" - ] - }, - "showticksuffix": { - "description": "Same as `showtickprefix` but for tick suffixes.", - "dflt": "all", - "editType": "calc", - "valType": "enumerated", - "values": [ - "all", - "first", - "last", - "none" - ] - }, - "thickness": { - "description": "Sets the thickness of the color bar This measure excludes the size of the padding, ticks and labels.", - "dflt": 30, - "editType": "calc", - "min": 0, - "valType": "number" - }, - "thicknessmode": { - "description": "Determines whether this color bar's thickness (i.e. the measure in the constant color direction) is set in units of plot *fraction* or in *pixels*. Use `thickness` to set the value.", - "dflt": "pixels", - "editType": "calc", - "valType": "enumerated", - "values": [ - "fraction", - "pixels" - ] - }, - "tick0": { - "description": "Sets the placement of the first tick on this axis. Use with `dtick`. If the axis `type` is *log*, then you must take the log of your starting tick (e.g. to set the starting tick to 100, set the `tick0` to 2) except when `dtick`=*L* (see `dtick` for more info). If the axis `type` is *date*, it should be a date string, like date data. If the axis `type` is *category*, it should be a number, using the scale where each category is assigned a serial number from zero in the order it appears.", - "editType": "calc", - "impliedEdits": { - "tickmode": "linear" - }, - "valType": "any" - }, - "tickangle": { - "description": "Sets the angle of the tick labels with respect to the horizontal. For example, a `tickangle` of -90 draws the tick labels vertically.", - "dflt": "auto", - "editType": "calc", - "valType": "angle" - }, - "tickcolor": { - "description": "Sets the tick color.", - "dflt": "#444", - "editType": "calc", - "valType": "color" - }, - "tickfont": { - "color": { - "editType": "calc", - "valType": "color" - }, - "description": "Sets the color bar's tick label font", - "editType": "calc", - "family": { - "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", - "editType": "calc", - "noBlank": true, - "strict": true, - "valType": "string" - }, - "lineposition": { - "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", - "dflt": "none", - "editType": "calc", - "extras": [ - "none" - ], - "flags": [ - "under", - "over", - "through" - ], - "valType": "flaglist" - }, - "role": "object", - "shadow": { - "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", - "dflt": "none", - "editType": "calc", - "valType": "string" - }, - "size": { - "editType": "calc", - "min": 1, - "valType": "number" - }, - "style": { - "description": "Sets whether a font should be styled with a normal or italic face from its family.", - "dflt": "normal", - "editType": "calc", - "valType": "enumerated", - "values": [ - "normal", - "italic" - ] - }, - "textcase": { - "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", - "dflt": "normal", - "editType": "calc", - "valType": "enumerated", - "values": [ - "normal", - "word caps", - "upper", - "lower" - ] - }, - "variant": { - "description": "Sets the variant of the font.", - "dflt": "normal", - "editType": "calc", - "valType": "enumerated", - "values": [ - "normal", - "small-caps", - "all-small-caps", - "all-petite-caps", - "petite-caps", - "unicase" - ] - }, - "weight": { - "description": "Sets the weight (or boldness) of the font.", - "dflt": "normal", - "editType": "calc", - "extras": [ - "normal", - "bold" - ], - "max": 1000, - "min": 1, - "valType": "integer" - } - }, - "tickformat": { - "description": "Sets the tick label formatting rule using d3 formatting mini-languages which are very similar to those in Python. For numbers, see: https://github.com/d3/d3-format/tree/v1.4.5#d3-format. And for dates see: https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format. We add two items to d3's date formatter: *%h* for half of the year as a decimal number as well as *%{n}f* for fractional seconds with n digits. For example, *2016-10-13 09:15:23.456* with tickformat *%H~%M~%S.%2f* would display *09~15~23.46*", - "dflt": "", - "editType": "calc", - "valType": "string" - }, - "tickformatstops": { - "items": { - "tickformatstop": { - "dtickrange": { - "description": "range [*min*, *max*], where *min*, *max* - dtick values which describe some zoom level, it is possible to omit *min* or *max* value by passing *null*", - "editType": "calc", - "items": [ - { - "editType": "calc", - "valType": "any" - }, - { - "editType": "calc", - "valType": "any" - } - ], - "valType": "info_array" - }, - "editType": "calc", - "enabled": { - "description": "Determines whether or not this stop is used. If `false`, this stop is ignored even within its `dtickrange`.", - "dflt": true, - "editType": "calc", - "valType": "boolean" - }, - "name": { - "description": "When used in a template, named items are created in the output figure in addition to any items the figure already has in this array. You can modify these items in the output figure by making your own item with `templateitemname` matching this `name` alongside your modifications (including `visible: false` or `enabled: false` to hide it). Has no effect outside of a template.", - "editType": "calc", - "valType": "string" - }, - "role": "object", - "templateitemname": { - "description": "Used to refer to a named item in this array in the template. Named items from the template will be created even without a matching item in the input figure, but you can modify one by making an item with `templateitemname` matching its `name`, alongside your modifications (including `visible: false` or `enabled: false` to hide it). If there is no template or no matching item, this item will be hidden unless you explicitly show it with `visible: true`.", - "editType": "calc", - "valType": "string" - }, - "value": { - "description": "string - dtickformat for described zoom level, the same as *tickformat*", - "dflt": "", - "editType": "calc", - "valType": "string" - } - } - }, - "role": "object" - }, - "ticklabeloverflow": { - "description": "Determines how we handle tick labels that would overflow either the graph div or the domain of the axis. The default value for inside tick labels is *hide past domain*. In other cases the default is *hide past div*.", - "editType": "calc", - "valType": "enumerated", - "values": [ - "allow", - "hide past div", - "hide past domain" - ] - }, - "ticklabelposition": { - "description": "Determines where tick labels are drawn relative to the ticks. Left and right options are used when `orientation` is *h*, top and bottom when `orientation` is *v*.", - "dflt": "outside", - "editType": "calc", - "valType": "enumerated", - "values": [ - "outside", - "inside", - "outside top", - "inside top", - "outside left", - "inside left", - "outside right", - "inside right", - "outside bottom", - "inside bottom" - ] - }, - "ticklabelstep": { - "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", - "dflt": 1, - "editType": "calc", - "min": 1, - "valType": "integer" - }, - "ticklen": { - "description": "Sets the tick length (in px).", - "dflt": 5, - "editType": "calc", - "min": 0, - "valType": "number" - }, - "tickmode": { - "description": "Sets the tick mode for this axis. If *auto*, the number of ticks is set via `nticks`. If *linear*, the placement of the ticks is determined by a starting position `tick0` and a tick step `dtick` (*linear* is the default value if `tick0` and `dtick` are provided). If *array*, the placement of the ticks is set via `tickvals` and the tick text is `ticktext`. (*array* is the default value if `tickvals` is provided).", - "editType": "calc", - "impliedEdits": {}, - "valType": "enumerated", - "values": [ - "auto", - "linear", - "array" - ] - }, - "tickprefix": { - "description": "Sets a tick label prefix.", - "dflt": "", - "editType": "calc", - "valType": "string" - }, - "ticks": { - "description": "Determines whether ticks are drawn or not. If **, this axis' ticks are not drawn. If *outside* (*inside*), this axis' are drawn outside (inside) the axis lines.", - "dflt": "", - "editType": "calc", - "valType": "enumerated", - "values": [ - "outside", - "inside", - "" - ] - }, - "ticksuffix": { - "description": "Sets a tick label suffix.", - "dflt": "", - "editType": "calc", - "valType": "string" - }, - "ticktext": { - "description": "Sets the text displayed at the ticks position via `tickvals`. Only has an effect if `tickmode` is set to *array*. Used with `tickvals`.", - "editType": "calc", - "valType": "data_array" - }, - "ticktextsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `ticktext`.", - "editType": "none", - "valType": "string" - }, - "tickvals": { - "description": "Sets the values at which ticks on this axis appear. Only has an effect if `tickmode` is set to *array*. Used with `ticktext`.", - "editType": "calc", - "valType": "data_array" - }, - "tickvalssrc": { - "description": "Sets the source reference on Chart Studio Cloud for `tickvals`.", - "editType": "none", - "valType": "string" - }, - "tickwidth": { - "description": "Sets the tick width (in px).", - "dflt": 1, - "editType": "calc", - "min": 0, - "valType": "number" - }, - "title": { - "editType": "calc", - "font": { - "color": { - "editType": "calc", - "valType": "color" - }, - "description": "Sets this color bar's title font.", - "editType": "calc", - "family": { - "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", - "editType": "calc", - "noBlank": true, - "strict": true, - "valType": "string" - }, - "lineposition": { - "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", - "dflt": "none", - "editType": "calc", - "extras": [ - "none" - ], - "flags": [ - "under", - "over", - "through" - ], - "valType": "flaglist" - }, - "role": "object", - "shadow": { - "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", - "dflt": "none", - "editType": "calc", - "valType": "string" - }, - "size": { - "editType": "calc", - "min": 1, - "valType": "number" - }, - "style": { - "description": "Sets whether a font should be styled with a normal or italic face from its family.", - "dflt": "normal", - "editType": "calc", - "valType": "enumerated", - "values": [ - "normal", - "italic" - ] - }, - "textcase": { - "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", - "dflt": "normal", - "editType": "calc", - "valType": "enumerated", - "values": [ - "normal", - "word caps", - "upper", - "lower" - ] - }, - "variant": { - "description": "Sets the variant of the font.", - "dflt": "normal", - "editType": "calc", - "valType": "enumerated", - "values": [ - "normal", - "small-caps", - "all-small-caps", - "all-petite-caps", - "petite-caps", - "unicase" - ] - }, - "weight": { - "description": "Sets the weight (or boldness) of the font.", - "dflt": "normal", - "editType": "calc", - "extras": [ - "normal", - "bold" - ], - "max": 1000, - "min": 1, - "valType": "integer" - } - }, - "role": "object", - "side": { - "description": "Determines the location of color bar's title with respect to the color bar. Defaults to *top* when `orientation` if *v* and defaults to *right* when `orientation` if *h*.", - "editType": "calc", - "valType": "enumerated", - "values": [ - "right", - "top", - "bottom" - ] - }, - "text": { - "description": "Sets the title of the color bar.", - "editType": "calc", - "valType": "string" - } - }, - "x": { - "description": "Sets the x position with respect to `xref` of the color bar (in plot fraction). When `xref` is *paper*, defaults to 1.02 when `orientation` is *v* and 0.5 when `orientation` is *h*. When `xref` is *container*, defaults to *1* when `orientation` is *v* and 0.5 when `orientation` is *h*. Must be between *0* and *1* if `xref` is *container* and between *-2* and *3* if `xref` is *paper*.", - "editType": "calc", - "valType": "number" - }, - "xanchor": { - "description": "Sets this color bar's horizontal position anchor. This anchor binds the `x` position to the *left*, *center* or *right* of the color bar. Defaults to *left* when `orientation` is *v* and *center* when `orientation` is *h*.", - "editType": "calc", - "valType": "enumerated", - "values": [ - "left", - "center", - "right" - ] - }, - "xpad": { - "description": "Sets the amount of padding (in px) along the x direction.", - "dflt": 10, - "editType": "calc", - "min": 0, - "valType": "number" - }, - "xref": { - "description": "Sets the container `x` refers to. *container* spans the entire `width` of the plot. *paper* refers to the width of the plotting area only.", - "dflt": "paper", - "editType": "calc", - "valType": "enumerated", - "values": [ - "container", - "paper" - ] - }, - "y": { - "description": "Sets the y position with respect to `yref` of the color bar (in plot fraction). When `yref` is *paper*, defaults to 0.5 when `orientation` is *v* and 1.02 when `orientation` is *h*. When `yref` is *container*, defaults to 0.5 when `orientation` is *v* and 1 when `orientation` is *h*. Must be between *0* and *1* if `yref` is *container* and between *-2* and *3* if `yref` is *paper*.", - "editType": "calc", - "valType": "number" - }, - "yanchor": { - "description": "Sets this color bar's vertical position anchor This anchor binds the `y` position to the *top*, *middle* or *bottom* of the color bar. Defaults to *middle* when `orientation` is *v* and *bottom* when `orientation` is *h*.", - "editType": "calc", - "valType": "enumerated", - "values": [ - "top", - "middle", - "bottom" - ] - }, - "ypad": { - "description": "Sets the amount of padding (in px) along the y direction.", - "dflt": 10, - "editType": "calc", - "min": 0, - "valType": "number" - }, - "yref": { - "description": "Sets the container `y` refers to. *container* spans the entire `height` of the plot. *paper* refers to the height of the plotting area only.", - "dflt": "paper", - "editType": "calc", - "valType": "enumerated", - "values": [ - "container", - "paper" - ] - } - }, - "colorscale": { - "description": "Sets the colorscale. Has an effect only if in `marker.color` is set to a numerical array. The colorscale must be an array containing arrays mapping a normalized value to an rgb, rgba, hex, hsl, hsv, or named color string. At minimum, a mapping for the lowest (0) and highest (1) values are required. For example, `[[0, 'rgb(0,0,255)'], [1, 'rgb(255,0,0)']]`. To control the bounds of the colorscale in color space, use `marker.cmin` and `marker.cmax`. Alternatively, `colorscale` may be a palette name string of the following list: Blackbody,Bluered,Blues,Cividis,Earth,Electric,Greens,Greys,Hot,Jet,Picnic,Portland,Rainbow,RdBu,Reds,Viridis,YlGnBu,YlOrRd.", - "dflt": null, - "editType": "calc", - "impliedEdits": { - "autocolorscale": false - }, - "valType": "colorscale" - }, - "colorsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `color`.", - "editType": "none", - "valType": "string" - }, - "editType": "calc", - "opacity": { - "arrayOk": true, - "description": "Sets the marker opacity.", - "editType": "calc", - "max": 1, - "min": 0, - "valType": "number" - }, - "opacitysrc": { - "description": "Sets the source reference on Chart Studio Cloud for `opacity`.", - "editType": "none", - "valType": "string" - }, - "reversescale": { - "description": "Reverses the color mapping if true. Has an effect only if in `marker.color` is set to a numerical array. If true, `marker.cmin` will correspond to the last color in the array and `marker.cmax` will correspond to the first color.", - "dflt": false, - "editType": "calc", - "valType": "boolean" - }, - "role": "object", - "showscale": { - "description": "Determines whether or not a colorbar is displayed for this trace. Has an effect only if in `marker.color` is set to a numerical array.", - "dflt": false, - "editType": "calc", - "valType": "boolean" - }, - "size": { - "arrayOk": true, - "description": "Sets the marker size (in px).", - "dflt": 6, - "editType": "calc", - "min": 0, - "valType": "number" - }, - "sizemin": { - "description": "Has an effect only if `marker.size` is set to a numerical array. Sets the minimum size (in px) of the rendered marker points.", - "dflt": 0, - "editType": "calc", - "min": 0, - "valType": "number" - }, - "sizemode": { - "description": "Has an effect only if `marker.size` is set to a numerical array. Sets the rule for which the data in `size` is converted to pixels.", - "dflt": "diameter", - "editType": "calc", - "valType": "enumerated", - "values": [ - "diameter", - "area" - ] - }, - "sizeref": { - "description": "Has an effect only if `marker.size` is set to a numerical array. Sets the scale factor used to determine the rendered size of marker points. Use with `sizemin` and `sizemode`.", - "dflt": 1, - "editType": "calc", - "valType": "number" - }, - "sizesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `size`.", - "editType": "none", - "valType": "string" - }, - "symbol": { - "arrayOk": true, - "description": "Sets the marker symbol. Full list: https://www.mapbox.com/maki-icons/ Note that the array `marker.color` and `marker.size` are only available for *circle* symbols.", - "dflt": "circle", - "editType": "calc", - "valType": "string" - }, - "symbolsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `symbol`.", - "editType": "none", - "valType": "string" - } - }, - "meta": { - "arrayOk": true, - "description": "Assigns extra meta information associated with this trace that can be used in various text attributes. Attributes such as trace `name`, graph, axis and colorbar `title.text`, annotation `text` `rangeselector`, `updatemenues` and `sliders` `label` text all support `meta`. To access the trace `meta` values in an attribute in the same trace, simply use `%{meta[i]}` where `i` is the index or key of the `meta` item in question. To access trace `meta` in layout attributes, use `%{data[n[.meta[i]}` where `i` is the index or key of the `meta` and `n` is the trace index.", - "editType": "plot", - "valType": "any" - }, - "metasrc": { - "description": "Sets the source reference on Chart Studio Cloud for `meta`.", - "editType": "none", - "valType": "string" - }, - "mode": { - "description": "Determines the drawing mode for this scatter trace. If the provided `mode` includes *text* then the `text` elements appear at the coordinates. Otherwise, the `text` elements appear on hover.", - "dflt": "markers", - "editType": "calc", - "extras": [ - "none" - ], - "flags": [ - "lines", - "markers", - "text" - ], - "valType": "flaglist" - }, - "name": { - "description": "Sets the trace name. The trace name appears as the legend item and on hover.", - "editType": "style", - "valType": "string" - }, - "opacity": { - "description": "Sets the opacity of the trace.", - "dflt": 1, - "editType": "style", - "max": 1, - "min": 0, - "valType": "number" - }, - "selected": { - "editType": "calc", - "marker": { - "color": { - "description": "Sets the marker color of selected points.", - "editType": "calc", - "valType": "color" - }, - "editType": "calc", - "opacity": { - "description": "Sets the marker opacity of selected points.", - "editType": "calc", - "max": 1, - "min": 0, - "valType": "number" - }, - "role": "object", - "size": { - "description": "Sets the marker size of selected points.", - "editType": "calc", - "min": 0, - "valType": "number" - } - }, - "role": "object" - }, - "selectedpoints": { - "description": "Array containing integer indices of selected points. Has an effect only for traces that support selections. Note that an empty array means an empty selection where the `unselected` are turned on for all points, whereas, any other non-array values means no selection all where the `selected` and `unselected` styles have no effect.", - "editType": "calc", - "valType": "any" - }, - "showlegend": { - "description": "Determines whether or not an item corresponding to this trace is shown in the legend.", - "dflt": true, - "editType": "style", - "valType": "boolean" - }, - "stream": { - "editType": "calc", - "maxpoints": { - "description": "Sets the maximum number of points to keep on the plots from an incoming stream. If `maxpoints` is set to *50*, only the newest 50 points will be displayed on the plot.", - "dflt": 500, - "editType": "calc", - "max": 10000, - "min": 0, - "valType": "number" - }, - "role": "object", - "token": { - "description": "The stream id number links a data trace on a plot with a stream. See https://chart-studio.plotly.com/settings for more details.", - "editType": "calc", - "noBlank": true, - "strict": true, - "valType": "string" - } - }, - "subplot": { - "description": "mapbox subplots and traces are deprecated! Please consider switching to `map` subplots and traces. Learn more at: https://plotly.com/python/maplibre-migration/ as well as https://plotly.com/javascript/maplibre-migration/ Sets a reference between this trace's data coordinates and a mapbox subplot. If *mapbox* (the default value), the data refer to `layout.mapbox`. If *mapbox2*, the data refer to `layout.mapbox2`, and so on.", - "dflt": "mapbox", - "editType": "calc", - "valType": "subplotid" - }, - "text": { - "arrayOk": true, - "description": "Sets text elements associated with each (lon,lat) pair If a single string, the same string appears over all the data points. If an array of string, the items are mapped in order to the this trace's (lon,lat) coordinates. If trace `hoverinfo` contains a *text* flag and *hovertext* is not set, these elements will be seen in the hover labels.", - "dflt": "", - "editType": "calc", - "valType": "string" - }, - "textfont": { - "color": { - "editType": "calc", - "valType": "color" - }, - "description": "Sets the icon text font (color=mapbox.layer.paint.text-color, size=mapbox.layer.layout.text-size). Has an effect only when `type` is set to *symbol*.", - "editType": "calc", - "family": { - "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", - "dflt": "Open Sans Regular, Arial Unicode MS Regular", - "editType": "calc", - "noBlank": true, - "strict": true, - "valType": "string" - }, - "role": "object", - "size": { - "editType": "calc", - "min": 1, - "valType": "number" - }, - "style": { - "description": "Sets whether a font should be styled with a normal or italic face from its family.", - "dflt": "normal", - "editType": "calc", - "valType": "enumerated", - "values": [ - "normal", - "italic" - ] - }, - "weight": { - "description": "Sets the weight (or boldness) of the font.", - "dflt": "normal", - "editType": "calc", - "extras": [ - "normal", - "bold" - ], - "max": 1000, - "min": 1, - "valType": "integer" - } - }, - "textposition": { - "arrayOk": false, - "description": "Sets the positions of the `text` elements with respects to the (x,y) coordinates.", - "dflt": "middle center", - "editType": "calc", - "valType": "enumerated", - "values": [ - "top left", - "top center", - "top right", - "middle left", - "middle center", - "middle right", - "bottom left", - "bottom center", - "bottom right" - ] - }, - "textsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `text`.", - "editType": "none", - "valType": "string" - }, - "texttemplate": { - "arrayOk": true, - "description": "Template string used for rendering the information text that appears on points. Note that this will override `textinfo`. Variables are inserted using %{variable}, for example \"y: %{y}\". Numbers are formatted using d3-format's syntax %{variable:d3-format}, for example \"Price: %{y:$.2f}\". https://github.com/d3/d3-format/tree/v1.4.5#d3-format for details on the formatting syntax. Dates are formatted using d3-time-format's syntax %{variable|d3-time-format}, for example \"Day: %{2019-01-01|%A}\". https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format for details on the date formatting syntax. Variables that can't be found will be replaced with the specifier. For example, a template of \"data: %{x}, %{y}\" will result in a value of \"data: 1, %{y}\" if x is 1 and y is missing. Variables with an undefined value will be replaced with the fallback value. All attributes that can be specified per-point (the ones that are `arrayOk: true`) are available. Finally, the template string has access to variables `lat`, `lon` and `text`.", - "dflt": "", - "editType": "calc", - "valType": "string" - }, - "texttemplatefallback": { - "description": "Fallback string that's displayed when a variable referenced in a template is missing. If the boolean value 'false' is passed in, the specifier with the missing variable will be displayed.", - "dflt": "-", - "editType": "calc", - "valType": "any" - }, - "texttemplatesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `texttemplate`.", - "editType": "none", - "valType": "string" - }, - "type": "scattermapbox", - "uid": { - "description": "Assign an id to this trace, Use this to provide object constancy between traces during animations and transitions.", - "editType": "plot", - "valType": "string" - }, - "uirevision": { - "description": "Controls persistence of some user-driven changes to the trace: `constraintrange` in `parcoords` traces, as well as some `editable: true` modifications such as `name` and `colorbar.title`. Defaults to `layout.uirevision`. Note that other user-driven trace attribute changes are controlled by `layout` attributes: `trace.visible` is controlled by `layout.legend.uirevision`, `selectedpoints` is controlled by `layout.selectionrevision`, and `colorbar.(x|y)` (accessible with `config: {editable: true}`) is controlled by `layout.editrevision`. Trace changes are tracked by `uid`, which only falls back on trace index if no `uid` is provided. So if your app can add/remove traces before the end of the `data` array, such that the same trace has a different index, you can still preserve user-driven changes if you give each trace a `uid` that stays with it as it moves.", - "editType": "none", - "valType": "any" - }, - "unselected": { - "editType": "calc", - "marker": { - "color": { - "description": "Sets the marker color of unselected points, applied only when a selection exists.", - "editType": "calc", - "valType": "color" - }, - "editType": "calc", - "opacity": { - "description": "Sets the marker opacity of unselected points, applied only when a selection exists.", - "editType": "calc", - "max": 1, - "min": 0, - "valType": "number" - }, - "role": "object", - "size": { - "description": "Sets the marker size of unselected points, applied only when a selection exists.", - "editType": "calc", - "min": 0, - "valType": "number" - } - }, - "role": "object" - }, - "visible": { - "description": "Determines whether or not this trace is visible. If *legendonly*, the trace is not drawn, but can appear as a legend item (provided that the legend itself is visible).", - "dflt": true, - "editType": "calc", - "valType": "enumerated", - "values": [ - true, - false, - "legendonly" - ] - } - }, - "categories": [ - "mapbox", - "gl", - "symbols", - "showLegend", - "scatter-like" - ], - "meta": { - "description": "*scattermapbox* trace is deprecated! Please consider switching to the *scattermap* trace type and `map` subplots. Learn more at: https://plotly.com/python/maplibre-migration/ as well as https://plotly.com/javascript/maplibre-migration/ The data visualized as scatter point, lines or marker symbols on a Mapbox GL geographic map is provided by longitude/latitude pairs in `lon` and `lat`.", - "hrName": "scatter_mapbox" - }, - "type": "scattermapbox" - }, - "scatterpolar": { - "animatable": false, - "attributes": { - "cliponaxis": { - "description": "Determines whether or not markers and text nodes are clipped about the subplot axes. To show markers and text nodes above axis lines and tick labels, make sure to set `xaxis.layer` and `yaxis.layer` to *below traces*.", - "dflt": false, - "editType": "plot", - "valType": "boolean" - }, - "connectgaps": { - "description": "Determines whether or not gaps (i.e. {nan} or missing values) in the provided data arrays are connected.", - "dflt": false, - "editType": "calc", - "valType": "boolean" - }, - "customdata": { - "description": "Assigns extra data each datum. This may be useful when listening to hover, click and selection events. Note that, *scatter* traces also appends customdata items in the markers DOM elements", - "editType": "calc", - "valType": "data_array" - }, - "customdatasrc": { - "description": "Sets the source reference on Chart Studio Cloud for `customdata`.", - "editType": "none", - "valType": "string" - }, - "dr": { - "description": "Sets the r coordinate step.", - "dflt": 1, - "editType": "calc", - "valType": "number" - }, - "dtheta": { - "description": "Sets the theta coordinate step. By default, the `dtheta` step equals the subplot's period divided by the length of the `r` coordinates.", - "editType": "calc", - "valType": "number" - }, - "fill": { - "description": "Sets the area to fill with a solid color. Use with `fillcolor` if not *none*. scatterpolar has a subset of the options available to scatter. *toself* connects the endpoints of the trace (or each segment of the trace if it has gaps) into a closed shape. *tonext* fills the space between two traces if one completely encloses the other (eg consecutive contour lines), and behaves like *toself* if there is no trace before it. *tonext* should not be used if one trace does not enclose the other.", - "dflt": "none", - "editType": "calc", - "valType": "enumerated", - "values": [ - "none", - "toself", - "tonext" - ] - }, - "fillcolor": { - "description": "Sets the fill color. Defaults to a half-transparent variant of the line color, marker color, or marker line color, whichever is available.", - "editType": "style", - "valType": "color" - }, - "hoverinfo": { - "arrayOk": true, - "description": "Determines which trace information appear on hover. If `none` or `skip` are set, no information is displayed upon hovering. But, if `none` is set, click and hover events are still fired.", - "dflt": "all", - "editType": "none", - "extras": [ - "all", - "none", - "skip" - ], - "flags": [ - "r", - "theta", - "text", - "name" - ], - "valType": "flaglist" - }, - "hoverinfosrc": { - "description": "Sets the source reference on Chart Studio Cloud for `hoverinfo`.", - "editType": "none", - "valType": "string" - }, - "hoverlabel": { - "align": { - "arrayOk": true, - "description": "Sets the horizontal alignment of the text content within hover label box. Has an effect only if the hover label text spans more two or more lines", - "dflt": "auto", - "editType": "none", - "valType": "enumerated", - "values": [ - "left", - "right", - "auto" - ] - }, - "alignsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `align`.", - "editType": "none", - "valType": "string" - }, - "bgcolor": { - "arrayOk": true, - "description": "Sets the background color of the hover labels for this trace", - "editType": "none", - "valType": "color" - }, - "bgcolorsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `bgcolor`.", - "editType": "none", - "valType": "string" - }, - "bordercolor": { - "arrayOk": true, - "description": "Sets the border color of the hover labels for this trace.", - "editType": "none", - "valType": "color" - }, - "bordercolorsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `bordercolor`.", - "editType": "none", - "valType": "string" - }, - "editType": "none", - "font": { - "color": { - "arrayOk": true, - "editType": "none", - "valType": "color" - }, - "colorsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `color`.", - "editType": "none", - "valType": "string" - }, - "description": "Sets the font used in hover labels.", - "editType": "none", - "family": { - "arrayOk": true, - "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", - "editType": "none", - "noBlank": true, - "strict": true, - "valType": "string" - }, - "familysrc": { - "description": "Sets the source reference on Chart Studio Cloud for `family`.", - "editType": "none", - "valType": "string" - }, - "lineposition": { - "arrayOk": true, - "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", - "dflt": "none", - "editType": "none", - "extras": [ - "none" - ], - "flags": [ - "under", - "over", - "through" - ], - "valType": "flaglist" - }, - "linepositionsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `lineposition`.", - "editType": "none", - "valType": "string" - }, - "role": "object", - "shadow": { - "arrayOk": true, - "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", - "dflt": "none", - "editType": "none", - "valType": "string" - }, - "shadowsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `shadow`.", - "editType": "none", - "valType": "string" - }, - "size": { - "arrayOk": true, - "editType": "none", - "min": 1, - "valType": "number" - }, - "sizesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `size`.", - "editType": "none", - "valType": "string" - }, - "style": { - "arrayOk": true, - "description": "Sets whether a font should be styled with a normal or italic face from its family.", - "dflt": "normal", - "editType": "none", - "valType": "enumerated", - "values": [ - "normal", - "italic" - ] - }, - "stylesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `style`.", - "editType": "none", - "valType": "string" - }, - "textcase": { - "arrayOk": true, - "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", - "dflt": "normal", - "editType": "none", - "valType": "enumerated", - "values": [ - "normal", - "word caps", - "upper", - "lower" - ] - }, - "textcasesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `textcase`.", - "editType": "none", - "valType": "string" - }, - "variant": { - "arrayOk": true, - "description": "Sets the variant of the font.", - "dflt": "normal", - "editType": "none", - "valType": "enumerated", - "values": [ - "normal", - "small-caps", - "all-small-caps", - "all-petite-caps", - "petite-caps", - "unicase" - ] - }, - "variantsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `variant`.", - "editType": "none", - "valType": "string" - }, - "weight": { - "arrayOk": true, - "description": "Sets the weight (or boldness) of the font.", - "dflt": "normal", - "editType": "none", - "extras": [ - "normal", - "bold" - ], - "max": 1000, - "min": 1, - "valType": "integer" - }, - "weightsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `weight`.", - "editType": "none", - "valType": "string" - } - }, - "namelength": { - "arrayOk": true, - "description": "Sets the default length (in number of characters) of the trace name in the hover labels for all traces. -1 shows the whole name regardless of length. 0-3 shows the first 0-3 characters, and an integer >3 will show the whole name if it is less than that many characters, but if it is longer, will truncate to `namelength - 3` characters and add an ellipsis.", - "dflt": 15, - "editType": "none", - "min": -1, - "valType": "integer" - }, - "namelengthsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `namelength`.", - "editType": "none", - "valType": "string" - }, - "role": "object", - "showarrow": { - "description": "Sets whether or not to show the hover label arrow/triangle pointing to the data point.", - "dflt": true, - "editType": "none", - "valType": "boolean" - } - }, - "hoveron": { - "description": "Do the hover effects highlight individual points (markers or line points) or do they highlight filled regions? If the fill is *toself* or *tonext* and there are no markers or text, then the default is *fills*, otherwise it is *points*.", - "editType": "style", - "flags": [ - "points", - "fills" - ], - "valType": "flaglist" - }, - "hovertemplate": { - "arrayOk": true, - "description": "Template string used for rendering the information that appear on hover box. Note that this will override `hoverinfo`. Variables are inserted using %{variable}, for example \"y: %{y}\" as well as %{xother}, {%_xother}, {%_xother_}, {%xother_}. When showing info for several points, *xother* will be added to those with different x positions from the first point. An underscore before or after *(x|y)other* will add a space on that side, only when this field is shown. Numbers are formatted using d3-format's syntax %{variable:d3-format}, for example \"Price: %{y:$.2f}\". https://github.com/d3/d3-format/tree/v1.4.5#d3-format for details on the formatting syntax. Dates are formatted using d3-time-format's syntax %{variable|d3-time-format}, for example \"Day: %{2019-01-01|%A}\". https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format for details on the date formatting syntax. Variables that can't be found will be replaced with the specifier. For example, a template of \"data: %{x}, %{y}\" will result in a value of \"data: 1, %{y}\" if x is 1 and y is missing. Variables with an undefined value will be replaced with the fallback value. The variables available in `hovertemplate` are the ones emitted as event data described at this link https://plotly.com/javascript/plotlyjs-events/#event-data. Additionally, all attributes that can be specified per-point (the ones that are `arrayOk: true`) are available. Anything contained in tag `` is displayed in the secondary box, for example `%{fullData.name}`. To hide the secondary box completely, use an empty tag ``.", - "dflt": "", - "editType": "none", - "valType": "string" - }, - "hovertemplatefallback": { - "description": "Fallback string that's displayed when a variable referenced in a template is missing. If the boolean value 'false' is passed in, the specifier with the missing variable will be displayed.", - "dflt": "-", - "editType": "none", - "valType": "any" - }, - "hovertemplatesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `hovertemplate`.", - "editType": "none", - "valType": "string" - }, - "hovertext": { - "arrayOk": true, - "description": "Sets hover text elements associated with each (x,y) pair. If a single string, the same string appears over all the data points. If an array of string, the items are mapped in order to the this trace's (x,y) coordinates. To be seen, trace `hoverinfo` must contain a *text* flag.", - "dflt": "", - "editType": "style", - "valType": "string" - }, - "hovertextsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `hovertext`.", - "editType": "none", - "valType": "string" - }, - "ids": { - "description": "Assigns id labels to each datum. These ids for object constancy of data points during animation. Should be an array of strings, not numbers or any other type.", - "editType": "calc", - "valType": "data_array" - }, - "idssrc": { - "description": "Sets the source reference on Chart Studio Cloud for `ids`.", - "editType": "none", - "valType": "string" - }, - "legend": { - "description": "Sets the reference to a legend to show this trace in. References to these legends are *legend*, *legend2*, *legend3*, etc. Settings for these legends are set in the layout, under `layout.legend`, `layout.legend2`, etc.", - "dflt": "legend", - "editType": "style", - "valType": "subplotid" - }, - "legendgroup": { - "description": "Sets the legend group for this trace. Traces and shapes part of the same legend group hide/show at the same time when toggling legend items.", - "dflt": "", - "editType": "style", - "valType": "string" - }, - "legendgrouptitle": { - "editType": "style", - "font": { - "color": { - "editType": "style", - "valType": "color" - }, - "description": "Sets this legend group's title font.", - "editType": "style", - "family": { - "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", - "editType": "style", - "noBlank": true, - "strict": true, - "valType": "string" - }, - "lineposition": { - "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", - "dflt": "none", - "editType": "style", - "extras": [ - "none" - ], - "flags": [ - "under", - "over", - "through" - ], - "valType": "flaglist" - }, - "role": "object", - "shadow": { - "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", - "dflt": "none", - "editType": "style", - "valType": "string" - }, - "size": { - "editType": "style", - "min": 1, - "valType": "number" - }, - "style": { - "description": "Sets whether a font should be styled with a normal or italic face from its family.", - "dflt": "normal", - "editType": "style", - "valType": "enumerated", - "values": [ - "normal", - "italic" - ] - }, - "textcase": { - "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", - "dflt": "normal", - "editType": "style", - "valType": "enumerated", - "values": [ - "normal", - "word caps", - "upper", - "lower" - ] - }, - "variant": { - "description": "Sets the variant of the font.", - "dflt": "normal", - "editType": "style", - "valType": "enumerated", - "values": [ - "normal", - "small-caps", - "all-small-caps", - "all-petite-caps", - "petite-caps", - "unicase" - ] - }, - "weight": { - "description": "Sets the weight (or boldness) of the font.", - "dflt": "normal", - "editType": "style", - "extras": [ - "normal", - "bold" - ], - "max": 1000, - "min": 1, - "valType": "integer" - } - }, - "role": "object", - "text": { - "description": "Sets the title of the legend group.", - "dflt": "", - "editType": "style", - "valType": "string" - } - }, - "legendrank": { - "description": "Sets the legend rank for this trace. Items and groups with smaller ranks are presented on top/left side while with *reversed* `legend.traceorder` they are on bottom/right side. The default legendrank is 1000, so that you can use ranks less than 1000 to place certain items before all unranked items, and ranks greater than 1000 to go after all unranked items. When having unranked or equal rank items shapes would be displayed after traces i.e. according to their order in data and layout.", - "dflt": 1000, - "editType": "style", - "valType": "number" - }, - "legendwidth": { - "description": "Sets the width (in px or fraction) of the legend for this trace.", - "editType": "style", - "min": 0, - "valType": "number" - }, - "line": { - "backoff": { - "arrayOk": true, - "description": "Sets the line back off from the end point of the nth line segment (in px). This option is useful e.g. to avoid overlap with arrowhead markers. With *auto* the lines would trim before markers if `marker.angleref` is set to *previous*.", - "dflt": "auto", - "editType": "plot", - "min": 0, - "valType": "number" - }, - "backoffsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `backoff`.", - "editType": "none", - "valType": "string" - }, - "color": { - "description": "Sets the line color.", - "editType": "style", - "valType": "color" - }, - "dash": { - "description": "Sets the dash style of lines. Set to a dash type string (*solid*, *dot*, *dash*, *longdash*, *dashdot*, or *longdashdot*) or a dash length list in px (eg *5px,10px,2px,2px*).", - "dflt": "solid", - "editType": "style", - "valType": "string", - "values": [ - "solid", - "dot", - "dash", - "longdash", - "dashdot", - "longdashdot" - ] - }, - "editType": "calc", - "role": "object", - "shape": { - "description": "Determines the line shape. With *spline* the lines are drawn using spline interpolation. The other available values correspond to step-wise line shapes.", - "dflt": "linear", - "editType": "plot", - "valType": "enumerated", - "values": [ - "linear", - "spline" - ] - }, - "smoothing": { - "description": "Has an effect only if `shape` is set to *spline* Sets the amount of smoothing. *0* corresponds to no smoothing (equivalent to a *linear* shape).", - "dflt": 1, - "editType": "plot", - "max": 1.3, - "min": 0, - "valType": "number" - }, - "width": { - "description": "Sets the line width (in px).", - "dflt": 2, - "editType": "style", - "min": 0, - "valType": "number" - } - }, - "marker": { - "angle": { - "arrayOk": true, - "description": "Sets the marker angle in respect to `angleref`.", - "dflt": 0, - "editType": "plot", - "valType": "angle" - }, - "angleref": { - "description": "Sets the reference for marker angle. With *previous*, angle 0 points along the line from the previous point to this one. With *up*, angle 0 points toward the top of the screen.", - "dflt": "up", - "editType": "plot", - "valType": "enumerated", - "values": [ - "previous", - "up" - ] - }, - "anglesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `angle`.", - "editType": "none", - "valType": "string" - }, - "autocolorscale": { - "description": "Determines whether the colorscale is a default palette (`autocolorscale: true`) or the palette determined by `marker.colorscale`. Has an effect only if in `marker.color` is set to a numerical array. In case `colorscale` is unspecified or `autocolorscale` is true, the default palette will be chosen according to whether numbers in the `color` array are all positive, all negative or mixed.", - "dflt": true, - "editType": "calc", - "impliedEdits": {}, - "valType": "boolean" - }, - "cauto": { - "description": "Determines whether or not the color domain is computed with respect to the input data (here in `marker.color`) or the bounds set in `marker.cmin` and `marker.cmax` Has an effect only if in `marker.color` is set to a numerical array. Defaults to `false` when `marker.cmin` and `marker.cmax` are set by the user.", - "dflt": true, - "editType": "calc", - "impliedEdits": {}, - "valType": "boolean" - }, - "cmax": { - "description": "Sets the upper bound of the color domain. Has an effect only if in `marker.color` is set to a numerical array. Value should have the same units as in `marker.color` and if set, `marker.cmin` must be set as well.", - "dflt": null, - "editType": "plot", - "impliedEdits": { - "cauto": false - }, - "valType": "number" - }, - "cmid": { - "description": "Sets the mid-point of the color domain by scaling `marker.cmin` and/or `marker.cmax` to be equidistant to this point. Has an effect only if in `marker.color` is set to a numerical array. Value should have the same units as in `marker.color`. Has no effect when `marker.cauto` is `false`.", - "dflt": null, - "editType": "calc", - "impliedEdits": {}, - "valType": "number" - }, - "cmin": { - "description": "Sets the lower bound of the color domain. Has an effect only if in `marker.color` is set to a numerical array. Value should have the same units as in `marker.color` and if set, `marker.cmax` must be set as well.", - "dflt": null, - "editType": "plot", - "impliedEdits": { - "cauto": false - }, - "valType": "number" - }, - "color": { - "arrayOk": true, - "description": "Sets the marker color. It accepts either a specific color or an array of numbers that are mapped to the colorscale relative to the max and min values of the array or relative to `marker.cmin` and `marker.cmax` if set.", - "editType": "style", - "valType": "color" - }, - "coloraxis": { - "description": "Sets a reference to a shared color axis. References to these shared color axes are *coloraxis*, *coloraxis2*, *coloraxis3*, etc. Settings for these shared color axes are set in the layout, under `layout.coloraxis`, `layout.coloraxis2`, etc. Note that multiple color scales can be linked to the same color axis.", - "dflt": null, - "editType": "calc", - "regex": "/^coloraxis([2-9]|[1-9][0-9]+)?$/", - "valType": "subplotid" - }, - "colorbar": { - "bgcolor": { - "description": "Sets the color of padded area.", - "dflt": "rgba(0,0,0,0)", - "editType": "colorbars", - "valType": "color" - }, - "bordercolor": { - "description": "Sets the axis line color.", - "dflt": "#444", - "editType": "colorbars", - "valType": "color" - }, - "borderwidth": { - "description": "Sets the width (in px) or the border enclosing this color bar.", - "dflt": 0, - "editType": "colorbars", - "min": 0, - "valType": "number" - }, - "dtick": { - "description": "Sets the step in-between ticks on this axis. Use with `tick0`. Must be a positive number, or special strings available to *log* and *date* axes. If the axis `type` is *log*, then ticks are set every 10^(n*dtick) where n is the tick number. For example, to set a tick mark at 1, 10, 100, 1000, ... set dtick to 1. To set tick marks at 1, 100, 10000, ... set dtick to 2. To set tick marks at 1, 5, 25, 125, 625, 3125, ... set dtick to log_10(5), or 0.69897000433. *log* has several special values; *L*, where `f` is a positive number, gives ticks linearly spaced in value (but not position). For example `tick0` = 0.1, `dtick` = *L0.5* will put ticks at 0.1, 0.6, 1.1, 1.6 etc. To show powers of 10 plus small digits between, use *D1* (all digits) or *D2* (only 2 and 5). `tick0` is ignored for *D1* and *D2*. If the axis `type` is *date*, then you must convert the time to milliseconds. For example, to set the interval between ticks to one day, set `dtick` to 86400000.0. *date* also has special values *M* gives ticks spaced by a number of months. `n` must be a positive integer. To set ticks on the 15th of every third month, set `tick0` to *2000-01-15* and `dtick` to *M3*. To set ticks every 4 years, set `dtick` to *M48*", - "editType": "colorbars", - "impliedEdits": { - "tickmode": "linear" - }, - "valType": "any" - }, - "editType": "colorbars", - "exponentformat": { - "description": "Determines a formatting rule for the tick exponents. For example, consider the number 1,000,000,000. If *none*, it appears as 1,000,000,000. If *e*, 1e+9. If *E*, 1E+9. If *power*, 1x10^9 (with 9 in a super script). If *SI*, 1G. If *B*, 1B. *SI* uses prefixes from \"femto\" f (10^-15) to \"tera\" T (10^12). *SI extended* covers instead the full SI range from \"quecto\" q (10^-30) to \"quetta\" Q (10^30). If *SI* or *SI extended* is used and the exponent is beyond the above ranges, the formatting rule will automatically be switched to the power notation.", - "dflt": "B", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "none", - "e", - "E", - "power", - "SI", - "B", - "SI extended" - ] - }, - "labelalias": { - "description": "Replacement text for specific tick or hover labels. For example using {US: 'USA', CA: 'Canada'} changes US to USA and CA to Canada. The labels we would have shown must match the keys exactly, after adding any tickprefix or ticksuffix. For negative numbers the minus sign symbol used (U+2212) is wider than the regular ascii dash. That means you need to use −1 instead of -1. labelalias can be used with any axis type, and both keys (if needed) and values (if desired) can include html-like tags or MathJax.", - "dflt": false, - "editType": "colorbars", - "valType": "any" - }, - "len": { - "description": "Sets the length of the color bar This measure excludes the padding of both ends. That is, the color bar length is this length minus the padding on both ends.", - "dflt": 1, - "editType": "colorbars", - "min": 0, - "valType": "number" - }, - "lenmode": { - "description": "Determines whether this color bar's length (i.e. the measure in the color variation direction) is set in units of plot *fraction* or in *pixels. Use `len` to set the value.", - "dflt": "fraction", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "fraction", - "pixels" - ] - }, - "minexponent": { - "description": "Hide SI prefix for 10^n if |n| is below this number. This only has an effect when `tickformat` is *SI* or *B*.", - "dflt": 3, - "editType": "colorbars", - "min": 0, - "valType": "number" - }, - "nticks": { - "description": "Specifies the maximum number of ticks for the particular axis. The actual number of ticks will be chosen automatically to be less than or equal to `nticks`. Has an effect only if `tickmode` is set to *auto*.", - "dflt": 0, - "editType": "colorbars", - "min": 0, - "valType": "integer" - }, - "orientation": { - "description": "Sets the orientation of the colorbar.", - "dflt": "v", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "h", - "v" - ] - }, - "outlinecolor": { - "description": "Sets the axis line color.", - "dflt": "#444", - "editType": "colorbars", - "valType": "color" - }, - "outlinewidth": { - "description": "Sets the width (in px) of the axis line.", - "dflt": 1, - "editType": "colorbars", - "min": 0, - "valType": "number" - }, - "role": "object", - "separatethousands": { - "description": "If \"true\", even 4-digit integers are separated", - "dflt": false, - "editType": "colorbars", - "valType": "boolean" - }, - "showexponent": { - "description": "If *all*, all exponents are shown besides their significands. If *first*, only the exponent of the first tick is shown. If *last*, only the exponent of the last tick is shown. If *none*, no exponents appear.", - "dflt": "all", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "all", - "first", - "last", - "none" - ] - }, - "showticklabels": { - "description": "Determines whether or not the tick labels are drawn.", - "dflt": true, - "editType": "colorbars", - "valType": "boolean" - }, - "showtickprefix": { - "description": "If *all*, all tick labels are displayed with a prefix. If *first*, only the first tick is displayed with a prefix. If *last*, only the last tick is displayed with a suffix. If *none*, tick prefixes are hidden.", - "dflt": "all", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "all", - "first", - "last", - "none" - ] - }, - "showticksuffix": { - "description": "Same as `showtickprefix` but for tick suffixes.", - "dflt": "all", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "all", - "first", - "last", - "none" - ] - }, - "thickness": { - "description": "Sets the thickness of the color bar This measure excludes the size of the padding, ticks and labels.", - "dflt": 30, - "editType": "colorbars", - "min": 0, - "valType": "number" - }, - "thicknessmode": { - "description": "Determines whether this color bar's thickness (i.e. the measure in the constant color direction) is set in units of plot *fraction* or in *pixels*. Use `thickness` to set the value.", - "dflt": "pixels", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "fraction", - "pixels" - ] - }, - "tick0": { - "description": "Sets the placement of the first tick on this axis. Use with `dtick`. If the axis `type` is *log*, then you must take the log of your starting tick (e.g. to set the starting tick to 100, set the `tick0` to 2) except when `dtick`=*L* (see `dtick` for more info). If the axis `type` is *date*, it should be a date string, like date data. If the axis `type` is *category*, it should be a number, using the scale where each category is assigned a serial number from zero in the order it appears.", - "editType": "colorbars", - "impliedEdits": { - "tickmode": "linear" - }, - "valType": "any" - }, - "tickangle": { - "description": "Sets the angle of the tick labels with respect to the horizontal. For example, a `tickangle` of -90 draws the tick labels vertically.", - "dflt": "auto", - "editType": "colorbars", - "valType": "angle" - }, - "tickcolor": { - "description": "Sets the tick color.", - "dflt": "#444", - "editType": "colorbars", - "valType": "color" - }, - "tickfont": { - "color": { - "editType": "colorbars", - "valType": "color" - }, - "description": "Sets the color bar's tick label font", - "editType": "colorbars", - "family": { - "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", - "editType": "colorbars", - "noBlank": true, - "strict": true, - "valType": "string" - }, - "lineposition": { - "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", - "dflt": "none", - "editType": "colorbars", - "extras": [ - "none" - ], - "flags": [ - "under", - "over", - "through" - ], - "valType": "flaglist" - }, - "role": "object", - "shadow": { - "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", - "dflt": "none", - "editType": "colorbars", - "valType": "string" - }, - "size": { - "editType": "colorbars", - "min": 1, - "valType": "number" - }, - "style": { - "description": "Sets whether a font should be styled with a normal or italic face from its family.", - "dflt": "normal", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "normal", - "italic" - ] - }, - "textcase": { - "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", - "dflt": "normal", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "normal", - "word caps", - "upper", - "lower" - ] - }, - "variant": { - "description": "Sets the variant of the font.", - "dflt": "normal", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "normal", - "small-caps", - "all-small-caps", - "all-petite-caps", - "petite-caps", - "unicase" - ] - }, - "weight": { - "description": "Sets the weight (or boldness) of the font.", - "dflt": "normal", - "editType": "colorbars", - "extras": [ - "normal", - "bold" - ], - "max": 1000, - "min": 1, - "valType": "integer" - } - }, - "tickformat": { - "description": "Sets the tick label formatting rule using d3 formatting mini-languages which are very similar to those in Python. For numbers, see: https://github.com/d3/d3-format/tree/v1.4.5#d3-format. And for dates see: https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format. We add two items to d3's date formatter: *%h* for half of the year as a decimal number as well as *%{n}f* for fractional seconds with n digits. For example, *2016-10-13 09:15:23.456* with tickformat *%H~%M~%S.%2f* would display *09~15~23.46*", - "dflt": "", - "editType": "colorbars", - "valType": "string" - }, - "tickformatstops": { - "items": { - "tickformatstop": { - "dtickrange": { - "description": "range [*min*, *max*], where *min*, *max* - dtick values which describe some zoom level, it is possible to omit *min* or *max* value by passing *null*", - "editType": "colorbars", - "items": [ - { - "editType": "colorbars", - "valType": "any" - }, - { - "editType": "colorbars", - "valType": "any" - } - ], - "valType": "info_array" - }, - "editType": "colorbars", - "enabled": { - "description": "Determines whether or not this stop is used. If `false`, this stop is ignored even within its `dtickrange`.", - "dflt": true, - "editType": "colorbars", - "valType": "boolean" - }, - "name": { - "description": "When used in a template, named items are created in the output figure in addition to any items the figure already has in this array. You can modify these items in the output figure by making your own item with `templateitemname` matching this `name` alongside your modifications (including `visible: false` or `enabled: false` to hide it). Has no effect outside of a template.", - "editType": "colorbars", - "valType": "string" - }, - "role": "object", - "templateitemname": { - "description": "Used to refer to a named item in this array in the template. Named items from the template will be created even without a matching item in the input figure, but you can modify one by making an item with `templateitemname` matching its `name`, alongside your modifications (including `visible: false` or `enabled: false` to hide it). If there is no template or no matching item, this item will be hidden unless you explicitly show it with `visible: true`.", - "editType": "colorbars", - "valType": "string" - }, - "value": { - "description": "string - dtickformat for described zoom level, the same as *tickformat*", - "dflt": "", - "editType": "colorbars", - "valType": "string" - } - } - }, - "role": "object" - }, - "ticklabeloverflow": { - "description": "Determines how we handle tick labels that would overflow either the graph div or the domain of the axis. The default value for inside tick labels is *hide past domain*. In other cases the default is *hide past div*.", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "allow", - "hide past div", - "hide past domain" - ] - }, - "ticklabelposition": { - "description": "Determines where tick labels are drawn relative to the ticks. Left and right options are used when `orientation` is *h*, top and bottom when `orientation` is *v*.", - "dflt": "outside", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "outside", - "inside", - "outside top", - "inside top", - "outside left", - "inside left", - "outside right", - "inside right", - "outside bottom", - "inside bottom" - ] - }, - "ticklabelstep": { - "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", - "dflt": 1, - "editType": "colorbars", - "min": 1, - "valType": "integer" - }, - "ticklen": { - "description": "Sets the tick length (in px).", - "dflt": 5, - "editType": "colorbars", - "min": 0, - "valType": "number" - }, - "tickmode": { - "description": "Sets the tick mode for this axis. If *auto*, the number of ticks is set via `nticks`. If *linear*, the placement of the ticks is determined by a starting position `tick0` and a tick step `dtick` (*linear* is the default value if `tick0` and `dtick` are provided). If *array*, the placement of the ticks is set via `tickvals` and the tick text is `ticktext`. (*array* is the default value if `tickvals` is provided).", - "editType": "colorbars", - "impliedEdits": {}, - "valType": "enumerated", - "values": [ - "auto", - "linear", - "array" - ] - }, - "tickprefix": { - "description": "Sets a tick label prefix.", - "dflt": "", - "editType": "colorbars", - "valType": "string" - }, - "ticks": { - "description": "Determines whether ticks are drawn or not. If **, this axis' ticks are not drawn. If *outside* (*inside*), this axis' are drawn outside (inside) the axis lines.", - "dflt": "", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "outside", - "inside", - "" - ] - }, - "ticksuffix": { - "description": "Sets a tick label suffix.", - "dflt": "", - "editType": "colorbars", - "valType": "string" - }, - "ticktext": { - "description": "Sets the text displayed at the ticks position via `tickvals`. Only has an effect if `tickmode` is set to *array*. Used with `tickvals`.", - "editType": "colorbars", - "valType": "data_array" - }, - "ticktextsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `ticktext`.", - "editType": "none", - "valType": "string" - }, - "tickvals": { - "description": "Sets the values at which ticks on this axis appear. Only has an effect if `tickmode` is set to *array*. Used with `ticktext`.", - "editType": "colorbars", - "valType": "data_array" - }, - "tickvalssrc": { - "description": "Sets the source reference on Chart Studio Cloud for `tickvals`.", - "editType": "none", - "valType": "string" - }, - "tickwidth": { - "description": "Sets the tick width (in px).", - "dflt": 1, - "editType": "colorbars", - "min": 0, - "valType": "number" - }, - "title": { - "editType": "colorbars", - "font": { - "color": { - "editType": "colorbars", - "valType": "color" - }, - "description": "Sets this color bar's title font.", - "editType": "colorbars", - "family": { - "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", - "editType": "colorbars", - "noBlank": true, - "strict": true, - "valType": "string" - }, - "lineposition": { - "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", - "dflt": "none", - "editType": "colorbars", - "extras": [ - "none" - ], - "flags": [ - "under", - "over", - "through" - ], - "valType": "flaglist" - }, - "role": "object", - "shadow": { - "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", - "dflt": "none", - "editType": "colorbars", - "valType": "string" - }, - "size": { - "editType": "colorbars", - "min": 1, - "valType": "number" - }, - "style": { - "description": "Sets whether a font should be styled with a normal or italic face from its family.", - "dflt": "normal", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "normal", - "italic" - ] - }, - "textcase": { - "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", - "dflt": "normal", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "normal", - "word caps", - "upper", - "lower" - ] - }, - "variant": { - "description": "Sets the variant of the font.", - "dflt": "normal", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "normal", - "small-caps", - "all-small-caps", - "all-petite-caps", - "petite-caps", - "unicase" - ] - }, - "weight": { - "description": "Sets the weight (or boldness) of the font.", - "dflt": "normal", - "editType": "colorbars", - "extras": [ - "normal", - "bold" - ], - "max": 1000, - "min": 1, - "valType": "integer" - } - }, - "role": "object", - "side": { - "description": "Determines the location of color bar's title with respect to the color bar. Defaults to *top* when `orientation` if *v* and defaults to *right* when `orientation` if *h*.", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "right", - "top", - "bottom" - ] - }, - "text": { - "description": "Sets the title of the color bar.", - "editType": "colorbars", - "valType": "string" - } - }, - "x": { - "description": "Sets the x position with respect to `xref` of the color bar (in plot fraction). When `xref` is *paper*, defaults to 1.02 when `orientation` is *v* and 0.5 when `orientation` is *h*. When `xref` is *container*, defaults to *1* when `orientation` is *v* and 0.5 when `orientation` is *h*. Must be between *0* and *1* if `xref` is *container* and between *-2* and *3* if `xref` is *paper*.", - "editType": "colorbars", - "valType": "number" - }, - "xanchor": { - "description": "Sets this color bar's horizontal position anchor. This anchor binds the `x` position to the *left*, *center* or *right* of the color bar. Defaults to *left* when `orientation` is *v* and *center* when `orientation` is *h*.", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "left", - "center", - "right" - ] - }, - "xpad": { - "description": "Sets the amount of padding (in px) along the x direction.", - "dflt": 10, - "editType": "colorbars", - "min": 0, - "valType": "number" - }, - "xref": { - "description": "Sets the container `x` refers to. *container* spans the entire `width` of the plot. *paper* refers to the width of the plotting area only.", - "dflt": "paper", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "container", - "paper" - ] - }, - "y": { - "description": "Sets the y position with respect to `yref` of the color bar (in plot fraction). When `yref` is *paper*, defaults to 0.5 when `orientation` is *v* and 1.02 when `orientation` is *h*. When `yref` is *container*, defaults to 0.5 when `orientation` is *v* and 1 when `orientation` is *h*. Must be between *0* and *1* if `yref` is *container* and between *-2* and *3* if `yref` is *paper*.", - "editType": "colorbars", - "valType": "number" - }, - "yanchor": { - "description": "Sets this color bar's vertical position anchor This anchor binds the `y` position to the *top*, *middle* or *bottom* of the color bar. Defaults to *middle* when `orientation` is *v* and *bottom* when `orientation` is *h*.", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "top", - "middle", - "bottom" - ] - }, - "ypad": { - "description": "Sets the amount of padding (in px) along the y direction.", - "dflt": 10, - "editType": "colorbars", - "min": 0, - "valType": "number" - }, - "yref": { - "description": "Sets the container `y` refers to. *container* spans the entire `height` of the plot. *paper* refers to the height of the plotting area only.", - "dflt": "paper", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "container", - "paper" - ] - } - }, - "colorscale": { - "description": "Sets the colorscale. Has an effect only if in `marker.color` is set to a numerical array. The colorscale must be an array containing arrays mapping a normalized value to an rgb, rgba, hex, hsl, hsv, or named color string. At minimum, a mapping for the lowest (0) and highest (1) values are required. For example, `[[0, 'rgb(0,0,255)'], [1, 'rgb(255,0,0)']]`. To control the bounds of the colorscale in color space, use `marker.cmin` and `marker.cmax`. Alternatively, `colorscale` may be a palette name string of the following list: Blackbody,Bluered,Blues,Cividis,Earth,Electric,Greens,Greys,Hot,Jet,Picnic,Portland,Rainbow,RdBu,Reds,Viridis,YlGnBu,YlOrRd.", - "dflt": null, - "editType": "calc", - "impliedEdits": { - "autocolorscale": false - }, - "valType": "colorscale" - }, - "colorsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `color`.", - "editType": "none", - "valType": "string" - }, - "editType": "calc", - "gradient": { - "color": { - "arrayOk": true, - "description": "Sets the final color of the gradient fill: the center color for radial, the right for horizontal, or the bottom for vertical.", - "editType": "calc", - "valType": "color" - }, - "colorsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `color`.", - "editType": "none", - "valType": "string" - }, - "editType": "calc", - "role": "object", - "type": { - "arrayOk": true, - "description": "Sets the type of gradient used to fill the markers", - "dflt": "none", - "editType": "calc", - "valType": "enumerated", - "values": [ - "radial", - "horizontal", - "vertical", - "none" - ] - }, - "typesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `type`.", - "editType": "none", - "valType": "string" - } - }, - "line": { - "autocolorscale": { - "description": "Determines whether the colorscale is a default palette (`autocolorscale: true`) or the palette determined by `marker.line.colorscale`. Has an effect only if in `marker.line.color` is set to a numerical array. In case `colorscale` is unspecified or `autocolorscale` is true, the default palette will be chosen according to whether numbers in the `color` array are all positive, all negative or mixed.", - "dflt": true, - "editType": "calc", - "impliedEdits": {}, - "valType": "boolean" - }, - "cauto": { - "description": "Determines whether or not the color domain is computed with respect to the input data (here in `marker.line.color`) or the bounds set in `marker.line.cmin` and `marker.line.cmax` Has an effect only if in `marker.line.color` is set to a numerical array. Defaults to `false` when `marker.line.cmin` and `marker.line.cmax` are set by the user.", - "dflt": true, - "editType": "calc", - "impliedEdits": {}, - "valType": "boolean" - }, - "cmax": { - "description": "Sets the upper bound of the color domain. Has an effect only if in `marker.line.color` is set to a numerical array. Value should have the same units as in `marker.line.color` and if set, `marker.line.cmin` must be set as well.", - "dflt": null, - "editType": "plot", - "impliedEdits": { - "cauto": false - }, - "valType": "number" - }, - "cmid": { - "description": "Sets the mid-point of the color domain by scaling `marker.line.cmin` and/or `marker.line.cmax` to be equidistant to this point. Has an effect only if in `marker.line.color` is set to a numerical array. Value should have the same units as in `marker.line.color`. Has no effect when `marker.line.cauto` is `false`.", - "dflt": null, - "editType": "calc", - "impliedEdits": {}, - "valType": "number" - }, - "cmin": { - "description": "Sets the lower bound of the color domain. Has an effect only if in `marker.line.color` is set to a numerical array. Value should have the same units as in `marker.line.color` and if set, `marker.line.cmax` must be set as well.", - "dflt": null, - "editType": "plot", - "impliedEdits": { - "cauto": false - }, - "valType": "number" - }, - "color": { - "arrayOk": true, - "description": "Sets the marker.line color. It accepts either a specific color or an array of numbers that are mapped to the colorscale relative to the max and min values of the array or relative to `marker.line.cmin` and `marker.line.cmax` if set.", - "editType": "style", - "valType": "color" - }, - "coloraxis": { - "description": "Sets a reference to a shared color axis. References to these shared color axes are *coloraxis*, *coloraxis2*, *coloraxis3*, etc. Settings for these shared color axes are set in the layout, under `layout.coloraxis`, `layout.coloraxis2`, etc. Note that multiple color scales can be linked to the same color axis.", - "dflt": null, - "editType": "calc", - "regex": "/^coloraxis([2-9]|[1-9][0-9]+)?$/", - "valType": "subplotid" - }, - "colorscale": { - "description": "Sets the colorscale. Has an effect only if in `marker.line.color` is set to a numerical array. The colorscale must be an array containing arrays mapping a normalized value to an rgb, rgba, hex, hsl, hsv, or named color string. At minimum, a mapping for the lowest (0) and highest (1) values are required. For example, `[[0, 'rgb(0,0,255)'], [1, 'rgb(255,0,0)']]`. To control the bounds of the colorscale in color space, use `marker.line.cmin` and `marker.line.cmax`. Alternatively, `colorscale` may be a palette name string of the following list: Blackbody,Bluered,Blues,Cividis,Earth,Electric,Greens,Greys,Hot,Jet,Picnic,Portland,Rainbow,RdBu,Reds,Viridis,YlGnBu,YlOrRd.", - "dflt": null, - "editType": "calc", - "impliedEdits": { - "autocolorscale": false - }, - "valType": "colorscale" - }, - "colorsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `color`.", - "editType": "none", - "valType": "string" - }, - "editType": "calc", - "reversescale": { - "description": "Reverses the color mapping if true. Has an effect only if in `marker.line.color` is set to a numerical array. If true, `marker.line.cmin` will correspond to the last color in the array and `marker.line.cmax` will correspond to the first color.", - "dflt": false, - "editType": "plot", - "valType": "boolean" - }, - "role": "object", - "width": { - "arrayOk": true, - "description": "Sets the width (in px) of the lines bounding the marker points.", - "editType": "style", - "min": 0, - "valType": "number" - }, - "widthsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `width`.", - "editType": "none", - "valType": "string" - } - }, - "maxdisplayed": { - "description": "Sets a maximum number of points to be drawn on the graph. *0* corresponds to no limit.", - "dflt": 0, - "editType": "plot", - "min": 0, - "valType": "number" - }, - "opacity": { - "arrayOk": true, - "description": "Sets the marker opacity.", - "editType": "style", - "max": 1, - "min": 0, - "valType": "number" - }, - "opacitysrc": { - "description": "Sets the source reference on Chart Studio Cloud for `opacity`.", - "editType": "none", - "valType": "string" - }, - "reversescale": { - "description": "Reverses the color mapping if true. Has an effect only if in `marker.color` is set to a numerical array. If true, `marker.cmin` will correspond to the last color in the array and `marker.cmax` will correspond to the first color.", - "dflt": false, - "editType": "plot", - "valType": "boolean" - }, - "role": "object", - "showscale": { - "description": "Determines whether or not a colorbar is displayed for this trace. Has an effect only if in `marker.color` is set to a numerical array.", - "dflt": false, - "editType": "calc", - "valType": "boolean" - }, - "size": { - "arrayOk": true, - "description": "Sets the marker size (in px).", - "dflt": 6, - "editType": "calc", - "min": 0, - "valType": "number" - }, - "sizemin": { - "description": "Has an effect only if `marker.size` is set to a numerical array. Sets the minimum size (in px) of the rendered marker points.", - "dflt": 0, - "editType": "calc", - "min": 0, - "valType": "number" - }, - "sizemode": { - "description": "Has an effect only if `marker.size` is set to a numerical array. Sets the rule for which the data in `size` is converted to pixels.", - "dflt": "diameter", - "editType": "calc", - "valType": "enumerated", - "values": [ - "diameter", - "area" - ] - }, - "sizeref": { - "description": "Has an effect only if `marker.size` is set to a numerical array. Sets the scale factor used to determine the rendered size of marker points. Use with `sizemin` and `sizemode`.", - "dflt": 1, - "editType": "calc", - "valType": "number" - }, - "sizesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `size`.", - "editType": "none", - "valType": "string" - }, - "standoff": { - "arrayOk": true, - "description": "Moves the marker away from the data point in the direction of `angle` (in px). This can be useful for example if you have another marker at this location and you want to point an arrowhead marker at it.", - "dflt": 0, - "editType": "plot", - "min": 0, - "valType": "number" - }, - "standoffsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `standoff`.", - "editType": "none", - "valType": "string" - }, - "symbol": { - "arrayOk": true, - "description": "Sets the marker symbol type. Adding 100 is equivalent to appending *-open* to a symbol name. Adding 200 is equivalent to appending *-dot* to a symbol name. Adding 300 is equivalent to appending *-open-dot* or *dot-open* to a symbol name.", - "dflt": "circle", - "editType": "style", - "valType": "enumerated", - "values": [ - 0, - "0", - "circle", - 100, - "100", - "circle-open", - 200, - "200", - "circle-dot", - 300, - "300", - "circle-open-dot", - 1, - "1", - "square", - 101, - "101", - "square-open", - 201, - "201", - "square-dot", - 301, - "301", - "square-open-dot", - 2, - "2", - "diamond", - 102, - "102", - "diamond-open", - 202, - "202", - "diamond-dot", - 302, - "302", - "diamond-open-dot", - 3, - "3", - "cross", - 103, - "103", - "cross-open", - 203, - "203", - "cross-dot", - 303, - "303", - "cross-open-dot", - 4, - "4", - "x", - 104, - "104", - "x-open", - 204, - "204", - "x-dot", - 304, - "304", - "x-open-dot", - 5, - "5", - "triangle-up", - 105, - "105", - "triangle-up-open", - 205, - "205", - "triangle-up-dot", - 305, - "305", - "triangle-up-open-dot", - 6, - "6", - "triangle-down", - 106, - "106", - "triangle-down-open", - 206, - "206", - "triangle-down-dot", - 306, - "306", - "triangle-down-open-dot", - 7, - "7", - "triangle-left", - 107, - "107", - "triangle-left-open", - 207, - "207", - "triangle-left-dot", - 307, - "307", - "triangle-left-open-dot", - 8, - "8", - "triangle-right", - 108, - "108", - "triangle-right-open", - 208, - "208", - "triangle-right-dot", - 308, - "308", - "triangle-right-open-dot", - 9, - "9", - "triangle-ne", - 109, - "109", - "triangle-ne-open", - 209, - "209", - "triangle-ne-dot", - 309, - "309", - "triangle-ne-open-dot", - 10, - "10", - "triangle-se", - 110, - "110", - "triangle-se-open", - 210, - "210", - "triangle-se-dot", - 310, - "310", - "triangle-se-open-dot", - 11, - "11", - "triangle-sw", - 111, - "111", - "triangle-sw-open", - 211, - "211", - "triangle-sw-dot", - 311, - "311", - "triangle-sw-open-dot", - 12, - "12", - "triangle-nw", - 112, - "112", - "triangle-nw-open", - 212, - "212", - "triangle-nw-dot", - 312, - "312", - "triangle-nw-open-dot", - 13, - "13", - "pentagon", - 113, - "113", - "pentagon-open", - 213, - "213", - "pentagon-dot", - 313, - "313", - "pentagon-open-dot", - 14, - "14", - "hexagon", - 114, - "114", - "hexagon-open", - 214, - "214", - "hexagon-dot", - 314, - "314", - "hexagon-open-dot", - 15, - "15", - "hexagon2", - 115, - "115", - "hexagon2-open", - 215, - "215", - "hexagon2-dot", - 315, - "315", - "hexagon2-open-dot", - 16, - "16", - "octagon", - 116, - "116", - "octagon-open", - 216, - "216", - "octagon-dot", - 316, - "316", - "octagon-open-dot", - 17, - "17", - "star", - 117, - "117", - "star-open", - 217, - "217", - "star-dot", - 317, - "317", - "star-open-dot", - 18, - "18", - "hexagram", - 118, - "118", - "hexagram-open", - 218, - "218", - "hexagram-dot", - 318, - "318", - "hexagram-open-dot", - 19, - "19", - "star-triangle-up", - 119, - "119", - "star-triangle-up-open", - 219, - "219", - "star-triangle-up-dot", - 319, - "319", - "star-triangle-up-open-dot", - 20, - "20", - "star-triangle-down", - 120, - "120", - "star-triangle-down-open", - 220, - "220", - "star-triangle-down-dot", - 320, - "320", - "star-triangle-down-open-dot", - 21, - "21", - "star-square", - 121, - "121", - "star-square-open", - 221, - "221", - "star-square-dot", - 321, - "321", - "star-square-open-dot", - 22, - "22", - "star-diamond", - 122, - "122", - "star-diamond-open", - 222, - "222", - "star-diamond-dot", - 322, - "322", - "star-diamond-open-dot", - 23, - "23", - "diamond-tall", - 123, - "123", - "diamond-tall-open", - 223, - "223", - "diamond-tall-dot", - 323, - "323", - "diamond-tall-open-dot", - 24, - "24", - "diamond-wide", - 124, - "124", - "diamond-wide-open", - 224, - "224", - "diamond-wide-dot", - 324, - "324", - "diamond-wide-open-dot", - 25, - "25", - "hourglass", - 125, - "125", - "hourglass-open", - 26, - "26", - "bowtie", - 126, - "126", - "bowtie-open", - 27, - "27", - "circle-cross", - 127, - "127", - "circle-cross-open", - 28, - "28", - "circle-x", - 128, - "128", - "circle-x-open", - 29, - "29", - "square-cross", - 129, - "129", - "square-cross-open", - 30, - "30", - "square-x", - 130, - "130", - "square-x-open", - 31, - "31", - "diamond-cross", - 131, - "131", - "diamond-cross-open", - 32, - "32", - "diamond-x", - 132, - "132", - "diamond-x-open", - 33, - "33", - "cross-thin", - 133, - "133", - "cross-thin-open", - 34, - "34", - "x-thin", - 134, - "134", - "x-thin-open", - 35, - "35", - "asterisk", - 135, - "135", - "asterisk-open", - 36, - "36", - "hash", - 136, - "136", - "hash-open", - 236, - "236", - "hash-dot", - 336, - "336", - "hash-open-dot", - 37, - "37", - "y-up", - 137, - "137", - "y-up-open", - 38, - "38", - "y-down", - 138, - "138", - "y-down-open", - 39, - "39", - "y-left", - 139, - "139", - "y-left-open", - 40, - "40", - "y-right", - 140, - "140", - "y-right-open", - 41, - "41", - "line-ew", - 141, - "141", - "line-ew-open", - 42, - "42", - "line-ns", - 142, - "142", - "line-ns-open", - 43, - "43", - "line-ne", - 143, - "143", - "line-ne-open", - 44, - "44", - "line-nw", - 144, - "144", - "line-nw-open", - 45, - "45", - "arrow-up", - 145, - "145", - "arrow-up-open", - 46, - "46", - "arrow-down", - 146, - "146", - "arrow-down-open", - 47, - "47", - "arrow-left", - 147, - "147", - "arrow-left-open", - 48, - "48", - "arrow-right", - 148, - "148", - "arrow-right-open", - 49, - "49", - "arrow-bar-up", - 149, - "149", - "arrow-bar-up-open", - 50, - "50", - "arrow-bar-down", - 150, - "150", - "arrow-bar-down-open", - 51, - "51", - "arrow-bar-left", - 151, - "151", - "arrow-bar-left-open", - 52, - "52", - "arrow-bar-right", - 152, - "152", - "arrow-bar-right-open", - 53, - "53", - "arrow", - 153, - "153", - "arrow-open", - 54, - "54", - "arrow-wide", - 154, - "154", - "arrow-wide-open" - ] - }, - "symbolsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `symbol`.", - "editType": "none", - "valType": "string" - } - }, - "meta": { - "arrayOk": true, - "description": "Assigns extra meta information associated with this trace that can be used in various text attributes. Attributes such as trace `name`, graph, axis and colorbar `title.text`, annotation `text` `rangeselector`, `updatemenues` and `sliders` `label` text all support `meta`. To access the trace `meta` values in an attribute in the same trace, simply use `%{meta[i]}` where `i` is the index or key of the `meta` item in question. To access trace `meta` in layout attributes, use `%{data[n[.meta[i]}` where `i` is the index or key of the `meta` and `n` is the trace index.", - "editType": "plot", - "valType": "any" - }, - "metasrc": { - "description": "Sets the source reference on Chart Studio Cloud for `meta`.", - "editType": "none", - "valType": "string" - }, - "mode": { - "description": "Determines the drawing mode for this scatter trace. If the provided `mode` includes *text* then the `text` elements appear at the coordinates. Otherwise, the `text` elements appear on hover. If there are less than 20 points and the trace is not stacked then the default is *lines+markers*. Otherwise, *lines*.", - "editType": "calc", - "extras": [ - "none" - ], - "flags": [ - "lines", - "markers", - "text" - ], - "valType": "flaglist" - }, - "name": { - "description": "Sets the trace name. The trace name appears as the legend item and on hover.", - "editType": "style", - "valType": "string" - }, - "opacity": { - "description": "Sets the opacity of the trace.", - "dflt": 1, - "editType": "style", - "max": 1, - "min": 0, - "valType": "number" - }, - "r": { - "description": "Sets the radial coordinates", - "editType": "calc+clearAxisTypes", - "valType": "data_array" - }, - "r0": { - "description": "Alternate to `r`. Builds a linear space of r coordinates. Use with `dr` where `r0` is the starting coordinate and `dr` the step.", - "dflt": 0, - "editType": "calc+clearAxisTypes", - "valType": "any" - }, - "rsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `r`.", - "editType": "none", - "valType": "string" - }, - "selected": { - "editType": "style", - "marker": { - "color": { - "description": "Sets the marker color of selected points.", - "editType": "style", - "valType": "color" - }, - "editType": "style", - "opacity": { - "description": "Sets the marker opacity of selected points.", - "editType": "style", - "max": 1, - "min": 0, - "valType": "number" - }, - "role": "object", - "size": { - "description": "Sets the marker size of selected points.", - "editType": "style", - "min": 0, - "valType": "number" - } - }, - "role": "object", - "textfont": { - "color": { - "description": "Sets the text font color of selected points.", - "editType": "style", - "valType": "color" - }, - "editType": "style", - "role": "object" - } - }, - "selectedpoints": { - "description": "Array containing integer indices of selected points. Has an effect only for traces that support selections. Note that an empty array means an empty selection where the `unselected` are turned on for all points, whereas, any other non-array values means no selection all where the `selected` and `unselected` styles have no effect.", - "editType": "calc", - "valType": "any" - }, - "showlegend": { - "description": "Determines whether or not an item corresponding to this trace is shown in the legend.", - "dflt": true, - "editType": "style", - "valType": "boolean" - }, - "stream": { - "editType": "calc", - "maxpoints": { - "description": "Sets the maximum number of points to keep on the plots from an incoming stream. If `maxpoints` is set to *50*, only the newest 50 points will be displayed on the plot.", - "dflt": 500, - "editType": "calc", - "max": 10000, - "min": 0, - "valType": "number" - }, - "role": "object", - "token": { - "description": "The stream id number links a data trace on a plot with a stream. See https://chart-studio.plotly.com/settings for more details.", - "editType": "calc", - "noBlank": true, - "strict": true, - "valType": "string" - } - }, - "subplot": { - "description": "Sets a reference between this trace's data coordinates and a polar subplot. If *polar* (the default value), the data refer to `layout.polar`. If *polar2*, the data refer to `layout.polar2`, and so on.", - "dflt": "polar", - "editType": "calc", - "valType": "subplotid" - }, - "text": { - "arrayOk": true, - "description": "Sets text elements associated with each (x,y) pair. If a single string, the same string appears over all the data points. If an array of string, the items are mapped in order to the this trace's (x,y) coordinates. If trace `hoverinfo` contains a *text* flag and *hovertext* is not set, these elements will be seen in the hover labels.", - "dflt": "", - "editType": "calc", - "valType": "string" - }, - "textfont": { - "color": { - "arrayOk": true, - "editType": "style", - "valType": "color" - }, - "colorsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `color`.", - "editType": "none", - "valType": "string" - }, - "description": "Sets the text font.", - "editType": "calc", - "family": { - "arrayOk": true, - "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", - "editType": "calc", - "noBlank": true, - "strict": true, - "valType": "string" - }, - "familysrc": { - "description": "Sets the source reference on Chart Studio Cloud for `family`.", - "editType": "none", - "valType": "string" - }, - "lineposition": { - "arrayOk": true, - "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", - "dflt": "none", - "editType": "calc", - "extras": [ - "none" - ], - "flags": [ - "under", - "over", - "through" - ], - "valType": "flaglist" - }, - "linepositionsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `lineposition`.", - "editType": "none", - "valType": "string" - }, - "role": "object", - "shadow": { - "arrayOk": true, - "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", - "dflt": "none", - "editType": "calc", - "valType": "string" - }, - "shadowsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `shadow`.", - "editType": "none", - "valType": "string" - }, - "size": { - "arrayOk": true, - "editType": "calc", - "min": 1, - "valType": "number" - }, - "sizesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `size`.", - "editType": "none", - "valType": "string" - }, - "style": { - "arrayOk": true, - "description": "Sets whether a font should be styled with a normal or italic face from its family.", - "dflt": "normal", - "editType": "calc", - "valType": "enumerated", - "values": [ - "normal", - "italic" - ] - }, - "stylesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `style`.", - "editType": "none", - "valType": "string" - }, - "textcase": { - "arrayOk": true, - "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", - "dflt": "normal", - "editType": "calc", - "valType": "enumerated", - "values": [ - "normal", - "word caps", - "upper", - "lower" - ] - }, - "textcasesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `textcase`.", - "editType": "none", - "valType": "string" - }, - "variant": { - "arrayOk": true, - "description": "Sets the variant of the font.", - "dflt": "normal", - "editType": "calc", - "valType": "enumerated", - "values": [ - "normal", - "small-caps", - "all-small-caps", - "all-petite-caps", - "petite-caps", - "unicase" - ] - }, - "variantsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `variant`.", - "editType": "none", - "valType": "string" - }, - "weight": { - "arrayOk": true, - "description": "Sets the weight (or boldness) of the font.", - "dflt": "normal", - "editType": "calc", - "extras": [ - "normal", - "bold" - ], - "max": 1000, - "min": 1, - "valType": "integer" - }, - "weightsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `weight`.", - "editType": "none", - "valType": "string" - } - }, - "textposition": { - "arrayOk": true, - "description": "Sets the positions of the `text` elements with respects to the (x,y) coordinates.", - "dflt": "middle center", - "editType": "calc", - "valType": "enumerated", - "values": [ - "top left", - "top center", - "top right", - "middle left", - "middle center", - "middle right", - "bottom left", - "bottom center", - "bottom right" - ] - }, - "textpositionsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `textposition`.", - "editType": "none", - "valType": "string" - }, - "textsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `text`.", - "editType": "none", - "valType": "string" - }, - "texttemplate": { - "arrayOk": true, - "description": "Template string used for rendering the information text that appears on points. Note that this will override `textinfo`. Variables are inserted using %{variable}, for example \"y: %{y}\". Numbers are formatted using d3-format's syntax %{variable:d3-format}, for example \"Price: %{y:$.2f}\". https://github.com/d3/d3-format/tree/v1.4.5#d3-format for details on the formatting syntax. Dates are formatted using d3-time-format's syntax %{variable|d3-time-format}, for example \"Day: %{2019-01-01|%A}\". https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format for details on the date formatting syntax. Variables that can't be found will be replaced with the specifier. For example, a template of \"data: %{x}, %{y}\" will result in a value of \"data: 1, %{y}\" if x is 1 and y is missing. Variables with an undefined value will be replaced with the fallback value. All attributes that can be specified per-point (the ones that are `arrayOk: true`) are available. Finally, the template string has access to variables `r`, `theta` and `text`.", - "dflt": "", - "editType": "plot", - "valType": "string" - }, - "texttemplatefallback": { - "description": "Fallback string that's displayed when a variable referenced in a template is missing. If the boolean value 'false' is passed in, the specifier with the missing variable will be displayed.", - "dflt": "-", - "editType": "plot", - "valType": "any" - }, - "texttemplatesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `texttemplate`.", - "editType": "none", - "valType": "string" - }, - "theta": { - "description": "Sets the angular coordinates", - "editType": "calc+clearAxisTypes", - "valType": "data_array" - }, - "theta0": { - "description": "Alternate to `theta`. Builds a linear space of theta coordinates. Use with `dtheta` where `theta0` is the starting coordinate and `dtheta` the step.", - "dflt": 0, - "editType": "calc+clearAxisTypes", - "valType": "any" - }, - "thetasrc": { - "description": "Sets the source reference on Chart Studio Cloud for `theta`.", - "editType": "none", - "valType": "string" - }, - "thetaunit": { - "description": "Sets the unit of input *theta* values. Has an effect only when on *linear* angular axes.", - "dflt": "degrees", - "editType": "calc+clearAxisTypes", - "valType": "enumerated", - "values": [ - "radians", - "degrees", - "gradians" - ] - }, - "type": "scatterpolar", - "uid": { - "description": "Assign an id to this trace, Use this to provide object constancy between traces during animations and transitions.", - "editType": "plot", - "valType": "string" - }, - "uirevision": { - "description": "Controls persistence of some user-driven changes to the trace: `constraintrange` in `parcoords` traces, as well as some `editable: true` modifications such as `name` and `colorbar.title`. Defaults to `layout.uirevision`. Note that other user-driven trace attribute changes are controlled by `layout` attributes: `trace.visible` is controlled by `layout.legend.uirevision`, `selectedpoints` is controlled by `layout.selectionrevision`, and `colorbar.(x|y)` (accessible with `config: {editable: true}`) is controlled by `layout.editrevision`. Trace changes are tracked by `uid`, which only falls back on trace index if no `uid` is provided. So if your app can add/remove traces before the end of the `data` array, such that the same trace has a different index, you can still preserve user-driven changes if you give each trace a `uid` that stays with it as it moves.", - "editType": "none", - "valType": "any" - }, - "unselected": { - "editType": "style", - "marker": { - "color": { - "description": "Sets the marker color of unselected points, applied only when a selection exists.", - "editType": "style", - "valType": "color" - }, - "editType": "style", - "opacity": { - "description": "Sets the marker opacity of unselected points, applied only when a selection exists.", - "editType": "style", - "max": 1, - "min": 0, - "valType": "number" - }, - "role": "object", - "size": { - "description": "Sets the marker size of unselected points, applied only when a selection exists.", - "editType": "style", - "min": 0, - "valType": "number" - } - }, - "role": "object", - "textfont": { - "color": { - "description": "Sets the text font color of unselected points, applied only when a selection exists.", - "editType": "style", - "valType": "color" - }, - "editType": "style", - "role": "object" - } - }, - "visible": { - "description": "Determines whether or not this trace is visible. If *legendonly*, the trace is not drawn, but can appear as a legend item (provided that the legend itself is visible).", - "dflt": true, - "editType": "calc", - "valType": "enumerated", - "values": [ - true, - false, - "legendonly" - ] - } - }, - "categories": [ - "polar", - "symbols", - "showLegend", - "scatter-like" - ], - "meta": { - "description": "The scatterpolar trace type encompasses line charts, scatter charts, text charts, and bubble charts in polar coordinates. The data visualized as scatter point or lines is set in `r` (radial) and `theta` (angular) coordinates Text (appearing either on the chart or on hover only) is via `text`. Bubble charts are achieved by setting `marker.size` and/or `marker.color` to numerical arrays.", - "hrName": "scatter_polar" - }, - "type": "scatterpolar" - }, - "scatterpolargl": { - "animatable": false, - "attributes": { - "connectgaps": { - "description": "Determines whether or not gaps (i.e. {nan} or missing values) in the provided data arrays are connected.", - "dflt": false, - "editType": "calc", - "valType": "boolean" - }, - "customdata": { - "description": "Assigns extra data each datum. This may be useful when listening to hover, click and selection events. Note that, *scatter* traces also appends customdata items in the markers DOM elements", - "editType": "calc", - "valType": "data_array" - }, - "customdatasrc": { - "description": "Sets the source reference on Chart Studio Cloud for `customdata`.", - "editType": "none", - "valType": "string" - }, - "dr": { - "description": "Sets the r coordinate step.", - "dflt": 1, - "editType": "calc", - "valType": "number" - }, - "dtheta": { - "description": "Sets the theta coordinate step. By default, the `dtheta` step equals the subplot's period divided by the length of the `r` coordinates.", - "editType": "calc", - "valType": "number" - }, - "fill": { - "description": "Sets the area to fill with a solid color. Defaults to *none* unless this trace is stacked, then it gets *tonexty* (*tonextx*) if `orientation` is *v* (*h*) Use with `fillcolor` if not *none*. *tozerox* and *tozeroy* fill to x=0 and y=0 respectively. *tonextx* and *tonexty* fill between the endpoints of this trace and the endpoints of the trace before it, connecting those endpoints with straight lines (to make a stacked area graph); if there is no trace before it, they behave like *tozerox* and *tozeroy*. *toself* connects the endpoints of the trace (or each segment of the trace if it has gaps) into a closed shape. *tonext* fills the space between two traces if one completely encloses the other (eg consecutive contour lines), and behaves like *toself* if there is no trace before it. *tonext* should not be used if one trace does not enclose the other. Traces in a `stackgroup` will only fill to (or be filled to) other traces in the same group. With multiple `stackgroup`s or some traces stacked and some not, if fill-linked traces are not already consecutive, the later ones will be pushed down in the drawing order.", - "dflt": "none", - "editType": "calc", - "valType": "enumerated", - "values": [ - "none", - "tozeroy", - "tozerox", - "tonexty", - "tonextx", - "toself", - "tonext" - ] - }, - "fillcolor": { - "description": "Sets the fill color. Defaults to a half-transparent variant of the line color, marker color, or marker line color, whichever is available.", - "editType": "calc", - "valType": "color" - }, - "hoverinfo": { - "arrayOk": true, - "description": "Determines which trace information appear on hover. If `none` or `skip` are set, no information is displayed upon hovering. But, if `none` is set, click and hover events are still fired.", - "dflt": "all", - "editType": "none", - "extras": [ - "all", - "none", - "skip" - ], - "flags": [ - "r", - "theta", - "text", - "name" - ], - "valType": "flaglist" - }, - "hoverinfosrc": { - "description": "Sets the source reference on Chart Studio Cloud for `hoverinfo`.", - "editType": "none", - "valType": "string" - }, - "hoverlabel": { - "align": { - "arrayOk": true, - "description": "Sets the horizontal alignment of the text content within hover label box. Has an effect only if the hover label text spans more two or more lines", - "dflt": "auto", - "editType": "none", - "valType": "enumerated", - "values": [ - "left", - "right", - "auto" - ] - }, - "alignsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `align`.", - "editType": "none", - "valType": "string" - }, - "bgcolor": { - "arrayOk": true, - "description": "Sets the background color of the hover labels for this trace", - "editType": "none", - "valType": "color" - }, - "bgcolorsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `bgcolor`.", - "editType": "none", - "valType": "string" - }, - "bordercolor": { - "arrayOk": true, - "description": "Sets the border color of the hover labels for this trace.", - "editType": "none", - "valType": "color" - }, - "bordercolorsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `bordercolor`.", - "editType": "none", - "valType": "string" - }, - "editType": "none", - "font": { - "color": { - "arrayOk": true, - "editType": "none", - "valType": "color" - }, - "colorsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `color`.", - "editType": "none", - "valType": "string" - }, - "description": "Sets the font used in hover labels.", - "editType": "none", - "family": { - "arrayOk": true, - "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", - "editType": "none", - "noBlank": true, - "strict": true, - "valType": "string" - }, - "familysrc": { - "description": "Sets the source reference on Chart Studio Cloud for `family`.", - "editType": "none", - "valType": "string" - }, - "lineposition": { - "arrayOk": true, - "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", - "dflt": "none", - "editType": "none", - "extras": [ - "none" - ], - "flags": [ - "under", - "over", - "through" - ], - "valType": "flaglist" - }, - "linepositionsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `lineposition`.", - "editType": "none", - "valType": "string" - }, - "role": "object", - "shadow": { - "arrayOk": true, - "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", - "dflt": "none", - "editType": "none", - "valType": "string" - }, - "shadowsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `shadow`.", - "editType": "none", - "valType": "string" - }, - "size": { - "arrayOk": true, - "editType": "none", - "min": 1, - "valType": "number" - }, - "sizesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `size`.", - "editType": "none", - "valType": "string" - }, - "style": { - "arrayOk": true, - "description": "Sets whether a font should be styled with a normal or italic face from its family.", - "dflt": "normal", - "editType": "none", - "valType": "enumerated", - "values": [ - "normal", - "italic" - ] - }, - "stylesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `style`.", - "editType": "none", - "valType": "string" - }, - "textcase": { - "arrayOk": true, - "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", - "dflt": "normal", - "editType": "none", - "valType": "enumerated", - "values": [ - "normal", - "word caps", - "upper", - "lower" - ] - }, - "textcasesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `textcase`.", - "editType": "none", - "valType": "string" - }, - "variant": { - "arrayOk": true, - "description": "Sets the variant of the font.", - "dflt": "normal", - "editType": "none", - "valType": "enumerated", - "values": [ - "normal", - "small-caps", - "all-small-caps", - "all-petite-caps", - "petite-caps", - "unicase" - ] - }, - "variantsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `variant`.", - "editType": "none", - "valType": "string" - }, - "weight": { - "arrayOk": true, - "description": "Sets the weight (or boldness) of the font.", - "dflt": "normal", - "editType": "none", - "extras": [ - "normal", - "bold" - ], - "max": 1000, - "min": 1, - "valType": "integer" - }, - "weightsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `weight`.", - "editType": "none", - "valType": "string" - } - }, - "namelength": { - "arrayOk": true, - "description": "Sets the default length (in number of characters) of the trace name in the hover labels for all traces. -1 shows the whole name regardless of length. 0-3 shows the first 0-3 characters, and an integer >3 will show the whole name if it is less than that many characters, but if it is longer, will truncate to `namelength - 3` characters and add an ellipsis.", - "dflt": 15, - "editType": "none", - "min": -1, - "valType": "integer" - }, - "namelengthsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `namelength`.", - "editType": "none", - "valType": "string" - }, - "role": "object", - "showarrow": { - "description": "Sets whether or not to show the hover label arrow/triangle pointing to the data point.", - "dflt": true, - "editType": "none", - "valType": "boolean" - } - }, - "hovertemplate": { - "arrayOk": true, - "description": "Template string used for rendering the information that appear on hover box. Note that this will override `hoverinfo`. Variables are inserted using %{variable}, for example \"y: %{y}\" as well as %{xother}, {%_xother}, {%_xother_}, {%xother_}. When showing info for several points, *xother* will be added to those with different x positions from the first point. An underscore before or after *(x|y)other* will add a space on that side, only when this field is shown. Numbers are formatted using d3-format's syntax %{variable:d3-format}, for example \"Price: %{y:$.2f}\". https://github.com/d3/d3-format/tree/v1.4.5#d3-format for details on the formatting syntax. Dates are formatted using d3-time-format's syntax %{variable|d3-time-format}, for example \"Day: %{2019-01-01|%A}\". https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format for details on the date formatting syntax. Variables that can't be found will be replaced with the specifier. For example, a template of \"data: %{x}, %{y}\" will result in a value of \"data: 1, %{y}\" if x is 1 and y is missing. Variables with an undefined value will be replaced with the fallback value. The variables available in `hovertemplate` are the ones emitted as event data described at this link https://plotly.com/javascript/plotlyjs-events/#event-data. Additionally, all attributes that can be specified per-point (the ones that are `arrayOk: true`) are available. Anything contained in tag `` is displayed in the secondary box, for example `%{fullData.name}`. To hide the secondary box completely, use an empty tag ``.", - "dflt": "", - "editType": "none", - "valType": "string" - }, - "hovertemplatefallback": { - "description": "Fallback string that's displayed when a variable referenced in a template is missing. If the boolean value 'false' is passed in, the specifier with the missing variable will be displayed.", - "dflt": "-", - "editType": "none", - "valType": "any" - }, - "hovertemplatesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `hovertemplate`.", - "editType": "none", - "valType": "string" - }, - "hovertext": { - "arrayOk": true, - "description": "Sets hover text elements associated with each (x,y) pair. If a single string, the same string appears over all the data points. If an array of string, the items are mapped in order to the this trace's (x,y) coordinates. To be seen, trace `hoverinfo` must contain a *text* flag.", - "dflt": "", - "editType": "style", - "valType": "string" - }, - "hovertextsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `hovertext`.", - "editType": "none", - "valType": "string" - }, - "ids": { - "description": "Assigns id labels to each datum. These ids for object constancy of data points during animation. Should be an array of strings, not numbers or any other type.", - "editType": "calc", - "valType": "data_array" - }, - "idssrc": { - "description": "Sets the source reference on Chart Studio Cloud for `ids`.", - "editType": "none", - "valType": "string" - }, - "legend": { - "description": "Sets the reference to a legend to show this trace in. References to these legends are *legend*, *legend2*, *legend3*, etc. Settings for these legends are set in the layout, under `layout.legend`, `layout.legend2`, etc.", - "dflt": "legend", - "editType": "style", - "valType": "subplotid" - }, - "legendgroup": { - "description": "Sets the legend group for this trace. Traces and shapes part of the same legend group hide/show at the same time when toggling legend items.", - "dflt": "", - "editType": "style", - "valType": "string" - }, - "legendgrouptitle": { - "editType": "style", - "font": { - "color": { - "editType": "style", - "valType": "color" - }, - "description": "Sets this legend group's title font.", - "editType": "style", - "family": { - "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", - "editType": "style", - "noBlank": true, - "strict": true, - "valType": "string" - }, - "lineposition": { - "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", - "dflt": "none", - "editType": "style", - "extras": [ - "none" - ], - "flags": [ - "under", - "over", - "through" - ], - "valType": "flaglist" - }, - "role": "object", - "shadow": { - "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", - "dflt": "none", - "editType": "style", - "valType": "string" - }, - "size": { - "editType": "style", - "min": 1, - "valType": "number" - }, - "style": { - "description": "Sets whether a font should be styled with a normal or italic face from its family.", - "dflt": "normal", - "editType": "style", - "valType": "enumerated", - "values": [ - "normal", - "italic" - ] - }, - "textcase": { - "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", - "dflt": "normal", - "editType": "style", - "valType": "enumerated", - "values": [ - "normal", - "word caps", - "upper", - "lower" - ] - }, - "variant": { - "description": "Sets the variant of the font.", - "dflt": "normal", - "editType": "style", - "valType": "enumerated", - "values": [ - "normal", - "small-caps", - "all-small-caps", - "all-petite-caps", - "petite-caps", - "unicase" - ] - }, - "weight": { - "description": "Sets the weight (or boldness) of the font.", - "dflt": "normal", - "editType": "style", - "extras": [ - "normal", - "bold" - ], - "max": 1000, - "min": 1, - "valType": "integer" - } - }, - "role": "object", - "text": { - "description": "Sets the title of the legend group.", - "dflt": "", - "editType": "style", - "valType": "string" - } - }, - "legendrank": { - "description": "Sets the legend rank for this trace. Items and groups with smaller ranks are presented on top/left side while with *reversed* `legend.traceorder` they are on bottom/right side. The default legendrank is 1000, so that you can use ranks less than 1000 to place certain items before all unranked items, and ranks greater than 1000 to go after all unranked items. When having unranked or equal rank items shapes would be displayed after traces i.e. according to their order in data and layout.", - "dflt": 1000, - "editType": "style", - "valType": "number" - }, - "legendwidth": { - "description": "Sets the width (in px or fraction) of the legend for this trace.", - "editType": "style", - "min": 0, - "valType": "number" - }, - "line": { - "color": { - "description": "Sets the line color.", - "editType": "calc", - "valType": "color" - }, - "dash": { - "description": "Sets the style of the lines.", - "dflt": "solid", - "editType": "calc", - "valType": "enumerated", - "values": [ - "dash", - "dashdot", - "dot", - "longdash", - "longdashdot", - "solid" - ] - }, - "editType": "calc", - "role": "object", - "width": { - "description": "Sets the line width (in px).", - "dflt": 2, - "editType": "calc", - "min": 0, - "valType": "number" - } - }, - "marker": { - "angle": { - "arrayOk": true, - "description": "Sets the marker angle in respect to `angleref`.", - "dflt": 0, - "editType": "calc", - "valType": "angle" - }, - "anglesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `angle`.", - "editType": "none", - "valType": "string" - }, - "autocolorscale": { - "description": "Determines whether the colorscale is a default palette (`autocolorscale: true`) or the palette determined by `marker.colorscale`. Has an effect only if in `marker.color` is set to a numerical array. In case `colorscale` is unspecified or `autocolorscale` is true, the default palette will be chosen according to whether numbers in the `color` array are all positive, all negative or mixed.", - "dflt": true, - "editType": "calc", - "impliedEdits": {}, - "valType": "boolean" - }, - "cauto": { - "description": "Determines whether or not the color domain is computed with respect to the input data (here in `marker.color`) or the bounds set in `marker.cmin` and `marker.cmax` Has an effect only if in `marker.color` is set to a numerical array. Defaults to `false` when `marker.cmin` and `marker.cmax` are set by the user.", - "dflt": true, - "editType": "calc", - "impliedEdits": {}, - "valType": "boolean" - }, - "cmax": { - "description": "Sets the upper bound of the color domain. Has an effect only if in `marker.color` is set to a numerical array. Value should have the same units as in `marker.color` and if set, `marker.cmin` must be set as well.", - "dflt": null, - "editType": "calc", - "impliedEdits": { - "cauto": false - }, - "valType": "number" - }, - "cmid": { - "description": "Sets the mid-point of the color domain by scaling `marker.cmin` and/or `marker.cmax` to be equidistant to this point. Has an effect only if in `marker.color` is set to a numerical array. Value should have the same units as in `marker.color`. Has no effect when `marker.cauto` is `false`.", - "dflt": null, - "editType": "calc", - "impliedEdits": {}, - "valType": "number" - }, - "cmin": { - "description": "Sets the lower bound of the color domain. Has an effect only if in `marker.color` is set to a numerical array. Value should have the same units as in `marker.color` and if set, `marker.cmax` must be set as well.", - "dflt": null, - "editType": "calc", - "impliedEdits": { - "cauto": false - }, - "valType": "number" - }, - "color": { - "arrayOk": true, - "description": "Sets the marker color. It accepts either a specific color or an array of numbers that are mapped to the colorscale relative to the max and min values of the array or relative to `marker.cmin` and `marker.cmax` if set.", - "editType": "calc", - "valType": "color" - }, - "coloraxis": { - "description": "Sets a reference to a shared color axis. References to these shared color axes are *coloraxis*, *coloraxis2*, *coloraxis3*, etc. Settings for these shared color axes are set in the layout, under `layout.coloraxis`, `layout.coloraxis2`, etc. Note that multiple color scales can be linked to the same color axis.", - "dflt": null, - "editType": "calc", - "regex": "/^coloraxis([2-9]|[1-9][0-9]+)?$/", - "valType": "subplotid" - }, - "colorbar": { - "bgcolor": { - "description": "Sets the color of padded area.", - "dflt": "rgba(0,0,0,0)", - "editType": "calc", - "valType": "color" - }, - "bordercolor": { - "description": "Sets the axis line color.", - "dflt": "#444", - "editType": "calc", - "valType": "color" - }, - "borderwidth": { - "description": "Sets the width (in px) or the border enclosing this color bar.", - "dflt": 0, - "editType": "calc", - "min": 0, - "valType": "number" - }, - "dtick": { - "description": "Sets the step in-between ticks on this axis. Use with `tick0`. Must be a positive number, or special strings available to *log* and *date* axes. If the axis `type` is *log*, then ticks are set every 10^(n*dtick) where n is the tick number. For example, to set a tick mark at 1, 10, 100, 1000, ... set dtick to 1. To set tick marks at 1, 100, 10000, ... set dtick to 2. To set tick marks at 1, 5, 25, 125, 625, 3125, ... set dtick to log_10(5), or 0.69897000433. *log* has several special values; *L*, where `f` is a positive number, gives ticks linearly spaced in value (but not position). For example `tick0` = 0.1, `dtick` = *L0.5* will put ticks at 0.1, 0.6, 1.1, 1.6 etc. To show powers of 10 plus small digits between, use *D1* (all digits) or *D2* (only 2 and 5). `tick0` is ignored for *D1* and *D2*. If the axis `type` is *date*, then you must convert the time to milliseconds. For example, to set the interval between ticks to one day, set `dtick` to 86400000.0. *date* also has special values *M* gives ticks spaced by a number of months. `n` must be a positive integer. To set ticks on the 15th of every third month, set `tick0` to *2000-01-15* and `dtick` to *M3*. To set ticks every 4 years, set `dtick` to *M48*", - "editType": "calc", - "impliedEdits": { - "tickmode": "linear" - }, - "valType": "any" - }, - "editType": "calc", - "exponentformat": { - "description": "Determines a formatting rule for the tick exponents. For example, consider the number 1,000,000,000. If *none*, it appears as 1,000,000,000. If *e*, 1e+9. If *E*, 1E+9. If *power*, 1x10^9 (with 9 in a super script). If *SI*, 1G. If *B*, 1B. *SI* uses prefixes from \"femto\" f (10^-15) to \"tera\" T (10^12). *SI extended* covers instead the full SI range from \"quecto\" q (10^-30) to \"quetta\" Q (10^30). If *SI* or *SI extended* is used and the exponent is beyond the above ranges, the formatting rule will automatically be switched to the power notation.", - "dflt": "B", - "editType": "calc", - "valType": "enumerated", - "values": [ - "none", - "e", - "E", - "power", - "SI", - "B", - "SI extended" - ] - }, - "labelalias": { - "description": "Replacement text for specific tick or hover labels. For example using {US: 'USA', CA: 'Canada'} changes US to USA and CA to Canada. The labels we would have shown must match the keys exactly, after adding any tickprefix or ticksuffix. For negative numbers the minus sign symbol used (U+2212) is wider than the regular ascii dash. That means you need to use −1 instead of -1. labelalias can be used with any axis type, and both keys (if needed) and values (if desired) can include html-like tags or MathJax.", - "dflt": false, - "editType": "calc", - "valType": "any" - }, - "len": { - "description": "Sets the length of the color bar This measure excludes the padding of both ends. That is, the color bar length is this length minus the padding on both ends.", - "dflt": 1, - "editType": "calc", - "min": 0, - "valType": "number" - }, - "lenmode": { - "description": "Determines whether this color bar's length (i.e. the measure in the color variation direction) is set in units of plot *fraction* or in *pixels. Use `len` to set the value.", - "dflt": "fraction", - "editType": "calc", - "valType": "enumerated", - "values": [ - "fraction", - "pixels" - ] - }, - "minexponent": { - "description": "Hide SI prefix for 10^n if |n| is below this number. This only has an effect when `tickformat` is *SI* or *B*.", - "dflt": 3, - "editType": "calc", - "min": 0, - "valType": "number" - }, - "nticks": { - "description": "Specifies the maximum number of ticks for the particular axis. The actual number of ticks will be chosen automatically to be less than or equal to `nticks`. Has an effect only if `tickmode` is set to *auto*.", - "dflt": 0, - "editType": "calc", - "min": 0, - "valType": "integer" - }, - "orientation": { - "description": "Sets the orientation of the colorbar.", - "dflt": "v", - "editType": "calc", - "valType": "enumerated", - "values": [ - "h", - "v" - ] - }, - "outlinecolor": { - "description": "Sets the axis line color.", - "dflt": "#444", - "editType": "calc", - "valType": "color" - }, - "outlinewidth": { - "description": "Sets the width (in px) of the axis line.", - "dflt": 1, - "editType": "calc", - "min": 0, - "valType": "number" - }, - "role": "object", - "separatethousands": { - "description": "If \"true\", even 4-digit integers are separated", - "dflt": false, - "editType": "calc", - "valType": "boolean" - }, - "showexponent": { - "description": "If *all*, all exponents are shown besides their significands. If *first*, only the exponent of the first tick is shown. If *last*, only the exponent of the last tick is shown. If *none*, no exponents appear.", - "dflt": "all", - "editType": "calc", - "valType": "enumerated", - "values": [ - "all", - "first", - "last", - "none" - ] - }, - "showticklabels": { - "description": "Determines whether or not the tick labels are drawn.", - "dflt": true, - "editType": "calc", - "valType": "boolean" - }, - "showtickprefix": { - "description": "If *all*, all tick labels are displayed with a prefix. If *first*, only the first tick is displayed with a prefix. If *last*, only the last tick is displayed with a suffix. If *none*, tick prefixes are hidden.", - "dflt": "all", - "editType": "calc", - "valType": "enumerated", - "values": [ - "all", - "first", - "last", - "none" - ] - }, - "showticksuffix": { - "description": "Same as `showtickprefix` but for tick suffixes.", - "dflt": "all", - "editType": "calc", - "valType": "enumerated", - "values": [ - "all", - "first", - "last", - "none" - ] - }, - "thickness": { - "description": "Sets the thickness of the color bar This measure excludes the size of the padding, ticks and labels.", - "dflt": 30, - "editType": "calc", - "min": 0, - "valType": "number" - }, - "thicknessmode": { - "description": "Determines whether this color bar's thickness (i.e. the measure in the constant color direction) is set in units of plot *fraction* or in *pixels*. Use `thickness` to set the value.", - "dflt": "pixels", - "editType": "calc", - "valType": "enumerated", - "values": [ - "fraction", - "pixels" - ] - }, - "tick0": { - "description": "Sets the placement of the first tick on this axis. Use with `dtick`. If the axis `type` is *log*, then you must take the log of your starting tick (e.g. to set the starting tick to 100, set the `tick0` to 2) except when `dtick`=*L* (see `dtick` for more info). If the axis `type` is *date*, it should be a date string, like date data. If the axis `type` is *category*, it should be a number, using the scale where each category is assigned a serial number from zero in the order it appears.", - "editType": "calc", - "impliedEdits": { - "tickmode": "linear" - }, - "valType": "any" - }, - "tickangle": { - "description": "Sets the angle of the tick labels with respect to the horizontal. For example, a `tickangle` of -90 draws the tick labels vertically.", - "dflt": "auto", - "editType": "calc", - "valType": "angle" - }, - "tickcolor": { - "description": "Sets the tick color.", - "dflt": "#444", - "editType": "calc", - "valType": "color" - }, - "tickfont": { - "color": { - "editType": "calc", - "valType": "color" - }, - "description": "Sets the color bar's tick label font", - "editType": "calc", - "family": { - "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", - "editType": "calc", - "noBlank": true, - "strict": true, - "valType": "string" - }, - "lineposition": { - "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", - "dflt": "none", - "editType": "calc", - "extras": [ - "none" - ], - "flags": [ - "under", - "over", - "through" - ], - "valType": "flaglist" - }, - "role": "object", - "shadow": { - "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", - "dflt": "none", - "editType": "calc", - "valType": "string" - }, - "size": { - "editType": "calc", - "min": 1, - "valType": "number" - }, - "style": { - "description": "Sets whether a font should be styled with a normal or italic face from its family.", - "dflt": "normal", - "editType": "calc", - "valType": "enumerated", - "values": [ - "normal", - "italic" - ] - }, - "textcase": { - "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", - "dflt": "normal", - "editType": "calc", - "valType": "enumerated", - "values": [ - "normal", - "word caps", - "upper", - "lower" - ] - }, - "variant": { - "description": "Sets the variant of the font.", - "dflt": "normal", - "editType": "calc", - "valType": "enumerated", - "values": [ - "normal", - "small-caps", - "all-small-caps", - "all-petite-caps", - "petite-caps", - "unicase" - ] - }, - "weight": { - "description": "Sets the weight (or boldness) of the font.", - "dflt": "normal", - "editType": "calc", - "extras": [ - "normal", - "bold" - ], - "max": 1000, - "min": 1, - "valType": "integer" - } - }, - "tickformat": { - "description": "Sets the tick label formatting rule using d3 formatting mini-languages which are very similar to those in Python. For numbers, see: https://github.com/d3/d3-format/tree/v1.4.5#d3-format. And for dates see: https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format. We add two items to d3's date formatter: *%h* for half of the year as a decimal number as well as *%{n}f* for fractional seconds with n digits. For example, *2016-10-13 09:15:23.456* with tickformat *%H~%M~%S.%2f* would display *09~15~23.46*", - "dflt": "", - "editType": "calc", - "valType": "string" - }, - "tickformatstops": { - "items": { - "tickformatstop": { - "dtickrange": { - "description": "range [*min*, *max*], where *min*, *max* - dtick values which describe some zoom level, it is possible to omit *min* or *max* value by passing *null*", - "editType": "calc", - "items": [ - { - "editType": "calc", - "valType": "any" - }, - { - "editType": "calc", - "valType": "any" - } - ], - "valType": "info_array" - }, - "editType": "calc", - "enabled": { - "description": "Determines whether or not this stop is used. If `false`, this stop is ignored even within its `dtickrange`.", - "dflt": true, - "editType": "calc", - "valType": "boolean" - }, - "name": { - "description": "When used in a template, named items are created in the output figure in addition to any items the figure already has in this array. You can modify these items in the output figure by making your own item with `templateitemname` matching this `name` alongside your modifications (including `visible: false` or `enabled: false` to hide it). Has no effect outside of a template.", - "editType": "calc", - "valType": "string" - }, - "role": "object", - "templateitemname": { - "description": "Used to refer to a named item in this array in the template. Named items from the template will be created even without a matching item in the input figure, but you can modify one by making an item with `templateitemname` matching its `name`, alongside your modifications (including `visible: false` or `enabled: false` to hide it). If there is no template or no matching item, this item will be hidden unless you explicitly show it with `visible: true`.", - "editType": "calc", - "valType": "string" - }, - "value": { - "description": "string - dtickformat for described zoom level, the same as *tickformat*", - "dflt": "", - "editType": "calc", - "valType": "string" - } - } - }, - "role": "object" - }, - "ticklabeloverflow": { - "description": "Determines how we handle tick labels that would overflow either the graph div or the domain of the axis. The default value for inside tick labels is *hide past domain*. In other cases the default is *hide past div*.", - "editType": "calc", - "valType": "enumerated", - "values": [ - "allow", - "hide past div", - "hide past domain" - ] - }, - "ticklabelposition": { - "description": "Determines where tick labels are drawn relative to the ticks. Left and right options are used when `orientation` is *h*, top and bottom when `orientation` is *v*.", - "dflt": "outside", - "editType": "calc", - "valType": "enumerated", - "values": [ - "outside", - "inside", - "outside top", - "inside top", - "outside left", - "inside left", - "outside right", - "inside right", - "outside bottom", - "inside bottom" - ] - }, - "ticklabelstep": { - "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", - "dflt": 1, - "editType": "calc", - "min": 1, - "valType": "integer" - }, - "ticklen": { - "description": "Sets the tick length (in px).", - "dflt": 5, - "editType": "calc", - "min": 0, - "valType": "number" - }, - "tickmode": { - "description": "Sets the tick mode for this axis. If *auto*, the number of ticks is set via `nticks`. If *linear*, the placement of the ticks is determined by a starting position `tick0` and a tick step `dtick` (*linear* is the default value if `tick0` and `dtick` are provided). If *array*, the placement of the ticks is set via `tickvals` and the tick text is `ticktext`. (*array* is the default value if `tickvals` is provided).", - "editType": "calc", - "impliedEdits": {}, - "valType": "enumerated", - "values": [ - "auto", - "linear", - "array" - ] - }, - "tickprefix": { - "description": "Sets a tick label prefix.", - "dflt": "", - "editType": "calc", - "valType": "string" - }, - "ticks": { - "description": "Determines whether ticks are drawn or not. If **, this axis' ticks are not drawn. If *outside* (*inside*), this axis' are drawn outside (inside) the axis lines.", - "dflt": "", - "editType": "calc", - "valType": "enumerated", - "values": [ - "outside", - "inside", - "" - ] - }, - "ticksuffix": { - "description": "Sets a tick label suffix.", - "dflt": "", - "editType": "calc", - "valType": "string" - }, - "ticktext": { - "description": "Sets the text displayed at the ticks position via `tickvals`. Only has an effect if `tickmode` is set to *array*. Used with `tickvals`.", - "editType": "calc", - "valType": "data_array" - }, - "ticktextsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `ticktext`.", - "editType": "none", - "valType": "string" - }, - "tickvals": { - "description": "Sets the values at which ticks on this axis appear. Only has an effect if `tickmode` is set to *array*. Used with `ticktext`.", - "editType": "calc", - "valType": "data_array" - }, - "tickvalssrc": { - "description": "Sets the source reference on Chart Studio Cloud for `tickvals`.", - "editType": "none", - "valType": "string" - }, - "tickwidth": { - "description": "Sets the tick width (in px).", - "dflt": 1, - "editType": "calc", - "min": 0, - "valType": "number" - }, - "title": { - "editType": "calc", - "font": { - "color": { - "editType": "calc", - "valType": "color" - }, - "description": "Sets this color bar's title font.", - "editType": "calc", - "family": { - "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", - "editType": "calc", - "noBlank": true, - "strict": true, - "valType": "string" - }, - "lineposition": { - "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", - "dflt": "none", - "editType": "calc", - "extras": [ - "none" - ], - "flags": [ - "under", - "over", - "through" - ], - "valType": "flaglist" - }, - "role": "object", - "shadow": { - "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", - "dflt": "none", - "editType": "calc", - "valType": "string" - }, - "size": { - "editType": "calc", - "min": 1, - "valType": "number" - }, - "style": { - "description": "Sets whether a font should be styled with a normal or italic face from its family.", - "dflt": "normal", - "editType": "calc", - "valType": "enumerated", - "values": [ - "normal", - "italic" - ] - }, - "textcase": { - "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", - "dflt": "normal", - "editType": "calc", - "valType": "enumerated", - "values": [ - "normal", - "word caps", - "upper", - "lower" - ] - }, - "variant": { - "description": "Sets the variant of the font.", - "dflt": "normal", - "editType": "calc", - "valType": "enumerated", - "values": [ - "normal", - "small-caps", - "all-small-caps", - "all-petite-caps", - "petite-caps", - "unicase" - ] - }, - "weight": { - "description": "Sets the weight (or boldness) of the font.", - "dflt": "normal", - "editType": "calc", - "extras": [ - "normal", - "bold" - ], - "max": 1000, - "min": 1, - "valType": "integer" - } - }, - "role": "object", - "side": { - "description": "Determines the location of color bar's title with respect to the color bar. Defaults to *top* when `orientation` if *v* and defaults to *right* when `orientation` if *h*.", - "editType": "calc", - "valType": "enumerated", - "values": [ - "right", - "top", - "bottom" - ] - }, - "text": { - "description": "Sets the title of the color bar.", - "editType": "calc", - "valType": "string" - } - }, - "x": { - "description": "Sets the x position with respect to `xref` of the color bar (in plot fraction). When `xref` is *paper*, defaults to 1.02 when `orientation` is *v* and 0.5 when `orientation` is *h*. When `xref` is *container*, defaults to *1* when `orientation` is *v* and 0.5 when `orientation` is *h*. Must be between *0* and *1* if `xref` is *container* and between *-2* and *3* if `xref` is *paper*.", - "editType": "calc", - "valType": "number" - }, - "xanchor": { - "description": "Sets this color bar's horizontal position anchor. This anchor binds the `x` position to the *left*, *center* or *right* of the color bar. Defaults to *left* when `orientation` is *v* and *center* when `orientation` is *h*.", - "editType": "calc", - "valType": "enumerated", - "values": [ - "left", - "center", - "right" - ] - }, - "xpad": { - "description": "Sets the amount of padding (in px) along the x direction.", - "dflt": 10, - "editType": "calc", - "min": 0, - "valType": "number" - }, - "xref": { - "description": "Sets the container `x` refers to. *container* spans the entire `width` of the plot. *paper* refers to the width of the plotting area only.", - "dflt": "paper", - "editType": "calc", - "valType": "enumerated", - "values": [ - "container", - "paper" - ] - }, - "y": { - "description": "Sets the y position with respect to `yref` of the color bar (in plot fraction). When `yref` is *paper*, defaults to 0.5 when `orientation` is *v* and 1.02 when `orientation` is *h*. When `yref` is *container*, defaults to 0.5 when `orientation` is *v* and 1 when `orientation` is *h*. Must be between *0* and *1* if `yref` is *container* and between *-2* and *3* if `yref` is *paper*.", - "editType": "calc", - "valType": "number" - }, - "yanchor": { - "description": "Sets this color bar's vertical position anchor This anchor binds the `y` position to the *top*, *middle* or *bottom* of the color bar. Defaults to *middle* when `orientation` is *v* and *bottom* when `orientation` is *h*.", - "editType": "calc", - "valType": "enumerated", - "values": [ - "top", - "middle", - "bottom" - ] - }, - "ypad": { - "description": "Sets the amount of padding (in px) along the y direction.", - "dflt": 10, - "editType": "calc", - "min": 0, - "valType": "number" - }, - "yref": { - "description": "Sets the container `y` refers to. *container* spans the entire `height` of the plot. *paper* refers to the height of the plotting area only.", - "dflt": "paper", - "editType": "calc", - "valType": "enumerated", - "values": [ - "container", - "paper" - ] - } - }, - "colorscale": { - "description": "Sets the colorscale. Has an effect only if in `marker.color` is set to a numerical array. The colorscale must be an array containing arrays mapping a normalized value to an rgb, rgba, hex, hsl, hsv, or named color string. At minimum, a mapping for the lowest (0) and highest (1) values are required. For example, `[[0, 'rgb(0,0,255)'], [1, 'rgb(255,0,0)']]`. To control the bounds of the colorscale in color space, use `marker.cmin` and `marker.cmax`. Alternatively, `colorscale` may be a palette name string of the following list: Blackbody,Bluered,Blues,Cividis,Earth,Electric,Greens,Greys,Hot,Jet,Picnic,Portland,Rainbow,RdBu,Reds,Viridis,YlGnBu,YlOrRd.", - "dflt": null, - "editType": "calc", - "impliedEdits": { - "autocolorscale": false - }, - "valType": "colorscale" - }, - "colorsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `color`.", - "editType": "none", - "valType": "string" - }, - "editType": "calc", - "line": { - "autocolorscale": { - "description": "Determines whether the colorscale is a default palette (`autocolorscale: true`) or the palette determined by `marker.line.colorscale`. Has an effect only if in `marker.line.color` is set to a numerical array. In case `colorscale` is unspecified or `autocolorscale` is true, the default palette will be chosen according to whether numbers in the `color` array are all positive, all negative or mixed.", - "dflt": true, - "editType": "calc", - "impliedEdits": {}, - "valType": "boolean" - }, - "cauto": { - "description": "Determines whether or not the color domain is computed with respect to the input data (here in `marker.line.color`) or the bounds set in `marker.line.cmin` and `marker.line.cmax` Has an effect only if in `marker.line.color` is set to a numerical array. Defaults to `false` when `marker.line.cmin` and `marker.line.cmax` are set by the user.", - "dflt": true, - "editType": "calc", - "impliedEdits": {}, - "valType": "boolean" - }, - "cmax": { - "description": "Sets the upper bound of the color domain. Has an effect only if in `marker.line.color` is set to a numerical array. Value should have the same units as in `marker.line.color` and if set, `marker.line.cmin` must be set as well.", - "dflt": null, - "editType": "calc", - "impliedEdits": { - "cauto": false - }, - "valType": "number" - }, - "cmid": { - "description": "Sets the mid-point of the color domain by scaling `marker.line.cmin` and/or `marker.line.cmax` to be equidistant to this point. Has an effect only if in `marker.line.color` is set to a numerical array. Value should have the same units as in `marker.line.color`. Has no effect when `marker.line.cauto` is `false`.", - "dflt": null, - "editType": "calc", - "impliedEdits": {}, - "valType": "number" - }, - "cmin": { - "description": "Sets the lower bound of the color domain. Has an effect only if in `marker.line.color` is set to a numerical array. Value should have the same units as in `marker.line.color` and if set, `marker.line.cmax` must be set as well.", - "dflt": null, - "editType": "calc", - "impliedEdits": { - "cauto": false - }, - "valType": "number" - }, - "color": { - "arrayOk": true, - "description": "Sets the marker.line color. It accepts either a specific color or an array of numbers that are mapped to the colorscale relative to the max and min values of the array or relative to `marker.line.cmin` and `marker.line.cmax` if set.", - "editType": "calc", - "valType": "color" - }, - "coloraxis": { - "description": "Sets a reference to a shared color axis. References to these shared color axes are *coloraxis*, *coloraxis2*, *coloraxis3*, etc. Settings for these shared color axes are set in the layout, under `layout.coloraxis`, `layout.coloraxis2`, etc. Note that multiple color scales can be linked to the same color axis.", - "dflt": null, - "editType": "calc", - "regex": "/^coloraxis([2-9]|[1-9][0-9]+)?$/", - "valType": "subplotid" - }, - "colorscale": { - "description": "Sets the colorscale. Has an effect only if in `marker.line.color` is set to a numerical array. The colorscale must be an array containing arrays mapping a normalized value to an rgb, rgba, hex, hsl, hsv, or named color string. At minimum, a mapping for the lowest (0) and highest (1) values are required. For example, `[[0, 'rgb(0,0,255)'], [1, 'rgb(255,0,0)']]`. To control the bounds of the colorscale in color space, use `marker.line.cmin` and `marker.line.cmax`. Alternatively, `colorscale` may be a palette name string of the following list: Blackbody,Bluered,Blues,Cividis,Earth,Electric,Greens,Greys,Hot,Jet,Picnic,Portland,Rainbow,RdBu,Reds,Viridis,YlGnBu,YlOrRd.", - "dflt": null, - "editType": "calc", - "impliedEdits": { - "autocolorscale": false - }, - "valType": "colorscale" - }, - "colorsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `color`.", - "editType": "none", - "valType": "string" - }, - "editType": "calc", - "reversescale": { - "description": "Reverses the color mapping if true. Has an effect only if in `marker.line.color` is set to a numerical array. If true, `marker.line.cmin` will correspond to the last color in the array and `marker.line.cmax` will correspond to the first color.", - "dflt": false, - "editType": "calc", - "valType": "boolean" - }, - "role": "object", - "width": { - "arrayOk": true, - "description": "Sets the width (in px) of the lines bounding the marker points.", - "editType": "calc", - "min": 0, - "valType": "number" - }, - "widthsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `width`.", - "editType": "none", - "valType": "string" - } - }, - "opacity": { - "arrayOk": true, - "description": "Sets the marker opacity.", - "editType": "calc", - "max": 1, - "min": 0, - "valType": "number" - }, - "opacitysrc": { - "description": "Sets the source reference on Chart Studio Cloud for `opacity`.", - "editType": "none", - "valType": "string" - }, - "reversescale": { - "description": "Reverses the color mapping if true. Has an effect only if in `marker.color` is set to a numerical array. If true, `marker.cmin` will correspond to the last color in the array and `marker.cmax` will correspond to the first color.", - "dflt": false, - "editType": "calc", - "valType": "boolean" - }, - "role": "object", - "showscale": { - "description": "Determines whether or not a colorbar is displayed for this trace. Has an effect only if in `marker.color` is set to a numerical array.", - "dflt": false, - "editType": "calc", - "valType": "boolean" - }, - "size": { - "arrayOk": true, - "description": "Sets the marker size (in px).", - "dflt": 6, - "editType": "calc", - "min": 0, - "valType": "number" - }, - "sizemin": { - "description": "Has an effect only if `marker.size` is set to a numerical array. Sets the minimum size (in px) of the rendered marker points.", - "dflt": 0, - "editType": "calc", - "min": 0, - "valType": "number" - }, - "sizemode": { - "description": "Has an effect only if `marker.size` is set to a numerical array. Sets the rule for which the data in `size` is converted to pixels.", - "dflt": "diameter", - "editType": "calc", - "valType": "enumerated", - "values": [ - "diameter", - "area" - ] - }, - "sizeref": { - "description": "Has an effect only if `marker.size` is set to a numerical array. Sets the scale factor used to determine the rendered size of marker points. Use with `sizemin` and `sizemode`.", - "dflt": 1, - "editType": "calc", - "valType": "number" - }, - "sizesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `size`.", - "editType": "none", - "valType": "string" - }, - "symbol": { - "arrayOk": true, - "description": "Sets the marker symbol type. Adding 100 is equivalent to appending *-open* to a symbol name. Adding 200 is equivalent to appending *-dot* to a symbol name. Adding 300 is equivalent to appending *-open-dot* or *dot-open* to a symbol name.", - "dflt": "circle", - "editType": "calc", - "valType": "enumerated", - "values": [ - 0, - "0", - "circle", - 100, - "100", - "circle-open", - 200, - "200", - "circle-dot", - 300, - "300", - "circle-open-dot", - 1, - "1", - "square", - 101, - "101", - "square-open", - 201, - "201", - "square-dot", - 301, - "301", - "square-open-dot", - 2, - "2", - "diamond", - 102, - "102", - "diamond-open", - 202, - "202", - "diamond-dot", - 302, - "302", - "diamond-open-dot", - 3, - "3", - "cross", - 103, - "103", - "cross-open", - 203, - "203", - "cross-dot", - 303, - "303", - "cross-open-dot", - 4, - "4", - "x", - 104, - "104", - "x-open", - 204, - "204", - "x-dot", - 304, - "304", - "x-open-dot", - 5, - "5", - "triangle-up", - 105, - "105", - "triangle-up-open", - 205, - "205", - "triangle-up-dot", - 305, - "305", - "triangle-up-open-dot", - 6, - "6", - "triangle-down", - 106, - "106", - "triangle-down-open", - 206, - "206", - "triangle-down-dot", - 306, - "306", - "triangle-down-open-dot", - 7, - "7", - "triangle-left", - 107, - "107", - "triangle-left-open", - 207, - "207", - "triangle-left-dot", - 307, - "307", - "triangle-left-open-dot", - 8, - "8", - "triangle-right", - 108, - "108", - "triangle-right-open", - 208, - "208", - "triangle-right-dot", - 308, - "308", - "triangle-right-open-dot", - 9, - "9", - "triangle-ne", - 109, - "109", - "triangle-ne-open", - 209, - "209", - "triangle-ne-dot", - 309, - "309", - "triangle-ne-open-dot", - 10, - "10", - "triangle-se", - 110, - "110", - "triangle-se-open", - 210, - "210", - "triangle-se-dot", - 310, - "310", - "triangle-se-open-dot", - 11, - "11", - "triangle-sw", - 111, - "111", - "triangle-sw-open", - 211, - "211", - "triangle-sw-dot", - 311, - "311", - "triangle-sw-open-dot", - 12, - "12", - "triangle-nw", - 112, - "112", - "triangle-nw-open", - 212, - "212", - "triangle-nw-dot", - 312, - "312", - "triangle-nw-open-dot", - 13, - "13", - "pentagon", - 113, - "113", - "pentagon-open", - 213, - "213", - "pentagon-dot", - 313, - "313", - "pentagon-open-dot", - 14, - "14", - "hexagon", - 114, - "114", - "hexagon-open", - 214, - "214", - "hexagon-dot", - 314, - "314", - "hexagon-open-dot", - 15, - "15", - "hexagon2", - 115, - "115", - "hexagon2-open", - 215, - "215", - "hexagon2-dot", - 315, - "315", - "hexagon2-open-dot", - 16, - "16", - "octagon", - 116, - "116", - "octagon-open", - 216, - "216", - "octagon-dot", - 316, - "316", - "octagon-open-dot", - 17, - "17", - "star", - 117, - "117", - "star-open", - 217, - "217", - "star-dot", - 317, - "317", - "star-open-dot", - 18, - "18", - "hexagram", - 118, - "118", - "hexagram-open", - 218, - "218", - "hexagram-dot", - 318, - "318", - "hexagram-open-dot", - 19, - "19", - "star-triangle-up", - 119, - "119", - "star-triangle-up-open", - 219, - "219", - "star-triangle-up-dot", - 319, - "319", - "star-triangle-up-open-dot", - 20, - "20", - "star-triangle-down", - 120, - "120", - "star-triangle-down-open", - 220, - "220", - "star-triangle-down-dot", - 320, - "320", - "star-triangle-down-open-dot", - 21, - "21", - "star-square", - 121, - "121", - "star-square-open", - 221, - "221", - "star-square-dot", - 321, - "321", - "star-square-open-dot", - 22, - "22", - "star-diamond", - 122, - "122", - "star-diamond-open", - 222, - "222", - "star-diamond-dot", - 322, - "322", - "star-diamond-open-dot", - 23, - "23", - "diamond-tall", - 123, - "123", - "diamond-tall-open", - 223, - "223", - "diamond-tall-dot", - 323, - "323", - "diamond-tall-open-dot", - 24, - "24", - "diamond-wide", - 124, - "124", - "diamond-wide-open", - 224, - "224", - "diamond-wide-dot", - 324, - "324", - "diamond-wide-open-dot", - 25, - "25", - "hourglass", - 125, - "125", - "hourglass-open", - 26, - "26", - "bowtie", - 126, - "126", - "bowtie-open", - 27, - "27", - "circle-cross", - 127, - "127", - "circle-cross-open", - 28, - "28", - "circle-x", - 128, - "128", - "circle-x-open", - 29, - "29", - "square-cross", - 129, - "129", - "square-cross-open", - 30, - "30", - "square-x", - 130, - "130", - "square-x-open", - 31, - "31", - "diamond-cross", - 131, - "131", - "diamond-cross-open", - 32, - "32", - "diamond-x", - 132, - "132", - "diamond-x-open", - 33, - "33", - "cross-thin", - 133, - "133", - "cross-thin-open", - 34, - "34", - "x-thin", - 134, - "134", - "x-thin-open", - 35, - "35", - "asterisk", - 135, - "135", - "asterisk-open", - 36, - "36", - "hash", - 136, - "136", - "hash-open", - 236, - "236", - "hash-dot", - 336, - "336", - "hash-open-dot", - 37, - "37", - "y-up", - 137, - "137", - "y-up-open", - 38, - "38", - "y-down", - 138, - "138", - "y-down-open", - 39, - "39", - "y-left", - 139, - "139", - "y-left-open", - 40, - "40", - "y-right", - 140, - "140", - "y-right-open", - 41, - "41", - "line-ew", - 141, - "141", - "line-ew-open", - 42, - "42", - "line-ns", - 142, - "142", - "line-ns-open", - 43, - "43", - "line-ne", - 143, - "143", - "line-ne-open", - 44, - "44", - "line-nw", - 144, - "144", - "line-nw-open", - 45, - "45", - "arrow-up", - 145, - "145", - "arrow-up-open", - 46, - "46", - "arrow-down", - 146, - "146", - "arrow-down-open", - 47, - "47", - "arrow-left", - 147, - "147", - "arrow-left-open", - 48, - "48", - "arrow-right", - 148, - "148", - "arrow-right-open", - 49, - "49", - "arrow-bar-up", - 149, - "149", - "arrow-bar-up-open", - 50, - "50", - "arrow-bar-down", - 150, - "150", - "arrow-bar-down-open", - 51, - "51", - "arrow-bar-left", - 151, - "151", - "arrow-bar-left-open", - 52, - "52", - "arrow-bar-right", - 152, - "152", - "arrow-bar-right-open", - 53, - "53", - "arrow", - 153, - "153", - "arrow-open", - 54, - "54", - "arrow-wide", - 154, - "154", - "arrow-wide-open" - ] - }, - "symbolsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `symbol`.", - "editType": "none", - "valType": "string" - } - }, - "meta": { - "arrayOk": true, - "description": "Assigns extra meta information associated with this trace that can be used in various text attributes. Attributes such as trace `name`, graph, axis and colorbar `title.text`, annotation `text` `rangeselector`, `updatemenues` and `sliders` `label` text all support `meta`. To access the trace `meta` values in an attribute in the same trace, simply use `%{meta[i]}` where `i` is the index or key of the `meta` item in question. To access trace `meta` in layout attributes, use `%{data[n[.meta[i]}` where `i` is the index or key of the `meta` and `n` is the trace index.", - "editType": "plot", - "valType": "any" - }, - "metasrc": { - "description": "Sets the source reference on Chart Studio Cloud for `meta`.", - "editType": "none", - "valType": "string" - }, - "mode": { - "description": "Determines the drawing mode for this scatter trace. If the provided `mode` includes *text* then the `text` elements appear at the coordinates. Otherwise, the `text` elements appear on hover. If there are less than 20 points and the trace is not stacked then the default is *lines+markers*. Otherwise, *lines*.", - "editType": "calc", - "extras": [ - "none" - ], - "flags": [ - "lines", - "markers", - "text" - ], - "valType": "flaglist" - }, - "name": { - "description": "Sets the trace name. The trace name appears as the legend item and on hover.", - "editType": "style", - "valType": "string" - }, - "opacity": { - "description": "Sets the opacity of the trace.", - "dflt": 1, - "editType": "style", - "max": 1, - "min": 0, - "valType": "number" - }, - "r": { - "description": "Sets the radial coordinates", - "editType": "calc+clearAxisTypes", - "valType": "data_array" - }, - "r0": { - "description": "Alternate to `r`. Builds a linear space of r coordinates. Use with `dr` where `r0` is the starting coordinate and `dr` the step.", - "dflt": 0, - "editType": "calc+clearAxisTypes", - "valType": "any" - }, - "rsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `r`.", - "editType": "none", - "valType": "string" - }, - "selected": { - "editType": "style", - "marker": { - "color": { - "description": "Sets the marker color of selected points.", - "editType": "style", - "valType": "color" - }, - "editType": "style", - "opacity": { - "description": "Sets the marker opacity of selected points.", - "editType": "style", - "max": 1, - "min": 0, - "valType": "number" - }, - "role": "object", - "size": { - "description": "Sets the marker size of selected points.", - "editType": "style", - "min": 0, - "valType": "number" - } - }, - "role": "object", - "textfont": { - "color": { - "description": "Sets the text font color of selected points.", - "editType": "style", - "valType": "color" - }, - "editType": "style", - "role": "object" - } - }, - "selectedpoints": { - "description": "Array containing integer indices of selected points. Has an effect only for traces that support selections. Note that an empty array means an empty selection where the `unselected` are turned on for all points, whereas, any other non-array values means no selection all where the `selected` and `unselected` styles have no effect.", - "editType": "calc", - "valType": "any" - }, - "showlegend": { - "description": "Determines whether or not an item corresponding to this trace is shown in the legend.", - "dflt": true, - "editType": "style", - "valType": "boolean" - }, - "stream": { - "editType": "calc", - "maxpoints": { - "description": "Sets the maximum number of points to keep on the plots from an incoming stream. If `maxpoints` is set to *50*, only the newest 50 points will be displayed on the plot.", - "dflt": 500, - "editType": "calc", - "max": 10000, - "min": 0, - "valType": "number" - }, - "role": "object", - "token": { - "description": "The stream id number links a data trace on a plot with a stream. See https://chart-studio.plotly.com/settings for more details.", - "editType": "calc", - "noBlank": true, - "strict": true, - "valType": "string" - } - }, - "subplot": { - "description": "Sets a reference between this trace's data coordinates and a polar subplot. If *polar* (the default value), the data refer to `layout.polar`. If *polar2*, the data refer to `layout.polar2`, and so on.", - "dflt": "polar", - "editType": "calc", - "valType": "subplotid" - }, - "text": { - "arrayOk": true, - "description": "Sets text elements associated with each (x,y) pair. If a single string, the same string appears over all the data points. If an array of string, the items are mapped in order to the this trace's (x,y) coordinates. If trace `hoverinfo` contains a *text* flag and *hovertext* is not set, these elements will be seen in the hover labels.", - "dflt": "", - "editType": "calc", - "valType": "string" - }, - "textfont": { - "color": { - "arrayOk": true, - "editType": "calc", - "valType": "color" - }, - "colorsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `color`.", - "editType": "none", - "valType": "string" - }, - "description": "Sets the text font.", - "editType": "calc", - "family": { - "arrayOk": true, - "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", - "editType": "calc", - "noBlank": true, - "strict": true, - "valType": "string" - }, - "familysrc": { - "description": "Sets the source reference on Chart Studio Cloud for `family`.", - "editType": "none", - "valType": "string" - }, - "role": "object", - "size": { - "arrayOk": true, - "editType": "calc", - "min": 1, - "valType": "number" - }, - "sizesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `size`.", - "editType": "none", - "valType": "string" - }, - "style": { - "arrayOk": true, - "description": "Sets whether a font should be styled with a normal or italic face from its family.", - "dflt": "normal", - "editType": "calc", - "valType": "enumerated", - "values": [ - "normal", - "italic" - ] - }, - "stylesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `style`.", - "editType": "none", - "valType": "string" - }, - "variant": { - "arrayOk": true, - "description": "Sets the variant of the font.", - "dflt": "normal", - "editType": "calc", - "valType": "enumerated", - "values": [ - "normal", - "small-caps" - ] - }, - "variantsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `variant`.", - "editType": "none", - "valType": "string" - }, - "weight": { - "arrayOk": true, - "description": "Sets the weight (or boldness) of the font.", - "dflt": "normal", - "editType": "calc", - "valType": "enumerated", - "values": [ - "normal", - "bold" - ] - }, - "weightsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `weight`.", - "editType": "none", - "valType": "string" - } - }, - "textposition": { - "arrayOk": true, - "description": "Sets the positions of the `text` elements with respects to the (x,y) coordinates.", - "dflt": "middle center", - "editType": "calc", - "valType": "enumerated", - "values": [ - "top left", - "top center", - "top right", - "middle left", - "middle center", - "middle right", - "bottom left", - "bottom center", - "bottom right" - ] - }, - "textpositionsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `textposition`.", - "editType": "none", - "valType": "string" - }, - "textsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `text`.", - "editType": "none", - "valType": "string" - }, - "texttemplate": { - "arrayOk": true, - "description": "Template string used for rendering the information text that appears on points. Note that this will override `textinfo`. Variables are inserted using %{variable}, for example \"y: %{y}\". Numbers are formatted using d3-format's syntax %{variable:d3-format}, for example \"Price: %{y:$.2f}\". https://github.com/d3/d3-format/tree/v1.4.5#d3-format for details on the formatting syntax. Dates are formatted using d3-time-format's syntax %{variable|d3-time-format}, for example \"Day: %{2019-01-01|%A}\". https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format for details on the date formatting syntax. Variables that can't be found will be replaced with the specifier. For example, a template of \"data: %{x}, %{y}\" will result in a value of \"data: 1, %{y}\" if x is 1 and y is missing. Variables with an undefined value will be replaced with the fallback value. All attributes that can be specified per-point (the ones that are `arrayOk: true`) are available. Finally, the template string has access to variables `r`, `theta` and `text`.", - "dflt": "", - "editType": "plot", - "valType": "string" - }, - "texttemplatefallback": { - "description": "Fallback string that's displayed when a variable referenced in a template is missing. If the boolean value 'false' is passed in, the specifier with the missing variable will be displayed.", - "dflt": "-", - "editType": "plot", - "valType": "any" - }, - "texttemplatesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `texttemplate`.", - "editType": "none", - "valType": "string" - }, - "theta": { - "description": "Sets the angular coordinates", - "editType": "calc+clearAxisTypes", - "valType": "data_array" - }, - "theta0": { - "description": "Alternate to `theta`. Builds a linear space of theta coordinates. Use with `dtheta` where `theta0` is the starting coordinate and `dtheta` the step.", - "dflt": 0, - "editType": "calc+clearAxisTypes", - "valType": "any" - }, - "thetasrc": { - "description": "Sets the source reference on Chart Studio Cloud for `theta`.", - "editType": "none", - "valType": "string" - }, - "thetaunit": { - "description": "Sets the unit of input *theta* values. Has an effect only when on *linear* angular axes.", - "dflt": "degrees", - "editType": "calc+clearAxisTypes", - "valType": "enumerated", - "values": [ - "radians", - "degrees", - "gradians" - ] - }, - "type": "scatterpolargl", - "uid": { - "description": "Assign an id to this trace, Use this to provide object constancy between traces during animations and transitions.", - "editType": "plot", - "valType": "string" - }, - "uirevision": { - "description": "Controls persistence of some user-driven changes to the trace: `constraintrange` in `parcoords` traces, as well as some `editable: true` modifications such as `name` and `colorbar.title`. Defaults to `layout.uirevision`. Note that other user-driven trace attribute changes are controlled by `layout` attributes: `trace.visible` is controlled by `layout.legend.uirevision`, `selectedpoints` is controlled by `layout.selectionrevision`, and `colorbar.(x|y)` (accessible with `config: {editable: true}`) is controlled by `layout.editrevision`. Trace changes are tracked by `uid`, which only falls back on trace index if no `uid` is provided. So if your app can add/remove traces before the end of the `data` array, such that the same trace has a different index, you can still preserve user-driven changes if you give each trace a `uid` that stays with it as it moves.", - "editType": "none", - "valType": "any" - }, - "unselected": { - "editType": "style", - "marker": { - "color": { - "description": "Sets the marker color of unselected points, applied only when a selection exists.", - "editType": "style", - "valType": "color" - }, - "editType": "style", - "opacity": { - "description": "Sets the marker opacity of unselected points, applied only when a selection exists.", - "editType": "style", - "max": 1, - "min": 0, - "valType": "number" - }, - "role": "object", - "size": { - "description": "Sets the marker size of unselected points, applied only when a selection exists.", - "editType": "style", - "min": 0, - "valType": "number" - } - }, - "role": "object", - "textfont": { - "color": { - "description": "Sets the text font color of unselected points, applied only when a selection exists.", - "editType": "style", - "valType": "color" - }, - "editType": "style", - "role": "object" - } - }, - "visible": { - "description": "Determines whether or not this trace is visible. If *legendonly*, the trace is not drawn, but can appear as a legend item (provided that the legend itself is visible).", - "dflt": true, - "editType": "calc", - "valType": "enumerated", - "values": [ - true, - false, - "legendonly" - ] - } - }, - "categories": [ - "gl", - "regl", - "polar", - "symbols", - "showLegend", - "scatter-like" - ], - "meta": { - "description": "The scatterpolargl trace type encompasses line charts, scatter charts, and bubble charts in polar coordinates using the WebGL plotting engine. The data visualized as scatter point or lines is set in `r` (radial) and `theta` (angular) coordinates Bubble charts are achieved by setting `marker.size` and/or `marker.color` to numerical arrays.", - "hrName": "scatter_polar_gl" - }, - "type": "scatterpolargl" - }, - "scattersmith": { - "animatable": false, - "attributes": { - "cliponaxis": { - "description": "Determines whether or not markers and text nodes are clipped about the subplot axes. To show markers and text nodes above axis lines and tick labels, make sure to set `xaxis.layer` and `yaxis.layer` to *below traces*.", - "dflt": false, - "editType": "plot", - "valType": "boolean" - }, - "connectgaps": { - "description": "Determines whether or not gaps (i.e. {nan} or missing values) in the provided data arrays are connected.", - "dflt": false, - "editType": "calc", - "valType": "boolean" - }, - "customdata": { - "description": "Assigns extra data each datum. This may be useful when listening to hover, click and selection events. Note that, *scatter* traces also appends customdata items in the markers DOM elements", - "editType": "calc", - "valType": "data_array" - }, - "customdatasrc": { - "description": "Sets the source reference on Chart Studio Cloud for `customdata`.", - "editType": "none", - "valType": "string" - }, - "fill": { - "description": "Sets the area to fill with a solid color. Use with `fillcolor` if not *none*. scattersmith has a subset of the options available to scatter. *toself* connects the endpoints of the trace (or each segment of the trace if it has gaps) into a closed shape. *tonext* fills the space between two traces if one completely encloses the other (eg consecutive contour lines), and behaves like *toself* if there is no trace before it. *tonext* should not be used if one trace does not enclose the other.", - "dflt": "none", - "editType": "calc", - "valType": "enumerated", - "values": [ - "none", - "toself", - "tonext" - ] - }, - "fillcolor": { - "description": "Sets the fill color. Defaults to a half-transparent variant of the line color, marker color, or marker line color, whichever is available.", - "editType": "style", - "valType": "color" - }, - "hoverinfo": { - "arrayOk": true, - "description": "Determines which trace information appear on hover. If `none` or `skip` are set, no information is displayed upon hovering. But, if `none` is set, click and hover events are still fired.", - "dflt": "all", - "editType": "none", - "extras": [ - "all", - "none", - "skip" - ], - "flags": [ - "real", - "imag", - "text", - "name" - ], - "valType": "flaglist" - }, - "hoverinfosrc": { - "description": "Sets the source reference on Chart Studio Cloud for `hoverinfo`.", - "editType": "none", - "valType": "string" - }, - "hoverlabel": { - "align": { - "arrayOk": true, - "description": "Sets the horizontal alignment of the text content within hover label box. Has an effect only if the hover label text spans more two or more lines", - "dflt": "auto", - "editType": "none", - "valType": "enumerated", - "values": [ - "left", - "right", - "auto" - ] - }, - "alignsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `align`.", - "editType": "none", - "valType": "string" - }, - "bgcolor": { - "arrayOk": true, - "description": "Sets the background color of the hover labels for this trace", - "editType": "none", - "valType": "color" - }, - "bgcolorsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `bgcolor`.", - "editType": "none", - "valType": "string" - }, - "bordercolor": { - "arrayOk": true, - "description": "Sets the border color of the hover labels for this trace.", - "editType": "none", - "valType": "color" - }, - "bordercolorsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `bordercolor`.", - "editType": "none", - "valType": "string" - }, - "editType": "none", - "font": { - "color": { - "arrayOk": true, - "editType": "none", - "valType": "color" - }, - "colorsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `color`.", - "editType": "none", - "valType": "string" - }, - "description": "Sets the font used in hover labels.", - "editType": "none", - "family": { - "arrayOk": true, - "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", - "editType": "none", - "noBlank": true, - "strict": true, - "valType": "string" - }, - "familysrc": { - "description": "Sets the source reference on Chart Studio Cloud for `family`.", - "editType": "none", - "valType": "string" - }, - "lineposition": { - "arrayOk": true, - "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", - "dflt": "none", - "editType": "none", - "extras": [ - "none" - ], - "flags": [ - "under", - "over", - "through" - ], - "valType": "flaglist" - }, - "linepositionsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `lineposition`.", - "editType": "none", - "valType": "string" - }, - "role": "object", - "shadow": { - "arrayOk": true, - "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", - "dflt": "none", - "editType": "none", - "valType": "string" - }, - "shadowsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `shadow`.", - "editType": "none", - "valType": "string" - }, - "size": { - "arrayOk": true, - "editType": "none", - "min": 1, - "valType": "number" - }, - "sizesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `size`.", - "editType": "none", - "valType": "string" - }, - "style": { - "arrayOk": true, - "description": "Sets whether a font should be styled with a normal or italic face from its family.", - "dflt": "normal", - "editType": "none", - "valType": "enumerated", - "values": [ - "normal", - "italic" - ] - }, - "stylesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `style`.", - "editType": "none", - "valType": "string" - }, - "textcase": { - "arrayOk": true, - "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", - "dflt": "normal", - "editType": "none", - "valType": "enumerated", - "values": [ - "normal", - "word caps", - "upper", - "lower" - ] - }, - "textcasesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `textcase`.", - "editType": "none", - "valType": "string" - }, - "variant": { - "arrayOk": true, - "description": "Sets the variant of the font.", - "dflt": "normal", - "editType": "none", - "valType": "enumerated", - "values": [ - "normal", - "small-caps", - "all-small-caps", - "all-petite-caps", - "petite-caps", - "unicase" - ] - }, - "variantsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `variant`.", - "editType": "none", - "valType": "string" - }, - "weight": { - "arrayOk": true, - "description": "Sets the weight (or boldness) of the font.", - "dflt": "normal", - "editType": "none", - "extras": [ - "normal", - "bold" - ], - "max": 1000, - "min": 1, - "valType": "integer" - }, - "weightsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `weight`.", - "editType": "none", - "valType": "string" - } - }, - "namelength": { - "arrayOk": true, - "description": "Sets the default length (in number of characters) of the trace name in the hover labels for all traces. -1 shows the whole name regardless of length. 0-3 shows the first 0-3 characters, and an integer >3 will show the whole name if it is less than that many characters, but if it is longer, will truncate to `namelength - 3` characters and add an ellipsis.", - "dflt": 15, - "editType": "none", - "min": -1, - "valType": "integer" - }, - "namelengthsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `namelength`.", - "editType": "none", - "valType": "string" - }, - "role": "object", - "showarrow": { - "description": "Sets whether or not to show the hover label arrow/triangle pointing to the data point.", - "dflt": true, - "editType": "none", - "valType": "boolean" - } - }, - "hoveron": { - "description": "Do the hover effects highlight individual points (markers or line points) or do they highlight filled regions? If the fill is *toself* or *tonext* and there are no markers or text, then the default is *fills*, otherwise it is *points*.", - "editType": "style", - "flags": [ - "points", - "fills" - ], - "valType": "flaglist" - }, - "hovertemplate": { - "arrayOk": true, - "description": "Template string used for rendering the information that appear on hover box. Note that this will override `hoverinfo`. Variables are inserted using %{variable}, for example \"y: %{y}\" as well as %{xother}, {%_xother}, {%_xother_}, {%xother_}. When showing info for several points, *xother* will be added to those with different x positions from the first point. An underscore before or after *(x|y)other* will add a space on that side, only when this field is shown. Numbers are formatted using d3-format's syntax %{variable:d3-format}, for example \"Price: %{y:$.2f}\". https://github.com/d3/d3-format/tree/v1.4.5#d3-format for details on the formatting syntax. Dates are formatted using d3-time-format's syntax %{variable|d3-time-format}, for example \"Day: %{2019-01-01|%A}\". https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format for details on the date formatting syntax. Variables that can't be found will be replaced with the specifier. For example, a template of \"data: %{x}, %{y}\" will result in a value of \"data: 1, %{y}\" if x is 1 and y is missing. Variables with an undefined value will be replaced with the fallback value. The variables available in `hovertemplate` are the ones emitted as event data described at this link https://plotly.com/javascript/plotlyjs-events/#event-data. Additionally, all attributes that can be specified per-point (the ones that are `arrayOk: true`) are available. Anything contained in tag `` is displayed in the secondary box, for example `%{fullData.name}`. To hide the secondary box completely, use an empty tag ``.", - "dflt": "", - "editType": "none", - "valType": "string" - }, - "hovertemplatefallback": { - "description": "Fallback string that's displayed when a variable referenced in a template is missing. If the boolean value 'false' is passed in, the specifier with the missing variable will be displayed.", - "dflt": "-", - "editType": "none", - "valType": "any" - }, - "hovertemplatesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `hovertemplate`.", - "editType": "none", - "valType": "string" - }, - "hovertext": { - "arrayOk": true, - "description": "Sets hover text elements associated with each (x,y) pair. If a single string, the same string appears over all the data points. If an array of string, the items are mapped in order to the this trace's (x,y) coordinates. To be seen, trace `hoverinfo` must contain a *text* flag.", - "dflt": "", - "editType": "style", - "valType": "string" - }, - "hovertextsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `hovertext`.", - "editType": "none", - "valType": "string" - }, - "ids": { - "description": "Assigns id labels to each datum. These ids for object constancy of data points during animation. Should be an array of strings, not numbers or any other type.", - "editType": "calc", - "valType": "data_array" - }, - "idssrc": { - "description": "Sets the source reference on Chart Studio Cloud for `ids`.", - "editType": "none", - "valType": "string" - }, - "imag": { - "description": "Sets the imaginary component of the data, in units of normalized impedance such that real=1, imag=0 is the center of the chart.", - "editType": "calc+clearAxisTypes", - "valType": "data_array" - }, - "imagsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `imag`.", - "editType": "none", - "valType": "string" - }, - "legend": { - "description": "Sets the reference to a legend to show this trace in. References to these legends are *legend*, *legend2*, *legend3*, etc. Settings for these legends are set in the layout, under `layout.legend`, `layout.legend2`, etc.", - "dflt": "legend", - "editType": "style", - "valType": "subplotid" - }, - "legendgroup": { - "description": "Sets the legend group for this trace. Traces and shapes part of the same legend group hide/show at the same time when toggling legend items.", - "dflt": "", - "editType": "style", - "valType": "string" - }, - "legendgrouptitle": { - "editType": "style", - "font": { - "color": { - "editType": "style", - "valType": "color" - }, - "description": "Sets this legend group's title font.", - "editType": "style", - "family": { - "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", - "editType": "style", - "noBlank": true, - "strict": true, - "valType": "string" - }, - "lineposition": { - "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", - "dflt": "none", - "editType": "style", - "extras": [ - "none" - ], - "flags": [ - "under", - "over", - "through" - ], - "valType": "flaglist" - }, - "role": "object", - "shadow": { - "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", - "dflt": "none", - "editType": "style", - "valType": "string" - }, - "size": { - "editType": "style", - "min": 1, - "valType": "number" - }, - "style": { - "description": "Sets whether a font should be styled with a normal or italic face from its family.", - "dflt": "normal", - "editType": "style", - "valType": "enumerated", - "values": [ - "normal", - "italic" - ] - }, - "textcase": { - "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", - "dflt": "normal", - "editType": "style", - "valType": "enumerated", - "values": [ - "normal", - "word caps", - "upper", - "lower" - ] - }, - "variant": { - "description": "Sets the variant of the font.", - "dflt": "normal", - "editType": "style", - "valType": "enumerated", - "values": [ - "normal", - "small-caps", - "all-small-caps", - "all-petite-caps", - "petite-caps", - "unicase" - ] - }, - "weight": { - "description": "Sets the weight (or boldness) of the font.", - "dflt": "normal", - "editType": "style", - "extras": [ - "normal", - "bold" - ], - "max": 1000, - "min": 1, - "valType": "integer" - } - }, - "role": "object", - "text": { - "description": "Sets the title of the legend group.", - "dflt": "", - "editType": "style", - "valType": "string" - } - }, - "legendrank": { - "description": "Sets the legend rank for this trace. Items and groups with smaller ranks are presented on top/left side while with *reversed* `legend.traceorder` they are on bottom/right side. The default legendrank is 1000, so that you can use ranks less than 1000 to place certain items before all unranked items, and ranks greater than 1000 to go after all unranked items. When having unranked or equal rank items shapes would be displayed after traces i.e. according to their order in data and layout.", - "dflt": 1000, - "editType": "style", - "valType": "number" - }, - "legendwidth": { - "description": "Sets the width (in px or fraction) of the legend for this trace.", - "editType": "style", - "min": 0, - "valType": "number" - }, - "line": { - "backoff": { - "arrayOk": true, - "description": "Sets the line back off from the end point of the nth line segment (in px). This option is useful e.g. to avoid overlap with arrowhead markers. With *auto* the lines would trim before markers if `marker.angleref` is set to *previous*.", - "dflt": "auto", - "editType": "plot", - "min": 0, - "valType": "number" - }, - "backoffsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `backoff`.", - "editType": "none", - "valType": "string" - }, - "color": { - "description": "Sets the line color.", - "editType": "style", - "valType": "color" - }, - "dash": { - "description": "Sets the dash style of lines. Set to a dash type string (*solid*, *dot*, *dash*, *longdash*, *dashdot*, or *longdashdot*) or a dash length list in px (eg *5px,10px,2px,2px*).", - "dflt": "solid", - "editType": "style", - "valType": "string", - "values": [ - "solid", - "dot", - "dash", - "longdash", - "dashdot", - "longdashdot" - ] - }, - "editType": "calc", - "role": "object", - "shape": { - "description": "Determines the line shape. With *spline* the lines are drawn using spline interpolation. The other available values correspond to step-wise line shapes.", - "dflt": "linear", - "editType": "plot", - "valType": "enumerated", - "values": [ - "linear", - "spline" - ] - }, - "smoothing": { - "description": "Has an effect only if `shape` is set to *spline* Sets the amount of smoothing. *0* corresponds to no smoothing (equivalent to a *linear* shape).", - "dflt": 1, - "editType": "plot", - "max": 1.3, - "min": 0, - "valType": "number" - }, - "width": { - "description": "Sets the line width (in px).", - "dflt": 2, - "editType": "style", - "min": 0, - "valType": "number" - } - }, - "marker": { - "angle": { - "arrayOk": true, - "description": "Sets the marker angle in respect to `angleref`.", - "dflt": 0, - "editType": "plot", - "valType": "angle" - }, - "angleref": { - "description": "Sets the reference for marker angle. With *previous*, angle 0 points along the line from the previous point to this one. With *up*, angle 0 points toward the top of the screen.", - "dflt": "up", - "editType": "plot", - "valType": "enumerated", - "values": [ - "previous", - "up" - ] - }, - "anglesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `angle`.", - "editType": "none", - "valType": "string" - }, - "autocolorscale": { - "description": "Determines whether the colorscale is a default palette (`autocolorscale: true`) or the palette determined by `marker.colorscale`. Has an effect only if in `marker.color` is set to a numerical array. In case `colorscale` is unspecified or `autocolorscale` is true, the default palette will be chosen according to whether numbers in the `color` array are all positive, all negative or mixed.", - "dflt": true, - "editType": "calc", - "impliedEdits": {}, - "valType": "boolean" - }, - "cauto": { - "description": "Determines whether or not the color domain is computed with respect to the input data (here in `marker.color`) or the bounds set in `marker.cmin` and `marker.cmax` Has an effect only if in `marker.color` is set to a numerical array. Defaults to `false` when `marker.cmin` and `marker.cmax` are set by the user.", - "dflt": true, - "editType": "calc", - "impliedEdits": {}, - "valType": "boolean" - }, - "cmax": { - "description": "Sets the upper bound of the color domain. Has an effect only if in `marker.color` is set to a numerical array. Value should have the same units as in `marker.color` and if set, `marker.cmin` must be set as well.", - "dflt": null, - "editType": "plot", - "impliedEdits": { - "cauto": false - }, - "valType": "number" - }, - "cmid": { - "description": "Sets the mid-point of the color domain by scaling `marker.cmin` and/or `marker.cmax` to be equidistant to this point. Has an effect only if in `marker.color` is set to a numerical array. Value should have the same units as in `marker.color`. Has no effect when `marker.cauto` is `false`.", - "dflt": null, - "editType": "calc", - "impliedEdits": {}, - "valType": "number" - }, - "cmin": { - "description": "Sets the lower bound of the color domain. Has an effect only if in `marker.color` is set to a numerical array. Value should have the same units as in `marker.color` and if set, `marker.cmax` must be set as well.", - "dflt": null, - "editType": "plot", - "impliedEdits": { - "cauto": false - }, - "valType": "number" - }, - "color": { - "arrayOk": true, - "description": "Sets the marker color. It accepts either a specific color or an array of numbers that are mapped to the colorscale relative to the max and min values of the array or relative to `marker.cmin` and `marker.cmax` if set.", - "editType": "style", - "valType": "color" - }, - "coloraxis": { - "description": "Sets a reference to a shared color axis. References to these shared color axes are *coloraxis*, *coloraxis2*, *coloraxis3*, etc. Settings for these shared color axes are set in the layout, under `layout.coloraxis`, `layout.coloraxis2`, etc. Note that multiple color scales can be linked to the same color axis.", - "dflt": null, - "editType": "calc", - "regex": "/^coloraxis([2-9]|[1-9][0-9]+)?$/", - "valType": "subplotid" - }, - "colorbar": { - "bgcolor": { - "description": "Sets the color of padded area.", - "dflt": "rgba(0,0,0,0)", - "editType": "colorbars", - "valType": "color" - }, - "bordercolor": { - "description": "Sets the axis line color.", - "dflt": "#444", - "editType": "colorbars", - "valType": "color" - }, - "borderwidth": { - "description": "Sets the width (in px) or the border enclosing this color bar.", - "dflt": 0, - "editType": "colorbars", - "min": 0, - "valType": "number" - }, - "dtick": { - "description": "Sets the step in-between ticks on this axis. Use with `tick0`. Must be a positive number, or special strings available to *log* and *date* axes. If the axis `type` is *log*, then ticks are set every 10^(n*dtick) where n is the tick number. For example, to set a tick mark at 1, 10, 100, 1000, ... set dtick to 1. To set tick marks at 1, 100, 10000, ... set dtick to 2. To set tick marks at 1, 5, 25, 125, 625, 3125, ... set dtick to log_10(5), or 0.69897000433. *log* has several special values; *L*, where `f` is a positive number, gives ticks linearly spaced in value (but not position). For example `tick0` = 0.1, `dtick` = *L0.5* will put ticks at 0.1, 0.6, 1.1, 1.6 etc. To show powers of 10 plus small digits between, use *D1* (all digits) or *D2* (only 2 and 5). `tick0` is ignored for *D1* and *D2*. If the axis `type` is *date*, then you must convert the time to milliseconds. For example, to set the interval between ticks to one day, set `dtick` to 86400000.0. *date* also has special values *M* gives ticks spaced by a number of months. `n` must be a positive integer. To set ticks on the 15th of every third month, set `tick0` to *2000-01-15* and `dtick` to *M3*. To set ticks every 4 years, set `dtick` to *M48*", - "editType": "colorbars", - "impliedEdits": { - "tickmode": "linear" - }, - "valType": "any" - }, - "editType": "colorbars", - "exponentformat": { - "description": "Determines a formatting rule for the tick exponents. For example, consider the number 1,000,000,000. If *none*, it appears as 1,000,000,000. If *e*, 1e+9. If *E*, 1E+9. If *power*, 1x10^9 (with 9 in a super script). If *SI*, 1G. If *B*, 1B. *SI* uses prefixes from \"femto\" f (10^-15) to \"tera\" T (10^12). *SI extended* covers instead the full SI range from \"quecto\" q (10^-30) to \"quetta\" Q (10^30). If *SI* or *SI extended* is used and the exponent is beyond the above ranges, the formatting rule will automatically be switched to the power notation.", - "dflt": "B", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "none", - "e", - "E", - "power", - "SI", - "B", - "SI extended" - ] - }, - "labelalias": { - "description": "Replacement text for specific tick or hover labels. For example using {US: 'USA', CA: 'Canada'} changes US to USA and CA to Canada. The labels we would have shown must match the keys exactly, after adding any tickprefix or ticksuffix. For negative numbers the minus sign symbol used (U+2212) is wider than the regular ascii dash. That means you need to use −1 instead of -1. labelalias can be used with any axis type, and both keys (if needed) and values (if desired) can include html-like tags or MathJax.", - "dflt": false, - "editType": "colorbars", - "valType": "any" - }, - "len": { - "description": "Sets the length of the color bar This measure excludes the padding of both ends. That is, the color bar length is this length minus the padding on both ends.", - "dflt": 1, - "editType": "colorbars", - "min": 0, - "valType": "number" - }, - "lenmode": { - "description": "Determines whether this color bar's length (i.e. the measure in the color variation direction) is set in units of plot *fraction* or in *pixels. Use `len` to set the value.", - "dflt": "fraction", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "fraction", - "pixels" - ] - }, - "minexponent": { - "description": "Hide SI prefix for 10^n if |n| is below this number. This only has an effect when `tickformat` is *SI* or *B*.", - "dflt": 3, - "editType": "colorbars", - "min": 0, - "valType": "number" - }, - "nticks": { - "description": "Specifies the maximum number of ticks for the particular axis. The actual number of ticks will be chosen automatically to be less than or equal to `nticks`. Has an effect only if `tickmode` is set to *auto*.", - "dflt": 0, - "editType": "colorbars", - "min": 0, - "valType": "integer" - }, - "orientation": { - "description": "Sets the orientation of the colorbar.", - "dflt": "v", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "h", - "v" - ] - }, - "outlinecolor": { - "description": "Sets the axis line color.", - "dflt": "#444", - "editType": "colorbars", - "valType": "color" - }, - "outlinewidth": { - "description": "Sets the width (in px) of the axis line.", - "dflt": 1, - "editType": "colorbars", - "min": 0, - "valType": "number" - }, - "role": "object", - "separatethousands": { - "description": "If \"true\", even 4-digit integers are separated", - "dflt": false, - "editType": "colorbars", - "valType": "boolean" - }, - "showexponent": { - "description": "If *all*, all exponents are shown besides their significands. If *first*, only the exponent of the first tick is shown. If *last*, only the exponent of the last tick is shown. If *none*, no exponents appear.", - "dflt": "all", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "all", - "first", - "last", - "none" - ] - }, - "showticklabels": { - "description": "Determines whether or not the tick labels are drawn.", - "dflt": true, - "editType": "colorbars", - "valType": "boolean" - }, - "showtickprefix": { - "description": "If *all*, all tick labels are displayed with a prefix. If *first*, only the first tick is displayed with a prefix. If *last*, only the last tick is displayed with a suffix. If *none*, tick prefixes are hidden.", - "dflt": "all", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "all", - "first", - "last", - "none" - ] - }, - "showticksuffix": { - "description": "Same as `showtickprefix` but for tick suffixes.", - "dflt": "all", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "all", - "first", - "last", - "none" - ] - }, - "thickness": { - "description": "Sets the thickness of the color bar This measure excludes the size of the padding, ticks and labels.", - "dflt": 30, - "editType": "colorbars", - "min": 0, - "valType": "number" - }, - "thicknessmode": { - "description": "Determines whether this color bar's thickness (i.e. the measure in the constant color direction) is set in units of plot *fraction* or in *pixels*. Use `thickness` to set the value.", - "dflt": "pixels", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "fraction", - "pixels" - ] - }, - "tick0": { - "description": "Sets the placement of the first tick on this axis. Use with `dtick`. If the axis `type` is *log*, then you must take the log of your starting tick (e.g. to set the starting tick to 100, set the `tick0` to 2) except when `dtick`=*L* (see `dtick` for more info). If the axis `type` is *date*, it should be a date string, like date data. If the axis `type` is *category*, it should be a number, using the scale where each category is assigned a serial number from zero in the order it appears.", - "editType": "colorbars", - "impliedEdits": { - "tickmode": "linear" - }, - "valType": "any" - }, - "tickangle": { - "description": "Sets the angle of the tick labels with respect to the horizontal. For example, a `tickangle` of -90 draws the tick labels vertically.", - "dflt": "auto", - "editType": "colorbars", - "valType": "angle" - }, - "tickcolor": { - "description": "Sets the tick color.", - "dflt": "#444", - "editType": "colorbars", - "valType": "color" - }, - "tickfont": { - "color": { - "editType": "colorbars", - "valType": "color" - }, - "description": "Sets the color bar's tick label font", - "editType": "colorbars", - "family": { - "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", - "editType": "colorbars", - "noBlank": true, - "strict": true, - "valType": "string" - }, - "lineposition": { - "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", - "dflt": "none", - "editType": "colorbars", - "extras": [ - "none" - ], - "flags": [ - "under", - "over", - "through" - ], - "valType": "flaglist" - }, - "role": "object", - "shadow": { - "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", - "dflt": "none", - "editType": "colorbars", - "valType": "string" - }, - "size": { - "editType": "colorbars", - "min": 1, - "valType": "number" - }, - "style": { - "description": "Sets whether a font should be styled with a normal or italic face from its family.", - "dflt": "normal", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "normal", - "italic" - ] - }, - "textcase": { - "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", - "dflt": "normal", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "normal", - "word caps", - "upper", - "lower" - ] - }, - "variant": { - "description": "Sets the variant of the font.", - "dflt": "normal", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "normal", - "small-caps", - "all-small-caps", - "all-petite-caps", - "petite-caps", - "unicase" - ] - }, - "weight": { - "description": "Sets the weight (or boldness) of the font.", - "dflt": "normal", - "editType": "colorbars", - "extras": [ - "normal", - "bold" - ], - "max": 1000, - "min": 1, - "valType": "integer" - } - }, - "tickformat": { - "description": "Sets the tick label formatting rule using d3 formatting mini-languages which are very similar to those in Python. For numbers, see: https://github.com/d3/d3-format/tree/v1.4.5#d3-format. And for dates see: https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format. We add two items to d3's date formatter: *%h* for half of the year as a decimal number as well as *%{n}f* for fractional seconds with n digits. For example, *2016-10-13 09:15:23.456* with tickformat *%H~%M~%S.%2f* would display *09~15~23.46*", - "dflt": "", - "editType": "colorbars", - "valType": "string" - }, - "tickformatstops": { - "items": { - "tickformatstop": { - "dtickrange": { - "description": "range [*min*, *max*], where *min*, *max* - dtick values which describe some zoom level, it is possible to omit *min* or *max* value by passing *null*", - "editType": "colorbars", - "items": [ - { - "editType": "colorbars", - "valType": "any" - }, - { - "editType": "colorbars", - "valType": "any" - } - ], - "valType": "info_array" - }, - "editType": "colorbars", - "enabled": { - "description": "Determines whether or not this stop is used. If `false`, this stop is ignored even within its `dtickrange`.", - "dflt": true, - "editType": "colorbars", - "valType": "boolean" - }, - "name": { - "description": "When used in a template, named items are created in the output figure in addition to any items the figure already has in this array. You can modify these items in the output figure by making your own item with `templateitemname` matching this `name` alongside your modifications (including `visible: false` or `enabled: false` to hide it). Has no effect outside of a template.", - "editType": "colorbars", - "valType": "string" - }, - "role": "object", - "templateitemname": { - "description": "Used to refer to a named item in this array in the template. Named items from the template will be created even without a matching item in the input figure, but you can modify one by making an item with `templateitemname` matching its `name`, alongside your modifications (including `visible: false` or `enabled: false` to hide it). If there is no template or no matching item, this item will be hidden unless you explicitly show it with `visible: true`.", - "editType": "colorbars", - "valType": "string" - }, - "value": { - "description": "string - dtickformat for described zoom level, the same as *tickformat*", - "dflt": "", - "editType": "colorbars", - "valType": "string" - } - } - }, - "role": "object" - }, - "ticklabeloverflow": { - "description": "Determines how we handle tick labels that would overflow either the graph div or the domain of the axis. The default value for inside tick labels is *hide past domain*. In other cases the default is *hide past div*.", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "allow", - "hide past div", - "hide past domain" - ] - }, - "ticklabelposition": { - "description": "Determines where tick labels are drawn relative to the ticks. Left and right options are used when `orientation` is *h*, top and bottom when `orientation` is *v*.", - "dflt": "outside", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "outside", - "inside", - "outside top", - "inside top", - "outside left", - "inside left", - "outside right", - "inside right", - "outside bottom", - "inside bottom" - ] - }, - "ticklabelstep": { - "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", - "dflt": 1, - "editType": "colorbars", - "min": 1, - "valType": "integer" - }, - "ticklen": { - "description": "Sets the tick length (in px).", - "dflt": 5, - "editType": "colorbars", - "min": 0, - "valType": "number" - }, - "tickmode": { - "description": "Sets the tick mode for this axis. If *auto*, the number of ticks is set via `nticks`. If *linear*, the placement of the ticks is determined by a starting position `tick0` and a tick step `dtick` (*linear* is the default value if `tick0` and `dtick` are provided). If *array*, the placement of the ticks is set via `tickvals` and the tick text is `ticktext`. (*array* is the default value if `tickvals` is provided).", - "editType": "colorbars", - "impliedEdits": {}, - "valType": "enumerated", - "values": [ - "auto", - "linear", - "array" - ] - }, - "tickprefix": { - "description": "Sets a tick label prefix.", - "dflt": "", - "editType": "colorbars", - "valType": "string" - }, - "ticks": { - "description": "Determines whether ticks are drawn or not. If **, this axis' ticks are not drawn. If *outside* (*inside*), this axis' are drawn outside (inside) the axis lines.", - "dflt": "", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "outside", - "inside", - "" - ] - }, - "ticksuffix": { - "description": "Sets a tick label suffix.", - "dflt": "", - "editType": "colorbars", - "valType": "string" - }, - "ticktext": { - "description": "Sets the text displayed at the ticks position via `tickvals`. Only has an effect if `tickmode` is set to *array*. Used with `tickvals`.", - "editType": "colorbars", - "valType": "data_array" - }, - "ticktextsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `ticktext`.", - "editType": "none", - "valType": "string" - }, - "tickvals": { - "description": "Sets the values at which ticks on this axis appear. Only has an effect if `tickmode` is set to *array*. Used with `ticktext`.", - "editType": "colorbars", - "valType": "data_array" - }, - "tickvalssrc": { - "description": "Sets the source reference on Chart Studio Cloud for `tickvals`.", - "editType": "none", - "valType": "string" - }, - "tickwidth": { - "description": "Sets the tick width (in px).", - "dflt": 1, - "editType": "colorbars", - "min": 0, - "valType": "number" - }, - "title": { - "editType": "colorbars", - "font": { - "color": { - "editType": "colorbars", - "valType": "color" - }, - "description": "Sets this color bar's title font.", - "editType": "colorbars", - "family": { - "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", - "editType": "colorbars", - "noBlank": true, - "strict": true, - "valType": "string" - }, - "lineposition": { - "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", - "dflt": "none", - "editType": "colorbars", - "extras": [ - "none" - ], - "flags": [ - "under", - "over", - "through" - ], - "valType": "flaglist" - }, - "role": "object", - "shadow": { - "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", - "dflt": "none", - "editType": "colorbars", - "valType": "string" - }, - "size": { - "editType": "colorbars", - "min": 1, - "valType": "number" - }, - "style": { - "description": "Sets whether a font should be styled with a normal or italic face from its family.", - "dflt": "normal", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "normal", - "italic" - ] - }, - "textcase": { - "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", - "dflt": "normal", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "normal", - "word caps", - "upper", - "lower" - ] - }, - "variant": { - "description": "Sets the variant of the font.", - "dflt": "normal", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "normal", - "small-caps", - "all-small-caps", - "all-petite-caps", - "petite-caps", - "unicase" - ] - }, - "weight": { - "description": "Sets the weight (or boldness) of the font.", - "dflt": "normal", - "editType": "colorbars", - "extras": [ - "normal", - "bold" - ], - "max": 1000, - "min": 1, - "valType": "integer" - } - }, - "role": "object", - "side": { - "description": "Determines the location of color bar's title with respect to the color bar. Defaults to *top* when `orientation` if *v* and defaults to *right* when `orientation` if *h*.", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "right", - "top", - "bottom" - ] - }, - "text": { - "description": "Sets the title of the color bar.", - "editType": "colorbars", - "valType": "string" - } - }, - "x": { - "description": "Sets the x position with respect to `xref` of the color bar (in plot fraction). When `xref` is *paper*, defaults to 1.02 when `orientation` is *v* and 0.5 when `orientation` is *h*. When `xref` is *container*, defaults to *1* when `orientation` is *v* and 0.5 when `orientation` is *h*. Must be between *0* and *1* if `xref` is *container* and between *-2* and *3* if `xref` is *paper*.", - "editType": "colorbars", - "valType": "number" - }, - "xanchor": { - "description": "Sets this color bar's horizontal position anchor. This anchor binds the `x` position to the *left*, *center* or *right* of the color bar. Defaults to *left* when `orientation` is *v* and *center* when `orientation` is *h*.", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "left", - "center", - "right" - ] - }, - "xpad": { - "description": "Sets the amount of padding (in px) along the x direction.", - "dflt": 10, - "editType": "colorbars", - "min": 0, - "valType": "number" - }, - "xref": { - "description": "Sets the container `x` refers to. *container* spans the entire `width` of the plot. *paper* refers to the width of the plotting area only.", - "dflt": "paper", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "container", - "paper" - ] - }, - "y": { - "description": "Sets the y position with respect to `yref` of the color bar (in plot fraction). When `yref` is *paper*, defaults to 0.5 when `orientation` is *v* and 1.02 when `orientation` is *h*. When `yref` is *container*, defaults to 0.5 when `orientation` is *v* and 1 when `orientation` is *h*. Must be between *0* and *1* if `yref` is *container* and between *-2* and *3* if `yref` is *paper*.", - "editType": "colorbars", - "valType": "number" - }, - "yanchor": { - "description": "Sets this color bar's vertical position anchor This anchor binds the `y` position to the *top*, *middle* or *bottom* of the color bar. Defaults to *middle* when `orientation` is *v* and *bottom* when `orientation` is *h*.", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "top", - "middle", - "bottom" - ] - }, - "ypad": { - "description": "Sets the amount of padding (in px) along the y direction.", - "dflt": 10, - "editType": "colorbars", - "min": 0, - "valType": "number" - }, - "yref": { - "description": "Sets the container `y` refers to. *container* spans the entire `height` of the plot. *paper* refers to the height of the plotting area only.", - "dflt": "paper", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "container", - "paper" - ] - } - }, - "colorscale": { - "description": "Sets the colorscale. Has an effect only if in `marker.color` is set to a numerical array. The colorscale must be an array containing arrays mapping a normalized value to an rgb, rgba, hex, hsl, hsv, or named color string. At minimum, a mapping for the lowest (0) and highest (1) values are required. For example, `[[0, 'rgb(0,0,255)'], [1, 'rgb(255,0,0)']]`. To control the bounds of the colorscale in color space, use `marker.cmin` and `marker.cmax`. Alternatively, `colorscale` may be a palette name string of the following list: Blackbody,Bluered,Blues,Cividis,Earth,Electric,Greens,Greys,Hot,Jet,Picnic,Portland,Rainbow,RdBu,Reds,Viridis,YlGnBu,YlOrRd.", - "dflt": null, - "editType": "calc", - "impliedEdits": { - "autocolorscale": false - }, - "valType": "colorscale" - }, - "colorsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `color`.", - "editType": "none", - "valType": "string" - }, - "editType": "calc", - "gradient": { - "color": { - "arrayOk": true, - "description": "Sets the final color of the gradient fill: the center color for radial, the right for horizontal, or the bottom for vertical.", - "editType": "calc", - "valType": "color" - }, - "colorsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `color`.", - "editType": "none", - "valType": "string" - }, - "editType": "calc", - "role": "object", - "type": { - "arrayOk": true, - "description": "Sets the type of gradient used to fill the markers", - "dflt": "none", - "editType": "calc", - "valType": "enumerated", - "values": [ - "radial", - "horizontal", - "vertical", - "none" - ] - }, - "typesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `type`.", - "editType": "none", - "valType": "string" - } - }, - "line": { - "autocolorscale": { - "description": "Determines whether the colorscale is a default palette (`autocolorscale: true`) or the palette determined by `marker.line.colorscale`. Has an effect only if in `marker.line.color` is set to a numerical array. In case `colorscale` is unspecified or `autocolorscale` is true, the default palette will be chosen according to whether numbers in the `color` array are all positive, all negative or mixed.", - "dflt": true, - "editType": "calc", - "impliedEdits": {}, - "valType": "boolean" - }, - "cauto": { - "description": "Determines whether or not the color domain is computed with respect to the input data (here in `marker.line.color`) or the bounds set in `marker.line.cmin` and `marker.line.cmax` Has an effect only if in `marker.line.color` is set to a numerical array. Defaults to `false` when `marker.line.cmin` and `marker.line.cmax` are set by the user.", - "dflt": true, - "editType": "calc", - "impliedEdits": {}, - "valType": "boolean" - }, - "cmax": { - "description": "Sets the upper bound of the color domain. Has an effect only if in `marker.line.color` is set to a numerical array. Value should have the same units as in `marker.line.color` and if set, `marker.line.cmin` must be set as well.", - "dflt": null, - "editType": "plot", - "impliedEdits": { - "cauto": false - }, - "valType": "number" - }, - "cmid": { - "description": "Sets the mid-point of the color domain by scaling `marker.line.cmin` and/or `marker.line.cmax` to be equidistant to this point. Has an effect only if in `marker.line.color` is set to a numerical array. Value should have the same units as in `marker.line.color`. Has no effect when `marker.line.cauto` is `false`.", - "dflt": null, - "editType": "calc", - "impliedEdits": {}, - "valType": "number" - }, - "cmin": { - "description": "Sets the lower bound of the color domain. Has an effect only if in `marker.line.color` is set to a numerical array. Value should have the same units as in `marker.line.color` and if set, `marker.line.cmax` must be set as well.", - "dflt": null, - "editType": "plot", - "impliedEdits": { - "cauto": false - }, - "valType": "number" - }, - "color": { - "arrayOk": true, - "description": "Sets the marker.line color. It accepts either a specific color or an array of numbers that are mapped to the colorscale relative to the max and min values of the array or relative to `marker.line.cmin` and `marker.line.cmax` if set.", - "editType": "style", - "valType": "color" - }, - "coloraxis": { - "description": "Sets a reference to a shared color axis. References to these shared color axes are *coloraxis*, *coloraxis2*, *coloraxis3*, etc. Settings for these shared color axes are set in the layout, under `layout.coloraxis`, `layout.coloraxis2`, etc. Note that multiple color scales can be linked to the same color axis.", - "dflt": null, - "editType": "calc", - "regex": "/^coloraxis([2-9]|[1-9][0-9]+)?$/", - "valType": "subplotid" - }, - "colorscale": { - "description": "Sets the colorscale. Has an effect only if in `marker.line.color` is set to a numerical array. The colorscale must be an array containing arrays mapping a normalized value to an rgb, rgba, hex, hsl, hsv, or named color string. At minimum, a mapping for the lowest (0) and highest (1) values are required. For example, `[[0, 'rgb(0,0,255)'], [1, 'rgb(255,0,0)']]`. To control the bounds of the colorscale in color space, use `marker.line.cmin` and `marker.line.cmax`. Alternatively, `colorscale` may be a palette name string of the following list: Blackbody,Bluered,Blues,Cividis,Earth,Electric,Greens,Greys,Hot,Jet,Picnic,Portland,Rainbow,RdBu,Reds,Viridis,YlGnBu,YlOrRd.", - "dflt": null, - "editType": "calc", - "impliedEdits": { - "autocolorscale": false - }, - "valType": "colorscale" - }, - "colorsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `color`.", - "editType": "none", - "valType": "string" - }, - "editType": "calc", - "reversescale": { - "description": "Reverses the color mapping if true. Has an effect only if in `marker.line.color` is set to a numerical array. If true, `marker.line.cmin` will correspond to the last color in the array and `marker.line.cmax` will correspond to the first color.", - "dflt": false, - "editType": "plot", - "valType": "boolean" - }, - "role": "object", - "width": { - "arrayOk": true, - "description": "Sets the width (in px) of the lines bounding the marker points.", - "editType": "style", - "min": 0, - "valType": "number" - }, - "widthsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `width`.", - "editType": "none", - "valType": "string" - } - }, - "maxdisplayed": { - "description": "Sets a maximum number of points to be drawn on the graph. *0* corresponds to no limit.", - "dflt": 0, - "editType": "plot", - "min": 0, - "valType": "number" - }, - "opacity": { - "arrayOk": true, - "description": "Sets the marker opacity.", - "editType": "style", - "max": 1, - "min": 0, - "valType": "number" - }, - "opacitysrc": { - "description": "Sets the source reference on Chart Studio Cloud for `opacity`.", - "editType": "none", - "valType": "string" - }, - "reversescale": { - "description": "Reverses the color mapping if true. Has an effect only if in `marker.color` is set to a numerical array. If true, `marker.cmin` will correspond to the last color in the array and `marker.cmax` will correspond to the first color.", - "dflt": false, - "editType": "plot", - "valType": "boolean" - }, - "role": "object", - "showscale": { - "description": "Determines whether or not a colorbar is displayed for this trace. Has an effect only if in `marker.color` is set to a numerical array.", - "dflt": false, - "editType": "calc", - "valType": "boolean" - }, - "size": { - "arrayOk": true, - "description": "Sets the marker size (in px).", - "dflt": 6, - "editType": "calc", - "min": 0, - "valType": "number" - }, - "sizemin": { - "description": "Has an effect only if `marker.size` is set to a numerical array. Sets the minimum size (in px) of the rendered marker points.", - "dflt": 0, - "editType": "calc", - "min": 0, - "valType": "number" - }, - "sizemode": { - "description": "Has an effect only if `marker.size` is set to a numerical array. Sets the rule for which the data in `size` is converted to pixels.", - "dflt": "diameter", - "editType": "calc", - "valType": "enumerated", - "values": [ - "diameter", - "area" - ] - }, - "sizeref": { - "description": "Has an effect only if `marker.size` is set to a numerical array. Sets the scale factor used to determine the rendered size of marker points. Use with `sizemin` and `sizemode`.", - "dflt": 1, - "editType": "calc", - "valType": "number" - }, - "sizesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `size`.", - "editType": "none", - "valType": "string" - }, - "standoff": { - "arrayOk": true, - "description": "Moves the marker away from the data point in the direction of `angle` (in px). This can be useful for example if you have another marker at this location and you want to point an arrowhead marker at it.", - "dflt": 0, - "editType": "plot", - "min": 0, - "valType": "number" - }, - "standoffsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `standoff`.", - "editType": "none", - "valType": "string" - }, - "symbol": { - "arrayOk": true, - "description": "Sets the marker symbol type. Adding 100 is equivalent to appending *-open* to a symbol name. Adding 200 is equivalent to appending *-dot* to a symbol name. Adding 300 is equivalent to appending *-open-dot* or *dot-open* to a symbol name.", - "dflt": "circle", - "editType": "style", - "valType": "enumerated", - "values": [ - 0, - "0", - "circle", - 100, - "100", - "circle-open", - 200, - "200", - "circle-dot", - 300, - "300", - "circle-open-dot", - 1, - "1", - "square", - 101, - "101", - "square-open", - 201, - "201", - "square-dot", - 301, - "301", - "square-open-dot", - 2, - "2", - "diamond", - 102, - "102", - "diamond-open", - 202, - "202", - "diamond-dot", - 302, - "302", - "diamond-open-dot", - 3, - "3", - "cross", - 103, - "103", - "cross-open", - 203, - "203", - "cross-dot", - 303, - "303", - "cross-open-dot", - 4, - "4", - "x", - 104, - "104", - "x-open", - 204, - "204", - "x-dot", - 304, - "304", - "x-open-dot", - 5, - "5", - "triangle-up", - 105, - "105", - "triangle-up-open", - 205, - "205", - "triangle-up-dot", - 305, - "305", - "triangle-up-open-dot", - 6, - "6", - "triangle-down", - 106, - "106", - "triangle-down-open", - 206, - "206", - "triangle-down-dot", - 306, - "306", - "triangle-down-open-dot", - 7, - "7", - "triangle-left", - 107, - "107", - "triangle-left-open", - 207, - "207", - "triangle-left-dot", - 307, - "307", - "triangle-left-open-dot", - 8, - "8", - "triangle-right", - 108, - "108", - "triangle-right-open", - 208, - "208", - "triangle-right-dot", - 308, - "308", - "triangle-right-open-dot", - 9, - "9", - "triangle-ne", - 109, - "109", - "triangle-ne-open", - 209, - "209", - "triangle-ne-dot", - 309, - "309", - "triangle-ne-open-dot", - 10, - "10", - "triangle-se", - 110, - "110", - "triangle-se-open", - 210, - "210", - "triangle-se-dot", - 310, - "310", - "triangle-se-open-dot", - 11, - "11", - "triangle-sw", - 111, - "111", - "triangle-sw-open", - 211, - "211", - "triangle-sw-dot", - 311, - "311", - "triangle-sw-open-dot", - 12, - "12", - "triangle-nw", - 112, - "112", - "triangle-nw-open", - 212, - "212", - "triangle-nw-dot", - 312, - "312", - "triangle-nw-open-dot", - 13, - "13", - "pentagon", - 113, - "113", - "pentagon-open", - 213, - "213", - "pentagon-dot", - 313, - "313", - "pentagon-open-dot", - 14, - "14", - "hexagon", - 114, - "114", - "hexagon-open", - 214, - "214", - "hexagon-dot", - 314, - "314", - "hexagon-open-dot", - 15, - "15", - "hexagon2", - 115, - "115", - "hexagon2-open", - 215, - "215", - "hexagon2-dot", - 315, - "315", - "hexagon2-open-dot", - 16, - "16", - "octagon", - 116, - "116", - "octagon-open", - 216, - "216", - "octagon-dot", - 316, - "316", - "octagon-open-dot", - 17, - "17", - "star", - 117, - "117", - "star-open", - 217, - "217", - "star-dot", - 317, - "317", - "star-open-dot", - 18, - "18", - "hexagram", - 118, - "118", - "hexagram-open", - 218, - "218", - "hexagram-dot", - 318, - "318", - "hexagram-open-dot", - 19, - "19", - "star-triangle-up", - 119, - "119", - "star-triangle-up-open", - 219, - "219", - "star-triangle-up-dot", - 319, - "319", - "star-triangle-up-open-dot", - 20, - "20", - "star-triangle-down", - 120, - "120", - "star-triangle-down-open", - 220, - "220", - "star-triangle-down-dot", - 320, - "320", - "star-triangle-down-open-dot", - 21, - "21", - "star-square", - 121, - "121", - "star-square-open", - 221, - "221", - "star-square-dot", - 321, - "321", - "star-square-open-dot", - 22, - "22", - "star-diamond", - 122, - "122", - "star-diamond-open", - 222, - "222", - "star-diamond-dot", - 322, - "322", - "star-diamond-open-dot", - 23, - "23", - "diamond-tall", - 123, - "123", - "diamond-tall-open", - 223, - "223", - "diamond-tall-dot", - 323, - "323", - "diamond-tall-open-dot", - 24, - "24", - "diamond-wide", - 124, - "124", - "diamond-wide-open", - 224, - "224", - "diamond-wide-dot", - 324, - "324", - "diamond-wide-open-dot", - 25, - "25", - "hourglass", - 125, - "125", - "hourglass-open", - 26, - "26", - "bowtie", - 126, - "126", - "bowtie-open", - 27, - "27", - "circle-cross", - 127, - "127", - "circle-cross-open", - 28, - "28", - "circle-x", - 128, - "128", - "circle-x-open", - 29, - "29", - "square-cross", - 129, - "129", - "square-cross-open", - 30, - "30", - "square-x", - 130, - "130", - "square-x-open", - 31, - "31", - "diamond-cross", - 131, - "131", - "diamond-cross-open", - 32, - "32", - "diamond-x", - 132, - "132", - "diamond-x-open", - 33, - "33", - "cross-thin", - 133, - "133", - "cross-thin-open", - 34, - "34", - "x-thin", - 134, - "134", - "x-thin-open", - 35, - "35", - "asterisk", - 135, - "135", - "asterisk-open", - 36, - "36", - "hash", - 136, - "136", - "hash-open", - 236, - "236", - "hash-dot", - 336, - "336", - "hash-open-dot", - 37, - "37", - "y-up", - 137, - "137", - "y-up-open", - 38, - "38", - "y-down", - 138, - "138", - "y-down-open", - 39, - "39", - "y-left", - 139, - "139", - "y-left-open", - 40, - "40", - "y-right", - 140, - "140", - "y-right-open", - 41, - "41", - "line-ew", - 141, - "141", - "line-ew-open", - 42, - "42", - "line-ns", - 142, - "142", - "line-ns-open", - 43, - "43", - "line-ne", - 143, - "143", - "line-ne-open", - 44, - "44", - "line-nw", - 144, - "144", - "line-nw-open", - 45, - "45", - "arrow-up", - 145, - "145", - "arrow-up-open", - 46, - "46", - "arrow-down", - 146, - "146", - "arrow-down-open", - 47, - "47", - "arrow-left", - 147, - "147", - "arrow-left-open", - 48, - "48", - "arrow-right", - 148, - "148", - "arrow-right-open", - 49, - "49", - "arrow-bar-up", - 149, - "149", - "arrow-bar-up-open", - 50, - "50", - "arrow-bar-down", - 150, - "150", - "arrow-bar-down-open", - 51, - "51", - "arrow-bar-left", - 151, - "151", - "arrow-bar-left-open", - 52, - "52", - "arrow-bar-right", - 152, - "152", - "arrow-bar-right-open", - 53, - "53", - "arrow", - 153, - "153", - "arrow-open", - 54, - "54", - "arrow-wide", - 154, - "154", - "arrow-wide-open" - ] - }, - "symbolsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `symbol`.", - "editType": "none", - "valType": "string" - } - }, - "meta": { - "arrayOk": true, - "description": "Assigns extra meta information associated with this trace that can be used in various text attributes. Attributes such as trace `name`, graph, axis and colorbar `title.text`, annotation `text` `rangeselector`, `updatemenues` and `sliders` `label` text all support `meta`. To access the trace `meta` values in an attribute in the same trace, simply use `%{meta[i]}` where `i` is the index or key of the `meta` item in question. To access trace `meta` in layout attributes, use `%{data[n[.meta[i]}` where `i` is the index or key of the `meta` and `n` is the trace index.", - "editType": "plot", - "valType": "any" - }, - "metasrc": { - "description": "Sets the source reference on Chart Studio Cloud for `meta`.", - "editType": "none", - "valType": "string" - }, - "mode": { - "description": "Determines the drawing mode for this scatter trace. If the provided `mode` includes *text* then the `text` elements appear at the coordinates. Otherwise, the `text` elements appear on hover. If there are less than 20 points and the trace is not stacked then the default is *lines+markers*. Otherwise, *lines*.", - "editType": "calc", - "extras": [ - "none" - ], - "flags": [ - "lines", - "markers", - "text" - ], - "valType": "flaglist" - }, - "name": { - "description": "Sets the trace name. The trace name appears as the legend item and on hover.", - "editType": "style", - "valType": "string" - }, - "opacity": { - "description": "Sets the opacity of the trace.", - "dflt": 1, - "editType": "style", - "max": 1, - "min": 0, - "valType": "number" - }, - "real": { - "description": "Sets the real component of the data, in units of normalized impedance such that real=1, imag=0 is the center of the chart.", - "editType": "calc+clearAxisTypes", - "valType": "data_array" - }, - "realsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `real`.", - "editType": "none", - "valType": "string" - }, - "selected": { - "editType": "style", - "marker": { - "color": { - "description": "Sets the marker color of selected points.", - "editType": "style", - "valType": "color" - }, - "editType": "style", - "opacity": { - "description": "Sets the marker opacity of selected points.", - "editType": "style", - "max": 1, - "min": 0, - "valType": "number" - }, - "role": "object", - "size": { - "description": "Sets the marker size of selected points.", - "editType": "style", - "min": 0, - "valType": "number" - } - }, - "role": "object", - "textfont": { - "color": { - "description": "Sets the text font color of selected points.", - "editType": "style", - "valType": "color" - }, - "editType": "style", - "role": "object" - } - }, - "selectedpoints": { - "description": "Array containing integer indices of selected points. Has an effect only for traces that support selections. Note that an empty array means an empty selection where the `unselected` are turned on for all points, whereas, any other non-array values means no selection all where the `selected` and `unselected` styles have no effect.", - "editType": "calc", - "valType": "any" - }, - "showlegend": { - "description": "Determines whether or not an item corresponding to this trace is shown in the legend.", - "dflt": true, - "editType": "style", - "valType": "boolean" - }, - "stream": { - "editType": "calc", - "maxpoints": { - "description": "Sets the maximum number of points to keep on the plots from an incoming stream. If `maxpoints` is set to *50*, only the newest 50 points will be displayed on the plot.", - "dflt": 500, - "editType": "calc", - "max": 10000, - "min": 0, - "valType": "number" - }, - "role": "object", - "token": { - "description": "The stream id number links a data trace on a plot with a stream. See https://chart-studio.plotly.com/settings for more details.", - "editType": "calc", - "noBlank": true, - "strict": true, - "valType": "string" - } - }, - "subplot": { - "description": "Sets a reference between this trace's data coordinates and a smith subplot. If *smith* (the default value), the data refer to `layout.smith`. If *smith2*, the data refer to `layout.smith2`, and so on.", - "dflt": "smith", - "editType": "calc", - "valType": "subplotid" - }, - "text": { - "arrayOk": true, - "description": "Sets text elements associated with each (x,y) pair. If a single string, the same string appears over all the data points. If an array of string, the items are mapped in order to the this trace's (x,y) coordinates. If trace `hoverinfo` contains a *text* flag and *hovertext* is not set, these elements will be seen in the hover labels.", - "dflt": "", - "editType": "calc", - "valType": "string" - }, - "textfont": { - "color": { - "arrayOk": true, - "editType": "style", - "valType": "color" - }, - "colorsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `color`.", - "editType": "none", - "valType": "string" - }, - "description": "Sets the text font.", - "editType": "calc", - "family": { - "arrayOk": true, - "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", - "editType": "calc", - "noBlank": true, - "strict": true, - "valType": "string" - }, - "familysrc": { - "description": "Sets the source reference on Chart Studio Cloud for `family`.", - "editType": "none", - "valType": "string" - }, - "lineposition": { - "arrayOk": true, - "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", - "dflt": "none", - "editType": "calc", - "extras": [ - "none" - ], - "flags": [ - "under", - "over", - "through" - ], - "valType": "flaglist" - }, - "linepositionsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `lineposition`.", - "editType": "none", - "valType": "string" - }, - "role": "object", - "shadow": { - "arrayOk": true, - "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", - "dflt": "none", - "editType": "calc", - "valType": "string" - }, - "shadowsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `shadow`.", - "editType": "none", - "valType": "string" - }, - "size": { - "arrayOk": true, - "editType": "calc", - "min": 1, - "valType": "number" - }, - "sizesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `size`.", - "editType": "none", - "valType": "string" - }, - "style": { - "arrayOk": true, - "description": "Sets whether a font should be styled with a normal or italic face from its family.", - "dflt": "normal", - "editType": "calc", - "valType": "enumerated", - "values": [ - "normal", - "italic" - ] - }, - "stylesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `style`.", - "editType": "none", - "valType": "string" - }, - "textcase": { - "arrayOk": true, - "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", - "dflt": "normal", - "editType": "calc", - "valType": "enumerated", - "values": [ - "normal", - "word caps", - "upper", - "lower" - ] - }, - "textcasesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `textcase`.", - "editType": "none", - "valType": "string" - }, - "variant": { - "arrayOk": true, - "description": "Sets the variant of the font.", - "dflt": "normal", - "editType": "calc", - "valType": "enumerated", - "values": [ - "normal", - "small-caps", - "all-small-caps", - "all-petite-caps", - "petite-caps", - "unicase" - ] - }, - "variantsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `variant`.", - "editType": "none", - "valType": "string" - }, - "weight": { - "arrayOk": true, - "description": "Sets the weight (or boldness) of the font.", - "dflt": "normal", - "editType": "calc", - "extras": [ - "normal", - "bold" - ], - "max": 1000, - "min": 1, - "valType": "integer" - }, - "weightsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `weight`.", - "editType": "none", - "valType": "string" - } - }, - "textposition": { - "arrayOk": true, - "description": "Sets the positions of the `text` elements with respects to the (x,y) coordinates.", - "dflt": "middle center", - "editType": "calc", - "valType": "enumerated", - "values": [ - "top left", - "top center", - "top right", - "middle left", - "middle center", - "middle right", - "bottom left", - "bottom center", - "bottom right" - ] - }, - "textpositionsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `textposition`.", - "editType": "none", - "valType": "string" - }, - "textsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `text`.", - "editType": "none", - "valType": "string" - }, - "texttemplate": { - "arrayOk": true, - "description": "Template string used for rendering the information text that appears on points. Note that this will override `textinfo`. Variables are inserted using %{variable}, for example \"y: %{y}\". Numbers are formatted using d3-format's syntax %{variable:d3-format}, for example \"Price: %{y:$.2f}\". https://github.com/d3/d3-format/tree/v1.4.5#d3-format for details on the formatting syntax. Dates are formatted using d3-time-format's syntax %{variable|d3-time-format}, for example \"Day: %{2019-01-01|%A}\". https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format for details on the date formatting syntax. Variables that can't be found will be replaced with the specifier. For example, a template of \"data: %{x}, %{y}\" will result in a value of \"data: 1, %{y}\" if x is 1 and y is missing. Variables with an undefined value will be replaced with the fallback value. All attributes that can be specified per-point (the ones that are `arrayOk: true`) are available. Finally, the template string has access to variables `real`, `imag` and `text`.", - "dflt": "", - "editType": "plot", - "valType": "string" - }, - "texttemplatefallback": { - "description": "Fallback string that's displayed when a variable referenced in a template is missing. If the boolean value 'false' is passed in, the specifier with the missing variable will be displayed.", - "dflt": "-", - "editType": "plot", - "valType": "any" - }, - "texttemplatesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `texttemplate`.", - "editType": "none", - "valType": "string" - }, - "type": "scattersmith", - "uid": { - "description": "Assign an id to this trace, Use this to provide object constancy between traces during animations and transitions.", - "editType": "plot", - "valType": "string" - }, - "uirevision": { - "description": "Controls persistence of some user-driven changes to the trace: `constraintrange` in `parcoords` traces, as well as some `editable: true` modifications such as `name` and `colorbar.title`. Defaults to `layout.uirevision`. Note that other user-driven trace attribute changes are controlled by `layout` attributes: `trace.visible` is controlled by `layout.legend.uirevision`, `selectedpoints` is controlled by `layout.selectionrevision`, and `colorbar.(x|y)` (accessible with `config: {editable: true}`) is controlled by `layout.editrevision`. Trace changes are tracked by `uid`, which only falls back on trace index if no `uid` is provided. So if your app can add/remove traces before the end of the `data` array, such that the same trace has a different index, you can still preserve user-driven changes if you give each trace a `uid` that stays with it as it moves.", - "editType": "none", - "valType": "any" - }, - "unselected": { - "editType": "style", - "marker": { - "color": { - "description": "Sets the marker color of unselected points, applied only when a selection exists.", - "editType": "style", - "valType": "color" - }, - "editType": "style", - "opacity": { - "description": "Sets the marker opacity of unselected points, applied only when a selection exists.", - "editType": "style", - "max": 1, - "min": 0, - "valType": "number" - }, - "role": "object", - "size": { - "description": "Sets the marker size of unselected points, applied only when a selection exists.", - "editType": "style", - "min": 0, - "valType": "number" - } - }, - "role": "object", - "textfont": { - "color": { - "description": "Sets the text font color of unselected points, applied only when a selection exists.", - "editType": "style", - "valType": "color" - }, - "editType": "style", - "role": "object" - } - }, - "visible": { - "description": "Determines whether or not this trace is visible. If *legendonly*, the trace is not drawn, but can appear as a legend item (provided that the legend itself is visible).", - "dflt": true, - "editType": "calc", - "valType": "enumerated", - "values": [ - true, - false, - "legendonly" - ] - } - }, - "categories": [ - "smith", - "symbols", - "showLegend", - "scatter-like" - ], - "meta": { - "description": "The scattersmith trace type encompasses line charts, scatter charts, text charts, and bubble charts in smith coordinates. The data visualized as scatter point or lines is set in `real` and `imag` (imaginary) coordinates Text (appearing either on the chart or on hover only) is via `text`. Bubble charts are achieved by setting `marker.size` and/or `marker.color` to numerical arrays.", - "hrName": "scatter_smith" - }, - "type": "scattersmith" - }, - "scatterternary": { - "animatable": false, - "attributes": { - "a": { - "description": "Sets the quantity of component `a` in each data point. If `a`, `b`, and `c` are all provided, they need not be normalized, only the relative values matter. If only two arrays are provided they must be normalized to match `ternary.sum`.", - "editType": "calc", - "valType": "data_array" - }, - "asrc": { - "description": "Sets the source reference on Chart Studio Cloud for `a`.", - "editType": "none", - "valType": "string" - }, - "b": { - "description": "Sets the quantity of component `a` in each data point. If `a`, `b`, and `c` are all provided, they need not be normalized, only the relative values matter. If only two arrays are provided they must be normalized to match `ternary.sum`.", - "editType": "calc", - "valType": "data_array" - }, - "bsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `b`.", - "editType": "none", - "valType": "string" - }, - "c": { - "description": "Sets the quantity of component `a` in each data point. If `a`, `b`, and `c` are all provided, they need not be normalized, only the relative values matter. If only two arrays are provided they must be normalized to match `ternary.sum`.", - "editType": "calc", - "valType": "data_array" - }, - "cliponaxis": { - "description": "Determines whether or not markers and text nodes are clipped about the subplot axes. To show markers and text nodes above axis lines and tick labels, make sure to set `xaxis.layer` and `yaxis.layer` to *below traces*.", - "dflt": true, - "editType": "plot", - "valType": "boolean" - }, - "connectgaps": { - "description": "Determines whether or not gaps (i.e. {nan} or missing values) in the provided data arrays are connected.", - "dflt": false, - "editType": "calc", - "valType": "boolean" - }, - "csrc": { - "description": "Sets the source reference on Chart Studio Cloud for `c`.", - "editType": "none", - "valType": "string" - }, - "customdata": { - "description": "Assigns extra data each datum. This may be useful when listening to hover, click and selection events. Note that, *scatter* traces also appends customdata items in the markers DOM elements", - "editType": "calc", - "valType": "data_array" - }, - "customdatasrc": { - "description": "Sets the source reference on Chart Studio Cloud for `customdata`.", - "editType": "none", - "valType": "string" - }, - "fill": { - "description": "Sets the area to fill with a solid color. Use with `fillcolor` if not *none*. scatterternary has a subset of the options available to scatter. *toself* connects the endpoints of the trace (or each segment of the trace if it has gaps) into a closed shape. *tonext* fills the space between two traces if one completely encloses the other (eg consecutive contour lines), and behaves like *toself* if there is no trace before it. *tonext* should not be used if one trace does not enclose the other.", - "dflt": "none", - "editType": "calc", - "valType": "enumerated", - "values": [ - "none", - "toself", - "tonext" - ] - }, - "fillcolor": { - "description": "Sets the fill color. Defaults to a half-transparent variant of the line color, marker color, or marker line color, whichever is available.", - "editType": "style", - "valType": "color" - }, - "hoverinfo": { - "arrayOk": true, - "description": "Determines which trace information appear on hover. If `none` or `skip` are set, no information is displayed upon hovering. But, if `none` is set, click and hover events are still fired.", - "dflt": "all", - "editType": "none", - "extras": [ - "all", - "none", - "skip" - ], - "flags": [ - "a", - "b", - "c", - "text", - "name" - ], - "valType": "flaglist" - }, - "hoverinfosrc": { - "description": "Sets the source reference on Chart Studio Cloud for `hoverinfo`.", - "editType": "none", - "valType": "string" - }, - "hoverlabel": { - "align": { - "arrayOk": true, - "description": "Sets the horizontal alignment of the text content within hover label box. Has an effect only if the hover label text spans more two or more lines", - "dflt": "auto", - "editType": "none", - "valType": "enumerated", - "values": [ - "left", - "right", - "auto" - ] - }, - "alignsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `align`.", - "editType": "none", - "valType": "string" - }, - "bgcolor": { - "arrayOk": true, - "description": "Sets the background color of the hover labels for this trace", - "editType": "none", - "valType": "color" - }, - "bgcolorsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `bgcolor`.", - "editType": "none", - "valType": "string" - }, - "bordercolor": { - "arrayOk": true, - "description": "Sets the border color of the hover labels for this trace.", - "editType": "none", - "valType": "color" - }, - "bordercolorsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `bordercolor`.", - "editType": "none", - "valType": "string" - }, - "editType": "none", - "font": { - "color": { - "arrayOk": true, - "editType": "none", - "valType": "color" - }, - "colorsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `color`.", - "editType": "none", - "valType": "string" - }, - "description": "Sets the font used in hover labels.", - "editType": "none", - "family": { - "arrayOk": true, - "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", - "editType": "none", - "noBlank": true, - "strict": true, - "valType": "string" - }, - "familysrc": { - "description": "Sets the source reference on Chart Studio Cloud for `family`.", - "editType": "none", - "valType": "string" - }, - "lineposition": { - "arrayOk": true, - "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", - "dflt": "none", - "editType": "none", - "extras": [ - "none" - ], - "flags": [ - "under", - "over", - "through" - ], - "valType": "flaglist" - }, - "linepositionsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `lineposition`.", - "editType": "none", - "valType": "string" - }, - "role": "object", - "shadow": { - "arrayOk": true, - "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", - "dflt": "none", - "editType": "none", - "valType": "string" - }, - "shadowsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `shadow`.", - "editType": "none", - "valType": "string" - }, - "size": { - "arrayOk": true, - "editType": "none", - "min": 1, - "valType": "number" - }, - "sizesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `size`.", - "editType": "none", - "valType": "string" - }, - "style": { - "arrayOk": true, - "description": "Sets whether a font should be styled with a normal or italic face from its family.", - "dflt": "normal", - "editType": "none", - "valType": "enumerated", - "values": [ - "normal", - "italic" - ] - }, - "stylesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `style`.", - "editType": "none", - "valType": "string" - }, - "textcase": { - "arrayOk": true, - "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", - "dflt": "normal", - "editType": "none", - "valType": "enumerated", - "values": [ - "normal", - "word caps", - "upper", - "lower" - ] - }, - "textcasesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `textcase`.", - "editType": "none", - "valType": "string" - }, - "variant": { - "arrayOk": true, - "description": "Sets the variant of the font.", - "dflt": "normal", - "editType": "none", - "valType": "enumerated", - "values": [ - "normal", - "small-caps", - "all-small-caps", - "all-petite-caps", - "petite-caps", - "unicase" - ] - }, - "variantsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `variant`.", - "editType": "none", - "valType": "string" - }, - "weight": { - "arrayOk": true, - "description": "Sets the weight (or boldness) of the font.", - "dflt": "normal", - "editType": "none", - "extras": [ - "normal", - "bold" - ], - "max": 1000, - "min": 1, - "valType": "integer" - }, - "weightsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `weight`.", - "editType": "none", - "valType": "string" - } - }, - "namelength": { - "arrayOk": true, - "description": "Sets the default length (in number of characters) of the trace name in the hover labels for all traces. -1 shows the whole name regardless of length. 0-3 shows the first 0-3 characters, and an integer >3 will show the whole name if it is less than that many characters, but if it is longer, will truncate to `namelength - 3` characters and add an ellipsis.", - "dflt": 15, - "editType": "none", - "min": -1, - "valType": "integer" - }, - "namelengthsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `namelength`.", - "editType": "none", - "valType": "string" - }, - "role": "object", - "showarrow": { - "description": "Sets whether or not to show the hover label arrow/triangle pointing to the data point.", - "dflt": true, - "editType": "none", - "valType": "boolean" - } - }, - "hoveron": { - "description": "Do the hover effects highlight individual points (markers or line points) or do they highlight filled regions? If the fill is *toself* or *tonext* and there are no markers or text, then the default is *fills*, otherwise it is *points*.", - "editType": "style", - "flags": [ - "points", - "fills" - ], - "valType": "flaglist" - }, - "hovertemplate": { - "arrayOk": true, - "description": "Template string used for rendering the information that appear on hover box. Note that this will override `hoverinfo`. Variables are inserted using %{variable}, for example \"y: %{y}\" as well as %{xother}, {%_xother}, {%_xother_}, {%xother_}. When showing info for several points, *xother* will be added to those with different x positions from the first point. An underscore before or after *(x|y)other* will add a space on that side, only when this field is shown. Numbers are formatted using d3-format's syntax %{variable:d3-format}, for example \"Price: %{y:$.2f}\". https://github.com/d3/d3-format/tree/v1.4.5#d3-format for details on the formatting syntax. Dates are formatted using d3-time-format's syntax %{variable|d3-time-format}, for example \"Day: %{2019-01-01|%A}\". https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format for details on the date formatting syntax. Variables that can't be found will be replaced with the specifier. For example, a template of \"data: %{x}, %{y}\" will result in a value of \"data: 1, %{y}\" if x is 1 and y is missing. Variables with an undefined value will be replaced with the fallback value. The variables available in `hovertemplate` are the ones emitted as event data described at this link https://plotly.com/javascript/plotlyjs-events/#event-data. Additionally, all attributes that can be specified per-point (the ones that are `arrayOk: true`) are available. Anything contained in tag `` is displayed in the secondary box, for example `%{fullData.name}`. To hide the secondary box completely, use an empty tag ``.", - "dflt": "", - "editType": "none", - "valType": "string" - }, - "hovertemplatefallback": { - "description": "Fallback string that's displayed when a variable referenced in a template is missing. If the boolean value 'false' is passed in, the specifier with the missing variable will be displayed.", - "dflt": "-", - "editType": "none", - "valType": "any" - }, - "hovertemplatesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `hovertemplate`.", - "editType": "none", - "valType": "string" - }, - "hovertext": { - "arrayOk": true, - "description": "Sets hover text elements associated with each (a,b,c) point. If a single string, the same string appears over all the data points. If an array of strings, the items are mapped in order to the the data points in (a,b,c). To be seen, trace `hoverinfo` must contain a *text* flag.", - "dflt": "", - "editType": "style", - "valType": "string" - }, - "hovertextsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `hovertext`.", - "editType": "none", - "valType": "string" - }, - "ids": { - "description": "Assigns id labels to each datum. These ids for object constancy of data points during animation. Should be an array of strings, not numbers or any other type.", - "editType": "calc", - "valType": "data_array" - }, - "idssrc": { - "description": "Sets the source reference on Chart Studio Cloud for `ids`.", - "editType": "none", - "valType": "string" - }, - "legend": { - "description": "Sets the reference to a legend to show this trace in. References to these legends are *legend*, *legend2*, *legend3*, etc. Settings for these legends are set in the layout, under `layout.legend`, `layout.legend2`, etc.", - "dflt": "legend", - "editType": "style", - "valType": "subplotid" - }, - "legendgroup": { - "description": "Sets the legend group for this trace. Traces and shapes part of the same legend group hide/show at the same time when toggling legend items.", - "dflt": "", - "editType": "style", - "valType": "string" - }, - "legendgrouptitle": { - "editType": "style", - "font": { - "color": { - "editType": "style", - "valType": "color" - }, - "description": "Sets this legend group's title font.", - "editType": "style", - "family": { - "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", - "editType": "style", - "noBlank": true, - "strict": true, - "valType": "string" - }, - "lineposition": { - "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", - "dflt": "none", - "editType": "style", - "extras": [ - "none" - ], - "flags": [ - "under", - "over", - "through" - ], - "valType": "flaglist" - }, - "role": "object", - "shadow": { - "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", - "dflt": "none", - "editType": "style", - "valType": "string" - }, - "size": { - "editType": "style", - "min": 1, - "valType": "number" - }, - "style": { - "description": "Sets whether a font should be styled with a normal or italic face from its family.", - "dflt": "normal", - "editType": "style", - "valType": "enumerated", - "values": [ - "normal", - "italic" - ] - }, - "textcase": { - "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", - "dflt": "normal", - "editType": "style", - "valType": "enumerated", - "values": [ - "normal", - "word caps", - "upper", - "lower" - ] - }, - "variant": { - "description": "Sets the variant of the font.", - "dflt": "normal", - "editType": "style", - "valType": "enumerated", - "values": [ - "normal", - "small-caps", - "all-small-caps", - "all-petite-caps", - "petite-caps", - "unicase" - ] - }, - "weight": { - "description": "Sets the weight (or boldness) of the font.", - "dflt": "normal", - "editType": "style", - "extras": [ - "normal", - "bold" - ], - "max": 1000, - "min": 1, - "valType": "integer" - } - }, - "role": "object", - "text": { - "description": "Sets the title of the legend group.", - "dflt": "", - "editType": "style", - "valType": "string" - } - }, - "legendrank": { - "description": "Sets the legend rank for this trace. Items and groups with smaller ranks are presented on top/left side while with *reversed* `legend.traceorder` they are on bottom/right side. The default legendrank is 1000, so that you can use ranks less than 1000 to place certain items before all unranked items, and ranks greater than 1000 to go after all unranked items. When having unranked or equal rank items shapes would be displayed after traces i.e. according to their order in data and layout.", - "dflt": 1000, - "editType": "style", - "valType": "number" - }, - "legendwidth": { - "description": "Sets the width (in px or fraction) of the legend for this trace.", - "editType": "style", - "min": 0, - "valType": "number" - }, - "line": { - "backoff": { - "arrayOk": true, - "description": "Sets the line back off from the end point of the nth line segment (in px). This option is useful e.g. to avoid overlap with arrowhead markers. With *auto* the lines would trim before markers if `marker.angleref` is set to *previous*.", - "dflt": "auto", - "editType": "plot", - "min": 0, - "valType": "number" - }, - "backoffsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `backoff`.", - "editType": "none", - "valType": "string" - }, - "color": { - "description": "Sets the line color.", - "editType": "style", - "valType": "color" - }, - "dash": { - "description": "Sets the dash style of lines. Set to a dash type string (*solid*, *dot*, *dash*, *longdash*, *dashdot*, or *longdashdot*) or a dash length list in px (eg *5px,10px,2px,2px*).", - "dflt": "solid", - "editType": "style", - "valType": "string", - "values": [ - "solid", - "dot", - "dash", - "longdash", - "dashdot", - "longdashdot" - ] - }, - "editType": "calc", - "role": "object", - "shape": { - "description": "Determines the line shape. With *spline* the lines are drawn using spline interpolation. The other available values correspond to step-wise line shapes.", - "dflt": "linear", - "editType": "plot", - "valType": "enumerated", - "values": [ - "linear", - "spline" - ] - }, - "smoothing": { - "description": "Has an effect only if `shape` is set to *spline* Sets the amount of smoothing. *0* corresponds to no smoothing (equivalent to a *linear* shape).", - "dflt": 1, - "editType": "plot", - "max": 1.3, - "min": 0, - "valType": "number" - }, - "width": { - "description": "Sets the line width (in px).", - "dflt": 2, - "editType": "style", - "min": 0, - "valType": "number" - } - }, - "marker": { - "angle": { - "arrayOk": true, - "description": "Sets the marker angle in respect to `angleref`.", - "dflt": 0, - "editType": "plot", - "valType": "angle" - }, - "angleref": { - "description": "Sets the reference for marker angle. With *previous*, angle 0 points along the line from the previous point to this one. With *up*, angle 0 points toward the top of the screen.", - "dflt": "up", - "editType": "plot", - "valType": "enumerated", - "values": [ - "previous", - "up" - ] - }, - "anglesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `angle`.", - "editType": "none", - "valType": "string" - }, - "autocolorscale": { - "description": "Determines whether the colorscale is a default palette (`autocolorscale: true`) or the palette determined by `marker.colorscale`. Has an effect only if in `marker.color` is set to a numerical array. In case `colorscale` is unspecified or `autocolorscale` is true, the default palette will be chosen according to whether numbers in the `color` array are all positive, all negative or mixed.", - "dflt": true, - "editType": "calc", - "impliedEdits": {}, - "valType": "boolean" - }, - "cauto": { - "description": "Determines whether or not the color domain is computed with respect to the input data (here in `marker.color`) or the bounds set in `marker.cmin` and `marker.cmax` Has an effect only if in `marker.color` is set to a numerical array. Defaults to `false` when `marker.cmin` and `marker.cmax` are set by the user.", - "dflt": true, - "editType": "calc", - "impliedEdits": {}, - "valType": "boolean" - }, - "cmax": { - "description": "Sets the upper bound of the color domain. Has an effect only if in `marker.color` is set to a numerical array. Value should have the same units as in `marker.color` and if set, `marker.cmin` must be set as well.", - "dflt": null, - "editType": "plot", - "impliedEdits": { - "cauto": false - }, - "valType": "number" - }, - "cmid": { - "description": "Sets the mid-point of the color domain by scaling `marker.cmin` and/or `marker.cmax` to be equidistant to this point. Has an effect only if in `marker.color` is set to a numerical array. Value should have the same units as in `marker.color`. Has no effect when `marker.cauto` is `false`.", - "dflt": null, - "editType": "calc", - "impliedEdits": {}, - "valType": "number" - }, - "cmin": { - "description": "Sets the lower bound of the color domain. Has an effect only if in `marker.color` is set to a numerical array. Value should have the same units as in `marker.color` and if set, `marker.cmax` must be set as well.", - "dflt": null, - "editType": "plot", - "impliedEdits": { - "cauto": false - }, - "valType": "number" - }, - "color": { - "arrayOk": true, - "description": "Sets the marker color. It accepts either a specific color or an array of numbers that are mapped to the colorscale relative to the max and min values of the array or relative to `marker.cmin` and `marker.cmax` if set.", - "editType": "style", - "valType": "color" - }, - "coloraxis": { - "description": "Sets a reference to a shared color axis. References to these shared color axes are *coloraxis*, *coloraxis2*, *coloraxis3*, etc. Settings for these shared color axes are set in the layout, under `layout.coloraxis`, `layout.coloraxis2`, etc. Note that multiple color scales can be linked to the same color axis.", - "dflt": null, - "editType": "calc", - "regex": "/^coloraxis([2-9]|[1-9][0-9]+)?$/", - "valType": "subplotid" - }, - "colorbar": { - "bgcolor": { - "description": "Sets the color of padded area.", - "dflt": "rgba(0,0,0,0)", - "editType": "colorbars", - "valType": "color" - }, - "bordercolor": { - "description": "Sets the axis line color.", - "dflt": "#444", - "editType": "colorbars", - "valType": "color" - }, - "borderwidth": { - "description": "Sets the width (in px) or the border enclosing this color bar.", - "dflt": 0, - "editType": "colorbars", - "min": 0, - "valType": "number" - }, - "dtick": { - "description": "Sets the step in-between ticks on this axis. Use with `tick0`. Must be a positive number, or special strings available to *log* and *date* axes. If the axis `type` is *log*, then ticks are set every 10^(n*dtick) where n is the tick number. For example, to set a tick mark at 1, 10, 100, 1000, ... set dtick to 1. To set tick marks at 1, 100, 10000, ... set dtick to 2. To set tick marks at 1, 5, 25, 125, 625, 3125, ... set dtick to log_10(5), or 0.69897000433. *log* has several special values; *L*, where `f` is a positive number, gives ticks linearly spaced in value (but not position). For example `tick0` = 0.1, `dtick` = *L0.5* will put ticks at 0.1, 0.6, 1.1, 1.6 etc. To show powers of 10 plus small digits between, use *D1* (all digits) or *D2* (only 2 and 5). `tick0` is ignored for *D1* and *D2*. If the axis `type` is *date*, then you must convert the time to milliseconds. For example, to set the interval between ticks to one day, set `dtick` to 86400000.0. *date* also has special values *M* gives ticks spaced by a number of months. `n` must be a positive integer. To set ticks on the 15th of every third month, set `tick0` to *2000-01-15* and `dtick` to *M3*. To set ticks every 4 years, set `dtick` to *M48*", - "editType": "colorbars", - "impliedEdits": { - "tickmode": "linear" - }, - "valType": "any" - }, - "editType": "colorbars", - "exponentformat": { - "description": "Determines a formatting rule for the tick exponents. For example, consider the number 1,000,000,000. If *none*, it appears as 1,000,000,000. If *e*, 1e+9. If *E*, 1E+9. If *power*, 1x10^9 (with 9 in a super script). If *SI*, 1G. If *B*, 1B. *SI* uses prefixes from \"femto\" f (10^-15) to \"tera\" T (10^12). *SI extended* covers instead the full SI range from \"quecto\" q (10^-30) to \"quetta\" Q (10^30). If *SI* or *SI extended* is used and the exponent is beyond the above ranges, the formatting rule will automatically be switched to the power notation.", - "dflt": "B", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "none", - "e", - "E", - "power", - "SI", - "B", - "SI extended" - ] - }, - "labelalias": { - "description": "Replacement text for specific tick or hover labels. For example using {US: 'USA', CA: 'Canada'} changes US to USA and CA to Canada. The labels we would have shown must match the keys exactly, after adding any tickprefix or ticksuffix. For negative numbers the minus sign symbol used (U+2212) is wider than the regular ascii dash. That means you need to use −1 instead of -1. labelalias can be used with any axis type, and both keys (if needed) and values (if desired) can include html-like tags or MathJax.", - "dflt": false, - "editType": "colorbars", - "valType": "any" - }, - "len": { - "description": "Sets the length of the color bar This measure excludes the padding of both ends. That is, the color bar length is this length minus the padding on both ends.", - "dflt": 1, - "editType": "colorbars", - "min": 0, - "valType": "number" - }, - "lenmode": { - "description": "Determines whether this color bar's length (i.e. the measure in the color variation direction) is set in units of plot *fraction* or in *pixels. Use `len` to set the value.", - "dflt": "fraction", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "fraction", - "pixels" - ] - }, - "minexponent": { - "description": "Hide SI prefix for 10^n if |n| is below this number. This only has an effect when `tickformat` is *SI* or *B*.", - "dflt": 3, - "editType": "colorbars", - "min": 0, - "valType": "number" - }, - "nticks": { - "description": "Specifies the maximum number of ticks for the particular axis. The actual number of ticks will be chosen automatically to be less than or equal to `nticks`. Has an effect only if `tickmode` is set to *auto*.", - "dflt": 0, - "editType": "colorbars", - "min": 0, - "valType": "integer" - }, - "orientation": { - "description": "Sets the orientation of the colorbar.", - "dflt": "v", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "h", - "v" - ] - }, - "outlinecolor": { - "description": "Sets the axis line color.", - "dflt": "#444", - "editType": "colorbars", - "valType": "color" - }, - "outlinewidth": { - "description": "Sets the width (in px) of the axis line.", - "dflt": 1, - "editType": "colorbars", - "min": 0, - "valType": "number" - }, - "role": "object", - "separatethousands": { - "description": "If \"true\", even 4-digit integers are separated", - "dflt": false, - "editType": "colorbars", - "valType": "boolean" - }, - "showexponent": { - "description": "If *all*, all exponents are shown besides their significands. If *first*, only the exponent of the first tick is shown. If *last*, only the exponent of the last tick is shown. If *none*, no exponents appear.", - "dflt": "all", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "all", - "first", - "last", - "none" - ] - }, - "showticklabels": { - "description": "Determines whether or not the tick labels are drawn.", - "dflt": true, - "editType": "colorbars", - "valType": "boolean" - }, - "showtickprefix": { - "description": "If *all*, all tick labels are displayed with a prefix. If *first*, only the first tick is displayed with a prefix. If *last*, only the last tick is displayed with a suffix. If *none*, tick prefixes are hidden.", - "dflt": "all", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "all", - "first", - "last", - "none" - ] - }, - "showticksuffix": { - "description": "Same as `showtickprefix` but for tick suffixes.", - "dflt": "all", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "all", - "first", - "last", - "none" - ] - }, - "thickness": { - "description": "Sets the thickness of the color bar This measure excludes the size of the padding, ticks and labels.", - "dflt": 30, - "editType": "colorbars", - "min": 0, - "valType": "number" - }, - "thicknessmode": { - "description": "Determines whether this color bar's thickness (i.e. the measure in the constant color direction) is set in units of plot *fraction* or in *pixels*. Use `thickness` to set the value.", - "dflt": "pixels", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "fraction", - "pixels" - ] - }, - "tick0": { - "description": "Sets the placement of the first tick on this axis. Use with `dtick`. If the axis `type` is *log*, then you must take the log of your starting tick (e.g. to set the starting tick to 100, set the `tick0` to 2) except when `dtick`=*L* (see `dtick` for more info). If the axis `type` is *date*, it should be a date string, like date data. If the axis `type` is *category*, it should be a number, using the scale where each category is assigned a serial number from zero in the order it appears.", - "editType": "colorbars", - "impliedEdits": { - "tickmode": "linear" - }, - "valType": "any" - }, - "tickangle": { - "description": "Sets the angle of the tick labels with respect to the horizontal. For example, a `tickangle` of -90 draws the tick labels vertically.", - "dflt": "auto", - "editType": "colorbars", - "valType": "angle" - }, - "tickcolor": { - "description": "Sets the tick color.", - "dflt": "#444", - "editType": "colorbars", - "valType": "color" - }, - "tickfont": { - "color": { - "editType": "colorbars", - "valType": "color" - }, - "description": "Sets the color bar's tick label font", - "editType": "colorbars", - "family": { - "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", - "editType": "colorbars", - "noBlank": true, - "strict": true, - "valType": "string" - }, - "lineposition": { - "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", - "dflt": "none", - "editType": "colorbars", - "extras": [ - "none" - ], - "flags": [ - "under", - "over", - "through" - ], - "valType": "flaglist" - }, - "role": "object", - "shadow": { - "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", - "dflt": "none", - "editType": "colorbars", - "valType": "string" - }, - "size": { - "editType": "colorbars", - "min": 1, - "valType": "number" - }, - "style": { - "description": "Sets whether a font should be styled with a normal or italic face from its family.", - "dflt": "normal", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "normal", - "italic" - ] - }, - "textcase": { - "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", - "dflt": "normal", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "normal", - "word caps", - "upper", - "lower" - ] - }, - "variant": { - "description": "Sets the variant of the font.", - "dflt": "normal", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "normal", - "small-caps", - "all-small-caps", - "all-petite-caps", - "petite-caps", - "unicase" - ] - }, - "weight": { - "description": "Sets the weight (or boldness) of the font.", - "dflt": "normal", - "editType": "colorbars", - "extras": [ - "normal", - "bold" - ], - "max": 1000, - "min": 1, - "valType": "integer" - } - }, - "tickformat": { - "description": "Sets the tick label formatting rule using d3 formatting mini-languages which are very similar to those in Python. For numbers, see: https://github.com/d3/d3-format/tree/v1.4.5#d3-format. And for dates see: https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format. We add two items to d3's date formatter: *%h* for half of the year as a decimal number as well as *%{n}f* for fractional seconds with n digits. For example, *2016-10-13 09:15:23.456* with tickformat *%H~%M~%S.%2f* would display *09~15~23.46*", - "dflt": "", - "editType": "colorbars", - "valType": "string" - }, - "tickformatstops": { - "items": { - "tickformatstop": { - "dtickrange": { - "description": "range [*min*, *max*], where *min*, *max* - dtick values which describe some zoom level, it is possible to omit *min* or *max* value by passing *null*", - "editType": "colorbars", - "items": [ - { - "editType": "colorbars", - "valType": "any" - }, - { - "editType": "colorbars", - "valType": "any" - } - ], - "valType": "info_array" - }, - "editType": "colorbars", - "enabled": { - "description": "Determines whether or not this stop is used. If `false`, this stop is ignored even within its `dtickrange`.", + "rangeselector": { + "activecolor": { + "description": "Sets the background color of the active range selector button.", + "editType": "plot", + "valType": "color" + }, + "bgcolor": { + "description": "Sets the background color of the range selector buttons.", + "dflt": "#eee", + "editType": "plot", + "valType": "color" + }, + "bordercolor": { + "description": "Sets the color of the border enclosing the range selector.", + "dflt": "#444", + "editType": "plot", + "valType": "color" + }, + "borderwidth": { + "description": "Sets the width (in px) of the border enclosing the range selector.", + "dflt": 0, + "editType": "plot", + "min": 0, + "valType": "number" + }, + "buttons": { + "items": { + "button": { + "count": { + "description": "Sets the number of steps to take to update the range. Use with `step` to specify the update interval.", + "dflt": 1, + "editType": "plot", + "min": 0, + "valType": "number" + }, + "description": "Sets the specifications for each buttons. By default, a range selector comes with no buttons.", + "editType": "plot", + "label": { + "description": "Sets the text label to appear on the button.", + "editType": "plot", + "valType": "string" + }, + "name": { + "description": "When used in a template, named items are created in the output figure in addition to any items the figure already has in this array. You can modify these items in the output figure by making your own item with `templateitemname` matching this `name` alongside your modifications (including `visible: false` or `enabled: false` to hide it). Has no effect outside of a template.", + "editType": "none", + "valType": "string" + }, + "role": "object", + "step": { + "description": "The unit of measurement that the `count` value will set the range by.", + "dflt": "month", + "editType": "plot", + "valType": "enumerated", + "values": [ + "month", + "year", + "day", + "hour", + "minute", + "second", + "all" + ] + }, + "stepmode": { + "description": "Sets the range update mode. If *backward*, the range update shifts the start of range back *count* times *step* milliseconds. If *todate*, the range update shifts the start of range back to the first timestamp from *count* times *step* milliseconds back. For example, with `step` set to *year* and `count` set to *1* the range update shifts the start of the range back to January 01 of the current year. Month and year *todate* are currently available only for the built-in (Gregorian) calendar.", + "dflt": "backward", + "editType": "plot", + "valType": "enumerated", + "values": [ + "backward", + "todate" + ] + }, + "templateitemname": { + "description": "Used to refer to a named item in this array in the template. Named items from the template will be created even without a matching item in the input figure, but you can modify one by making an item with `templateitemname` matching its `name`, alongside your modifications (including `visible: false` or `enabled: false` to hide it). If there is no template or no matching item, this item will be hidden unless you explicitly show it with `visible: true`.", + "editType": "calc", + "valType": "string" + }, + "visible": { + "description": "Determines whether or not this button is visible.", + "dflt": true, + "editType": "plot", + "valType": "boolean" + } + } + }, + "role": "object" + }, + "editType": "plot", + "font": { + "color": { + "editType": "plot", + "valType": "color" + }, + "description": "Sets the font of the range selector button text.", + "editType": "plot", + "family": { + "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", + "editType": "plot", + "noBlank": true, + "strict": true, + "valType": "string" + }, + "lineposition": { + "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", + "dflt": "none", + "editType": "plot", + "extras": [ + "none" + ], + "flags": [ + "under", + "over", + "through" + ], + "valType": "flaglist" + }, + "role": "object", + "shadow": { + "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", + "dflt": "none", + "editType": "plot", + "valType": "string" + }, + "size": { + "editType": "plot", + "min": 1, + "valType": "number" + }, + "style": { + "description": "Sets whether a font should be styled with a normal or italic face from its family.", + "dflt": "normal", + "editType": "plot", + "valType": "enumerated", + "values": [ + "normal", + "italic" + ] + }, + "textcase": { + "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", + "dflt": "normal", + "editType": "plot", + "valType": "enumerated", + "values": [ + "normal", + "word caps", + "upper", + "lower" + ] + }, + "variant": { + "description": "Sets the variant of the font.", + "dflt": "normal", + "editType": "plot", + "valType": "enumerated", + "values": [ + "normal", + "small-caps", + "all-small-caps", + "all-petite-caps", + "petite-caps", + "unicase" + ] + }, + "weight": { + "description": "Sets the weight (or boldness) of the font.", + "dflt": "normal", + "editType": "plot", + "extras": [ + "normal", + "bold" + ], + "max": 1000, + "min": 1, + "valType": "integer" + } + }, + "role": "object", + "visible": { + "description": "Determines whether or not this range selector is visible. Note that range selectors are only available for x axes of `type` set to or auto-typed to *date*.", + "editType": "plot", + "valType": "boolean" + }, + "x": { + "description": "Sets the x position (in normalized coordinates) of the range selector.", + "editType": "plot", + "max": 3, + "min": -2, + "valType": "number" + }, + "xanchor": { + "description": "Sets the range selector's horizontal position anchor. This anchor binds the `x` position to the *left*, *center* or *right* of the range selector.", + "dflt": "left", + "editType": "plot", + "valType": "enumerated", + "values": [ + "auto", + "left", + "center", + "right" + ] + }, + "y": { + "description": "Sets the y position (in normalized coordinates) of the range selector.", + "editType": "plot", + "max": 3, + "min": -2, + "valType": "number" + }, + "yanchor": { + "description": "Sets the range selector's vertical position anchor This anchor binds the `y` position to the *top*, *middle* or *bottom* of the range selector.", + "dflt": "bottom", + "editType": "plot", + "valType": "enumerated", + "values": [ + "auto", + "top", + "middle", + "bottom" + ] + } + }, + "rangeslider": { + "autorange": { + "description": "Determines whether or not the range slider range is computed in relation to the input data. If `range` is provided, then `autorange` is set to *false*.", + "dflt": true, + "editType": "calc", + "impliedEdits": {}, + "valType": "boolean" + }, + "bgcolor": { + "description": "Sets the background color of the range slider.", + "dflt": "#fff", + "editType": "plot", + "valType": "color" + }, + "bordercolor": { + "description": "Sets the border color of the range slider.", + "dflt": "#444", + "editType": "plot", + "valType": "color" + }, + "borderwidth": { + "description": "Sets the border width of the range slider.", + "dflt": 0, + "editType": "plot", + "min": 0, + "valType": "integer" + }, + "editType": "calc", + "range": { + "description": "Sets the range of the range slider. If not set, defaults to the full xaxis range. If the axis `type` is *log*, then you must take the log of your desired range. If the axis `type` is *date*, it should be date strings, like date data, though Date objects and unix milliseconds will be accepted and converted to strings. If the axis `type` is *category*, it should be numbers, using the scale where each category is assigned a serial number from zero in the order it appears.", + "editType": "calc", + "impliedEdits": { + "autorange": false + }, + "items": [ + { + "editType": "calc", + "impliedEdits": { + "^autorange": false + }, + "valType": "any" + }, + { + "editType": "calc", + "impliedEdits": { + "^autorange": false + }, + "valType": "any" + } + ], + "valType": "info_array" + }, + "role": "object", + "thickness": { + "description": "The height of the range slider as a fraction of the total plot area height.", + "dflt": 0.15, + "editType": "plot", + "max": 1, + "min": 0, + "valType": "number" + }, + "visible": { + "description": "Determines whether or not the range slider will be visible. If visible, perpendicular axes will be set to `fixedrange`", + "dflt": true, + "editType": "calc", + "valType": "boolean" + }, + "yaxis": { + "_isSubplotObj": true, + "editType": "calc", + "range": { + "description": "Sets the range of this axis for the rangeslider.", + "editType": "plot", + "items": [ + { + "editType": "plot", + "valType": "any" + }, + { + "editType": "plot", + "valType": "any" + } + ], + "valType": "info_array" + }, + "rangemode": { + "description": "Determines whether or not the range of this axis in the rangeslider use the same value than in the main plot when zooming in/out. If *auto*, the autorange will be used. If *fixed*, the `range` is used. If *match*, the current range of the corresponding y-axis on the main subplot is used.", + "dflt": "match", + "editType": "calc", + "valType": "enumerated", + "values": [ + "auto", + "fixed", + "match" + ] + }, + "role": "object" + } + }, + "role": "object", + "scaleanchor": { + "description": "If set to another axis id (e.g. `x2`, `y`), the range of this axis changes together with the range of the corresponding axis such that the scale of pixels per unit is in a constant ratio. Both axes are still zoomable, but when you zoom one, the other will zoom the same amount, keeping a fixed midpoint. `constrain` and `constraintoward` determine how we enforce the constraint. You can chain these, ie `yaxis: {scaleanchor: *x*}, xaxis2: {scaleanchor: *y*}` but you can only link axes of the same `type`. The linked axis can have the opposite letter (to constrain the aspect ratio) or the same letter (to match scales across subplots). Loops (`yaxis: {scaleanchor: *x*}, xaxis: {scaleanchor: *y*}` or longer) are redundant and the last constraint encountered will be ignored to avoid possible inconsistent constraints via `scaleratio`. Note that setting axes simultaneously in both a `scaleanchor` and a `matches` constraint is currently forbidden. Setting `false` allows to remove a default constraint (occasionally, you may need to prevent a default `scaleanchor` constraint from being applied, eg. when having an image trace `yaxis: {scaleanchor: \"x\"}` is set automatically in order for pixels to be rendered as squares, setting `yaxis: {scaleanchor: false}` allows to remove the constraint).", + "editType": "plot", + "valType": "enumerated", + "values": [ + "/^x([2-9]|[1-9][0-9]+)?( domain)?$/", + "/^y([2-9]|[1-9][0-9]+)?( domain)?$/", + false + ] + }, + "scaleratio": { + "description": "If this axis is linked to another by `scaleanchor`, this determines the pixel to unit scale ratio. For example, if this value is 10, then every unit on this axis spans 10 times the number of pixels as a unit on the linked axis. Use this for example to create an elevation profile where the vertical scale is exaggerated a fixed amount with respect to the horizontal.", + "dflt": 1, + "editType": "plot", + "min": 0, + "valType": "number" + }, + "separatethousands": { + "description": "If \"true\", even 4-digit integers are separated", + "dflt": false, + "editType": "ticks", + "valType": "boolean" + }, + "showdividers": { + "description": "Determines whether or not a dividers are drawn between the category levels of this axis. Only has an effect on *multicategory* axes.", "dflt": true, - "editType": "colorbars", + "editType": "ticks", "valType": "boolean" - }, - "name": { - "description": "When used in a template, named items are created in the output figure in addition to any items the figure already has in this array. You can modify these items in the output figure by making your own item with `templateitemname` matching this `name` alongside your modifications (including `visible: false` or `enabled: false` to hide it). Has no effect outside of a template.", - "editType": "colorbars", - "valType": "string" - }, - "role": "object", - "templateitemname": { - "description": "Used to refer to a named item in this array in the template. Named items from the template will be created even without a matching item in the input figure, but you can modify one by making an item with `templateitemname` matching its `name`, alongside your modifications (including `visible: false` or `enabled: false` to hide it). If there is no template or no matching item, this item will be hidden unless you explicitly show it with `visible: true`.", - "editType": "colorbars", - "valType": "string" - }, - "value": { - "description": "string - dtickformat for described zoom level, the same as *tickformat*", + }, + "showexponent": { + "description": "If *all*, all exponents are shown besides their significands. If *first*, only the exponent of the first tick is shown. If *last*, only the exponent of the last tick is shown. If *none*, no exponents appear.", + "dflt": "all", + "editType": "ticks", + "valType": "enumerated", + "values": [ + "all", + "first", + "last", + "none" + ] + }, + "showgrid": { + "description": "Determines whether or not grid lines are drawn. If *true*, the grid lines are drawn at every tick mark.", + "editType": "ticks", + "valType": "boolean" + }, + "showline": { + "description": "Determines whether or not a line bounding this axis is drawn.", + "dflt": false, + "editType": "ticks+layoutstyle", + "valType": "boolean" + }, + "showspikes": { + "description": "Determines whether or not spikes (aka droplines) are drawn for this axis. Note: This only takes affect when hovermode = closest", + "dflt": false, + "editType": "modebar", + "valType": "boolean" + }, + "showticklabels": { + "description": "Determines whether or not the tick labels are drawn.", + "dflt": true, + "editType": "ticks", + "valType": "boolean" + }, + "showtickprefix": { + "description": "If *all*, all tick labels are displayed with a prefix. If *first*, only the first tick is displayed with a prefix. If *last*, only the last tick is displayed with a suffix. If *none*, tick prefixes are hidden.", + "dflt": "all", + "editType": "ticks", + "valType": "enumerated", + "values": [ + "all", + "first", + "last", + "none" + ] + }, + "showticksuffix": { + "description": "Same as `showtickprefix` but for tick suffixes.", + "dflt": "all", + "editType": "ticks", + "valType": "enumerated", + "values": [ + "all", + "first", + "last", + "none" + ] + }, + "side": { + "description": "Determines whether a x (y) axis is positioned at the *bottom* (*left*) or *top* (*right*) of the plotting area.", + "editType": "plot", + "valType": "enumerated", + "values": [ + "top", + "bottom", + "left", + "right" + ] + }, + "spikecolor": { + "description": "Sets the spike color. If undefined, will use the series color", + "dflt": null, + "editType": "none", + "valType": "color" + }, + "spikedash": { + "description": "Sets the dash style of lines. Set to a dash type string (*solid*, *dot*, *dash*, *longdash*, *dashdot*, or *longdashdot*) or a dash length list in px (eg *5px,10px,2px,2px*).", + "dflt": "dash", + "editType": "none", + "valType": "string", + "values": [ + "solid", + "dot", + "dash", + "longdash", + "dashdot", + "longdashdot" + ] + }, + "spikemode": { + "description": "Determines the drawing mode for the spike line If *toaxis*, the line is drawn from the data point to the axis the series is plotted on. If *across*, the line is drawn across the entire plot area, and supercedes *toaxis*. If *marker*, then a marker dot is drawn on the axis the series is plotted on", + "dflt": "toaxis", + "editType": "none", + "flags": [ + "toaxis", + "across", + "marker" + ], + "valType": "flaglist" + }, + "spikesnap": { + "description": "Determines whether spikelines are stuck to the cursor or to the closest datapoints.", + "dflt": "hovered data", + "editType": "none", + "valType": "enumerated", + "values": [ + "data", + "cursor", + "hovered data" + ] + }, + "spikethickness": { + "description": "Sets the width (in px) of the zero line.", + "dflt": 3, + "editType": "none", + "valType": "number" + }, + "tick0": { + "description": "Sets the placement of the first tick on this axis. Use with `dtick`. If the axis `type` is *log*, then you must take the log of your starting tick (e.g. to set the starting tick to 100, set the `tick0` to 2) except when `dtick`=*L* (see `dtick` for more info). If the axis `type` is *date*, it should be a date string, like date data. If the axis `type` is *category*, it should be a number, using the scale where each category is assigned a serial number from zero in the order it appears.", + "editType": "ticks", + "impliedEdits": { + "tickmode": "linear" + }, + "valType": "any" + }, + "tickangle": { + "description": "Sets the angle of the tick labels with respect to the horizontal. For example, a `tickangle` of -90 draws the tick labels vertically.", + "dflt": "auto", + "editType": "ticks", + "valType": "angle" + }, + "tickcolor": { + "description": "Sets the tick color.", + "dflt": "#444", + "editType": "ticks", + "valType": "color" + }, + "tickfont": { + "color": { + "editType": "ticks", + "valType": "color" + }, + "description": "Sets the tick font.", + "editType": "ticks", + "family": { + "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", + "editType": "ticks", + "noBlank": true, + "strict": true, + "valType": "string" + }, + "lineposition": { + "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", + "dflt": "none", + "editType": "ticks", + "extras": [ + "none" + ], + "flags": [ + "under", + "over", + "through" + ], + "valType": "flaglist" + }, + "role": "object", + "shadow": { + "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", + "dflt": "none", + "editType": "ticks", + "valType": "string" + }, + "size": { + "editType": "ticks", + "min": 1, + "valType": "number" + }, + "style": { + "description": "Sets whether a font should be styled with a normal or italic face from its family.", + "dflt": "normal", + "editType": "ticks", + "valType": "enumerated", + "values": [ + "normal", + "italic" + ] + }, + "textcase": { + "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", + "dflt": "normal", + "editType": "ticks", + "valType": "enumerated", + "values": [ + "normal", + "word caps", + "upper", + "lower" + ] + }, + "variant": { + "description": "Sets the variant of the font.", + "dflt": "normal", + "editType": "ticks", + "valType": "enumerated", + "values": [ + "normal", + "small-caps", + "all-small-caps", + "all-petite-caps", + "petite-caps", + "unicase" + ] + }, + "weight": { + "description": "Sets the weight (or boldness) of the font.", + "dflt": "normal", + "editType": "ticks", + "extras": [ + "normal", + "bold" + ], + "max": 1000, + "min": 1, + "valType": "integer" + } + }, + "tickformat": { + "description": "Sets the tick label formatting rule using d3 formatting mini-languages which are very similar to those in Python. For numbers, see: https://github.com/d3/d3-format/tree/v1.4.5#d3-format. And for dates see: https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format. We add two items to d3's date formatter: *%h* for half of the year as a decimal number as well as *%{n}f* for fractional seconds with n digits. For example, *2016-10-13 09:15:23.456* with tickformat *%H~%M~%S.%2f* would display *09~15~23.46*", "dflt": "", - "editType": "colorbars", + "editType": "ticks", "valType": "string" - } - } - }, - "role": "object" - }, - "ticklabeloverflow": { - "description": "Determines how we handle tick labels that would overflow either the graph div or the domain of the axis. The default value for inside tick labels is *hide past domain*. In other cases the default is *hide past div*.", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "allow", - "hide past div", - "hide past domain" - ] - }, - "ticklabelposition": { - "description": "Determines where tick labels are drawn relative to the ticks. Left and right options are used when `orientation` is *h*, top and bottom when `orientation` is *v*.", - "dflt": "outside", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "outside", - "inside", - "outside top", - "inside top", - "outside left", - "inside left", - "outside right", - "inside right", - "outside bottom", - "inside bottom" - ] - }, - "ticklabelstep": { - "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", - "dflt": 1, - "editType": "colorbars", - "min": 1, - "valType": "integer" - }, - "ticklen": { - "description": "Sets the tick length (in px).", - "dflt": 5, - "editType": "colorbars", - "min": 0, - "valType": "number" - }, - "tickmode": { - "description": "Sets the tick mode for this axis. If *auto*, the number of ticks is set via `nticks`. If *linear*, the placement of the ticks is determined by a starting position `tick0` and a tick step `dtick` (*linear* is the default value if `tick0` and `dtick` are provided). If *array*, the placement of the ticks is set via `tickvals` and the tick text is `ticktext`. (*array* is the default value if `tickvals` is provided).", - "editType": "colorbars", - "impliedEdits": {}, - "valType": "enumerated", - "values": [ - "auto", - "linear", - "array" - ] - }, - "tickprefix": { - "description": "Sets a tick label prefix.", - "dflt": "", - "editType": "colorbars", - "valType": "string" - }, - "ticks": { - "description": "Determines whether ticks are drawn or not. If **, this axis' ticks are not drawn. If *outside* (*inside*), this axis' are drawn outside (inside) the axis lines.", - "dflt": "", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "outside", - "inside", - "" - ] - }, - "ticksuffix": { - "description": "Sets a tick label suffix.", - "dflt": "", - "editType": "colorbars", - "valType": "string" - }, - "ticktext": { - "description": "Sets the text displayed at the ticks position via `tickvals`. Only has an effect if `tickmode` is set to *array*. Used with `tickvals`.", - "editType": "colorbars", - "valType": "data_array" - }, - "ticktextsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `ticktext`.", - "editType": "none", - "valType": "string" - }, - "tickvals": { - "description": "Sets the values at which ticks on this axis appear. Only has an effect if `tickmode` is set to *array*. Used with `ticktext`.", - "editType": "colorbars", - "valType": "data_array" - }, - "tickvalssrc": { - "description": "Sets the source reference on Chart Studio Cloud for `tickvals`.", - "editType": "none", - "valType": "string" - }, - "tickwidth": { - "description": "Sets the tick width (in px).", - "dflt": 1, - "editType": "colorbars", - "min": 0, - "valType": "number" - }, - "title": { - "editType": "colorbars", - "font": { - "color": { - "editType": "colorbars", - "valType": "color" - }, - "description": "Sets this color bar's title font.", - "editType": "colorbars", - "family": { - "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", - "editType": "colorbars", - "noBlank": true, - "strict": true, - "valType": "string" - }, - "lineposition": { - "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", - "dflt": "none", - "editType": "colorbars", - "extras": [ - "none" - ], - "flags": [ - "under", - "over", - "through" - ], - "valType": "flaglist" }, - "role": "object", - "shadow": { - "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", - "dflt": "none", - "editType": "colorbars", - "valType": "string" - }, - "size": { - "editType": "colorbars", - "min": 1, - "valType": "number" - }, - "style": { - "description": "Sets whether a font should be styled with a normal or italic face from its family.", - "dflt": "normal", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "normal", - "italic" - ] - }, - "textcase": { - "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", - "dflt": "normal", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "normal", - "word caps", - "upper", - "lower" - ] - }, - "variant": { - "description": "Sets the variant of the font.", - "dflt": "normal", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "normal", - "small-caps", - "all-small-caps", - "all-petite-caps", - "petite-caps", - "unicase" - ] - }, - "weight": { - "description": "Sets the weight (or boldness) of the font.", - "dflt": "normal", - "editType": "colorbars", - "extras": [ - "normal", - "bold" - ], - "max": 1000, - "min": 1, - "valType": "integer" - } - }, - "role": "object", - "side": { - "description": "Determines the location of color bar's title with respect to the color bar. Defaults to *top* when `orientation` if *v* and defaults to *right* when `orientation` if *h*.", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "right", - "top", - "bottom" - ] - }, - "text": { - "description": "Sets the title of the color bar.", - "editType": "colorbars", - "valType": "string" - } - }, - "x": { - "description": "Sets the x position with respect to `xref` of the color bar (in plot fraction). When `xref` is *paper*, defaults to 1.02 when `orientation` is *v* and 0.5 when `orientation` is *h*. When `xref` is *container*, defaults to *1* when `orientation` is *v* and 0.5 when `orientation` is *h*. Must be between *0* and *1* if `xref` is *container* and between *-2* and *3* if `xref` is *paper*.", - "editType": "colorbars", - "valType": "number" - }, - "xanchor": { - "description": "Sets this color bar's horizontal position anchor. This anchor binds the `x` position to the *left*, *center* or *right* of the color bar. Defaults to *left* when `orientation` is *v* and *center* when `orientation` is *h*.", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "left", - "center", - "right" - ] - }, - "xpad": { - "description": "Sets the amount of padding (in px) along the x direction.", - "dflt": 10, - "editType": "colorbars", - "min": 0, - "valType": "number" - }, - "xref": { - "description": "Sets the container `x` refers to. *container* spans the entire `width` of the plot. *paper* refers to the width of the plotting area only.", - "dflt": "paper", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "container", - "paper" - ] - }, - "y": { - "description": "Sets the y position with respect to `yref` of the color bar (in plot fraction). When `yref` is *paper*, defaults to 0.5 when `orientation` is *v* and 1.02 when `orientation` is *h*. When `yref` is *container*, defaults to 0.5 when `orientation` is *v* and 1 when `orientation` is *h*. Must be between *0* and *1* if `yref` is *container* and between *-2* and *3* if `yref` is *paper*.", - "editType": "colorbars", - "valType": "number" - }, - "yanchor": { - "description": "Sets this color bar's vertical position anchor This anchor binds the `y` position to the *top*, *middle* or *bottom* of the color bar. Defaults to *middle* when `orientation` is *v* and *bottom* when `orientation` is *h*.", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "top", - "middle", - "bottom" - ] - }, - "ypad": { - "description": "Sets the amount of padding (in px) along the y direction.", - "dflt": 10, - "editType": "colorbars", - "min": 0, - "valType": "number" - }, - "yref": { - "description": "Sets the container `y` refers to. *container* spans the entire `height` of the plot. *paper* refers to the height of the plotting area only.", - "dflt": "paper", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "container", - "paper" - ] - } - }, - "colorscale": { - "description": "Sets the colorscale. Has an effect only if in `marker.color` is set to a numerical array. The colorscale must be an array containing arrays mapping a normalized value to an rgb, rgba, hex, hsl, hsv, or named color string. At minimum, a mapping for the lowest (0) and highest (1) values are required. For example, `[[0, 'rgb(0,0,255)'], [1, 'rgb(255,0,0)']]`. To control the bounds of the colorscale in color space, use `marker.cmin` and `marker.cmax`. Alternatively, `colorscale` may be a palette name string of the following list: Blackbody,Bluered,Blues,Cividis,Earth,Electric,Greens,Greys,Hot,Jet,Picnic,Portland,Rainbow,RdBu,Reds,Viridis,YlGnBu,YlOrRd.", - "dflt": null, - "editType": "calc", - "impliedEdits": { - "autocolorscale": false - }, - "valType": "colorscale" - }, - "colorsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `color`.", - "editType": "none", - "valType": "string" - }, - "editType": "calc", - "gradient": { - "color": { - "arrayOk": true, - "description": "Sets the final color of the gradient fill: the center color for radial, the right for horizontal, or the bottom for vertical.", - "editType": "calc", - "valType": "color" - }, - "colorsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `color`.", - "editType": "none", - "valType": "string" - }, - "editType": "calc", - "role": "object", - "type": { - "arrayOk": true, - "description": "Sets the type of gradient used to fill the markers", - "dflt": "none", - "editType": "calc", - "valType": "enumerated", - "values": [ - "radial", - "horizontal", - "vertical", - "none" - ] - }, - "typesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `type`.", - "editType": "none", - "valType": "string" - } - }, - "line": { - "autocolorscale": { - "description": "Determines whether the colorscale is a default palette (`autocolorscale: true`) or the palette determined by `marker.line.colorscale`. Has an effect only if in `marker.line.color` is set to a numerical array. In case `colorscale` is unspecified or `autocolorscale` is true, the default palette will be chosen according to whether numbers in the `color` array are all positive, all negative or mixed.", - "dflt": true, - "editType": "calc", - "impliedEdits": {}, - "valType": "boolean" - }, - "cauto": { - "description": "Determines whether or not the color domain is computed with respect to the input data (here in `marker.line.color`) or the bounds set in `marker.line.cmin` and `marker.line.cmax` Has an effect only if in `marker.line.color` is set to a numerical array. Defaults to `false` when `marker.line.cmin` and `marker.line.cmax` are set by the user.", - "dflt": true, - "editType": "calc", - "impliedEdits": {}, - "valType": "boolean" - }, - "cmax": { - "description": "Sets the upper bound of the color domain. Has an effect only if in `marker.line.color` is set to a numerical array. Value should have the same units as in `marker.line.color` and if set, `marker.line.cmin` must be set as well.", - "dflt": null, - "editType": "plot", - "impliedEdits": { - "cauto": false - }, - "valType": "number" - }, - "cmid": { - "description": "Sets the mid-point of the color domain by scaling `marker.line.cmin` and/or `marker.line.cmax` to be equidistant to this point. Has an effect only if in `marker.line.color` is set to a numerical array. Value should have the same units as in `marker.line.color`. Has no effect when `marker.line.cauto` is `false`.", - "dflt": null, - "editType": "calc", - "impliedEdits": {}, - "valType": "number" - }, - "cmin": { - "description": "Sets the lower bound of the color domain. Has an effect only if in `marker.line.color` is set to a numerical array. Value should have the same units as in `marker.line.color` and if set, `marker.line.cmax` must be set as well.", - "dflt": null, - "editType": "plot", - "impliedEdits": { - "cauto": false - }, - "valType": "number" - }, - "color": { - "arrayOk": true, - "description": "Sets the marker.line color. It accepts either a specific color or an array of numbers that are mapped to the colorscale relative to the max and min values of the array or relative to `marker.line.cmin` and `marker.line.cmax` if set.", - "editType": "style", - "valType": "color" - }, - "coloraxis": { - "description": "Sets a reference to a shared color axis. References to these shared color axes are *coloraxis*, *coloraxis2*, *coloraxis3*, etc. Settings for these shared color axes are set in the layout, under `layout.coloraxis`, `layout.coloraxis2`, etc. Note that multiple color scales can be linked to the same color axis.", - "dflt": null, - "editType": "calc", - "regex": "/^coloraxis([2-9]|[1-9][0-9]+)?$/", - "valType": "subplotid" - }, - "colorscale": { - "description": "Sets the colorscale. Has an effect only if in `marker.line.color` is set to a numerical array. The colorscale must be an array containing arrays mapping a normalized value to an rgb, rgba, hex, hsl, hsv, or named color string. At minimum, a mapping for the lowest (0) and highest (1) values are required. For example, `[[0, 'rgb(0,0,255)'], [1, 'rgb(255,0,0)']]`. To control the bounds of the colorscale in color space, use `marker.line.cmin` and `marker.line.cmax`. Alternatively, `colorscale` may be a palette name string of the following list: Blackbody,Bluered,Blues,Cividis,Earth,Electric,Greens,Greys,Hot,Jet,Picnic,Portland,Rainbow,RdBu,Reds,Viridis,YlGnBu,YlOrRd.", - "dflt": null, - "editType": "calc", - "impliedEdits": { - "autocolorscale": false - }, - "valType": "colorscale" - }, - "colorsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `color`.", - "editType": "none", - "valType": "string" - }, - "editType": "calc", - "reversescale": { - "description": "Reverses the color mapping if true. Has an effect only if in `marker.line.color` is set to a numerical array. If true, `marker.line.cmin` will correspond to the last color in the array and `marker.line.cmax` will correspond to the first color.", - "dflt": false, - "editType": "plot", - "valType": "boolean" - }, - "role": "object", - "width": { - "arrayOk": true, - "description": "Sets the width (in px) of the lines bounding the marker points.", - "editType": "style", - "min": 0, - "valType": "number" - }, - "widthsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `width`.", - "editType": "none", - "valType": "string" - } - }, - "maxdisplayed": { - "description": "Sets a maximum number of points to be drawn on the graph. *0* corresponds to no limit.", - "dflt": 0, - "editType": "plot", - "min": 0, - "valType": "number" - }, - "opacity": { - "arrayOk": true, - "description": "Sets the marker opacity.", - "editType": "style", - "max": 1, - "min": 0, - "valType": "number" - }, - "opacitysrc": { - "description": "Sets the source reference on Chart Studio Cloud for `opacity`.", - "editType": "none", - "valType": "string" - }, - "reversescale": { - "description": "Reverses the color mapping if true. Has an effect only if in `marker.color` is set to a numerical array. If true, `marker.cmin` will correspond to the last color in the array and `marker.cmax` will correspond to the first color.", - "dflt": false, - "editType": "plot", - "valType": "boolean" - }, - "role": "object", - "showscale": { - "description": "Determines whether or not a colorbar is displayed for this trace. Has an effect only if in `marker.color` is set to a numerical array.", - "dflt": false, - "editType": "calc", - "valType": "boolean" - }, - "size": { - "arrayOk": true, - "description": "Sets the marker size (in px).", - "dflt": 6, - "editType": "calc", - "min": 0, - "valType": "number" - }, - "sizemin": { - "description": "Has an effect only if `marker.size` is set to a numerical array. Sets the minimum size (in px) of the rendered marker points.", - "dflt": 0, - "editType": "calc", - "min": 0, - "valType": "number" - }, - "sizemode": { - "description": "Has an effect only if `marker.size` is set to a numerical array. Sets the rule for which the data in `size` is converted to pixels.", - "dflt": "diameter", - "editType": "calc", - "valType": "enumerated", - "values": [ - "diameter", - "area" - ] - }, - "sizeref": { - "description": "Has an effect only if `marker.size` is set to a numerical array. Sets the scale factor used to determine the rendered size of marker points. Use with `sizemin` and `sizemode`.", - "dflt": 1, - "editType": "calc", - "valType": "number" - }, - "sizesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `size`.", - "editType": "none", - "valType": "string" - }, - "standoff": { - "arrayOk": true, - "description": "Moves the marker away from the data point in the direction of `angle` (in px). This can be useful for example if you have another marker at this location and you want to point an arrowhead marker at it.", - "dflt": 0, - "editType": "plot", - "min": 0, - "valType": "number" - }, - "standoffsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `standoff`.", - "editType": "none", - "valType": "string" - }, - "symbol": { - "arrayOk": true, - "description": "Sets the marker symbol type. Adding 100 is equivalent to appending *-open* to a symbol name. Adding 200 is equivalent to appending *-dot* to a symbol name. Adding 300 is equivalent to appending *-open-dot* or *dot-open* to a symbol name.", - "dflt": "circle", - "editType": "style", - "valType": "enumerated", - "values": [ - 0, - "0", - "circle", - 100, - "100", - "circle-open", - 200, - "200", - "circle-dot", - 300, - "300", - "circle-open-dot", - 1, - "1", - "square", - 101, - "101", - "square-open", - 201, - "201", - "square-dot", - 301, - "301", - "square-open-dot", - 2, - "2", - "diamond", - 102, - "102", - "diamond-open", - 202, - "202", - "diamond-dot", - 302, - "302", - "diamond-open-dot", - 3, - "3", - "cross", - 103, - "103", - "cross-open", - 203, - "203", - "cross-dot", - 303, - "303", - "cross-open-dot", - 4, - "4", - "x", - 104, - "104", - "x-open", - 204, - "204", - "x-dot", - 304, - "304", - "x-open-dot", - 5, - "5", - "triangle-up", - 105, - "105", - "triangle-up-open", - 205, - "205", - "triangle-up-dot", - 305, - "305", - "triangle-up-open-dot", - 6, - "6", - "triangle-down", - 106, - "106", - "triangle-down-open", - 206, - "206", - "triangle-down-dot", - 306, - "306", - "triangle-down-open-dot", - 7, - "7", - "triangle-left", - 107, - "107", - "triangle-left-open", - 207, - "207", - "triangle-left-dot", - 307, - "307", - "triangle-left-open-dot", - 8, - "8", - "triangle-right", - 108, - "108", - "triangle-right-open", - 208, - "208", - "triangle-right-dot", - 308, - "308", - "triangle-right-open-dot", - 9, - "9", - "triangle-ne", - 109, - "109", - "triangle-ne-open", - 209, - "209", - "triangle-ne-dot", - 309, - "309", - "triangle-ne-open-dot", - 10, - "10", - "triangle-se", - 110, - "110", - "triangle-se-open", - 210, - "210", - "triangle-se-dot", - 310, - "310", - "triangle-se-open-dot", - 11, - "11", - "triangle-sw", - 111, - "111", - "triangle-sw-open", - 211, - "211", - "triangle-sw-dot", - 311, - "311", - "triangle-sw-open-dot", - 12, - "12", - "triangle-nw", - 112, - "112", - "triangle-nw-open", - 212, - "212", - "triangle-nw-dot", - 312, - "312", - "triangle-nw-open-dot", - 13, - "13", - "pentagon", - 113, - "113", - "pentagon-open", - 213, - "213", - "pentagon-dot", - 313, - "313", - "pentagon-open-dot", - 14, - "14", - "hexagon", - 114, - "114", - "hexagon-open", - 214, - "214", - "hexagon-dot", - 314, - "314", - "hexagon-open-dot", - 15, - "15", - "hexagon2", - 115, - "115", - "hexagon2-open", - 215, - "215", - "hexagon2-dot", - 315, - "315", - "hexagon2-open-dot", - 16, - "16", - "octagon", - 116, - "116", - "octagon-open", - 216, - "216", - "octagon-dot", - 316, - "316", - "octagon-open-dot", - 17, - "17", - "star", - 117, - "117", - "star-open", - 217, - "217", - "star-dot", - 317, - "317", - "star-open-dot", - 18, - "18", - "hexagram", - 118, - "118", - "hexagram-open", - 218, - "218", - "hexagram-dot", - 318, - "318", - "hexagram-open-dot", - 19, - "19", - "star-triangle-up", - 119, - "119", - "star-triangle-up-open", - 219, - "219", - "star-triangle-up-dot", - 319, - "319", - "star-triangle-up-open-dot", - 20, - "20", - "star-triangle-down", - 120, - "120", - "star-triangle-down-open", - 220, - "220", - "star-triangle-down-dot", - 320, - "320", - "star-triangle-down-open-dot", - 21, - "21", - "star-square", - 121, - "121", - "star-square-open", - 221, - "221", - "star-square-dot", - 321, - "321", - "star-square-open-dot", - 22, - "22", - "star-diamond", - 122, - "122", - "star-diamond-open", - 222, - "222", - "star-diamond-dot", - 322, - "322", - "star-diamond-open-dot", - 23, - "23", - "diamond-tall", - 123, - "123", - "diamond-tall-open", - 223, - "223", - "diamond-tall-dot", - 323, - "323", - "diamond-tall-open-dot", - 24, - "24", - "diamond-wide", - 124, - "124", - "diamond-wide-open", - 224, - "224", - "diamond-wide-dot", - 324, - "324", - "diamond-wide-open-dot", - 25, - "25", - "hourglass", - 125, - "125", - "hourglass-open", - 26, - "26", - "bowtie", - 126, - "126", - "bowtie-open", - 27, - "27", - "circle-cross", - 127, - "127", - "circle-cross-open", - 28, - "28", - "circle-x", - 128, - "128", - "circle-x-open", - 29, - "29", - "square-cross", - 129, - "129", - "square-cross-open", - 30, - "30", - "square-x", - 130, - "130", - "square-x-open", - 31, - "31", - "diamond-cross", - 131, - "131", - "diamond-cross-open", - 32, - "32", - "diamond-x", - 132, - "132", - "diamond-x-open", - 33, - "33", - "cross-thin", - 133, - "133", - "cross-thin-open", - 34, - "34", - "x-thin", - 134, - "134", - "x-thin-open", - 35, - "35", - "asterisk", - 135, - "135", - "asterisk-open", - 36, - "36", - "hash", - 136, - "136", - "hash-open", - 236, - "236", - "hash-dot", - 336, - "336", - "hash-open-dot", - 37, - "37", - "y-up", - 137, - "137", - "y-up-open", - 38, - "38", - "y-down", - 138, - "138", - "y-down-open", - 39, - "39", - "y-left", - 139, - "139", - "y-left-open", - 40, - "40", - "y-right", - 140, - "140", - "y-right-open", - 41, - "41", - "line-ew", - 141, - "141", - "line-ew-open", - 42, - "42", - "line-ns", - 142, - "142", - "line-ns-open", - 43, - "43", - "line-ne", - 143, - "143", - "line-ne-open", - 44, - "44", - "line-nw", - 144, - "144", - "line-nw-open", - 45, - "45", - "arrow-up", - 145, - "145", - "arrow-up-open", - 46, - "46", - "arrow-down", - 146, - "146", - "arrow-down-open", - 47, - "47", - "arrow-left", - 147, - "147", - "arrow-left-open", - 48, - "48", - "arrow-right", - 148, - "148", - "arrow-right-open", - 49, - "49", - "arrow-bar-up", - 149, - "149", - "arrow-bar-up-open", - 50, - "50", - "arrow-bar-down", - 150, - "150", - "arrow-bar-down-open", - 51, - "51", - "arrow-bar-left", - 151, - "151", - "arrow-bar-left-open", - 52, - "52", - "arrow-bar-right", - 152, - "152", - "arrow-bar-right-open", - 53, - "53", - "arrow", - 153, - "153", - "arrow-open", - 54, - "54", - "arrow-wide", - 154, - "154", - "arrow-wide-open" - ] - }, - "symbolsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `symbol`.", - "editType": "none", - "valType": "string" - } - }, - "meta": { - "arrayOk": true, - "description": "Assigns extra meta information associated with this trace that can be used in various text attributes. Attributes such as trace `name`, graph, axis and colorbar `title.text`, annotation `text` `rangeselector`, `updatemenues` and `sliders` `label` text all support `meta`. To access the trace `meta` values in an attribute in the same trace, simply use `%{meta[i]}` where `i` is the index or key of the `meta` item in question. To access trace `meta` in layout attributes, use `%{data[n[.meta[i]}` where `i` is the index or key of the `meta` and `n` is the trace index.", - "editType": "plot", - "valType": "any" - }, - "metasrc": { - "description": "Sets the source reference on Chart Studio Cloud for `meta`.", - "editType": "none", - "valType": "string" - }, - "mode": { - "description": "Determines the drawing mode for this scatter trace. If the provided `mode` includes *text* then the `text` elements appear at the coordinates. Otherwise, the `text` elements appear on hover. If there are less than 20 points and the trace is not stacked then the default is *lines+markers*. Otherwise, *lines*.", - "dflt": "markers", - "editType": "calc", - "extras": [ - "none" - ], - "flags": [ - "lines", - "markers", - "text" - ], - "valType": "flaglist" - }, - "name": { - "description": "Sets the trace name. The trace name appears as the legend item and on hover.", - "editType": "style", - "valType": "string" - }, - "opacity": { - "description": "Sets the opacity of the trace.", - "dflt": 1, - "editType": "style", - "max": 1, - "min": 0, - "valType": "number" - }, - "selected": { - "editType": "style", - "marker": { - "color": { - "description": "Sets the marker color of selected points.", - "editType": "style", - "valType": "color" - }, - "editType": "style", - "opacity": { - "description": "Sets the marker opacity of selected points.", - "editType": "style", - "max": 1, - "min": 0, - "valType": "number" - }, - "role": "object", - "size": { - "description": "Sets the marker size of selected points.", - "editType": "style", - "min": 0, - "valType": "number" - } - }, - "role": "object", - "textfont": { - "color": { - "description": "Sets the text font color of selected points.", - "editType": "style", - "valType": "color" - }, - "editType": "style", - "role": "object" - } - }, - "selectedpoints": { - "description": "Array containing integer indices of selected points. Has an effect only for traces that support selections. Note that an empty array means an empty selection where the `unselected` are turned on for all points, whereas, any other non-array values means no selection all where the `selected` and `unselected` styles have no effect.", - "editType": "calc", - "valType": "any" - }, - "showlegend": { - "description": "Determines whether or not an item corresponding to this trace is shown in the legend.", - "dflt": true, - "editType": "style", - "valType": "boolean" - }, - "stream": { - "editType": "calc", - "maxpoints": { - "description": "Sets the maximum number of points to keep on the plots from an incoming stream. If `maxpoints` is set to *50*, only the newest 50 points will be displayed on the plot.", - "dflt": 500, - "editType": "calc", - "max": 10000, - "min": 0, - "valType": "number" - }, - "role": "object", - "token": { - "description": "The stream id number links a data trace on a plot with a stream. See https://chart-studio.plotly.com/settings for more details.", - "editType": "calc", - "noBlank": true, - "strict": true, - "valType": "string" - } - }, - "subplot": { - "description": "Sets a reference between this trace's data coordinates and a ternary subplot. If *ternary* (the default value), the data refer to `layout.ternary`. If *ternary2*, the data refer to `layout.ternary2`, and so on.", - "dflt": "ternary", - "editType": "calc", - "valType": "subplotid" - }, - "sum": { - "description": "The number each triplet should sum to, if only two of `a`, `b`, and `c` are provided. This overrides `ternary.sum` to normalize this specific trace, but does not affect the values displayed on the axes. 0 (or missing) means to use ternary.sum", - "dflt": 0, - "editType": "calc", - "min": 0, - "valType": "number" - }, - "text": { - "arrayOk": true, - "description": "Sets text elements associated with each (a,b,c) point. If a single string, the same string appears over all the data points. If an array of strings, the items are mapped in order to the the data points in (a,b,c). If trace `hoverinfo` contains a *text* flag and *hovertext* is not set, these elements will be seen in the hover labels.", - "dflt": "", - "editType": "calc", - "valType": "string" - }, - "textfont": { - "color": { - "arrayOk": true, - "editType": "style", - "valType": "color" - }, - "colorsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `color`.", - "editType": "none", - "valType": "string" - }, - "description": "Sets the text font.", - "editType": "calc", - "family": { - "arrayOk": true, - "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", - "editType": "calc", - "noBlank": true, - "strict": true, - "valType": "string" - }, - "familysrc": { - "description": "Sets the source reference on Chart Studio Cloud for `family`.", - "editType": "none", - "valType": "string" - }, - "lineposition": { - "arrayOk": true, - "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", - "dflt": "none", - "editType": "calc", - "extras": [ - "none" - ], - "flags": [ - "under", - "over", - "through" - ], - "valType": "flaglist" - }, - "linepositionsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `lineposition`.", - "editType": "none", - "valType": "string" - }, - "role": "object", - "shadow": { - "arrayOk": true, - "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", - "dflt": "none", - "editType": "calc", - "valType": "string" - }, - "shadowsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `shadow`.", - "editType": "none", - "valType": "string" - }, - "size": { - "arrayOk": true, - "editType": "calc", - "min": 1, - "valType": "number" - }, - "sizesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `size`.", - "editType": "none", - "valType": "string" - }, - "style": { - "arrayOk": true, - "description": "Sets whether a font should be styled with a normal or italic face from its family.", - "dflt": "normal", - "editType": "calc", - "valType": "enumerated", - "values": [ - "normal", - "italic" - ] - }, - "stylesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `style`.", - "editType": "none", - "valType": "string" - }, - "textcase": { - "arrayOk": true, - "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", - "dflt": "normal", - "editType": "calc", - "valType": "enumerated", - "values": [ - "normal", - "word caps", - "upper", - "lower" - ] - }, - "textcasesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `textcase`.", - "editType": "none", - "valType": "string" - }, - "variant": { - "arrayOk": true, - "description": "Sets the variant of the font.", - "dflt": "normal", - "editType": "calc", - "valType": "enumerated", - "values": [ - "normal", - "small-caps", - "all-small-caps", - "all-petite-caps", - "petite-caps", - "unicase" - ] - }, - "variantsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `variant`.", - "editType": "none", - "valType": "string" - }, - "weight": { - "arrayOk": true, - "description": "Sets the weight (or boldness) of the font.", - "dflt": "normal", - "editType": "calc", - "extras": [ - "normal", - "bold" - ], - "max": 1000, - "min": 1, - "valType": "integer" - }, - "weightsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `weight`.", - "editType": "none", - "valType": "string" - } - }, - "textposition": { - "arrayOk": true, - "description": "Sets the positions of the `text` elements with respects to the (x,y) coordinates.", - "dflt": "middle center", - "editType": "calc", - "valType": "enumerated", - "values": [ - "top left", - "top center", - "top right", - "middle left", - "middle center", - "middle right", - "bottom left", - "bottom center", - "bottom right" - ] - }, - "textpositionsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `textposition`.", - "editType": "none", - "valType": "string" - }, - "textsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `text`.", - "editType": "none", - "valType": "string" - }, - "texttemplate": { - "arrayOk": true, - "description": "Template string used for rendering the information text that appears on points. Note that this will override `textinfo`. Variables are inserted using %{variable}, for example \"y: %{y}\". Numbers are formatted using d3-format's syntax %{variable:d3-format}, for example \"Price: %{y:$.2f}\". https://github.com/d3/d3-format/tree/v1.4.5#d3-format for details on the formatting syntax. Dates are formatted using d3-time-format's syntax %{variable|d3-time-format}, for example \"Day: %{2019-01-01|%A}\". https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format for details on the date formatting syntax. Variables that can't be found will be replaced with the specifier. For example, a template of \"data: %{x}, %{y}\" will result in a value of \"data: 1, %{y}\" if x is 1 and y is missing. Variables with an undefined value will be replaced with the fallback value. All attributes that can be specified per-point (the ones that are `arrayOk: true`) are available. Finally, the template string has access to variables `a`, `b`, `c` and `text`.", - "dflt": "", - "editType": "plot", - "valType": "string" - }, - "texttemplatefallback": { - "description": "Fallback string that's displayed when a variable referenced in a template is missing. If the boolean value 'false' is passed in, the specifier with the missing variable will be displayed.", - "dflt": "-", - "editType": "plot", - "valType": "any" - }, - "texttemplatesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `texttemplate`.", - "editType": "none", - "valType": "string" - }, - "type": "scatterternary", - "uid": { - "description": "Assign an id to this trace, Use this to provide object constancy between traces during animations and transitions.", - "editType": "plot", - "valType": "string" - }, - "uirevision": { - "description": "Controls persistence of some user-driven changes to the trace: `constraintrange` in `parcoords` traces, as well as some `editable: true` modifications such as `name` and `colorbar.title`. Defaults to `layout.uirevision`. Note that other user-driven trace attribute changes are controlled by `layout` attributes: `trace.visible` is controlled by `layout.legend.uirevision`, `selectedpoints` is controlled by `layout.selectionrevision`, and `colorbar.(x|y)` (accessible with `config: {editable: true}`) is controlled by `layout.editrevision`. Trace changes are tracked by `uid`, which only falls back on trace index if no `uid` is provided. So if your app can add/remove traces before the end of the `data` array, such that the same trace has a different index, you can still preserve user-driven changes if you give each trace a `uid` that stays with it as it moves.", - "editType": "none", - "valType": "any" - }, - "unselected": { - "editType": "style", - "marker": { - "color": { - "description": "Sets the marker color of unselected points, applied only when a selection exists.", - "editType": "style", - "valType": "color" - }, - "editType": "style", - "opacity": { - "description": "Sets the marker opacity of unselected points, applied only when a selection exists.", - "editType": "style", - "max": 1, - "min": 0, - "valType": "number" - }, - "role": "object", - "size": { - "description": "Sets the marker size of unselected points, applied only when a selection exists.", - "editType": "style", - "min": 0, - "valType": "number" - } - }, - "role": "object", - "textfont": { - "color": { - "description": "Sets the text font color of unselected points, applied only when a selection exists.", - "editType": "style", - "valType": "color" - }, - "editType": "style", - "role": "object" - } - }, - "visible": { - "description": "Determines whether or not this trace is visible. If *legendonly*, the trace is not drawn, but can appear as a legend item (provided that the legend itself is visible).", - "dflt": true, - "editType": "calc", - "valType": "enumerated", - "values": [ - true, - false, - "legendonly" - ] - } - }, - "categories": [ - "ternary", - "symbols", - "showLegend", - "scatter-like" - ], - "meta": { - "description": "Provides similar functionality to the *scatter* type but on a ternary phase diagram. The data is provided by at least two arrays out of `a`, `b`, `c` triplets.", - "hrName": "scatter_ternary" - }, - "type": "scatterternary" - }, - "splom": { - "animatable": false, - "attributes": { - "customdata": { - "description": "Assigns extra data each datum. This may be useful when listening to hover, click and selection events. Note that, *scatter* traces also appends customdata items in the markers DOM elements", - "editType": "calc", - "valType": "data_array" - }, - "customdatasrc": { - "description": "Sets the source reference on Chart Studio Cloud for `customdata`.", - "editType": "none", - "valType": "string" - }, - "diagonal": { - "editType": "calc", - "role": "object", - "visible": { - "description": "Determines whether or not subplots on the diagonal are displayed.", - "dflt": true, - "editType": "calc", - "valType": "boolean" - } - }, - "dimensions": { - "items": { - "dimension": { - "axis": { - "editType": "calc+clearAxisTypes", - "matches": { - "description": "Determines whether or not the x & y axes generated by this dimension match. Equivalent to setting the `matches` axis attribute in the layout with the correct axis id.", - "dflt": false, - "editType": "calc", - "valType": "boolean" + "tickformatstops": { + "items": { + "tickformatstop": { + "dtickrange": { + "description": "range [*min*, *max*], where *min*, *max* - dtick values which describe some zoom level, it is possible to omit *min* or *max* value by passing *null*", + "editType": "ticks", + "items": [ + { + "editType": "ticks", + "valType": "any" + }, + { + "editType": "ticks", + "valType": "any" + } + ], + "valType": "info_array" + }, + "editType": "ticks", + "enabled": { + "description": "Determines whether or not this stop is used. If `false`, this stop is ignored even within its `dtickrange`.", + "dflt": true, + "editType": "ticks", + "valType": "boolean" + }, + "name": { + "description": "When used in a template, named items are created in the output figure in addition to any items the figure already has in this array. You can modify these items in the output figure by making your own item with `templateitemname` matching this `name` alongside your modifications (including `visible: false` or `enabled: false` to hide it). Has no effect outside of a template.", + "editType": "none", + "valType": "string" + }, + "role": "object", + "templateitemname": { + "description": "Used to refer to a named item in this array in the template. Named items from the template will be created even without a matching item in the input figure, but you can modify one by making an item with `templateitemname` matching its `name`, alongside your modifications (including `visible: false` or `enabled: false` to hide it). If there is no template or no matching item, this item will be hidden unless you explicitly show it with `visible: true`.", + "editType": "calc", + "valType": "string" + }, + "value": { + "description": "string - dtickformat for described zoom level, the same as *tickformat*", + "dflt": "", + "editType": "ticks", + "valType": "string" + } + } + }, + "role": "object" + }, + "ticklabelindex": { + "arrayOk": true, + "description": "Only for axes with `type` *date* or *linear*. Instead of drawing the major tick label, draw the label for the minor tick that is n positions away from the major tick. E.g. to always draw the label for the minor tick before each major tick, choose `ticklabelindex` -1. This is useful for date axes with `ticklabelmode` *period* if you want to label the period that ends with each major tick instead of the period that begins there.", + "editType": "calc", + "valType": "integer" + }, + "ticklabelindexsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `ticklabelindex`.", + "editType": "none", + "valType": "string" + }, + "ticklabelmode": { + "description": "Determines where tick labels are drawn with respect to their corresponding ticks and grid lines. Only has an effect for axes of `type` *date* When set to *period*, tick labels are drawn in the middle of the period between ticks.", + "dflt": "instant", + "editType": "ticks", + "valType": "enumerated", + "values": [ + "instant", + "period" + ] + }, + "ticklabeloverflow": { + "description": "Determines how we handle tick labels that would overflow either the graph div or the domain of the axis. The default value for inside tick labels is *hide past domain*. Otherwise on *category* and *multicategory* axes the default is *allow*. In other cases the default is *hide past div*.", + "editType": "calc", + "valType": "enumerated", + "values": [ + "allow", + "hide past div", + "hide past domain" + ] + }, + "ticklabelposition": { + "description": "Determines where tick labels are drawn with respect to the axis. Please note that top or bottom has no effect on x axes or when `ticklabelmode` is set to *period* or when `tickson` is set to *boundaries*. Similarly, left or right has no effect on y axes or when `ticklabelmode` is set to *period* or when `tickson` is set to *boundaries*. Has no effect on *multicategory* axes. When used on axes linked by `matches` or `scaleanchor`, no extra padding for inside labels would be added by autorange, so that the scales could match.", + "dflt": "outside", + "editType": "calc", + "valType": "enumerated", + "values": [ + "outside", + "inside", + "outside top", + "inside top", + "outside left", + "inside left", + "outside right", + "inside right", + "outside bottom", + "inside bottom" + ] + }, + "ticklabelshift": { + "description": "Shifts the tick labels by the specified number of pixels in parallel to the axis. Positive values move the labels in the positive direction of the axis.", + "dflt": 0, + "editType": "ticks", + "valType": "integer" + }, + "ticklabelstandoff": { + "description": "Sets the standoff distance (in px) between the axis tick labels and their default position. A positive `ticklabelstandoff` moves the labels farther away from the plot area if `ticklabelposition` is *outside*, and deeper into the plot area if `ticklabelposition` is *inside*. A negative `ticklabelstandoff` works in the opposite direction, moving outside ticks towards the plot area and inside ticks towards the outside. If the negative value is large enough, inside ticks can even end up outside and vice versa.", + "dflt": 0, + "editType": "ticks", + "valType": "integer" + }, + "ticklabelstep": { + "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", + "dflt": 1, + "editType": "ticks", + "min": 1, + "valType": "integer" + }, + "ticklen": { + "description": "Sets the tick length (in px).", + "dflt": 5, + "editType": "ticks", + "min": 0, + "valType": "number" + }, + "tickmode": { + "description": "Sets the tick mode for this axis. If *auto*, the number of ticks is set via `nticks`. If *linear*, the placement of the ticks is determined by a starting position `tick0` and a tick step `dtick` (*linear* is the default value if `tick0` and `dtick` are provided). If *array*, the placement of the ticks is set via `tickvals` and the tick text is `ticktext`. (*array* is the default value if `tickvals` is provided). If *sync*, the number of ticks will sync with the overlayed axis set by `overlaying` property.", + "editType": "ticks", + "impliedEdits": {}, + "valType": "enumerated", + "values": [ + "auto", + "linear", + "array", + "sync" + ] + }, + "tickprefix": { + "description": "Sets a tick label prefix.", + "dflt": "", + "editType": "ticks", + "valType": "string" + }, + "ticks": { + "description": "Determines whether ticks are drawn or not. If **, this axis' ticks are not drawn. If *outside* (*inside*), this axis' are drawn outside (inside) the axis lines.", + "editType": "ticks", + "valType": "enumerated", + "values": [ + "outside", + "inside", + "" + ] + }, + "tickson": { + "description": "Determines where ticks and grid lines are drawn with respect to their corresponding tick labels. Only has an effect for axes of `type` *category* or *multicategory*. When set to *boundaries*, ticks and grid lines are drawn half a category to the left/bottom of labels.", + "dflt": "labels", + "editType": "ticks", + "valType": "enumerated", + "values": [ + "labels", + "boundaries" + ] + }, + "ticksuffix": { + "description": "Sets a tick label suffix.", + "dflt": "", + "editType": "ticks", + "valType": "string" + }, + "ticktext": { + "description": "Sets the text displayed at the ticks position via `tickvals`. Only has an effect if `tickmode` is set to *array*. Used with `tickvals`.", + "editType": "ticks", + "valType": "data_array" + }, + "ticktextsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `ticktext`.", + "editType": "none", + "valType": "string" + }, + "tickvals": { + "description": "Sets the values at which ticks on this axis appear. Only has an effect if `tickmode` is set to *array*. Used with `ticktext`.", + "editType": "ticks", + "valType": "data_array" + }, + "tickvalssrc": { + "description": "Sets the source reference on Chart Studio Cloud for `tickvals`.", + "editType": "none", + "valType": "string" + }, + "tickwidth": { + "description": "Sets the tick width (in px).", + "dflt": 1, + "editType": "ticks", + "min": 0, + "valType": "number" + }, + "title": { + "editType": "ticks", + "font": { + "color": { + "editType": "ticks", + "valType": "color" + }, + "description": "Sets this axis' title font.", + "editType": "ticks", + "family": { + "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", + "editType": "ticks", + "noBlank": true, + "strict": true, + "valType": "string" + }, + "lineposition": { + "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", + "dflt": "none", + "editType": "ticks", + "extras": [ + "none" + ], + "flags": [ + "under", + "over", + "through" + ], + "valType": "flaglist" + }, + "role": "object", + "shadow": { + "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", + "dflt": "none", + "editType": "ticks", + "valType": "string" + }, + "size": { + "editType": "ticks", + "min": 1, + "valType": "number" + }, + "style": { + "description": "Sets whether a font should be styled with a normal or italic face from its family.", + "dflt": "normal", + "editType": "ticks", + "valType": "enumerated", + "values": [ + "normal", + "italic" + ] + }, + "textcase": { + "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", + "dflt": "normal", + "editType": "ticks", + "valType": "enumerated", + "values": [ + "normal", + "word caps", + "upper", + "lower" + ] + }, + "variant": { + "description": "Sets the variant of the font.", + "dflt": "normal", + "editType": "ticks", + "valType": "enumerated", + "values": [ + "normal", + "small-caps", + "all-small-caps", + "all-petite-caps", + "petite-caps", + "unicase" + ] + }, + "weight": { + "description": "Sets the weight (or boldness) of the font.", + "dflt": "normal", + "editType": "ticks", + "extras": [ + "normal", + "bold" + ], + "max": 1000, + "min": 1, + "valType": "integer" + } + }, + "role": "object", + "standoff": { + "description": "Sets the standoff distance (in px) between the axis labels and the title text The default value is a function of the axis tick labels, the title `font.size` and the axis `linewidth`. Note that the axis title position is always constrained within the margins, so the actual standoff distance is always less than the set or default value. By setting `standoff` and turning on `automargin`, plotly.js will push the margins to fit the axis title at given standoff distance.", + "editType": "ticks", + "min": 0, + "valType": "number" + }, + "text": { + "description": "Sets the title of this axis.", + "editType": "ticks", + "valType": "string" + } }, - "role": "object", ->>>>>>> 776a4535b (Name plot type quiver not scatterquiver) "type": { "_noTemplating": true, "description": "Sets the axis type. By default, plotly attempts to determined the axis type by looking into the data of the traces that referenced the axis in question.", From a1c40a6031947d451c64f546c9e326860eb80115 Mon Sep 17 00:00:00 2001 From: John Degner Date: Thu, 18 Dec 2025 13:31:29 -0800 Subject: [PATCH 15/46] Improve code readability --- src/traces/quiver/attributes.js | 6 ++ src/traces/quiver/defaults.js | 67 +++++++++--------- src/traces/quiver/format_labels.js | 15 ++-- src/traces/quiver/hover.js | 2 +- src/traces/quiver/index.js | 4 +- src/traces/quiver/plot.js | 16 ++--- src/traces/quiver/select_points.js | 22 +++--- src/traces/quiver/style.js | 33 ++++++--- test/image/baselines/quiver_anchor.png | Bin 26453 -> 25935 bytes test/image/baselines/quiver_arrow-styling.png | Bin 22306 -> 21942 bytes test/image/baselines/quiver_categorical.png | Bin 14784 -> 14650 bytes test/image/baselines/quiver_colorscale.png | Bin 17292 -> 17103 bytes .../baselines/quiver_custom-colorscale.png | Bin 21053 -> 21113 bytes test/image/baselines/quiver_simple.png | Bin 13934 -> 14093 bytes test/image/baselines/quiver_sizemode.png | Bin 28492 -> 28936 bytes test/image/baselines/quiver_wind.png | Bin 32997 -> 31990 bytes test/image/baselines/quiver_zero-vectors.png | Bin 14882 -> 14785 bytes test/plot-schema.json | 24 +++++++ 18 files changed, 118 insertions(+), 71 deletions(-) diff --git a/src/traces/quiver/attributes.js b/src/traces/quiver/attributes.js index 966344561ca..a237d9044f7 100644 --- a/src/traces/quiver/attributes.js +++ b/src/traces/quiver/attributes.js @@ -3,6 +3,7 @@ var baseAttrs = require('../../plots/attributes'); var hovertemplateAttrs = require('../../plots/template_attributes').hovertemplateAttrs; var fontAttrs = require('../../plots/font_attributes'); +var axisHoverFormat = require('../../plots/cartesian/axis_format_attributes').axisHoverFormat; var dash = require('../../components/drawing/attributes').dash; var extendFlat = require('../../lib/extend').extendFlat; @@ -81,6 +82,11 @@ var attrs = { description: 'Maximum distance (in pixels) to look for nearby arrows on hover.' }, + xhoverformat: axisHoverFormat('x'), + yhoverformat: axisHoverFormat('y'), + uhoverformat: axisHoverFormat('u', 'noDate'), + vhoverformat: axisHoverFormat('v', 'noDate'), + // Arrowhead sizing, consistent with annotations API naming arrowsize: { valType: 'number', diff --git a/src/traces/quiver/defaults.js b/src/traces/quiver/defaults.js index e7e5c0e86fd..9ba70a09d46 100644 --- a/src/traces/quiver/defaults.js +++ b/src/traces/quiver/defaults.js @@ -2,12 +2,9 @@ var Lib = require('../../lib'); var attributes = require('./attributes'); -var Colorscale = require('../../components/colorscale'); -var colorscaleDefaults = Colorscale.handleDefaults; -var hasColorscale = Colorscale.hasColorscale; +var colorscaleDefaults = require('../../components/colorscale/defaults'); module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout) { - // Selection styling - use coerce to set proper defaults function coerce(attr, dflt) { return Lib.coerce(traceIn, traceOut, attributes, attr, dflt); } @@ -17,7 +14,7 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout var y = coerce('y'); var u = coerce('u'); var v = coerce('v'); - + // Optional scalar field for colorscale coerce('c'); @@ -40,46 +37,48 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout for(var j = 0; j < len; j++) traceOut.v[j] = 0; } - // Set basic properties - traceOut.type = 'quiver'; - // Sizing API similar to cone var sizemode = coerce('sizemode'); coerce('sizeref', sizemode === 'raw' ? 1 : 0.5); coerce('anchor'); - // Set default values using coerce - coerce('arrowsize', 1); - // back-compat - coerce('arrow_scale'); - coerce('hoverdistance', 20); + // Arrow styling + coerce('arrowsize'); + coerce('arrow_scale'); // back-compat alias + coerce('arrowwidth'); + coerce('hoverdistance'); + + // Line styling - use coerce for proper validation + coerce('line.color', defaultColor); + // If arrowwidth is set, use it as line.width default + var arrowwidth = traceOut.arrowwidth; + if(arrowwidth !== undefined) { + coerce('line.width', arrowwidth); + } else { + coerce('line.width'); + } + coerce('line.dash'); + coerce('line.shape'); + coerce('line.smoothing'); + coerce('line.simplify'); - // Line styling - traceOut.line = { - color: traceIn.line && traceIn.line.color ? traceIn.line.color : defaultColor, - width: (traceIn.arrowwidth !== undefined) ? traceIn.arrowwidth : (traceIn.line && traceIn.line.width ? traceIn.line.width : 1), - dash: traceIn.line && traceIn.line.dash ? traceIn.line.dash : 'solid', - shape: traceIn.line && traceIn.line.shape ? traceIn.line.shape : 'linear', - smoothing: traceIn.line && traceIn.line.smoothing ? traceIn.line.smoothing : 1, - simplify: traceIn.line && traceIn.line.simplify !== undefined ? traceIn.line.simplify : true - }; + // Text + coerce('text'); + coerce('textposition'); + Lib.coerceFont(coerce, 'textfont', layout.font); - // Hover and interaction - let the plots module handle hoverinfo defaults - // traceOut.hoverinfo will be set by Lib.coerceHoverinfo in plots.js - traceOut.hovertemplate = traceIn.hovertemplate; + // Hover + coerce('hovertemplate'); + coerce('xhoverformat'); + coerce('yhoverformat'); + coerce('uhoverformat'); + coerce('vhoverformat'); // Colorscale defaults (adds colorscale, showscale, colorbar, etc.) - // Keep colorscale enabled by default for quiver - traceOut._hasColorscale = hasColorscale(traceIn) || true; + traceOut._hasColorscale = true; colorscaleDefaults(traceIn, traceOut, layout, coerce, { prefix: '', cLetter: 'c' }); - // Text - traceOut.text = traceIn.text; - traceOut.textposition = traceIn.textposition || 'middle center'; - - // Use Lib.coerceFont to set textfont properly - Lib.coerceFont(coerce, 'textfont', layout.font); - + // Selection styling coerce('selected.line.color'); coerce('selected.line.width'); coerce('selected.textfont.color'); diff --git a/src/traces/quiver/format_labels.js b/src/traces/quiver/format_labels.js index 8b56f67c2bf..6ed314702ef 100644 --- a/src/traces/quiver/format_labels.js +++ b/src/traces/quiver/format_labels.js @@ -1,12 +1,14 @@ 'use strict'; var Axes = require('../../plots/cartesian/axes'); +var Lib = require('../../lib'); module.exports = function formatLabels(cdi, trace, fullLayout) { var labels = {}; - var xa = Axes.getFromId({ _fullLayout: fullLayout }, trace.xaxis || 'x'); - var ya = Axes.getFromId({ _fullLayout: fullLayout }, trace.yaxis || 'y'); + var mockGd = {_fullLayout: fullLayout}; + var xa = Axes.getFromTrace(mockGd, trace, 'x'); + var ya = Axes.getFromTrace(mockGd, trace, 'y'); var x = cdi.x; var y = cdi.y; @@ -17,9 +19,12 @@ module.exports = function formatLabels(cdi, trace, fullLayout) { var u = trace.u ? trace.u[cdi.i] : 0; var v = trace.v ? trace.v[cdi.i] : 0; - // Format u and v as plain numbers - labels.uLabel = String(u); - labels.vLabel = String(v); + // Format u and v using hoverformat if provided + var uhoverformat = trace.uhoverformat; + var vhoverformat = trace.vhoverformat; + + labels.uLabel = uhoverformat ? Lib.numberFormat(uhoverformat)(u) : String(u); + labels.vLabel = vhoverformat ? Lib.numberFormat(vhoverformat)(v) : String(v); return labels; }; diff --git a/src/traces/quiver/hover.js b/src/traces/quiver/hover.js index 41c7735f145..97eaea35aae 100644 --- a/src/traces/quiver/hover.js +++ b/src/traces/quiver/hover.js @@ -15,7 +15,7 @@ module.exports = function hoverPoints(pointData, xval, yval, hovermode) { var distfn = function(di) { var x = xa.c2p(di.x) - xpx; var y = ya.c2p(di.y) - ypx; - return Math.max(Math.sqrt(x * x + y * y), 1 - 3 / Math.max(3, di.mrc || 0)); + return Math.sqrt(x * x + y * y); }; Fx.getClosest(cd, distfn, pointData); diff --git a/src/traces/quiver/index.js b/src/traces/quiver/index.js index 4237fcf810a..942ef83fd9b 100644 --- a/src/traces/quiver/index.js +++ b/src/traces/quiver/index.js @@ -12,8 +12,8 @@ module.exports = { supplyDefaults: require('./defaults'), calc: require('./calc'), plot: require('./plot'), - style: require('./style'), - styleOnSelect: require('../scatter/style').styleOnSelect, + style: require('./style').style, + styleOnSelect: require('./style').styleOnSelect, hoverPoints: require('./hover'), formatLabels: require('./format_labels'), eventData: require('./event_data'), diff --git a/src/traces/quiver/plot.js b/src/traces/quiver/plot.js index ee03ad0334c..a571e2ef409 100644 --- a/src/traces/quiver/plot.js +++ b/src/traces/quiver/plot.js @@ -2,7 +2,6 @@ var d3 = require('@plotly/d3'); -var Registry = require('../../registry'); var Lib = require('../../lib'); var Drawing = require('../../components/drawing'); var Colorscale = require('../../components/colorscale'); @@ -61,7 +60,6 @@ function plotOne(gd, idx, plotinfo, cdscatter, cdscatterAll, element, transition var trace = cdscatter[0].trace; var xa = plotinfo.xaxis; var ya = plotinfo.yaxis; - var fullLayout = gd._fullLayout; // Create line group for arrows var lines = d3.select(element).selectAll('g.lines') @@ -86,11 +84,11 @@ function plotOne(gd, idx, plotinfo, cdscatter, cdscatterAll, element, transition var uArr = trace.u || []; var vArr = trace.v || []; var maxNorm = 0; - for (var ni = 0; ni < trace._length; ni++) { + for(var ni = 0; ni < trace._length; ni++) { var uu = uArr[ni] || 0; var vv = vArr[ni] || 0; var nrm = Math.sqrt(uu * uu + vv * vv); - if (nrm > maxNorm) maxNorm = nrm; + if(nrm > maxNorm) maxNorm = nrm; } var sizemode = trace.sizemode || 'scaled'; var sizeref = (trace.sizeref !== undefined) ? trace.sizeref : (sizemode === 'raw' ? 1 : 0.5); @@ -127,7 +125,7 @@ function plotOne(gd, idx, plotinfo, cdscatter, cdscatterAll, element, transition var unitx = norm ? (u / norm) : 0; var unity = norm ? (v / norm) : 0; var baseLen; - if (sizemode === 'scaled') { + if(sizemode === 'scaled') { var n = maxNorm ? (norm / maxNorm) : 0; baseLen = n * sizeref; } else { @@ -146,12 +144,12 @@ function plotOne(gd, idx, plotinfo, cdscatter, cdscatterAll, element, transition var ang2 = barbAng - headAngle; var x0, y0, x1, y1; - if (anchor === 'tip') { + if(anchor === 'tip') { x1 = cdi.x; y1 = cdi.y; x0 = x1 - dx; y0 = y1 - dy; - } else if (anchor === 'cm' || anchor === 'center' || anchor === 'middle') { + } else if(anchor === 'cm' || anchor === 'center' || anchor === 'middle') { x0 = cdi.x - dx / 2; y0 = cdi.y - dy / 2; x1 = cdi.x + dx / 2; @@ -186,12 +184,12 @@ function plotOne(gd, idx, plotinfo, cdscatter, cdscatterAll, element, transition Drawing.lineGroupStyle(lineSegments, trace.line && trace.line.width, trace.line && trace.line.color, trace.line && trace.line.dash); // If colorscale present, color arrows by magnitude |(u,v)| - if (trace._hasColorscale) { + if(trace._hasColorscale) { var colorFunc = Colorscale.makeColorScaleFuncFromTrace(trace); lineSegments.style('stroke', function(cdi) { var cArr = trace.c; var value; - if (Lib.isArrayOrTypedArray(cArr) && cArr.length > cdi.i && isFinite(cArr[cdi.i])) { + if(Lib.isArrayOrTypedArray(cArr) && cArr.length > cdi.i && isFinite(cArr[cdi.i])) { value = cArr[cdi.i]; } else { var uVal = (trace.u && trace.u[cdi.i]) || 0; diff --git a/src/traces/quiver/select_points.js b/src/traces/quiver/select_points.js index e169b1b9517..66f26e444bf 100644 --- a/src/traces/quiver/select_points.js +++ b/src/traces/quiver/select_points.js @@ -5,9 +5,8 @@ module.exports = function selectPoints(searchInfo, selectionTester) { var xa = searchInfo.xaxis; var ya = searchInfo.yaxis; var selection = []; - var trace = cd[0].trace; var i; - var segment; + var di; var x; var y; @@ -17,20 +16,19 @@ module.exports = function selectPoints(searchInfo, selectionTester) { } } else { for(i = 0; i < cd.length; i++) { - segment = cd[i]; - // Use the start point of the arrow for selection testing - x = xa.c2p(segment[0].x); - y = ya.c2p(segment[0].y); + di = cd[i]; + x = xa.c2p(di.x); + y = ya.c2p(di.y); - if((segment[0].i !== null) && selectionTester.contains([x, y], false, i, searchInfo)) { + if((di.i !== null) && selectionTester.contains([x, y], false, i, searchInfo)) { selection.push({ - pointNumber: segment[0].i, - x: xa.c2d(segment[0].x), - y: ya.c2d(segment[0].y) + pointNumber: di.i, + x: xa.c2d(di.x), + y: ya.c2d(di.y) }); - segment.selected = 1; + di.selected = 1; } else { - segment.selected = 0; + di.selected = 0; } } } diff --git a/src/traces/quiver/style.js b/src/traces/quiver/style.js index deb72e21718..3e910b6d091 100644 --- a/src/traces/quiver/style.js +++ b/src/traces/quiver/style.js @@ -3,14 +3,31 @@ var d3 = require('@plotly/d3'); var Drawing = require('../../components/drawing'); -var Lib = require('../../lib'); -module.exports = function style(gd, calcTrace) { - if(!calcTrace || !calcTrace.length || !calcTrace[0]) return; - - var trace = calcTrace[0].trace; - var s = d3.select(gd).selectAll('g.trace' + trace.uid); +function style(gd) { + var s = d3.select(gd).selectAll('g.trace.quiver'); - s.selectAll('path.js-line') - .call(Drawing.lineGroupStyle, trace.line || {}); + s.each(function(d) { + var trace = d[0].trace; + var line = trace.line || {}; + + d3.select(this).selectAll('path.js-line') + .call(Drawing.lineGroupStyle, line.width, line.color, line.dash); + }); +} + +function styleOnSelect(gd, cd, sel) { + var trace = cd[0].trace; + var line = trace.line || {}; + + if(!sel) return; + + // Style the line paths based on selection state + sel.selectAll('path.js-line') + .call(Drawing.lineGroupStyle, line.width, line.color, line.dash); +} + +module.exports = { + style: style, + styleOnSelect: styleOnSelect }; diff --git a/test/image/baselines/quiver_anchor.png b/test/image/baselines/quiver_anchor.png index 463f0fb85dfaf6f6b16f0edc8dba648db3e7567d..688e05bc59d4e4e2a947db59296c86df37ae7bd4 100644 GIT binary patch literal 25935 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 R0xwEo@O1TaS?83{1OSJv?4|$! literal 26453 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 diff --git a/test/image/baselines/quiver_arrow-styling.png b/test/image/baselines/quiver_arrow-styling.png index d6fe39cceb5344f9f2e41d921f097468789f2f3e..26c92dfce802be0e96450cd95f0f002f6bd54341 100644 GIT binary patch literal 21942 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 Zm8i?i<3oO|;7%lk<_*2;rE2${{12gCmKOj3 literal 14784 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 ip$qxHRE;65GjPcBqrc8yiey= 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 literal 17292 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 literal 21053 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 diff --git a/test/image/baselines/quiver_simple.png b/test/image/baselines/quiver_simple.png index fb0a7e451f9db87f045c4e133b48f50821218847..af35ecc0b8f0fc8ebc9a852249e54b91f0308040 100644 GIT binary patch literal 14093 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 diff --git a/test/image/baselines/quiver_sizemode.png b/test/image/baselines/quiver_sizemode.png index b914c5129b97027134f23a773feb0ec0072e9bed..1fa4d32c2ddef57a471e8f61d853ea98d2ef907d 100644 GIT binary patch literal 28936 zcmeFZbyU>r`!4K^AR$VLhzblXEulyaqjU(;A)(TOAkC0tGK37>Atfo@sZv9CNo|o% z8M@Cid++b>yZ1TYwa$9iI`6yA?_K*3mI%Z1spoUw*L~gBb^AY3mA^!Ko%GzfbC(nq zWHip5I}bZ|4iZ9q0sKUVjX?O^IoLTxnfqGq#;b`WqYsA;znDZYQEDj4vMEmVKT)W@ zbUhubRo#_w-~UlWE>?n#vK{>EFKiTfJe1)`VvU%$)3~06CZjv;sZm|n`teiT({~}y zWf6tshB^wf~e z+YQ8MKgElq<^-&;!jK`#kdWUbtly(Xm9IdbVafs(h|w39`-1&Z?lC3=O^xYPiP8A?7i2Az)>_rxwQq z+ogJk8Z}*Grh?AA_9!)FhB3_3g2P)wYJyM%1Xqj2pj1=|99;`224VY(FAK zCpN)guJ>vJUZX}?F#o=F>jIP^6Ljh<{sa^utlv}yq?ur@RBuqDKUTR&!6TFS^RX%5 zvNlGGq~DX#F(><;RxMg;y(6Vb_uN}&|FSw(V!plDha0zVXj7M`XH$b8q#vIiZS)tI zNa>e7kF*+pf9Xb?xvoL+MeKZ6e3t_)uK_Fg>oCuaI$c%qHDOKrwlFq9t6tbxv3a0Y zo}PNS{WKq~u{)D;VOaEV=RGPY)rkZP%+)dIKb_XuUc*^rwq~YMG@nuDec$~bM4XzR zf)3oq%U^u3jo>$#Qc&=xVl!LlPL$)y(fQ1EIR4x4WBbS=)7H3#4n7zcqu)(O^n}mR znw*Z9>*_7jmY~o#H4|^mtp;4=Oqp6$?7ua^$9wNqOpO{PX%Iy?JaOR zZ356|ekHlLz;nj^>shy@o$id7+&Fl|bnj=7Q1RvC<=lenB-TSYLy$L;nHLfcP_6d#LR5LV2t#&s>-;b#l60~LOj7p_C8`YRQ}J6t;n}Sc=0NBfAgpLWVMUqLZVyym}N3Ai+pfI<7IJ` zI1&4L`NBIk!!gx1Bl(eD2e`JG=D;qVwl8+JI?uiC!y3EE>LLQ}D$cH;G$vSIj}X{%t^ezuOMhR@=hvU{s0V(OS9`QxgWKwn z>X6)h%O}B*h7(&makUcbMj2U{nryZxR?8I zved6H=Pme2Fh3qXGw6X$Rv9Ft8s5!b>zoVL{xs)z-$c{F`65< zJ9Eem12;?1&B~edplrmrgJy7|%Bd?cKH9`bUn!C+(&j`<8-dV}y(<~K5|3KMP)?$9 zl!dqDWlAi%W^;1$#bBM5Nk}>P;UY`P@VNPXgkis$w=DrHGRXIEiNnd8mfzUWIcg?Y zd_Cl8!8(RZfg@gy_V6s#iN(SDhZN%!SG`gleja%GMv_l##!_63zK@B#p`= zoXOGMu8W(O#TH=);3?0cS%PoVH_SynRuP|!sP{T>EFqFm-^hwH`3*Pgf*T37^*xX?-zX-lf6<0)t!`93pF81X9B8Yq6l&c$7-4VDs^> zERBqSDuGXK@T1)|?p8)$uiz^?>~VH-LoPpw(UY&rpEh3LG$_rwa_i9-yC?E}6d|*( zOe$Zdgp!@CYd!6~acO5|L~V78`Za^n&?S)%{QrECv+CRiIR zXr24O-+R7X796*^>BuhCPCVm*1qw=&@7&^b~NJ?|r=v$W5+megufI#EG@<8~jh0hgJ#q`7a zwVxkX#5rWBv9;sZXe|k3v*fG4D8!VR-y>j3C^Is+bc4f%TD7*+cC6nkWJNC7y)U|I zF^tmteX)=A1}}_@9jwOrv^ju=jsa#?50(P8Ubvs;S&!Ddkd9XG5a zidRT;e6uyId1K1L*FTV5D|s~yb0_d|gHNH&hgGhoa#5Rr9-8^XK@p?aPBx7%3UVDmn6Q%D5#1`!iJ`*kR@U zx)x{2qbZvV%8=U;Tf-M1Z8sXUDuy`(mb?5`M*^l`noNCT)!)l(EG6@Wrf3ORhxFSH z_H7@yH6~{DF@^L&XKb#=LN@O>`R|Rl(uFkj@OeKkCgApV3=K%yuO#56xoLYdoQ~o~ z#ANf63r+M#S#oj!8}j_0!iGiCMvO(09@|!Q_g+5fhc2Igvi-xu&@AbCMbGdN za4VSo#GwG%|LNfkb%94q`}6Vk>C%3eajPXg*O~fgBVCvJo1NvROEUUX&+JC>6URhS z`!_+M6Hu>pw3L|~1@1KmE6n%oXu1m?O2e&V)`eQ+=F&0)*@R?3*IO;AzIf)lO~FG_ zG6Gi4YikSykfM%pS#T#WyMQlCU3GxqXDR!gTQbZ$t60b!$D(ed&8y z?&3~{&H+VSUDiE!q#EO z`#&-I{8YoSv}+?D@4pFyo`)!s%GD47xQ273yaXwdriT+9_mKV`S_? zVs>vTf7zh99zgrT&{QGXH$>#!q*+q?YGO;Q*1aEJ@#qyIS}=_KE5o0uBgqok`VPMv zo0whaPZV?>4QZ5(v^k~QY6ptX9>uP9CSH<7(^!&^m4J~ zCC%lNynu`7bx7ZwUfJ`ZFi->={E65pyYBz^_AbMHbEX)%Wx;Zx@%<&C8$Dpt`T+c4 z^l7J0o-sBgO`rpTWkMACiFPUp>B z^rP2#mxgkqZ~7i@ek$N%t=?dz126Rj*^X8Og6F&&#brp*`Tz7R)pe1J!=K~xjOz>l z^kn;RLnO+2;FCECcD60N%Q5raMOu8R-P!q`udM$}w{5iEy9P-W3C~vAbF+#CAs+cE z1+Klan1;DK^HDIB?a0*KWmnc*E?Q%$m{&5GZ$JYiJmo~~gY}w?pe(Bz01*e#L3{^X zdW9b++<$)105CB93jz`Lx^MkH1w~D*kqoG+AAwTgf4aHv`$P{trByTZRTEmRdIy`QbZv3<{J!@<~RPz40y0##J(nEUK~dl|E&=hY}mmfg3zT_VhL?f+g;2BMEUqOumrNc1{hYt{c~!=R~YF$wQra90Mr ziSkFGTVx=M75|MHu#7`(uT&U$>~O&v&XVlOpBYu7omZ|>J-aS~=SVoh3Cy}$?)0Co z?c(}%`Pa_xhl|5Qm(6p>&)aiSL7$O0UwC&Pa2I#~njUvlC_{8jXqHCR&F0#@@6&si zVsUfKemAN9YgK9jvyNTf{zB<}Z9zO@V$Jnh)T^`1$x=8ELq zeWZMqkF&w<;LgRDp>G1P0Y^I6K0k&RjxbJUdQW_V`W*B|EmCS6~ z+VVv!o7r*TA+w|h+IFJyhE7);b4hB2q2vky;GAgX&=%@6A!E~BQ99v|+iLG@kwwmH z$8{7nVB+>3fbT7DEzTb^uCq^?OaoN$tXtlA!+=9O!k{$NA9KF54-(OJx z$O~pR<$&!a7RT?_%+W^dxT6hb8t(Nl^NwdFFsFHRg14)JJHziJ7Uy#i!RhHgxrRhv zZQ4a9xDHwi=AGV-E%S&vaN^Cp=@YpPTJ^}Oa-q01Y?m&b&h;{3Wq^~*WA=^i`F{rN`X_=r9F}xUn_?^ zYYu43Qcp7j$h^PUT)FCSIrl@%6&}4u-%G7cPir4n*g0g zFJQ=e7bot>ASQ|`Xy`!N6(a>Tf~)r3?P-JMVH)HzXW|n2MBfn3SFJF;RrK(>@GYym z2`ep5lPHF{u;&o0;0E`hV8 z28(*zsroTzQ{54x(4&|flZN`xAk$r^=w|?j;0{*`lrapFcs%3?@{v-N<6OFFYp~;b z)k6DIKYDghDu>w=)al3t-{fo#q}>aqgw7bX%lwU?J>r4o>b54??#u)hg-adGj&=|f z?60tOdUmunobfsi>(|WY7T^>MjEf|h)%mk2LTI>U#GKJ2e(Pmz*$EEsvFVD;t&EH= z-)ee#EFpb+?u&3tkMHqBLT@C83Fn)YOHtIyNmi#)N1cA{ey85e9NcjY@xCKo**c#L zW~mcNA;=e-HiE0+PX+gms)~J94!y7Gh^7W0OO6M0;q;>QT(EEswJ5IxSE(zrYZcQ` z=fil{INgMaLPtVdL^VkL%Czb#FrN|tD|U5ywnZKp0i=#hgp;qj2A&1 z8vgq=--5;8ZQgasvR#Ce*KKBOY*wC~PEzbfVcNo7)(WwSZUHylCinm)*~9VlT~qXK zmj)9|Y$f#M-G`x^=H0#o7oF8<^(jrKk8h7|!MJ^mtaqJM4xfjKmIY*RwQK6a*<94J z;$3n)JLJa=US#|TyfpVY!(K7)Ij`BacG|$Hn1URUCKIf2fh=0bzCv(PJZDi|V{0@{ zV`bF9LPzneX7OuLhN3zT7mVxXrl9ApEfPFYvo9!!h2n6Yeo1GS1x*Nl!?A|3kLO{^ z+P|~_2j-j_>1biAUId=J1UIA3&~4JC`1ueQ3p4yG;GXlC{>nY?Jw!N9KV9gq*{GfN z@l=shiiQ_@9Uo*Wyd!0nI^)58yEs0}cy{YrSd0n&@|B+KzYG=Xxst8j!OxJr`dJN% zJ1U>fINDyvjdr$@g;Bjz#-`CqaP1A%+LOzOwzUpMYR>gLM7O69F>-Yn@P`XFx2IFt ze7`A91I6vwn*^?J-P>9entMydk=|AHeGxkaO})`;2?(OMrht&`udp}i>)}7~J*luW zklO$4O;<5*;w3!H^4jVWaRguSZ2JG{s$>B?)044xT=JAGUEJ#`e9D}eT)*JIAiSks zS%^JPjwZW#OCz&e6}eIOd0y3kJwl5_fxYmeM{qqccEBk)ijUD*AilM%RH7zh%*;4P zA=_|HntQQ7cdmga+IV3vjHt)6_xM`p+b~i{8-d-CcxxS@+17lQh3UcaP;Q1+wnl%Y zgK6yD7jcvnyw!WsfXZ@ zK`(CT-^yfg;DUamfxMES!dgM}i_QEcc1KN%?Iy*tAEmsO*zT3am(3e*wgLAa0(uYk z0d>UBrWA3zpjK+FbO48jdpQxXN{E{n0Is<@&+>SG69;(xb`Xf8SS%ztykEB_h&s)F zd~-SM`km(rphoNRt>J=SRItNs&W1C;_>N9+*05zngEw|aL78VAL^gZ|pVvPF1woWW zSDb&n0CFSDs;()OJu|B3_lpx-z(|@{cnL`xj9BqX^D#a{37ij0aA;H)j7GGOV!IQ? zyMA_Tm+cPa>WWCk!B4g|w}#v50#6I8_h$mE!lMP5n}ZNvwI5fsj+$x{aW`TGDf)JdousYu3ko&u6U7X zd{@RLk%$YQ;{dJ^_1vZd&7a(14oIKvVqS~BWg^?dIN?wb1|?Gnva>+gY*|u{@VXK* zF)RI}!j4za*=p5VZ=zSbSkt(&iGMMf3rP_bEal2HMjn-$X1BxZ8SGq!7wBJxHH;nb^<16luS_S06j> zJ0rC-lp=Shb%dDn1MHz; zXfGZERt>gt!%3dHem1?$*Qj)#bnjoU6e{eP&tE`m6)?b)>KkXH9@~Z9e{-P?bP}qj z&$Aiud#O>`EXAW(nHe`*HKEY(^jwHy2UrJ0A(dk ziIyX~s~Zs0WCmG}nBt!%w)8t>*nD|G>;0*&{>2>?5@r~Ph2a9GE!f|_zUgw>cDbP8 zWLx9BF=YgzqvdW|x@W8qN5f!&$)me=SE>Ml#C^9Jcl2W2V2i#Ifq}R4gFcYah07E5 zt=3D9qP%>2lcTeFe^AbY4F}%KgV6poc}SmxwSMKx%mk0;s|}4;00AA{FzM7INn~5^ zCP_n8clAXyzDxD^u-1~iy|+p_qp@_fs}KJ|4(47SUe5 zS+T$~2tadJWqUM#GLdD%9^Z0hd$N>o`?P2A)A0**$8AsO#4NKGeQm~uTy&?@P%P>6 zuYzbo_NIMJEP9f70k6`oqy%7R2I!(VwsU5#hTl42UKuG!jsR@gD!o6gw`ay04%Ff8 z0W{o#a)^jJpMCQ%)MBOMX8H4zr*Y3AeST7lHw=%qm%?2vb)E7|7Rv+q0StX!P?;JM zirMO!E;2cAKU#zK=jq?)RDTxDV^BJDEbiII_>*hpkLYjL{Fqarfs;8~ENLqCmRO50oSZY8M#VUed!3G*?#OG&}p zk)O3DYtezNg;kBkO=-JDWf?0-qq+WY{+&y-Cl68h=u>Ro(K%SYe!h>Y!83kf>hj6A z;p)RTzrfv4J!kVgw~&Cl%xmDsqPo%R3?aAbr$!@r(cHS-qR$zlp0E|Ka$PR=LWXMR zK0A^!SToK~YK~>oYrEli7))dId}p(@$TZ0<37duqFmzU*dZv;nrtSQ`-fd%wsFozu zs;+j2eRCMj^Hs@gEHY`+Qp$_nGU#4o!g29%$85UB*s#FqySHq5{+JKvhXylr&RbrN z_*z2L@&0oW9cHT|nIB{PD{FClnX`{AqzIboX85?&>Zt`~H~h$U>q;I-#qB7_`A)|W z@W!|QNwY_Qre7@ON0)&V7;Guz-QX@07Zle>E)`>=+-$U`wnT4q(wBT0mqMrF25CEe z?=;DkrdIlWy1ll{MmE1jb@pgO_9_n+=>=L=4R$V?4FRp4u|=j!r!Q$RX13;We{l0* zK3FEd)xI$jYIcP`>3PSG9!ROim+}g35dV#Z-ja^f_ge|wyFcxvqT-Ef6ytR4xK8+& zl36GSSSRlJS7>bZCXmHSvMNh#vtcIr7T>$iUivKZSqO0X(jFo@(XWqzpkSUTw4Nv( zbpI@PtL;t)#2<-Gy03h$SQqN@0M%z~rbQKKX8+ktxXNc}l`mkFnXjC`ohUXI&9m5l zEqbM8Kp#=u;Ro+h(yd@E=3QJ!mJPlKg{VWTZDpd{@gfssJt|Yh-@heKzesv0pPo82 zkiUB?rR4I*X-wPVXp(kKvdV8dG_@cvJP9o`ewoS50+ERi~;`G}~qKwFB0zm^rZD-7) zQLk_OrR{1HHtGOA%y_AF_!WL*32N1mgft9v#?-N28}XW_hV)w^T?nl7naebigZ+9O zHSaEnSk|LQKkE0ke}V^NU9J6TK;yhdd>%+8hQ9P(aO>- zSauk>>{}Eo{Lz$;IQ#WvFDe_&TpimBv&9`$QgZA=D)JD;NG~g6%8(|xihx#B?D^TY zF*OVSR^(i_(2PSL33B3gq#kWn%+40gmg;jq~&$x!Vlr<~~M(mC&F zAtAUb%@jQV)G#;6|GuUy!WIjTzXj{-I+?5q?2M;9^7Qts3XnfJWFpdje^;3nQp5xf zTK~qdIc>W2q%%m~b+b1^2VY60=n`gn!|>4V=ii{6hZr%M_W*&|y~%1{OBufzBPF%F zV3|lmjo~gJ6O9q9)&KJYuH?HWch8Op2&h4! z(y#q8@pI#a-JLrR@n<{P88MyN9J4GsliKQxaTm6FV%aHsC%^_$#K{N z(w;Vkyz#T}qAeLbrzUi<#QK| ze7M96I^n{0wwAW$23KgIGfHrL%Qag&8FPr$bV~XzE#aI!#KwWU+pSX59geIgRuHr{ z5W5OU#nQ&xpp~^>PS}*;Wfp)^iJ^G>yzI$+TQcp>)tc2V9sCdDM(H$TuQ!*YDkCr| z6d}oH`(w6zjBv}!iLH*|f;8o*NKF!ACdzq!G4{TyLBQZIS6u zsLCiz)#6*9$ATy$gk?Qq-dK1bTKN+efuaY zS>n!KHqYk0g;A&U0nxdmrcAIXgg6<{HNCP|M)co@ zr*gsg>#k5^WCLe}7>Y6gedvD-ShZr86&-@6Z*yjUeCQU8i@{rJnOm*L+k+gxZ@Cyi zJHQXfA_U+=N^1c7*9 ze2pn?40IJkF}FzY`wi1NzZU;+-lc_wk6|+fg?d|g%gPafe<{ur{I%Zk$RT7+oMi!d z=i5brO}*NCQQMkoG)w)m>Buc_A_$ZU_l>xZX9yamilZcisBbQAJ!KU7NlA+_XdM=u zanOI)u}cRbRzL^7W+zq{Y&i#|Dhpcogo7IFW~K(B{~_FqHpKTtIo(n%luh}WX`16) zjJu)d+G#5gfh~yj-^#uc;v7z%OeoWww&z!8-ZVi;;xF$-02Fii87lrwWN5!w(2xDM zST2bRq9}jxOB>PhA<)0IKck2>*%91^(@o4ocra?V`A_fh+tgrBbks@Re_kmH81{#)+`w@?l zIP+4Gh~f=2&(+8Pr|f1lV+vYs3EIXspB^Ckwc%b=A(ieyF(MDjZKt30-;|M<`3Z%z ztMERb}hgI3bgh`9OQ!2TJM z)=3KJ?pRb7&$V3*agHK4AuwCj3pK8jiQ>m({F)7yWkAZzzP~}Gw8Rie5%OE-w{nGY zRCOmz-2^=#6vBD_#Yu74DaB(aV?|qYnAqQ(Bp{{E(+c!))y!ZSiHf6pi zI(#R_o}F?CdLP=2?f3ZZnrBe$Ev6wY(5P9urw@n}KB3ZUywYn>L3GsA7#i+p*|~ZG z>Cl*5T zA^80f6AHvO;V@>{WOcKdG#jh&_PTePoV9$DKPt<%$?~q2u(K~{8`5f&I zA!!2E9%5=SL@_}V(Sd?41i3pF{ENQRn87;ml<1C zyW1X(QN$kZ9BHT@Jn~W0^T{9roh-6iGh#G9F4PX+L>JiHKU~qv=hi~|w|0qe@b3Y= zoZh@^`X3)rg{IE*ImxMk%-EZEWhqF0WUEH$Bw)u$`SCYj42m@8cmhN=Vyu`uRA?lh4ve*N7(mKp_ld%j|2i zqKrZX(3x(9*N760auSS7AHP`!yu!qiPtsS|jeOAUL7|iBwzJT)Q z_g!>RkrAL_6Q7~eb_KKl74)JzhK5;{6%)h z9cY+XxhJD2kkQ6_Rf3!~^9nUu^Inh_C}*FxNRucWw{A~$6l@cf@kuJpOdgrBlySi} zyBAm)UW~W+NH&|l=!H?9lw7$&z)JYY>7JP$WK$h(NP;`oZjd6ySCAf~*u?^CS7}O4XLCxM&vx=vB8$WTEzX81E8**9^~^Zck+HQIJm> z`pmWIepg;K0Y_cIvM^GBSl;}Kz|8)jm+|{1aCW(E)?K#lWXb?U&*r21vc8RTP+gVjy-lQjVn}0S6o)xrk0<>}ivWqk^;}cxqBBl56 z!IYWXdI`n=B-1vx20-VE!9s!w;*a*S@(2S68ZGaovM9*yy@d>$-VDWtlyJeMPFMw> zK3GlGRHf`|KBCj0q72Ex$`=#Pws8PFcCuIW)p4~5z@4M@Z90i^!dXAYXVHC4{>&Ij zc8xlZ!$JiYwLktu5FgH3gBS!Ir?8SuY51iSBpVQDMLRFE_UC9HddGaHpfGa$)GuHihLvYrvj}M^&{0xM zb)*it)g~`Uz{;_SXTQ5Na-FF#`%j9PU|YU1{M57$h0l15Duitk)|acf*-WF}RI{N_ zm2-?-hY&*6XSh&H2nh>AN^#hP94943WU#KW|A|4IfN9TVUC`s)87d+?GH++yGwa{C zB8r3f$9c`lBFb(3k=AFYo&l}W)S z^AL_>#%H1`uffc;;`e?5es+BJdf89EUyjux!A@)}SSYpznCO}%`hte{ zTpZU3woJPqQd228tlV%>&mB;^?ylVi>$(W$TZ}1$O`4l%@|<)Mw36SchQ`wVuSUt% z)#=l#;lVZqG}(H6WA3hW?!Hhe*#lx0a8xx(8ftPQyblte*mjs*>1vPGxk$c{x_RiRYc2gJ;<+~ER2A%>n#Uv}S_oYEpG);UqbU2wAWJ@k!N9yhGT>0yF!EO_(tjoS=(`;Xq4?#?PCdNoJwFm zR&%p*1Adh3g8Xnz4iUvWURS%k)#JAJ(M&N^?gMy>%%kVZEc{v&p6dn-8|Ub_h)7oYp=1ow$-I8cP>yb2>`R+lDQJlL z_U@uGUe3+6mem;c@3jG+1iG~)#VJAz^#St7tRR%_HTXy=i}_4!k8Ee76ZCL0EH}Yh zvG5KG%o48zdO?p0?;x0P9(Y)6)<(57R+1@kv|6H(^(ckFfTKYv3bi=i>5`dNU+`eM zm)^JS2~Ju}@>wwE$A>KUSKaKfC; z6iGq)d@yh(Z*t7C~n8Zo6YZGES0Cn&{V&ATFd&J_TjEbPr!T$ zP={GF!73*2J}~xJaviI!LZpL*q|GL)c?G@p?*oy?{bD<#RW;1LXBF)IP6*C@9{o0yt;X-%Y9WcNDDD_a%hA!9lL>>4-=WI;B7G176m#_{eJbW zn7Cj$*i&y{zMc&$+NeKLt#)2w?vW@tBDwmr&`AenKCgdcvK$Wdj2S zb1S6d?u>JOxW1;a74tG~6 zGEH~LXz9;$6w21WTQ*I%ImAKY8u>hl0#tsAT3+6t`Mw53XC`?l;Z=h8-q%91@03T5 z%lT&+XQ#SK#_msN=cIouLk}+Y|4R#iL2FKV>jv0PKA&Z2pP^(_Y4zGqIbM@G3)Q~! z9DDYBI6{i2&fkcTbx8T*9tR9aW6FGZT|k>=IM15%%>{ZoAMm1U!KS^L!;t5LsvTLYD)z z$8%{hDUW_*nZ;w3-8F<5?^m(j_}&2uqokVBJ@#!0#@k)wA&Z)Y{l~(Nt5d++F^AWZ zOx1Z>N@{(XL*86`xX5=DnKQa62?J^p1#NVxm|d#cSEXFlf!I=Zzzl^X0ndw}QWTGM zl;M(Qp|j#JXgG2B-7~1b|5CUo7YJsl(7#J%m9z-W4!4&q$Rpv}-9vl5Q=+m6!w-() z4tPPh5GN@#3{fs(H*xFaXfGO=v10T?fQ<(WY*>kijzO*a2#v-&iNS#FYrF7=JX)QG z!ss+NneqVFyjyOC4_s8goBO6z4S_;=K?V5q++$w+K{q=_5VFDoB7m__BVgp|FN9@AF-VNa~uD;jTZmc7@+@q>_#C2 zL==xcU?_HD@*Y>Ha%pA3$R)Q!Zu;#1I5Io_pHxI4|FSw;vYdxFyq_|7GEHCxguQ~U zt9pHmUijQM0i3~MQog6&?sY)D^Si15@8LJBa>RW(Pab2_t_@tNp%v64@{qAwWXbm0 z_{h0sAa4l%SZ+JU{N}=?u!8!-c0=Wb1gBu&wi9f%>Aq}DNzioFTEu~ZLS!QC<{eW) zybBtyvQv(~`vR}F1v-s_w#;N7F5r9_<(U52iir;7uh$C}TfTKL6UeWUsB4Ur1vZHV zGg}x;weaz!4sV6+CPq<%8%03y(GL79c0@eTXLd=8 z_V1vCr1wniguvN`yIM50>p}2^UhHPCc*SOawTn$jZH`8U(oxrGj&|-W-YAUs*^Ck2 zM{UZ`^g!27>|Ee zyTJ&W=sdVzc~ghnyK-XZ0c66v+^}iiv%1)wO5jD7^}W^|BOvXuyJ~H5)riL8_niY; zv5lhPsWJu#yhE7|JVW?F?Mi-4=k^X*bx-d!Wu?!)^2dd2P&WpfK4}f6$Nlz(Jg!Ey zy4xr)zq!n4o3D6^&1NVk5|8?pu3Mg{KL&asj!h$iA&0q{*0)n#;y_?@KG885?wt-S zL7qHky^Jgyz>Ng&xFQAYHFOg0g|QCcb;+Lq`tte9sizI|qpnL+bv1*zx@yk{v!05V zhPziA%6Hr+qMv20U;8MQznyULDvyq-Im_3mM;tPKjx`5i0yiFvdkF~`rxVU1 zNW9NZ_GF{qIxi1$=Em904BRR6aC6;AH8DFm+zAKzmbf~W&D0wgUeHc9<#ref%Kls6 z!v!R{YboYFF&AhkCdqP3-s64HCzC*NVCd9!M-Yjdl{}PkTQ@|W9xP-4-3oiOn&eJI z+X}Eo+Y|iD$9l4PUAVP;D=g3bP}=a!0ceq1G}&Ny6~8jddDz%e*~KJv9klXBY`FO1 z+Gb*~4%hG6-m(XC37EB6)a9iLw#7)}O{Zatl^Xxa#i~Z>U!Xa{pAEWM^OY6S4TWX- z#snb9RBTC<5Og3(HKriRQBNKw-0QQA8H$zVJ#-c|in{Zx2`zbV=}vmQ4S&t5;MT(7 zJ6B-ciZ5HwCsi)Q#~+a#!VpC<*( z<-lP1*m3_GY>>W{Ovkx)i-ySH$3}OvN-iII?*PF|{0%d(A#&*pMP+_}-KeesU94!@ zYao`higIC;1qxnSM(?Z**51s`MS3={)!ky8v(c&|%YKJb19=sbuJOp{QGr0@_t8$| zlNu2DZ5xSJvm5Q@FOsv+P#Gl^zWnjP33!3$ob}P&_qvm%rVZ5qF?Dz2qUd~#>FT$x ztC#RGU+K47B{78939+|ZzXx&>bvfQ|r zM%Xlx2dI7vzD=Jac9?&%zQ>RZqMw_wZT$m~R@z>^8|;S~{kY0^0Xl=f;h+m`arLh) z$OD0FAnns(F?ckQQmypMM8psHO~%1s{Ov0l(Mfd|{3 zd5Bj~92g#;l&z7mit1t_#UCp23o)9ela7WJ4B;@J0q**!KZnZ9f$=!u|20+ya@%1> z<^Vr=z;>*d7~R}q22fwI^#D7kacyODmYwtgEAWvOL|vvA!&0kBJS8ypl}H3qXrNav z@rL0|`dIv|BYq-!=a9!(W`Nk$?kkD^7LUR!O;bm(*_lbt?Sj_S5ZhaYV48_zE4`b- z+V`>#oi%*K=oPZ`yKrcjL4B^&ZinuudGh}s-UN58m zVdFBeTSOgfEwI3@766RTyh@Q`>~ml~R_TydYSs6x)VS!`JF=VidJRp+I`H1X%~r-} zpy7Rw4vPblr{|TQI@Ev1^_e67yGP)prwdSvmr8)M>^ej-8VK^0*);~p30UtK3LRvD z*&ARsf{+k{$HHA>1K=wFZps3!94%{%K#F7P&U*ckU7xl6i&iQg&*)2d;X#Z77Y(?; zNM-)ILE-807xBW@{W8wkPj*wKvZDA+>?}&^Pj(;U@qkQ074Uxek;F&bC05Y5{b}vK z7Xa}JC&75{IRNouLa9RjKyEKIq6tjyK|wbG@7nG7>aVqse<{ifbX-KIUep2j4w~gY zx24`Yljzh+fZ0iojh94X$hTI_zr7_%U2(LpUSf|0%6$fCs?GNo(QZ@7)(N%&&V7|z z_<>1M&o9z&MUZ6LbgQ>&0|))*$Z*D9Os*?af=4^q#~%qZ2erR?7=u8b~`a1-x3I-H8RQR z>ubUnZ^v2Qw{%)FYBAHdJw#|tfNJ?siM{&S=aMZhR?rmu94pxuf45v2l(Msbn=TW1 zxntTE(F+i~eglgwE$#HX@*V-|pRxvs%MrbQ73=2=1AnMcNy^H|PjfJy!XmADYHo;s z4NQ({ZgNHLO}cdnMypU#oKU7P`oyxr#PS2Ka6a?2iWOkcLI7)lnZ+d_?zcb8bu%ld zn!g?^fy6PKFbY`&9TeAtc1mZmjqwc;JKLzZEHk`)BFrC}n)e3OFUDasYQE?dDPWS7 zDgdIkL&*%!Yd!aVlD$!~FR%Oc?V{ZLPKn_E2EzCE*wc#e8+y?mMlmuT#TP+~K@H!> zsJiL0e8@IbYOP5pVwZ4*TZe}`8egS@*;$+&hdXbKRv6qS90VO_6*xo}IQ4!n(FfR_ zz3;uT`vcT#G0?brKTz9E1tR>t9MH&`$Lw5uC@VWsQp3gb)lqgzbs~%JYd;-%Vp+{% zY9N_HqJVm+Zi=fmfbjvfiIqHGi}6Jx0LzP$|3>o%l1M5xaw;`0q%Wk1*e`s(8#kgZu&AUE3HWE}^@0ap1;|r-~($;h%N-AJn^23n`ji ze@}gTW7=f9&ktzlg;uOPA~;QlQ&$8-K{ucSgaQoeUOn^Z+x2@8lDB7|tTh|VQn%O$ zn2ObA>YF3ENXsWY5(76<&D>b%j5W2Ock$N;Gl?=lz&%p%f&K{70iz$Tx0gyhiXf0_ z%~>xC;CIn_HR7%1VFZSNAn_B|#PpLH)g+){QPGHgv3DreOKe1kfe5*a=z=s99fgTd zw0nbh97ORrufKpD8s;OaXo2yf2{98abm93cNkan=e9hl9*8hx9{C_+`@gL;-|2^`R z5pPJKC-}<<@BRRwY|&ZzDD>A!tLVF+YxVtLZuKu8goWq;iEpVAQR1t=%x*@M0(oxI zoZG)x(yqwAu%tdc-OQWo>)*?i@dI%H@tIQ#=4JYeY!}W0t;O6sT4Rc?&0u=*Sul+! z8vLXKP;N^<#?sxQM}VypPwxPQ)@Tg?9Lm%6-d*YdU`4g2Ww<$c zqZ{#q2f7nP9eeK+;d2{)K+}8!XB%4~5QgB*kDy8KqLK1|5V@G*H~XuRT+J>-So}L+ zSvc_KKto`?1m@sy;T0ptni4QEhfdO?)C-spGyp+rJ)9S7=rW|;cIjK6VAwh6jQV$= z5#gm5a}ME1a{uP_Wd-98#tAli!DNaS$#KSY9*Rr-8RlT>fuMDN`mH33VbK#XPY?&d zoe~%&nGUE>LA!~22h(S#mi3Fb+SophsKyGK&wh%xqdI{Ml~}3)m9Aw580^}1DS}-d zKSn8CIhxOLIXg3sF+iO*1dJN<_b~=&Ru?}wsQV-$mm)ulYXs z3uh5mQ?wwB45;UmPo6tCi^@LU5Uagv3mIwD`n(q?hU*_69&Z8*2?lQe;T6SdBIGab zU?1qpK8+Cyg{k(K|642oAfHcV4qys`kF;ydDK78hfcQF$N&hKcl}1R4m~4vo?nqDR7Wz%%A)C|`tJ>IXWvMWE3qNP1OLQY7 zTZT+(lbZd~9=Gol{Umef;uy6iC9gm2fQ2H#%BbCUX|map8nW1gX&O7x({4}2P*W`L+dx=Fo70Fn01F=%0~?Ge8S8tsR_e;daLPGz^or-Imf`CGLd>5E&EGG0QL zI8n|IJ@Y-pVfE80c04lqd8M&It>5t;73&=$Q>(cNpblI*iSct%8;KEvmJQ{_d)PPL zZ=*LxD+f{_-^>HSxEXW*mf;>qLBxXwE{Ms>*?%Q+aq$-;djv=kcqYF0i#}0R-`<$( z=LF{A7TfRID_E(gJ(>0k`cybo!eJL3a+{2;jfw?!#c+vdr2<{C=o791Fe_sG!~= z+s%suKvUNfH^Um}R-FRoS8Tw=jC6-^iOL^55$+Gj`Zc&z5`&$|-uxOpMtyf-N3-N0 zK%HLFGqoMS<#RvqGjPjN#SBKXM5hwGfw;0HNnD8^JRA(%6vGo$>1nd?D`Y#G(JHXa zspOk4qkKAcyZf-sH=PqFuH#FNKZDA)Ecz|Jb1MdyHDf$H88UE`Sdpqc69yM>s^ip7 zHO~$pu1K%4a5V>#&IW2eCh_}EUwSKR@Do@+w2YU4bs+_5D=mHpaodBj-fsEJ41Dl?lYI0Y z9XVzeXQLo=oA6TnkU(j_IdE~`2!&fu27WgthzA&5 z+dZ0PzH4-(yt0b*uO>!IQ8n!y83$3&Mu4y6Si0-XW|3!(Rvar3LErJLVM7)~U;bEq zY4G<<-*P=c=1d19$4m(mGra>|sCq&U?;)(;|JbuWpc)RW zwJOd^94ybfwgnTVEd5X>iPWY#QFHg? zI)ghi^r4{x`rkVips`Z?Fe~sYE1dd|-6%q#En)KJUf+E`?gDWY3!wu0yzu958&-VZ z1!D3hgc=dT)0;oU4=!F5^jM(YWgq)7C`rYMfQ{9e(JA~NTzs@X7vzP}EkA}T(tm#} zH~RnOm8~*+n;G^g9_j=3%GA&G=1&@9#H4jO8o@+P z5Vbc9*4w~ZAGQ|HbkqAb2v=eB9XUYV4}A)W${K0BDCqSBhhqYC0?WReSLglTL4`x` z+Cr6|7EgfqE>AAIz5g#1LN^Tkkm9LV)m~}=I15k(QU(*w+>@IM@?!7(HtOPls(#~Y zydVl{8An-W^y0SEOlSJMM?xgBu(JbQW0#V>HMCAe8bMhQ2U!5Z zNlcAg04L@nn{s7jGTEi-wo70)jO{c5L#k9+g8X!bKF|dmz=QDOg%3 z03hB7{!A`@rmF%7zYkpVWah+G6|Vx!5G!Yvetjytsj3H~i0l=$r^Kp}-{Xza(( z$!x$IG>dtr??a%75Ta5v2ohSGE8R0b+G0vT^hh6 ztq>^%g1w4wC8i0P29J-0L(|<_si3(l7yIqHhH8KQ_abSAk*IsFuJ)z*!#N+0IEC`Ak--Zsf}v zwi(b9uWU-dD!B`=>QLKERrMPiSqc6?PwA@iu|ew9)@6=^8-t)dy{YO3{M6jEJ{FyO z2yU&D%0wuQy}1zC3iW$Wojd1_fR>{S+*Q?t&tN%jF+DztV|UhyD;!|C8S2tuO&hlS z8-l~w8Uza9o1KS8zdWfXF_QE^#-fYVrFdo@gjWe*sOt&;44nN%Bt~4Bw&j!nlY0rO z(ai{7VR3-x{W@2)?U!>+pw7t1r~6-v=ihv|G~h-?h~1Z91^U@N$;sn2C8{d+a;*+h zMm#fZ{{K)0uwq{;W;j<*68bP6oH z3Hwh+i9R&v>z`YIGWY}FjOc;<eC5#Nk3r#va z*^vd1I^2?Rei6Lz$Kg_XLvn zB)BQm#&s3mYWQTU$Z1f@`yWMZ--6=51A$1C@8G`2zQe!H06wBd1^>@(n`Bwp#i{)W zhcYKtqh;jHCO7ymEvD$ix_mI;+Q^$|gjQR7vtM`x9aglCFUPzZ;mR-&Y9bX)!$S%~GqUWPX zTos4LizJ8{y}7hVPQ-oPsy+5a*28^?-aX})zuXR&)I4!QteDnYT)p<}q?9 z__#RTp5@nbkYo+O%njIX9;Cvt;v~K-I57^RL-pxsL96 zfL^)ITApstnSXTm>~LS@PsEobx!*sUKP}ZR*C{xcXUd)H-__z*{C8Ses_WbrufU7W zmGY;#?3R3k?~U_^fcVO2PIjx<-MgoQOeXvB7)?9_RxW#Uad+g#+EJZ?$47&Or%O}k zdyLrN{IH;m(MGMWonsWGtWHbB$(fgqI6FFyJP0FhvI6H{)47hBn6E6`D~8@$19*`)~{dzpU^%tGm}i}y}_R8 zE)XCnXbNE24HngD3q{Q)_Yzav!VKEl+FlQQTu+v@O|)m0Y>eC(qbT9%d={qD83w&7 z<}(-EB{Nv(g$V5zgmUUlDI^JAi{|tFqi!LXUo(t@@px5ZQ+w6tR4R-E?O|Xv*EmzW)EqiHqO2bBC+~Tcdv9Q}3FYzL&rZt>QHWmv8&u zyC-Lq=vDP-c;^?E{?MkEUSC52UvFJqojMU`#dVkY;e*FWfiC8V>C;)x0e={Rz0Wk( zBKUUUG@Ry!tNl<-F6wgCOr_)Ap@4lKYa~lHp0O=`w)&(6ezL$DawoKrZmYjRj=UO`Irs6xr5ZBoPx;h*hyc?mppj?Zi*yzp@Q zW6IU^X=-}a_3jq`f;Q&jjz0_SB3A$4lN#1oqLxumG=;j<0=KHP&aw+zb?|~CiqZ2Y zLSUt>9$Vd29C~iAqv%YJq6jyNvzs3qgGTY9`K7QVE^ZX>13t7=YvJe}6hubUi%-Z C?&OmI literal 28492 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 X75!SQl}aelf{&-WH(9u0_p$#15aZD> diff --git a/test/image/baselines/quiver_wind.png b/test/image/baselines/quiver_wind.png index 3e799eb8a8b87092332e0fc1566b6cf6db7966e4..ab33273e57389216324429496246a574e1072e9b 100644 GIT binary patch literal 31990 zcmeFadpy(s|Nq~acu6`?Nh%!)l@KyIphzkqW|neD4l9S5!={5nC8RW zQ4TAonX$FxyxE*Kv$5YpulM`?dVLP>@8$Q$=a29AbLo%7b9+9XkH=%rJ)if-^?tkE zpAXKTGn0|pBDG}65}7lnPhDKHWElbcyDYg1Y`KllrYu>qeaV?q$1kCrSZUIgHm>Eh z63do-vAMYP!>PEOmsh3UO0*D$BA)6VvC7QeKf`wjdTaeKvZ3Tids*zWlqW%&O%@HF zY0o~cTQ7a-{K4bLrK?o8-xs@|O{0}7c(S$mh$TX3NbOV*>RiKoj9x=%1FkE0NVitd zg5=cj=^>w1EtNE0vTW_`B`dZsxnpboQi((}S8MV({?BboC0$mmb<$r3UjD~Bjq~>0 z=2nbO`uhI4*RRczn&`jwFn(#X-WUZ92-4I0tMR4bNsxaw0S@-{-RkXxf@;Ext$($= zgk+)ot0R9N>3ZjiwRBsU)44VO=-=XIX146V`ny!J?8Y)lM4pD`UWtEn4zzrm+a~d^ z&MsNupuIF4XOool^xonS|9qPdSkoGnuHsoddNqchrb zX$y`XoM$Nb`4m~d(QZRy;-0m)jcdTSX{_e%PsXTZFGk4bO=XCCMPekor~I3sz_F?= z7BY98=AMCOm9?LPUK@gVw7ot%==i*g$EzZvTai>(1>vY&ZO`y|jcd~K2O3*Bpn=e= zTBX3=TRL9d2Mwm0wb%)EPQ_!`S~_uI1`8c(O{1KyHi@7NOhXxST{jv;!)8V|*fbo@ zLZj-VNL0~tBaakRu%8(qheS#!hZd!UPJYf)61N&~$}$$Fa|bgi1yJ4n6w+Rsm(Eq( z!kFsdEfz@{<^6F+^zq96SW|mLUiUQ}*Do7{ZArvS+o37o+?hGIgjv9sdJ>kW!o`No zt0_J(7|Sm`9JId=v}ok2QVZ#+WLMA%i~aZ)G?H2Zb`X-_m?}fic^!;sHc|u+9?3p? z%=FPF=PEmgRGTe*p&k&2; zg#(&l9$-2>pXE%=$hjm69&ApI=}8Y;5b!=*VGausVY7A0CEwiQ#=48MyldxqR5rKm!dW9C z<1jzITX}&SMQx-mmDu|DOo(7mDCCG25W;#*jB~0_wFl2#%t&YG4ZXPL{^FMDo;vj0 z^ydX0o-waM%N-h5c{*@+7JNM2JEFE;g|L~-DCLU1>8PFkUu(m}US$DfL%!FuyNpjr z3?#FX8L8-IttPs>z_?-Qaorp>b?i&7=WLMR%{!|hu82=V)OtCXL6oweaEag+ve_@= z2UEegb)-=xu32LhJ$S6(q4gHgu6Yh5n`HmT=EJX#9NL% z*AIACGtZ-S;R6vgkKDA9U{qi2R2s*n>KXrxJMU?R=;L^;cpLP==1ZO}H9fPoDF$nyy=+!Dp+67aGDuQE8aD5vqHR zzj=hR`+`WYd3o*i%VpOueCiWU6gO=194o*%C7SyQp(ME0>s5DjOu!}HdSK9HEaLq= zS;%#Uc!AFbpJ}Vh2VDiFT32>ft%fhLs$0;QCY^8L6SvKf1@5CU^9%f1vX5}6c!5z! zoV#K0$! zSd>9g!JfRpL=V4;Dv5p*Cgz8c=U$7&xL)6AG#}4s$tj(+wLsNugGB6Q5NhXE#>3B7 zPS4qn9i`*u3G>|xWZl}Y+=UC6P;qFGc*^52B>R(*fhK`_LPzGKk=9UJpp$$?sahMu zc1$FakTiZ-FS(td9+|%UsZKLY&?MumVYVO+`>CSr zu~sulB5e5GrK_p$unh>JV2~Gs2vt$E@rw^E1~;PX$XLI@W{*v0rhDgizD5=d{wqSrw(ERB;c6DfGa{msE58z6VRPkss%R+DHGNFudo;Y}T zwn`#`LNz)tcb-y;6S;}wb($}lq4<&`{x z9fG=NRb2TIL}&wud`8w9quSrDOg4Tgw=~0ZB+Eskj3^jRZ1NgWcMZG!#q2D)qsZS+ zZ{nMtIG#uQlA9iULmt;3Yhe4@@eB%mq{D27TD_pLl;OjJjzjD^20lcPltY^k^Ex)? z5S$-FPgpAX8ZR~WXk6FW#8}|rO23`Xuw&tVSopo!L%_sFDIqUs)m0y?9v&c#UmWrl zoyhd}+cDYSxrJF!W`2@EL~FfLRn~5)8rqqmOg0OG%{e**g1dERI3-s;bRrsFrY!m{ zK|LKbGN`ZtR_*U`5jB-?P^0quT`&D8EatncWa2r$H%GFaS>45hvYPrTwT+)SYkoGw zNn$y5niUn`vK1N69+bq!JrTlI!jtRFY*Tx_#93cL!4}e@{Z#uLGtnCJtM|Tm47>T0 z^>A93*aiY-e{kB3blg3={pTGvatYjf82Unn|I{v>2j>J_LSFeYmZ~Y_;L1 zh&GcCW{~*`-tDE!rKAzow=j8h<;T9qr=jmPG>Hci<22-{p>y}*I)ctY?AlG}X5T`m zz8%YG{XR6R(x)MU7{2OxLAl}Qj)rRxAUj91?m_nUm~BFL(1t{bKEyC`b|SahD@jvf z=*f6i=RnX;5kY4_VJRjyXxqTDjM7^g5ZNk!KU0WrZ-*on$KSsbvW&xq$)o8d@Yg?O zOKh$VYI6mht?!4f2ro$~a6)^`{lY0j>cX60@?QItGmSKM)vySa3N zCV)^nD5*15Zy-`5vJL~O(fLi@BkEHk1o3R5(W9AOKeB6y-&yBuv1 zLE(?>WUD-f$X5GLRS_4?JE}9iTTgoG1-e5$V2;?gloC;B=p{z|7v&DcW2l>1$I!34 z%#M1l#>Q0$Bkmd<9aMP=xjLpYAn1Bl7Ni(v{7th=wAGP-hE$Mi=ZB2MRXry?AuHdT z38$jELO1l9v0%e!o0w1!!wk>yq4urJ895C6YKt9*TlF~``mG<#TGEZM%h+K_MEpWm zzU;A>9ZT+%n=fI)@=#R06<1d{ZVfGKiKsKX*hINK6BM;@FxDa~ZrHXbG`wY~c&_p0 zh+}VC#lqJVtC-5^HVegtQfXYAm!KD}yhFWDge+9ng#R$NzxsvpZRP@0`NPx{*RNSO zLzTH~lr;7v#pwND7&z18RPkO(wO;RYqh~k7YVRiqwqA#)y$pphFD4EQ_0LS|H4rn8 zd%S3R9$gJD>saTcU{ZT|@~tAIkEDEi>cVg)X^b6us;g?q`f%vmqwv)q%}5ryoTpYs z^Zxg^)!&83M%p}d1fpvSoIyzh#I<2;K;h=%*irCF@&(MTL{1igTx~3rJ{1~Ez@Cps z5J#h$ZW1?aS0NO0j%4omdJ(Mm5_ghs?Kpqi7$Vz&NEONw$btiXj&~g)u&wAX_ZZ9g zau+frMvZy|%TGhfKbX{;eBm>v)}d9yv2VVs#4H3V4@^fTigrsa?5dS6U>shc^NC3X zQp~IXB0|}4+C(^STSfjnZ7JuZT)?|g`1ZBN6XYixMy~Jd^eXWq)EbEFvD)raDCy8!-&QPJz0Mf5 z{(#i}<1e4x7N5s+E1xCC`34z?Q=8st77VC(LfktjKW4reCS`>R8DM?I`cPzF>gMY0 zXzG{=^MW~rZfG%s!j_>|=ZJR8Lf#E!H4+!F$_#{su<_c+SlC8p3tWeZdxze5XR>9W zuAV|EQt#VI8WT=beS$n3S~j?Bw5dQ4aVO5D@UtBKn7dJWQ%wfeB7s~mV<#&-vOdEa zdIkmCo>pb?T8q0$!C%bLa5f32z>V1KP=BKTJd~X0*h5&rs4*gXgirk@=7PP=DSo`r z(3FoLwuwKJD_t@*Ww4@(TYUh3B_wQG`f!HscwXdeeWbVmT%9&Zy4w;3<}w($3)4rp zanOyL9U_fLtLzEs2j*zx=O??V8`fl`_h2ZNYJ$#TK+}>MxTOB838Juf1!>$cfpB#_vQ7!v6b@~VAEW_qW#IgFv*5px4H5w zOtk*C;~d!3<=)r0y||RMJe{3UcywDeCYPK9cRvfWf!?RUi)8ka~m$r~%M3EdTwzvC~4 zBL(J1`fldtzwP*Y%Kn<`-&6K~#aY%=0ui!Gy*u7q&~a&etPhD!Jc9<5rXp0}I|f$# zO}owynZb&#+?g5vRtNsJ8*(ohZ--ZSB`@O9u562>fH1DUQKlcX^5&}<7PYjM{Mxk* zUgGi~V6@}2K9bdacy-6b1-n8=k43`a(^uU&VPD4XkfZAt8jHDFA*3YY5nSq< zBtpt&t)DT<tA`X+;L-A|ek*TZ!qRPXC;C+s{LZYL4N zjReEcKk<7?{+CZlv=nE()*u!3)QwgMFDE*`MbqHTu3m+^qK9$d-p@LbKw z7g%^3V>NnOp+T3dN%-p{QuwJ6DssMG%bO?4-uz%*!uy7iA?CVT?nTk`jn!B!7JcRB z!c!ZV>U8o&?+4r*hva2JI|wVc+j!gsC+o3w%ua#Ldis8>dWqtm<}!o5Efre)z8+$U zSZD6IgNF+^Mm>e&>ED$)!@62);Agd>Fx(uV1-S_|<#eC*?#-p1X6&mHYsTBnLmp!s zz&BAN;dHoeg1KbScEYkU*%RPevG}F2JA;a=;;jzx9ZZ!mFx6Mp@-aurR!_$9dSBGb z+~KDc=gN#z3~lpm*{o_GU3 zt|@NYI<@m^F@?Jb8s52&GM>epLyq-+kk^EIFqHMetMD7=jCV8p`rFLBzm+7|k4?!c zx$I>hDoWs`cY7pABOq3xqn^>ME^B1}xf6eI^dFd_q^|%Rle&mYOD%Q#Iu;qfq5(3$ z51?{&NSGYxH$m0XJc5GQt+lS>SYo#I7IW8__|H9CEh2E2xDm^B83#dUe3qo>SPW#p`^sH0QYxUV=|g zZy}VsWj06fqhzgcYRbv!CR&H>|G26_&>F-Ree2ICiLkJ9DH+UL&3*6C{)a^b|6x>) zD;j|(_OVLh4Q_pNcqtqp35Uyql38;Rq=H-)o%?u~Y`#s@b7@Y9l0MD7!LnInLnwaW zS)UhQJw)N9)zd_fyVEIMh9yisOas^%*&m~;qvhM8YqanpntglunxcN5_+ttqNR5#t z%_#_5h)N41OH+qG6=WHS+7JV|MALJKuHGV}iV}RLLVtYGP_ZBm4e(spT5Khz0dJ};Yv-!|{jNRi5X-@fiH(DG< zd=dHTeP8(9@6BK;Mv}#4nskv@ol-v=dB+@fPQ3M#r|Du0 z>zz>j>iC~U$B`e;p`kltstpJ0`9_G^*{M7oR+b?`P212l#zeBF4h~1{gzEKMoSg|^9IMuavv?{-$!M*2BEeFy0 z75B^KHxghVCDDb28yPUe*Kf&8)R^avblt@}sI+XuEMy?(yu(U0Ic+ViNBz6EP~D-_ z&)D?jr=Q2eSVeDP!5_a@`1W}IJXXWd!`pCb+;!87{Gvlgu<`3X?xa=Te1Q=%*knyI zjx00g&d^8E^SzOfmVMdq*O)OJndaxGKBVz`IPXu#!Y5MGKnX8f%Mv zQf8k;VwH4Bk$*5BjAwr2JU?QPibu|#oA+Y9f=>N-komni-@o-|<+WAzV#^TR?7h^M z)3qk4bIVT%LSf3u$3jnMu!P|SI(OP6ge4HJAS^+@b3sw8Nt zvq1F^$l+v7S$l&N`D}%^5O`osVA9kL=G{J$=EXQA{;9f9SncTtAJwJB*KHl`<^gp!#>kBeYPiW=) z$B%w1cT#s0NfzL<;~vIsGuj{WQZMYyGX<-Tu$Iltg8nT#3BeO<=|5N^^(#a#+YyI) zNkqHI98nkMJS(r`_A$z@UJkta#m?Cn` zA>@AC36yo=xtQLyPBo}M16BH{$b4vQaBM8G!W5NPs+K|e?zuk62OJ`U)+VSX5`6^H z0c)M+Ll%SF>~-Mwc5(F%*>JntyyKF;;<;3}p*AFs{WPx-8_l&HwEJnY4(yC3GY$t1 zy|%ZZP)txW97AwPOfug^N;Tgder&DN(k-OClWGrK!tEOFa|>I?f2O9FL_tsw&RA z?bzU@we*0xAn$D}nXpuU$|OPm0ek8vYwPem}1V$ zwBQTOw8@^GioIAo^0Dm}n^P#TxS$n+@U$hp_DELI*!vh(#Wy_e;?5R>f}Ovx3$)TJ zTV}X3JIDYrP#{O2(>zFmHfWzh&HMnA&may2br{Rl*rrcuR^*B?<&5OjG_*VG!F1wF z06t*;4Roz~d37jt?Y9CyiPW2PNLP)tO3Iq-{meA&u(y5MpM~^Cj~Hlo%(@Zvkq}Aj zLfYR0)EUWbu*l%F0_aD$#(`q)F*n#9KOj)khuZ8?$EFr};3Dg=rlr2P}!pnS)D zOr?J94HAARJMOTmQ@>iVBWix<42^%zyYhVHKQKT8@$v(wJdlnme;CLf-wFs+qBJ(n zcUEDO-=640>S=A?OF~+eo+>U=Hb5x*MCe$f(9eduZ&@9AG@f3?>Eb2K1Y z!o{$8pOKXIQg&mSkj4@qXqm2RizLO}pOBBZw2nSW*39~mV03Si9~(_kGwYs7 zaZLDUixu|}y!s3RiyD$Sc9J)=nI;`K`qeVp9!p1I_uTBzSkC&e-!G`~-6F)9iS8iB zre3!mI#AL^98xGc=5G@ct}7n*bEbJW(Ww#3)EqkG>1~*yf+|I8VTfjgytf02Q`x^J z_2{ikf$Uei+PThmq>vVEN;i*&K!mW%?WD9l8$U$g7~9Nx2A8kuzJQ;$QpI&V{TvZ! zBRq%X+QhlaN(zR*4w%WFF`U^o*%ZNV&4ss^2B!7-KxZnJOL%{I;}9d2AcfG_DwOT% z&`{P}fz<8>e?wFk0Bq9nmGldc4%PapLa?xN&|wHZyv0t{*a3X<*$l-P`&z}^IVL(O zVJ~)q4Tr4UT;X4;qfQ_nn|dU(?O1oKA>Yw}UDp0iic_xu_sS47yL$ohbbTaPTYq6Q z+NhjnggQpKA)gSCv!0bdV(cYGF~badUOR`1Sr+umhRTfg;KwI-ICdf&3>nnEmF9*l;lyL_KjsjIDYr5SEt4aXcQk+*; zzCCp#{gWcX3rI1CymQl#Hzsau^Kb3sISTK5dXYDnbd{coWBXC&>z!bg%|3>%ftZ7- z54fKia;VRRIV$*;pMx#%7x?$*YG>?2e8#VaXC;dqQMEx7I6KLz<@2EB!u0Gb$JaXd zm~f{To_pu7mI&Td!uN3>+uTASG@NdT1*Jx`DXb>b54sh4QC-eSD{nVp;qJ1G+A;Az zVdDI3gHgqz_HdA#!PvPH9l-Q8m=4=RO`oUW@*uipCcbYd_vT7WFbU%&!uD%8oVRXY zk&{)n$>c%{gI*-f3HxU1Rr>%fd>rN(zjbuxWmu5wD>U1V>`pq)@O0WZ?`JT$pupz0 zGhTDFWno?V;$EN9&#RE%K0v2xD1Sr>5TB$G1XqP^A_Om4Nyo!oam&kn1NE7hso z8;-lpP2@|5HF{HEf#pEQjH|D1K16{yTaiQSe2)403Hi>-h~i_T?DvAYRgf6wTz_PD zQP{PZ*1?X0Veh}VQZ&m@?GCqs_3++8|8ixe(k$=3BxP*obSSZqypd1iDkzndrxop0 zyS%}5h&@^L4(74!ca^o^ zCOCw)sCEr~l-gLw+ou7n#?+yQ{;?OS^W$+B);p6(BRdF+32+0Fg7D zcCh&Y|cd1?TW|yuu7k5=-s<39ztA4tEFIYosk(eGbpakt&iuC(kU{PT&xx z&hf6KSi!olMys<((wb%at#d9%tx?Li%7EwuPhY1YY2K6*dMP-IE~a|x7+}QIne}cu z$6kI)?Rr?MmIMQLL(eI-8X5T9kz)Y;q~Z3VlRrL}yH^s`o)X;dP+U_HW1DSJkpOuS z$(7Fwt76TW%Xfm0!z-@L900dJvvu^rJ8G~;+W^Tbe8SpED5oaSBQ@bGS1`R(;N?kY zP#Z{4JSTzJ_!E$6ZHGInm<27^C#+zwITbdlzLwsh)^Q3WiFG;_j?*zns<_r*nO`}* zNrliUNRWzRL~4fhE0CaRu!5vB+XNW89q|y(Mbp0w{;sr7j!l4T1)@J`l5U;kN4^HViW15)6w(G zC3KxWNPvE6%*ab3MnMY{^9YbGv<(joz$~296SbL@;&=c~SE^nCn~s#5?wOJd$NAzW z<0noQ2Imh-%l#MDm2*V$D@5}6A}D&mwN>_*ipoprSxf)qe~vh^Kjix8SOmQ%ifhZU z&nEA?b3&(<+*-ehmQ$IY>cb924N)seQ#`lM!?Uo_B^1O;*UOj;SUaiz5UWnjt5 zhvAXl&+j5ffqBt{4VKU}uui9}>5$4wQ6X46L0xpuKKBSbmy#BLRQ&ZgvTfUP=#GRR zxtA`XYB-k3rHx2NN#H~pZZc64F|V-cUl~@Xv@|oIsH=4#jg{P*4^LvxHMn;J*unm_ z)P1eH-02ib`T1dr&vR~x<%>huSEv6e*fB+UJ_2jA8ewa9`zroeVIa?T!vk(t*r7#% zAW*&i5(stz8WfA)(^Ao7y2fMb?u7@w)})Yz*Hj&lvQ8eJi+rQK=duN=7AbVWkB#un z{4I1pve8>QO;JrI6xz7{O%=TN^mwu6L)#5~&$xpkow3e{==N~WSneLj7Y=WC5XvQO z#0DT#%mYpv=^$2(wW4X4kDjZp&jZ`{j+Q9RYIk#;!}irMgBuD4H*aQKE_S%!ug;u- zpm<8;Za+VH-4`>-LLYB9H7wQk)N!MP8zi6*3iJBd9LMbr5_aEqf=%BmFKN6%f(FNr zD!f@wBwDE%Om+F`OCppgAUPUsr$N9(V0cPT7iCgN_QXj+CiYH6sCivL9J$#=m%&pm zdpi$S>A`m#ZnjxTfO>p=<%mazv26K8%TNMWNt75Aq%`lti~jnSSLI9c3} z)cu6)lEFVXMpI86k6d!Td_)+|E6o`3h>e4ByC1v z#=)m#-=)l!S}|R#w7$u<2Z_d0Ijy4C3j;moDggYAY}k@>`!yT|gdZ_Z=ouRWv1p3@ z^`vaMO6<|hD;+)FiPD_1gc^1gMV@Le^p1J6@syJ)0W#!2J$uG}mx^NjlEhfiqF1<+|0Nl%#&^*(k4Bi`*TDnO0Fedh?~smLvQ2GugO?cx2~CT`hldtln+S z*}G}`6zDc=1MS8hA0V-73i|qP?FUB``qaK8SWk~Uvn?y@Hl#O8Ik^jG-g#V{z1l;w7z}+ zOFcDAOFxNRiPRt%h5gtl9ADmE8ud=Zgt*`~omQZ~#S)x{dJPMli5hALH(X1S<^cAF zgBwjb?7=4~8@@)}R78xBLYkgx(gb|M*Mlp=$=>LIhr7ac&2+qb%Fc!|Q2jErYjK8K zYU)R3`{NL|N)o~;VFZU8w1DQmimUVEyeMqR%V0mxn-n;_^p{o&gImgjXSjXN9OO<_ z#b^0EcfqPV_yEaKsmv&?K#%E7WCzuzT&)d47Aony#-jP$msn0+AOAd5yP3utxuKf|#7vH_ zk>kBpRUYlcaN~|VON}X(mnSgA!cn_ z4K&bT#5ghR#yPp1R(mhASYb4~#u5Q6y^n4liAob+$1LQym&C(daC$%K2w@C9qZGfF zTrBQ(w#H9O=4{uFy0ValYuTgN9k@oZIl@-!`#=V5Xi%e~SOwx{#wOTnWqQozxevN5 z-$mzt3d1DH$HTBEk~H$8w~oY|k>q5WM6&=ACJ#1(vyn(W=>=qvk6ut59$31X-_!iy z*O(AiHp5uRh4HJDyc*ZOF1Y@|4>=!-Io*6Ouk(^@CS}@w0AA9fd6C=~rY2EV8%P-e0f6f_*4|Ga&gU24x)|B^%yUgyu0NYu&E zua*P2muj`uP02euVC>U|!mHD5o{LwT@v5Po&wDexposZ}tIYj~{gMcxTRs-lC|KU_ z1!Ve?h!5wU)^2Qo2O0Pq2SSOVdL-y=7@$%&{un?ws1>CG3L8^@&O2#s1HxLf@Xrn8>ByFR;yk;=9{}H&U^AhD1=yN8N z!^!wi#|dtk*XqOcGF!qb;?8@Tb^R({DuE-20j#_RF}I?#3Ee7-8Od2%wf?r91(9 zcp%H^S0WZQRG^KvIiT2TM{CwTwP7zdvp_XLMbFc7dZn0_Rr=b#i}$`A1j|x`;V(u# zEP+KH@p#OBnFPT=39UnV_gZ=<)g}cCeE?Es^M1l|+FlyWitIB9T0#V1=n`>Cy2Yaw zy8-Ls>-kNe$H?7)R|QdX)E@~$1&xi~92U{;74B#rqC4)|A)%P zO7pbg3QTq0<`%p0&&rM7s!{+tmR(f)yG(2obK}cHzjR`!P<9Q&e&;2o-_7sY70yQ^ zAt}fKm3Gfq^Ta1^<|hZ@u<)CLl56DvCCa}V4Ko9%?(M0a|M;{vz68tKBjJHDMJG{4 zABVG^0wuNeb2SollTCf(|50Yvd1%pK@hi{x-vGTxZlTp@e;kT3H-xAvY$>r8BSI}?3_Z#pnI?aC5tlu>2H_iHedHr{GN|2FUG^Uv}*>;aZ zd0p$@Of~MdNW2V+80BAUhz-E(8H1q11N*e#?PjM?lq25)DuH!1s^)6F6bRa@0@yt^ zj5CU{j(>S;DUtiH=f-kx^d5VsM>4qeDOKmzCjyJnL6PqPEUh49Xbo>RNO+mA;cYz& zTnL;++0&(+a`a28JAU5bO8u2-9TkB(UW+zAz^14llLo1-Dp6(jXViAX{={&maT%A2 zjm^e;85%~x_nip(aR*chbbk7a2{+`cgX6QW0x(^kdqC$~ZhC#L0hNQ!7@@p?OLWmd z`cM+FaIXr+@Iik64k-p$Yd9yI;>wO(t?8ciB%8Ll1_Gu+gzK)9Fnv&@AXg()n7*I) zvsu^qa%AOxW(_cl@qmiUZY<;?aO2FyQJ_ZUQ!?9SYiCZMQIIG(`a4^bSk3NALsPF&8y2sXg)n+BJQk^V)bJ z?;;41x&y_l4=;{adMZ!8xPDa zoCg!lj8I^eG-;FuO$}0Qq28`=@f@WfkkhGry%M9*{-J>YNE@S%`hawz%|fR|I6G7ZRS8!DK9Dq zh~tK<{d@I1Dgpp`JGT{b@Tso&n2NHpZ^0gd-LWGrKF<$or4F%DwWd9e^ri_OgYgF- z?I4G1UO7WEbgYHey}s%_`P@Q>@-M#_OaCJ+ukIpe-WXimla87501iLajn2x&@_s@# z?pO7%0aY7jV>T%yowdy*iRA-P4iCQxxv#W=h|qp2e#cN?*8;6O&8p?b zq6ZYhD~{7vrQwJ(>Z#hEi9t~SLdCE_ok0RnrJYlE>ggv}b-T?hgts^rkrrw145u?f z*73u;X6SUqJeN75vp_B_y-?m{I{xv#>2V~TWfz9|jNuByToj}h?gf3g|ADL4$f>WA zW~CT47r~9R_TmFrM$aLtpKVib$8lrBLaSqh?ZWnr1P%;2ea>-fhiOvzY*Vx!yTr`R zO?El~?y|AhB-NWY_#>OwZbWp^6%TZ>cIHj{oJfth=)RZk7QtT-a&QXp&_k(hj}efo z!NAs9u&0#hlt*UFgpnaaFCF#=vnXAv%lcHKumych!4HrC=viIL9?W$rjq|rB6DLLr zyfeIe#;=aHsK19h*{ ziWNa|I!#%6d&e_qsTnEPDCeHL!VJoRw~y_fq1dDQ)TyFp#kfFd#17jQwp-Xce)uIG z?Lltw9$sQA`^K`B)fv&`-5YMtqt({L&lrm720oW-cfKk+RLT&sW$>c-*Rr=bpdn*5mU8xCCBbLt;V3e)hM`fURV@|ojNu;aT~%Qn+0Gq4z^dY z+dDsPn>(b)LmWu9d7U^QyE3hYV{CwlD+ro6C5Ljeojd>4`Q%*B+l(#Oq5Oe{JV{7K ze<%y`FVBtI!*G+O~mMSh9=!vinJAfLb|}6oW61x$KI2z zU@s8OIVmv)I!P<5O@bKsD<8Mh_}7$+0oLrAzPAjYdq!IBdMRm4_HCMf+ZiON2iWuV z)yYzuEsJ$8sr*_oda4$Np6N_JJEtE0VEtYiLIRj_3O*2f|Q~G+1Fs|CvwVj1PO(N^9$$Cf731KEIdEvb;097F_u+p zi7YAaVtS{YN(r=0&?uQCdxJM60k6sk|eq_QV77K+XjlnY=A;9027ZKAoEM(8{)W6tnq)pfg{RGnzr$sbCLyTJ1&& zn7}N=r}al<_C_^zL=?Acp~kXiB`GyHBBc>H4x@pROL+u!WpqqiVayC=^mB-GtI;M- zo50Kqy|j*5u%I_1aXM`Fe1E`;R0j(Mrgw82=hLHYMsK;3z+q@R9u3hShZ5y)W!nN| z7n1rn%j2Jla!?wC{z)WS`YJ1O&Azg22UG}&HJx7>%}Lm7=-iKcIl+5K__^Uqayd32 z9{4<2!qzM~`q8>X`f?JjZKLE?Wo9Q6giMPHp27lYtd;X7%t)5b8wB4JF{^rFBUAmv z+h9dgpp5^|#0qS?zB~RA(4f((x%zq;t1d#YM9B-`ILY1Nx~6Y^kC5;>ZwhJXorJMO z{uV=E(Ci1wGWUjGB|ZMEY_je1e}l_D0i{}u+%H?^pS-#-n0OjeM{{H~*Lgm$;>XT@PdnrFJfGF*ZpAtu!*?9+hxtNrw3HJd? zy3WA1NEL+xm#-KGPZupdZ@^iq=dB81i*B5%Dk1P}ig%!8iZ`f2m4_+O#A3lHEM_LJ0@Qt1xbKL!1il1KAWNG%y_ie4 zK%qDIPS56g0f|`5n!|4pfp~GV;mmT}-NsCk@cpwY9y=tb2dufhKw+qu)==^B)SdyA zDB$Foy9eL*sK))vjpo?is#+Lk`mycTd(+m&|H$>ORGsMKU?^Z+c&$M>j8MZRNh2rf z6=*XQct+or8=pZnkP#Jt8gqUjI%=cCNX1y9A{8*tSf!$kCX{tfNwI*%5qdVOD3zO` zYQ%;|0t)*C9bT#WL-Qljf(m=G29o;iWRE{QUz_xggu3p6NWb=<#j7@=rBcIGEm!|y zmQS_lUS;izI)mlG0Uir??qBueO?*oNpx3?lPGhVbedjY(+}mFSt$?Xxm}#4aD3_y;ZOibu#!2hBjFRwi!Nt&Fnzm}uKp6*l zH>MyZdoB&%)2NZjbC!5>gakd~iyNc0%<+5Pr@uI)saPN)an)IBLhtrHW&svP5TFz? zt5Z&yt2R99I(|b1k6+W$69`BAc8DhWAP$Vp2qa z%9WJ1>NjCPA?_n(zaDGRhY!SM#X+h~)Ka85rm2W)bClQ z7oS~Z&gA(G=}u$^@xFIZ6iJ&ewPV=I^o5=^>KQCG#r~7@Onm4|% zslXzNUka~o^ICYw>%unS_h+=~x3mNutF6qkOraDr{l@0U`wbbz>}qV0lajMd!FGB^ zI+U;=L~{!GoJ)hC{Mb0B`{lUWmJ@Jj4@9WQKyy?+hxxf5@Ih!XM!$aLzqqiFHZ;#o zwC^h+PkuntZ_IARj>t9wlU>)e2CZWOoa+PWx`^~N@ZUc;ZJa6)N3y-HU}FcBD_5%ZxGNhI-_Xr|`VJ~c_$AeZ z-8mR2kkD~DD-Dl%)6f$ubjuF;H z-?QurYp7t&jSJzkiuu>4S8|LBt11hg%9@cRZpo81M_kD2qt7R%$cWq-TWW)jqtCtI z{Oh~6tj;iv&Q7!#hYtnbm=y&xXs%fa72deO$Gv-0`!jiQI0H8{S@;sMP=oWv4NzAu zQ^-nS4)ltqfcI+wKbjimW7IQH$Elf&{uVG%Genjv9$EbQvqbVe@n+kSA9xePJHc}$ zEDdJA-}9d3GW7*+rgOa)Yg>-If%91zMk_vUrRVJMnV1oltb#}!?(f0@MrVUi?8Sxb zaXDa7pS4fm7hHAm8-FW&{JtCFg!}!96m1zOx_w6`^2ITT?Nb ztd8x>mX_fU&NaLc3frkYy3V53-mmHNi7qat_X_%0TLwz}j0TqtpG; zc)G{)E?1|eYoKMIqV1Tft;c1+e@2%K+=aG2cKy6%s>!7P!+s9=bBkt~qc7};Io$ue zXF_B-KPG-WJ@rX%=($37xW9dgKiR*}WYik7}61ovG8Cqoj5N^AQrKzFcq+XRe+ zFz@m-Fnqhe3#|T8hwCJYB8jiiAjsW+#5Em0L{fYe1^&;Li{|EBkk~IBZbwR7c__*b zNO(cbS-~&(wD<==N&m&Q2)2D)Jlg-swzvt@okgz&DCr+%XMelV77PD^Y5iTV_kX)s zWg#pia0|43s^ON1_71JKZll$uQwQQ#$;Ch6-rke=@gi+`!M-yIrr8%AghbAXlNUnX ztg}e{e%x@v`1IOS2Z}Y{YQL&@+-1ZNMC`-8pfBY5VTF(fd-Vg|T0IA+F|B%j=T;MJ zDpa_0R;RzuFk;_BwGEabIz`Kv?JMZUn^qbLjla*Vk9|L8wDk_|3vz{%c=c++0!K& z%OtnoUb6V(w)WCxSZxPY(r%h136`t_q|kMZ|%Qw#7EpFek6 zvh2=wKFuKTOSvbd zIq(#CsG93&$J>j*poG|XUiHcfNy1XC4RnJ{c&55T+2fBNPgMnsB_41hbZ>pU_4a_w zjDn4+X=FaU)+t5X(~V>%CuGha=5A2QynSLHwQgkbhBY_8BS{7#)HdN&~I;+LMVM(eh&L?#O9@b!026y?c7xq)MrpPqq(yYE#%D)3wUgrBrI{mXEOx9m_8p4dbN2r|XV3og{qdded(QK|zu)iqJ?DJq zd!K>=-3(PTE#9jC^5S$wlC^tn@hETf#dq&t%9UasJ?N?MJS!%>TRTNuM*0oPHG|ey z70r30_NW|R;VX>HXOY>BF>|XGvXPa)8l6HC;NAxnU{1yks&B73;25f2#-MLc(XF&xRv^X>PWk8>S^2_kaUt&B5@ga0=fdVcF-Q*YwU&DOJhHRAsqurv zb_$M2?Z`7co+_;tL_D_~!vVOCPU(=5`f%|5Vh5mXheXSP zz9pPW(-qVUzW&jpgI-0uO@eaNO;#J#F_f^P+F+KG*bZf%X!P+4EQB>UpFD8oW2Hsy zB)9D4Q?gql*pWHs!5fe(yI5CyOoP#3!S(*qP9UWp!VLd0qey*vl&^%jm-*BBsnIhio zZt4rqi^jDkfy}1D`rx!~P3ibPOeGc>zVo_W>DZX>LMv>ENim+17f)=&S!i4teGch@ zeOT)CXi#!t{Wz_gx!9IC(VF|f%f`kg&CV^!OoBSxmH-(hafZRaj_ux1WHiY#8IHkV z0y5~8EW5bi`4PR6%GmCk_hfwJqSuZ!gCc1PNzi}AjA{g5Uky4;4fs?w-IbLN_X>}E z1!yAFZ6s}RvRyT@yaqxL!kg7Kzg~1_c@p7{Ov>S@2Q4*l z2WHe{$OL3Dx{;3Mv0^T9*8*{VpPa1-en2p@W-#x_vdG}yX8I@V#c2Cq4lS4lXYN5B zTyY+OeEy82#R0=)Vl)WhSw{?|HoXE`r>Mbe==mx1i@^X( z;fid-a+{35x(QT+jm9y!Xwnn8P17ltl#Q)W=w3Ie4X4`R^T3u&d}`bp?uaX|YIspH_krrSg!yt=v?;oFqv0`pxH;7bPJlc{Gi z0jhuO3Nu0=4rpnelvhxYLRnkm3y(zEn}!W(kB*KS>=p3iTRw^n~JO31vIHH8ozntZ_zfCIt0>rmnDqc)TC^cHc(ueL+_U2W`X=?TX1`} z)czO1zVwuQ065>zN@jzbf@pf%!9vH-CIZwp#C;V&_sQ_C_}3dkB1#~#(&bW>t-?YB zi}om0W(Dd1SLS_^z6RJd4JFE`#kUUT<>+ge?0x+b;)M$wLfd^ zwb%Nrd)@cV_x_{Ck@&i(v->*b|led>~LA8h>Y#|InHdsps_*!07L zjlZ8+dKA3rkEbp_$Nu~se(85-Z|(TiV1?VYYZsCihcGvyp4*NFJ<%d>a89b<2il7r zVg4ei@MbUGx7h9Elu#(#z5e?LI{I6G)-^hkw&eS#eM|IPAZ4~)F-L(<|M((YUk7Bk z z{x8SU3d8<=+anJiFVo@N3l2u*{VS9sI+D2MUjqHdz20BYZGjAQb@l!wT%F*&zgOmO z=cM1W*Fi@oCox_BR>8kt*V47~9~J)c`N)924$=n%a`*c8bvkHQgMT&(a86W{4zFr@ z;w=9!$8~^3F&qovnCqEm-Dn;@PYgLQ6 zx%tYXRPI31;`9^IYn%Lf5Oy|)C~j7w*z-5M?Q2WbLKtdcqL58w$FN0o`=+UlWZ+vN znX9fI#c94F)uxHow|xp^i5FNh!MzUxrc(BR0{&UIRAB!*HjZSJit zLQq8t7SXlRQthx-Mb{4R?6eFsT#tURn=#^kJFLB;y6LTEz7x!HWSqW`e9qQ1G&C?bWLusQ zV-;ist3EOs&ee*w8c_TFj7S97Q!|^-W^?3D?h7AplBu`CDjOSJ*|cZJpP-b4b`$q* z6dU2}KKpW&=*^bWdT|Qh9rfwi6IM-V`_StP(u<7q$w2es<@drm^BNWxlim6E@L@q{5RhYB+{afBH;{g9NETf|5Y9F@<;^z`n!1I9vOeAqg~4^Q%2ue@<_O=txXB4KVsD``EYJo}9v9$gU>d z)*3(Jc+I?1jh2}MYQD2U*y}E?pXe%t73$5ihmc8KkfvO!YzWdrpR+st;$7DAbvJ^X zc80xLuHgD}lZ?Q;S_c~@b7a**ToD+DMG={uj!sT2px$?=R>8?@2B2K-E`>ua zA)@DP?|l(Xt69hDveu+P7vA~{F~Oox%O#n3YZ%WOwtr54J8Qq8Rdv|0cyEk>mB-MLJJk;aLrkUCtk z@yhGAuaYq4v{n6^j8oG|F8Om^jwv)%<#TB7m=s6HaBc<-9i>>7Z;_x-sE8i*N>i== zYxmTTHr8*j>rORYh|DkCJ%4zyRJmz2=ZtE8Hb^N_CV%epN(?&KKXAGf{o%5(E{~>F zi{+mx@GJuhc*v^Fhh7i0Gt?vT^q$FM*h9$#WXiaO9C$z!flM`b(^@; zAjWf@i5VttuQ&Uaj5PSTqPyJZlU+u-tXFM0EOhG%o=#BB-HDsR&bM0=R~>fQpmaZ; zd?1t7>kXpba+E;LgRu(}m1OHqYvpifWp%ZE(Lr23=@PDchojN*=S$KOkJvf8L+tdw zbTTH;9nUd>F^DXEoXZ83T{KuJxF*eR@1>8phFCTF`1qiJU|0y!XaQ9OwG?RCXA6TO z46RdYM2-BC$p^_FuX_n;S|zQjynK`1Q?MmXv)1jxIk_n%>{aIicpeFKSOO_q-Kd!> zq}_pfpQiY|pN*w^D28qElpEG6t0UD%XM(7?*u%Ttp~US6aok=rT){6YH?A z7GI3#5%!sS?8bPMR)8%7wTlc|9pQpz%9vua|LW@>X3`QKjK;PbJHdMIFAqba+b!y9 zO+DvB3|zdfws(T`Vvi{A#%pPe-DsS8oqm&z)hsAsi3Tx=qG zK{H=&2^@mbgy%TGV2shn<11*X;v=%=j%@2?CSY7JlpQBobV1JiuEA>;@j~<*(1Yfa zzh`U!p>aSzgVBDaj$4Ue=N-^$zdU<(62G`GsP{wuL7q$|@kU=U1qZ9mHfl55`ULq0 z@#CFDF^NXh0>f%fmbLW+UW}uu=A~WXsvG87vh>|P)3b%?^W3|jl(A*Z`7`7_o$M$> zuvSlh>y8k89dTMYKXcnVjBa*$*!zc{`|`27*^&ZC%$wek+a+q%8(-`Vb%v0kT0<{D zUAPbq`!11rwotgdqP?}Rj_#=p9~Mj>Ri&Mt-elYn{fkw0=XwmBv7__4R%;RSBGimx zX{vcxaqOkMq1h8#QAMm9IP7lcUNLzsad@UlP|fu8ly*A=!B(cuXf{-QNT5>F8Te>9 z-!>J!Pn!>>fh|94lKoGg|BWP4RZf-Vdp7NF6`Ybb#7`|s&8+iwbG^V7)V}=|RR;4P zlBwcUaToUTHc!iNO-f#WiD$jvNN;}T#uzJ9b1?S6A2##xrOMOJ^{eUol>w)+tMN3O zh9_RQUP(bd=pqZ(x~)2Flcc~iTYHATRtCMI8qMdd_n_u!t!ANX-qJr8(6FMD@K^>5Qb4+JcW_$56?Ulr&L_MUto%Pt*_>n><67g|4< zb9js$s`)(TGE0cpibmIi|@KEXC%%=xeqwI~ADHHu%Iu*YSq zDg)U;!YTs~b2(%D-{lUKCP%U_>-D71PJnQ(?iSOG)k?^0c|6dCoAYmO_W2~QGufXV zyh51g#(jmmzBSe550z|t@tA1Z-WZsX0t}wd5gvEU{Px-mN~h1cEm~G#gteVfJel`0 z&)Lhq!;EHmgYZz&bUW_hTF(@8DbJ4c?YK8|@fgZAo2zaC|8Oe#?mpkb-S-oQ0w%44 zKkwIgAD$ge{~+*c5zxnIaO$)V@{=23)LOC_5Qp<`6?c!p{FKSJXorI(ZW?M%;`UUR zKh=SY+m1gDr^SBHo^a*NU*E55^ys*b1S9*A=8pwH*w6d}Kw8|C* z7nC?V)8Xwpcag!LK`X|4K>V$#ACrnHJQ>YfV}D?_uB4xFerj=D5bbOTXWWj?)guBa zz)+BG3wb6`dhq)xe_g{rXvJd2y+w6|I`9N|*|c^2c2CQ?Ja#{+I|nyOdNXGlrXIJ} zzV5AdU8~ZAd3YqdwF{85%Da7>UWwa-nC6AaY6r@Mwa%w#SZXi!@!;$@(9KFZ1WBp) zOB>~oI@cM??D7_YXgShXA-B`VgYo-V^pM4bcjczEAqMz+|8FVkg?E9qWRhsQ`9<^N z=7I_3I80{cr`b!jLJdD;?@=GBDjll?dN_NAwsqdHQ`P;bv{vRY(cuL>Cq=0Au4r-! z#2M{ue5YK11O_`CUjERLwzP#VHv`vC!dlf=sTmyc^P`l85@_^{ascRD>#($rdt7Qe z-p4-mV=B;K2`7}CT*TYB2x;&fqJ@l&4bW%U7BlF~r+6%6b45er)Y-9fOl*Sh&d~pgYphqCqX;& zH)$~^R1=l+mJ^+odMw({FY(tE?kB#t#xhJhV`u%+?vLfF4~6a4H+ZhYvwAv5vDc6L zervGdCuETlEW!4`rrTG1oWJ0*xXDzr=0)iWnc!!&wdjN4HC4Ys_LY5aOWX0@pS?Gz z@{F*L`?MqUxW()OmG}3mn<|q)T-W@?W%jRUjK*LBRij$?kXz5?ZdXL_Qa?;%(EXGF zzvE13LoYs$C2o?aXOkA=mG`gY1I^{+hqbD-d5_bTbXlrAtMdN*5VS2Bvc}LC7?KyI z^U_6^?6O1!fq;FYr``05{$ep&egU!zjG58SI#7|R0tf+uS-5+GCc1-LTe}jiZm`P1 zCSBrgE2AJ?S(YSCGS+zs&cCHk1cR#=qYMewHXYt}6fTepa)hTOf|}G+RbknOb({~f zcbb_DZd0$gW{fT>be?zY0GE%HiR>QcSQ`=-EP_mZEV(v!WwEv@S_=Zv8Fv;P+eYc-kZGXv^{mSYwL2 z)}iw`H?WIdx!_oa1qFl2e3$K>*o7`=g!OU^u&}5@SlZ;B%dQ&lp#QnR^z(Yaz4&Z? zlPT7ZPT#0h0}CHDA`&b;wJ4(*p>v>4W5|=rprvoE^Gvhx+;-yU6}otEJ~Ubgo3#uv zIYJw~r#-`i?P7ccDtTWmvs5(G^0w26L$u^!ki%?r6lMutufNEBBQ-t$`~#(S=9@0P zVC`Zgx0l{q$k7h*Pv$v6aX4GrSK<@UgTPX zo3AL&ggoZ3SW$L%c1}_6pQhja`8F*oKAzy{=os+u$kREG0L1{bIi)cHg|}RljaZI(^5f_UQhEE8=_^XG=C)DMi(l)IAVz(|8)WNp zPPw;KDD)`F?kyJ4hUhT$v9-qN@LpeYkv1!gDCX!Fz0+EUP~=4@;i$m+SvtOf4$Sc?gu*m*$*#@;kl`x+6Bt-_#J@4n$J&9Z-}15Q#1)7O2ja zrT=|(zJ~GFhx@fP{!d$@jlvV9Txd?VnwiSGUlIp zwvsDd_r-LI2;ISfcW!SLqOT2FIpSYceB@FO@(?8dO3r>hu5EAqCSH}M!vJ{qv;O+- zGc3^1hHO!Q@}Zg?L$ni~!%$Oy!Cg1EVw$1ZzV^zAXmzchwoyN#z4QIKT#eWd$xCHw zqH=^$QY~kwmmou&(UwwPdFgOIK|@*~9ns&QWgY)`zZt90+L%tJEy|a%DkHDNLh&sp zXY(DkfK#0=E2VbAbH1(ZcwXB#!IL>ODVQsWZ6zYsKruWow+0anr;n5M(BsC2i|cfd zd8=OlxUCRCLfiuUO_cV!^Vc?_oOLP5P+(NCH59ky9WEmO*=~=BBtY}c&#d~? z*!>XSg8 zHglB0xofQLd%fTNX>B#w*KvvnEF?=qF~f&@I0x6CDGJQUtrLlis>_5EPq!N4aV|Zz z(L<35HzNW-$Px)BL`;sg=cC^0^{r26wpK>JNl+%Z?d>r|RCt)^NA_#a zkd%-radJ6NG(WLipc*_x=;?&0J0s#3eks?ZcVFQJ^`pJAg0#Q2;##+3f4^Z`DO+Fr z4M%>oOhone8>UuZ-)Ln|_ZJPffEHX$Xu8~`5_$Z$B`I?U+{dpvz|tvMt1fjy(F??@AQDfOf5)#5_7J=k%aNx4I3w|(!@b={^mLjg{p)xfgm?~WXmN4S?pZ;rnp^|7RYz=}t?n%Vclm04{u z$Lk!(DLd?-KO2g3Y^n*cPt~<6;g7Smd^@%ylwKK3=&ZM;}uZIbF|pNCOU1(}9> z<(b;EPd=LnkK$@xqE3>n^>)r;+`IFF`XX@zH}apg111&Le*~NmM|%e0o~fVA8dxxQ za)`m_*A#+2hizM?RTU4?JzlC}&?4&>@7y>jGge4TV4W=q*~S(_^Z-Iqq;5-*6g@RHRU@T?xlY`a_@Z5B z4>F#f?JAf^$#Nt!eVjd_veze<6`y})f?`D)Rx-EXXJJLkY?y-(3#aFbp8GbJzfz!j zW;k>=Bh+a~tDBpfXmUfb-rPQ1&rDwvhPd2vAH9B4!ZKlk?PjKc4JOP4Qw)NiX-Lr8 zMF{PTs7QFuN-IMMMp9CYg@aAZ%(IzZ!s&-*th%-`;=&xAnN=)?I)hHz;N#$s*6L`` zFuQ8B+Im;4INaE}mwfH|J|oHGQ$DgRC}p-|(vV%-xxOguWfSuyD02RT88~9RQSEUk5)!LH!};t&rk{_%c;3)ixl^q>`X2nl z2}*FHbSRRDWh?7Sx9kDHg2rVT&^F22W{0ZCfm&CCy31zhH!?5~$U<9l4;A*Nk4$9OwqREg~TZ4}tNMqC{i>#N9OzAf)kx;z{w8 z$>;3B_`{_=I!JAP`jb*DD{s%-?-dmSY-{gPFRQb_^FF67jWy2Gp{Vnjl=_}mSK&Km z+KceT+%N^LkQh<=yGH(pLD8=834L;!GnBSP_(8}X*w40SW)G;2OKvv@x^NvB8b6QG z%!hRRnriirjf!`m(pmBjN;pk`g7ObS?d~h}qf*)}AntXg7|7sVHSM~s*sj;i_k{M( z_$<;D29Vd~7^0;lHu8;;@{{CM40Nk5S~=sNj2rb4T@w<+It+PLvBKLyZAX&L3|b%y zV#KsMfgAD!Mk3pK>L4eu&6%a69??koMOZS|zVKW499iF~yB zbMoj1b%HlAw{etJ^50gHeMQ8bJdtwPmKw|u;~|>Wt!e(+#xLpfv#U!f&nhqNFm18@ z72>$`Z>c9&q=F2rClHdUG<%+?5n2Mep+iZv#?V6eIe?H532uQXU%XgSd9@iLsu++h? z?Y+vrF+E*({dE5W!@s4;Uy}C!Hrpme{m2_!wIrBo_0M&Jg`lwQTuV{g_CMlvC}&(+ zDzfz`W55E#7f21hJ-rh|L|T>tlCavOkKVYgj1plqwW=wjGnn*{{y(qa(< zH1wr^t~8L9P@^(kq*28Wy}FVsV?e8!NV3>KjW&D@<7;bt?Hga;l&|B)*HQHAobtEX z{Ob(+*WBhWtsyt0SV{R1LHAuhXDr3B_g*>eoN?~yy70@!R&MXjEi9tX;fH#vbvOwF zNr+}6UQkg2V=i7V*dsPNx}u@Je)#Fpvd>%Ay|gJRDyn++?2S=o+Yi+bM9DFd=K2=6 z`de1c`>CgUc!*LD_ly{RTV_CJ)8$o&Db<2w;3FLQ_A*LUPlWBgp8a_OE`a3>rI8lR z)=K!>XNUDhI7zv{bIBTy2`|+3Jogsk-Af2%r5> zT?Tt??0ic7=zwF&ZW)r1ycEArfpn;n&NA^H%>ApXV!*vu3Wr3-6#8(y{DB8t$#Pec z*21a102w!-B&CP?18)!l)GNrBN9~*;K!@>&#)jb%ViA?gvB0F8uOGEQyJOvYD`k$A z=TV8Wj0YeIvFF~|Dr{EbVA4#jcA--g}}9M`qcep@AV*q#1Ssic~Xx*Khdzer*Z*J2()Vx;sXB-_;L%_8>|W1B)jZ zO9iOLTMyYs`&NDVjvwTOLim#u#u0daC3*q+Bu)|x1J@afuEPoEiMN48l<`Gc`XDtY zV?8BtG@-CKzSmXWfKTlqG9!xC`%78Tct@>oYHF&S4?$8Jf|94p^_u4Z$nN4XNr~!Z zms|#eHauRu=+V^m%IR^5>6w$;*%oL;Z6b@D6pg2+Oz=cYI`7Q-4JSWO@bt(h-NbBr zVU8{;LM${Z1Nj&Ahhiu14!ML)fWFP+w7Ga*I9XC_Nh!t^#}u1F&k*~5wT0LD%0nC4 zAdO|e`DR16q1D2fL}4IisHDruVqs(3d(oq>KPDUL zGSW;ihHaK!_~~Ne-Z70(IJ1X&Ht1-fd=2KfG^`E!?BS2y^Q+t!O;SV0`m$5~sWvVcSf)e7!|j z7_g+=(+>gyCx^5yVTWd032z-gTpKy?SZ2fln4WACx2Yf4kxze!kRWJ90l%5u!ZO zdmUbop4j2-^qDj6cQK5;%C(|ETC??HVm(W9G{@7{;+=Do-)qeIu>DY}=jdUV zu}eUc0~A~KabJ(K*cN1c-+rfrPbZ45wU`bkS|-=3r>E_NS@DXx17g<3yBW{TH_wSD zY=x<&j_g%c#d5aDna3K%+Ow>o)Pb0F=WT~YFlR1hq9eOwA+dE#JbE-@z|SHFf42mv!w}I1M??V{H^}&PKX_qeS5fR|Yhep1w1T(;>5cUt&i5raeLxOW zrhd*N!aKWM<%_ky*ku+7yJu(uXpOpXCfdDnxZ1jmG4fb|r)lnC>h{hbN^>?ucjYhB zUSqGv2t$=35;x6im(mhfG@7I($cv;T0+rj`mDW?n3LX}}l$6l4TgX?(9-nU)Sy@#3 zBgi`*NbNY+TWc}r##;d}2<%rjKUUxSxVS1oVLe=9Y%povgFWPW*GHW^T40mk?RkF) zpr1Pdyv!SSA&!S0p{vkJf!v9$+%n{HrY!0XYGwRS>NHk*7dH%PO~kB}o>{2|>7exi z{tpM>mowx5Nm*kC)w7vY$6WXE6y+1?!&~4(W^&T(cqcv`R;7NjwPVJP?ZiYSAW|A) z!3ESmf@l$n(H`-~icDo+wY2&flXQx?#*lgCTW)=C)@BQU^ad^omBg@i;+h){mE2Et zK};b?%q|EL5%yyARI}cn4UO#Vfr6RXyZ@LzrMcE0A-B&c+C_$}B4}z^?s|{pYyQtT zqlOfZG*VevyFFRB%UvaD@8SL;ad#C0_cpsfr^I0(nxXS_aq(4GyHeFAY0p| zXz5v*1I1(Xw3S3Yg8$qeNllG62avEJrI5Lrc4&!2KBpi8wf)=SDpfq4F7b@M}H$AFwm>MgtdJHt2iz z%)SWv48e*gvZ429Rs?w-Z+8682pw52UB-{=@e7dFx=0k>_7PxxepS|3^^n>lXM|Lco6lY`^x6uYKcd-}p)-`bw+% z53}t5r6jY}5_@C}5yS7Uojv||xMpYAXES{IU)f5=!k(s4{T6Zz2A}H>WHV)-+>#Fi zyL&PJOSTf-nB#x1N=me-l8kL*EgR%L)ubty`pbmXfXG�E2DfB+hma`Jbm9Pi@lL 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

iZRV*Fxu7L?)S1oxrA~lHfGEiCOZr= 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 diff --git a/test/plot-schema.json b/test/plot-schema.json index c869e669c43..79222983c5a 100644 --- a/test/plot-schema.json +++ b/test/plot-schema.json @@ -59071,6 +59071,12 @@ "editType": "calc", "valType": "data_array" }, + "uhoverformat": { + "description": "Sets the hover text formatting rulefor `u` using d3 formatting mini-languages which are very similar to those in Python. For numbers, see: https://github.com/d3/d3-format/tree/v1.4.5#d3-format.By default the values are formatted using generic number format.", + "dflt": "", + "editType": "none", + "valType": "string" + }, "uid": { "anim": true, "description": "Assign an id to this trace, Use this to provide object constancy between traces during animations and transitions.", @@ -59121,6 +59127,12 @@ "editType": "calc", "valType": "data_array" }, + "vhoverformat": { + "description": "Sets the hover text formatting rulefor `v` using d3 formatting mini-languages which are very similar to those in Python. For numbers, see: https://github.com/d3/d3-format/tree/v1.4.5#d3-format.By default the values are formatted using generic number format.", + "dflt": "", + "editType": "none", + "valType": "string" + }, "visible": { "description": "Determines whether or not this trace is visible. If *legendonly*, the trace is not drawn, but can appear as a legend item (provided that the legend itself is visible).", "dflt": true, @@ -59149,6 +59161,12 @@ "editType": "calc+clearAxisTypes", "valType": "subplotid" }, + "xhoverformat": { + "description": "Sets the hover text formatting rulefor `x` using d3 formatting mini-languages which are very similar to those in Python. For numbers, see: https://github.com/d3/d3-format/tree/v1.4.5#d3-format. And for dates see: https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format. We add two items to d3's date formatter: *%h* for half of the year as a decimal number as well as *%{n}f* for fractional seconds with n digits. For example, *2016-10-13 09:15:23.456* with tickformat *%H~%M~%S.%2f* would display *09~15~23.46*By default the values are formatted using `xaxis.hoverformat`.", + "dflt": "", + "editType": "none", + "valType": "string" + }, "xsrc": { "description": "Sets the source reference on Chart Studio Cloud for `x`.", "editType": "none", @@ -59166,6 +59184,12 @@ "editType": "calc+clearAxisTypes", "valType": "subplotid" }, + "yhoverformat": { + "description": "Sets the hover text formatting rulefor `y` using d3 formatting mini-languages which are very similar to those in Python. For numbers, see: https://github.com/d3/d3-format/tree/v1.4.5#d3-format. And for dates see: https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format. We add two items to d3's date formatter: *%h* for half of the year as a decimal number as well as *%{n}f* for fractional seconds with n digits. For example, *2016-10-13 09:15:23.456* with tickformat *%H~%M~%S.%2f* would display *09~15~23.46*By default the values are formatted using `yaxis.hoverformat`.", + "dflt": "", + "editType": "none", + "valType": "string" + }, "ysrc": { "description": "Sets the source reference on Chart Studio Cloud for `y`.", "editType": "none", From 4d9f656d9a82bebe848055f143f0ac9103debcf3 Mon Sep 17 00:00:00 2001 From: degzhaus Date: Mon, 16 Feb 2026 12:29:05 -0800 Subject: [PATCH 16/46] Reuse scatter selectPoints for quiver instead of duplicating selection logic Co-authored-by: Cursor --- src/traces/quiver/index.js | 2 +- src/traces/quiver/select_points.js | 37 ------------------------------ src/traces/scatter/select.js | 2 +- 3 files changed, 2 insertions(+), 39 deletions(-) delete mode 100644 src/traces/quiver/select_points.js diff --git a/src/traces/quiver/index.js b/src/traces/quiver/index.js index 942ef83fd9b..f01dc527851 100644 --- a/src/traces/quiver/index.js +++ b/src/traces/quiver/index.js @@ -17,7 +17,7 @@ module.exports = { hoverPoints: require('./hover'), formatLabels: require('./format_labels'), eventData: require('./event_data'), - selectPoints: require('./select_points'), + selectPoints: require('../scatter/select'), animatable: true, meta: { diff --git a/src/traces/quiver/select_points.js b/src/traces/quiver/select_points.js deleted file mode 100644 index 66f26e444bf..00000000000 --- a/src/traces/quiver/select_points.js +++ /dev/null @@ -1,37 +0,0 @@ -'use strict'; - -module.exports = function selectPoints(searchInfo, selectionTester) { - var cd = searchInfo.cd; - var xa = searchInfo.xaxis; - var ya = searchInfo.yaxis; - var selection = []; - var i; - var di; - var x; - var y; - - if(selectionTester === false) { // clear selection - for(i = 0; i < cd.length; i++) { - cd[i].selected = 0; - } - } else { - for(i = 0; i < cd.length; i++) { - di = cd[i]; - x = xa.c2p(di.x); - y = ya.c2p(di.y); - - if((di.i !== null) && selectionTester.contains([x, y], false, i, searchInfo)) { - selection.push({ - pointNumber: di.i, - x: xa.c2d(di.x), - y: ya.c2d(di.y) - }); - di.selected = 1; - } else { - di.selected = 0; - } - } - } - - return selection; -}; diff --git a/src/traces/scatter/select.js b/src/traces/scatter/select.js index 01f757a779e..c4c4c3479cc 100644 --- a/src/traces/scatter/select.js +++ b/src/traces/scatter/select.js @@ -13,7 +13,7 @@ module.exports = function selectPoints(searchInfo, selectionTester) { var x; var y; - var hasOnlyLines = (!subtypes.hasMarkers(trace) && !subtypes.hasText(trace)); + var hasOnlyLines = trace.mode && !subtypes.hasMarkers(trace) && !subtypes.hasText(trace); if(hasOnlyLines) return []; if(selectionTester === false) { // clear selection From 452ba9dec489a1a2098c60eb5db4a4f1eb723c03 Mon Sep 17 00:00:00 2001 From: degzhaus Date: Mon, 16 Feb 2026 12:36:08 -0800 Subject: [PATCH 17/46] Use hasColorscale() to conditionally enable colorscale instead of hardcoding hasColorscale to true --- src/traces/quiver/calc.js | 14 ++++++++------ src/traces/quiver/defaults.js | 8 ++++++-- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/traces/quiver/calc.js b/src/traces/quiver/calc.js index 1bee1abefd9..f6678b31c59 100644 --- a/src/traces/quiver/calc.js +++ b/src/traces/quiver/calc.js @@ -66,12 +66,14 @@ module.exports = function calc(gd, trace) { scatterCalc.calcAxisExpansion(gd, trace, xa, ya, xVals, yVals); // Colorscale cmin/cmax computation: prefer provided c, else magnitude - var vals = hasC ? [cMin, cMax] : [normMin, normMax]; - colorscaleCalc(gd, trace, { - vals: vals, - containerStr: '', - cLetter: 'c' - }); + if(trace._hasColorscale) { + var vals = hasC ? [cMin, cMax] : [normMin, normMax]; + colorscaleCalc(gd, trace, { + vals: vals, + containerStr: '', + cLetter: 'c' + }); + } return cd; }; diff --git a/src/traces/quiver/defaults.js b/src/traces/quiver/defaults.js index 9ba70a09d46..d50dec61c47 100644 --- a/src/traces/quiver/defaults.js +++ b/src/traces/quiver/defaults.js @@ -2,6 +2,7 @@ var Lib = require('../../lib'); var attributes = require('./attributes'); +var hasColorscale = require('../../components/colorscale/helpers').hasColorscale; var colorscaleDefaults = require('../../components/colorscale/defaults'); module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout) { @@ -75,8 +76,11 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout coerce('vhoverformat'); // Colorscale defaults (adds colorscale, showscale, colorbar, etc.) - traceOut._hasColorscale = true; - colorscaleDefaults(traceIn, traceOut, layout, coerce, { prefix: '', cLetter: 'c' }); + var withColorscale = hasColorscale(traceIn, '', 'c') || traceIn.coloraxis; + traceOut._hasColorscale = !!withColorscale; + if(withColorscale) { + colorscaleDefaults(traceIn, traceOut, layout, coerce, { prefix: '', cLetter: 'c' }); + } // Selection styling coerce('selected.line.color'); From 3c42defdd184c9d6f9bc308a01a420b05a1cec54 Mon Sep 17 00:00:00 2001 From: degzhaus Date: Mon, 16 Feb 2026 12:42:51 -0800 Subject: [PATCH 18/46] Reuse scatter handleXYDefaults() for quiver x/y coercion, validation, and calendar handling --- src/traces/quiver/defaults.js | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/src/traces/quiver/defaults.js b/src/traces/quiver/defaults.js index d50dec61c47..bace2a6a8a5 100644 --- a/src/traces/quiver/defaults.js +++ b/src/traces/quiver/defaults.js @@ -2,6 +2,7 @@ var Lib = require('../../lib'); var attributes = require('./attributes'); +var handleXYDefaults = require('../scatter/xy_defaults'); var hasColorscale = require('../../components/colorscale/helpers').hasColorscale; var colorscaleDefaults = require('../../components/colorscale/defaults'); @@ -10,25 +11,19 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout return Lib.coerce(traceIn, traceOut, attributes, attr, dflt); } - // Coerce x and y data arrays (this ensures proper data structure for category ordering) - var x = coerce('x'); - var y = coerce('y'); + var len = handleXYDefaults(traceIn, traceOut, layout, coerce); + if(!len) { + traceOut.visible = false; + return; + } + var u = coerce('u'); var v = coerce('v'); // Optional scalar field for colorscale coerce('c'); - // Simple validation - check if we have the required arrays - // Use Lib.isArrayOrTypedArray to support both regular arrays and typed arrays - if(!x || !Lib.isArrayOrTypedArray(x) || x.length === 0 || - !y || !Lib.isArrayOrTypedArray(y) || y.length === 0) { - traceOut.visible = false; - return; - } - // If u/v are missing, default to zeros so the trace participates in calc/category logic - var len = Math.min(x.length, y.length); if(!Lib.isArrayOrTypedArray(u) || u.length === 0) { traceOut.u = new Array(len); for(var i = 0; i < len; i++) traceOut.u[i] = 0; @@ -90,6 +85,4 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout coerce('unselected.line.width'); coerce('unselected.textfont.color'); - // Set the data length - traceOut._length = len; }; From 36cab2193eb7da55db608365a2cb1cc17f64cb7c Mon Sep 17 00:00:00 2001 From: degzhaus Date: Mon, 16 Feb 2026 12:54:54 -0800 Subject: [PATCH 19/46] Move colorscale attrs under marker and replace custom c attribute with standard marker.color --- src/traces/quiver/attributes.js | 28 ++++++++----------- src/traces/quiver/calc.js | 13 +++++---- src/traces/quiver/defaults.js | 8 ++---- src/traces/quiver/plot.js | 11 ++++---- test/image/mocks/quiver_colorscale.json | 12 ++++---- .../image/mocks/quiver_custom-colorscale.json | 26 +++++++++-------- test/jasmine/tests/quiver_test.js | 9 ++---- 7 files changed, 51 insertions(+), 56 deletions(-) diff --git a/src/traces/quiver/attributes.js b/src/traces/quiver/attributes.js index a237d9044f7..742f31d41ee 100644 --- a/src/traces/quiver/attributes.js +++ b/src/traces/quiver/attributes.js @@ -34,13 +34,6 @@ var attrs = { anim: true, description: 'Sets the y components of the arrow vectors.' }, - // Optional scalar field used for colorscale mapping. If omitted, |(u,v)| is used. - c: { - valType: 'data_array', - editType: 'calc', - anim: true, - description: 'Sets the scalar values used to map colors via the colorscale. If not provided, the magnitude sqrt(u^2 + v^2) is used.' - }, sizemode: { valType: 'enumerated', values: ['scaled', 'absolute', 'raw'], @@ -181,6 +174,17 @@ var attrs = { description: 'Sets the text font.' }), + // Marker (for colorscale-based coloring of arrows) + marker: extendFlat( + { + editType: 'calc' + }, + colorScaleAttrs('marker', { + showScaleDflt: true, + editTypeOverride: 'calc' + }) + ), + // Selection and styling selected: { line: { @@ -237,16 +241,6 @@ var attrs = { // Extend with base attributes (includes hoverinfo, etc.) extendFlat(attrs, baseAttrs); -// Colorscale attributes to color arrows by |(u,v)| magnitude -extendFlat( - attrs, - colorScaleAttrs('', { - colorAttr: 'u/v norm', - showScaleDflt: true, - editTypeOverride: 'calc' - }) -); - // Add hoverinfo with proper flags for quiver // We need to create a new object to avoid mutating the shared base attributes attrs.hoverinfo = extendFlat({}, baseAttrs.hoverinfo, { diff --git a/src/traces/quiver/calc.js b/src/traces/quiver/calc.js index f6678b31c59..8123c00e443 100644 --- a/src/traces/quiver/calc.js +++ b/src/traces/quiver/calc.js @@ -29,7 +29,8 @@ module.exports = function calc(gd, trace) { var normMax = -Infinity; var cMin = Infinity; var cMax = -Infinity; - var hasC = Lib.isArrayOrTypedArray(trace.c); + var markerColor = (trace.marker || {}).color; + var hasMarkerColorArray = Lib.isArrayOrTypedArray(markerColor); for(var i = 0; i < len; i++) { var cdi = cd[i] = { i: i }; @@ -45,8 +46,8 @@ module.exports = function calc(gd, trace) { } // track ranges for colorscale - if(hasC) { - var ci = trace.c[i]; + if(hasMarkerColorArray) { + var ci = markerColor[i]; if(isNumeric(ci)) { if(ci < cMin) cMin = ci; if(ci > cMax) cMax = ci; @@ -65,12 +66,12 @@ module.exports = function calc(gd, trace) { // Ensure axes are expanded and categories registered like scatter traces do scatterCalc.calcAxisExpansion(gd, trace, xa, ya, xVals, yVals); - // Colorscale cmin/cmax computation: prefer provided c, else magnitude + // Colorscale cmin/cmax computation: prefer provided marker.color, else magnitude if(trace._hasColorscale) { - var vals = hasC ? [cMin, cMax] : [normMin, normMax]; + var vals = hasMarkerColorArray ? [cMin, cMax] : [normMin, normMax]; colorscaleCalc(gd, trace, { vals: vals, - containerStr: '', + containerStr: 'marker', cLetter: 'c' }); } diff --git a/src/traces/quiver/defaults.js b/src/traces/quiver/defaults.js index bace2a6a8a5..b0a659ca2b2 100644 --- a/src/traces/quiver/defaults.js +++ b/src/traces/quiver/defaults.js @@ -20,9 +20,6 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout var u = coerce('u'); var v = coerce('v'); - // Optional scalar field for colorscale - coerce('c'); - // If u/v are missing, default to zeros so the trace participates in calc/category logic if(!Lib.isArrayOrTypedArray(u) || u.length === 0) { traceOut.u = new Array(len); @@ -71,10 +68,11 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout coerce('vhoverformat'); // Colorscale defaults (adds colorscale, showscale, colorbar, etc.) - var withColorscale = hasColorscale(traceIn, '', 'c') || traceIn.coloraxis; + coerce('marker.color'); + var withColorscale = hasColorscale(traceIn, 'marker') || (traceIn.marker || {}).coloraxis; traceOut._hasColorscale = !!withColorscale; if(withColorscale) { - colorscaleDefaults(traceIn, traceOut, layout, coerce, { prefix: '', cLetter: 'c' }); + colorscaleDefaults(traceIn, traceOut, layout, coerce, { prefix: 'marker.', cLetter: 'c' }); } // Selection styling diff --git a/src/traces/quiver/plot.js b/src/traces/quiver/plot.js index a571e2ef409..84ab82fb1d6 100644 --- a/src/traces/quiver/plot.js +++ b/src/traces/quiver/plot.js @@ -183,14 +183,15 @@ function plotOne(gd, idx, plotinfo, cdscatter, cdscatterAll, element, transition // Apply styling using Plotly's standard styling system Drawing.lineGroupStyle(lineSegments, trace.line && trace.line.width, trace.line && trace.line.color, trace.line && trace.line.dash); - // If colorscale present, color arrows by magnitude |(u,v)| + // If colorscale present, color arrows by marker.color or magnitude |(u,v)| if(trace._hasColorscale) { - var colorFunc = Colorscale.makeColorScaleFuncFromTrace(trace); + var marker = trace.marker || {}; + var colorFunc = Colorscale.makeColorScaleFuncFromTrace(marker); lineSegments.style('stroke', function(cdi) { - var cArr = trace.c; + var markerColor = marker.color; var value; - if(Lib.isArrayOrTypedArray(cArr) && cArr.length > cdi.i && isFinite(cArr[cdi.i])) { - value = cArr[cdi.i]; + if(Lib.isArrayOrTypedArray(markerColor) && markerColor.length > cdi.i && isFinite(markerColor[cdi.i])) { + value = markerColor[cdi.i]; } else { var uVal = (trace.u && trace.u[cdi.i]) || 0; var vVal = (trace.v && trace.v[cdi.i]) || 0; diff --git a/test/image/mocks/quiver_colorscale.json b/test/image/mocks/quiver_colorscale.json index 40987cc87c7..a9471491013 100644 --- a/test/image/mocks/quiver_colorscale.json +++ b/test/image/mocks/quiver_colorscale.json @@ -9,13 +9,15 @@ "sizemode": "scaled", "sizeref": 0.3, "anchor": "tail", - "colorscale": "Viridis", - "showscale": true, + "marker": { + "colorscale": "Viridis", + "showscale": true, + "colorbar": { + "title": {"text": "Magnitude"} + } + }, "line": { "width": 2 - }, - "colorbar": { - "title": {"text": "Magnitude"} } } ], diff --git a/test/image/mocks/quiver_custom-colorscale.json b/test/image/mocks/quiver_custom-colorscale.json index 5a29f3e315b..75461f435d8 100644 --- a/test/image/mocks/quiver_custom-colorscale.json +++ b/test/image/mocks/quiver_custom-colorscale.json @@ -6,27 +6,29 @@ "y": [0, 0, 0, 1, 1, 1, 2, 2, 2], "u": [0.5, 1.5, 2.5, 0.5, 1.5, 2.5, 0.5, 1.5, 2.5], "v": [0.5, 0.5, 0.5, 1.5, 1.5, 1.5, 2.5, 2.5, 2.5], - "c": [1, 2, 3, 2, 3, 4, 3, 4, 5], + "marker": { + "color": [1, 2, 3, 2, 3, 4, 3, 4, 5], + "colorscale": [ + [0, "rgb(0,0,255)"], + [0.5, "rgb(0,255,0)"], + [1, "rgb(255,0,0)"] + ], + "showscale": true, + "colorbar": { + "title": {"text": "Custom Field"}, + "x": 1.02 + } + }, "sizemode": "scaled", "sizeref": 0.25, "anchor": "tail", - "colorscale": [ - [0, "rgb(0,0,255)"], - [0.5, "rgb(0,255,0)"], - [1, "rgb(255,0,0)"] - ], - "showscale": true, "line": { "width": 2 - }, - "colorbar": { - "title": {"text": "Custom Field"}, - "x": 1.02 } } ], "layout": { - "title": {"text": "Quiver with Custom Scalar Field (c)"}, + "title": {"text": "Quiver with Custom Scalar Field"}, "width": 600, "height": 500, "xaxis": { diff --git a/test/jasmine/tests/quiver_test.js b/test/jasmine/tests/quiver_test.js index 377e34db6c4..6c829a7278e 100644 --- a/test/jasmine/tests/quiver_test.js +++ b/test/jasmine/tests/quiver_test.js @@ -220,8 +220,7 @@ describe('Test quiver interactions', function() { x: [1, 2, 3], y: [1, 2, 3], u: [1, 0, -1], - v: [0, 1, 0], - showscale: false + v: [0, 1, 0] }], layout: { margin: {l: 0, t: 0, r: 0, b: 0}, @@ -251,8 +250,7 @@ describe('Test quiver interactions', function() { y: [1, 2], u: [1, 0], v: [0, 1], - line: {color: 'red'}, - showscale: false + line: {color: 'red'} }, { type: 'quiver', name: 'trace B', @@ -260,8 +258,7 @@ describe('Test quiver interactions', function() { y: [3, 4], u: [-1, 0], v: [0, -1], - line: {color: 'blue'}, - showscale: false + line: {color: 'blue'} }], { margin: {l: 0, t: 0, r: 0, b: 0}, width: 400, From b8e2aa87495c2e823e4c23e3de0c79218f8402da Mon Sep 17 00:00:00 2001 From: degzhaus Date: Mon, 16 Feb 2026 13:01:34 -0800 Subject: [PATCH 20/46] Fix axis autorange to include arrow tips, not just base positions; remove hard-coded ranges from mocks --- src/traces/quiver/calc.js | 81 ++++++++++++++++--- src/traces/quiver/plot.js | 12 +-- test/image/mocks/quiver_anchor.json | 15 +--- test/image/mocks/quiver_arrow-styling.json | 17 +--- test/image/mocks/quiver_colorscale.json | 8 +- .../image/mocks/quiver_custom-colorscale.json | 8 +- test/image/mocks/quiver_multi-trace.json | 40 +++++++++ test/image/mocks/quiver_simple.json | 8 +- test/image/mocks/quiver_sizemode.json | 15 +--- test/image/mocks/quiver_wind.json | 20 ++--- test/image/mocks/quiver_zero-vectors.json | 11 +-- 11 files changed, 135 insertions(+), 100 deletions(-) create mode 100644 test/image/mocks/quiver_multi-trace.json diff --git a/src/traces/quiver/calc.js b/src/traces/quiver/calc.js index 8123c00e443..4423b02abe4 100644 --- a/src/traces/quiver/calc.js +++ b/src/traces/quiver/calc.js @@ -4,7 +4,6 @@ var Lib = require('../../lib'); var Axes = require('../../plots/cartesian/axes'); var isNumeric = require('fast-isnumeric'); var BADNUM = require('../../constants/numerical').BADNUM; -var scatterCalc = require('../scatter/calc'); var colorscaleCalc = require('../../components/colorscale/calc'); /** @@ -19,8 +18,6 @@ module.exports = function calc(gd, trace) { var xVals = xa.makeCalcdata(trace, 'x'); var yVals = ya.makeCalcdata(trace, 'y'); - // u/v are read in plot using the original trace arrays via cdi.i - var len = Math.min(xVals.length, yVals.length); trace._length = len; var cd = new Array(len); @@ -32,6 +29,10 @@ module.exports = function calc(gd, trace) { var markerColor = (trace.marker || {}).color; var hasMarkerColorArray = Lib.isArrayOrTypedArray(markerColor); + var uArr = trace.u || []; + var vArr = trace.v || []; + + // First pass: build calcdata and compute maxNorm (needed for 'scaled' sizemode) for(var i = 0; i < len; i++) { var cdi = cd[i] = { i: i }; var xValid = isNumeric(xVals[i]); @@ -45,26 +46,80 @@ module.exports = function calc(gd, trace) { cdi.y = BADNUM; } - // track ranges for colorscale + var ui = uArr[i] || 0; + var vi = vArr[i] || 0; + var norm = Math.sqrt(ui * ui + vi * vi); + + if(isFinite(norm)) { + if(norm > normMax) normMax = norm; + if(norm < normMin) normMin = norm; + } + if(hasMarkerColorArray) { var ci = markerColor[i]; if(isNumeric(ci)) { if(ci < cMin) cMin = ci; if(ci > cMax) cMax = ci; } + } + } + + // Store maxNorm for use by plot.js + trace._maxNorm = normMax; + + // Compute arrow endpoints for axis expansion. + // We approximate with scaleRatio=1 (exact for square plots, + // close enough for autorange padding in non-square plots). + var sizemode = trace.sizemode || 'scaled'; + var sizeref = (trace.sizeref !== undefined) ? trace.sizeref : (sizemode === 'raw' ? 1 : 0.5); + var anchor = trace.anchor || 'tail'; + + var allX = new Array(len * 2); + var allY = new Array(len * 2); + + for(var k = 0; k < len; k++) { + var xk = xVals[k]; + var yk = yVals[k]; + var uk = uArr[k] || 0; + var vk = vArr[k] || 0; + var nk = Math.sqrt(uk * uk + vk * vk); + + var baseLen; + if(sizemode === 'scaled') { + baseLen = normMax ? (nk / normMax) * sizeref : 0; } else { - var ui = (trace.u && trace.u[i]) || 0; - var vi = (trace.v && trace.v[i]) || 0; - var n = Math.sqrt(ui * ui + vi * vi); - if(isFinite(n)) { - if(n < normMin) normMin = n; - if(n > normMax) normMax = n; - } + baseLen = nk * sizeref; + } + + var unitxk = nk ? (uk / nk) : 0; + var unityk = nk ? (vk / nk) : 0; + var dxk = unitxk * baseLen; + var dyk = unityk * baseLen; + + if(anchor === 'tip') { + allX[k * 2] = xk; + allY[k * 2] = yk; + allX[k * 2 + 1] = xk - dxk; + allY[k * 2 + 1] = yk - dyk; + } else if(anchor === 'cm' || anchor === 'center' || anchor === 'middle') { + allX[k * 2] = xk - dxk / 2; + allY[k * 2] = yk - dyk / 2; + allX[k * 2 + 1] = xk + dxk / 2; + allY[k * 2 + 1] = yk + dyk / 2; + } else { // tail (default) + allX[k * 2] = xk; + allY[k * 2] = yk; + allX[k * 2 + 1] = xk + dxk; + allY[k * 2 + 1] = yk + dyk; } } - // Ensure axes are expanded and categories registered like scatter traces do - scatterCalc.calcAxisExpansion(gd, trace, xa, ya, xVals, yVals); + // Expand axes to include both base positions and arrow tips + xa._minDtick = 0; + ya._minDtick = 0; + + trace._extremes[xa._id] = Axes.findExtremes(xa, allX, {padded: true}); + trace._extremes[ya._id] = Axes.findExtremes(ya, allY, {padded: true}); // Colorscale cmin/cmax computation: prefer provided marker.color, else magnitude if(trace._hasColorscale) { diff --git a/src/traces/quiver/plot.js b/src/traces/quiver/plot.js index 84ab82fb1d6..86a2f723c2a 100644 --- a/src/traces/quiver/plot.js +++ b/src/traces/quiver/plot.js @@ -80,16 +80,8 @@ function plotOne(gd, idx, plotinfo, cdscatter, cdscatterAll, element, transition lineSegments.exit().remove(); - // Precompute norms for sizing - var uArr = trace.u || []; - var vArr = trace.v || []; - var maxNorm = 0; - for(var ni = 0; ni < trace._length; ni++) { - var uu = uArr[ni] || 0; - var vv = vArr[ni] || 0; - var nrm = Math.sqrt(uu * uu + vv * vv); - if(nrm > maxNorm) maxNorm = nrm; - } + // Use maxNorm precomputed in calc + var maxNorm = trace._maxNorm || 0; var sizemode = trace.sizemode || 'scaled'; var sizeref = (trace.sizeref !== undefined) ? trace.sizeref : (sizemode === 'raw' ? 1 : 0.5); var anchor = trace.anchor || 'tail'; diff --git a/test/image/mocks/quiver_anchor.json b/test/image/mocks/quiver_anchor.json index dc0a157e889..c16e5e2d10d 100644 --- a/test/image/mocks/quiver_anchor.json +++ b/test/image/mocks/quiver_anchor.json @@ -14,7 +14,6 @@ "color": "red", "width": 2 }, - "showscale": false, "xaxis": "x", "yaxis": "y" }, @@ -32,7 +31,6 @@ "color": "blue", "width": 2 }, - "showscale": false, "xaxis": "x2", "yaxis": "y2" }, @@ -50,7 +48,6 @@ "color": "green", "width": 2 }, - "showscale": false, "xaxis": "x3", "yaxis": "y3" } @@ -61,32 +58,26 @@ "showlegend": true, "xaxis": { "domain": [0, 0.3], - "range": [-0.5, 2.5], "title": {"text": "tail anchor"} }, "yaxis": { - "domain": [0, 1], - "range": [-0.5, 1.5] + "domain": [0, 1] }, "xaxis2": { "domain": [0.35, 0.65], - "range": [-0.5, 2.5], "title": {"text": "tip anchor"} }, "yaxis2": { "domain": [0, 1], - "anchor": "x2", - "range": [0, 2] + "anchor": "x2" }, "xaxis3": { "domain": [0.7, 1], - "range": [-0.5, 2.5], "title": {"text": "center anchor"} }, "yaxis3": { "domain": [0, 1], - "anchor": "x3", - "range": [1, 3] + "anchor": "x3" } } } diff --git a/test/image/mocks/quiver_arrow-styling.json b/test/image/mocks/quiver_arrow-styling.json index d080d62515c..2a74a96a884 100644 --- a/test/image/mocks/quiver_arrow-styling.json +++ b/test/image/mocks/quiver_arrow-styling.json @@ -14,8 +14,7 @@ "line": { "color": "red", "width": 1 - }, - "showscale": false + } }, { "type": "quiver", @@ -31,8 +30,7 @@ "line": { "color": "blue", "width": 2 - }, - "showscale": false + } }, { "type": "quiver", @@ -48,19 +46,12 @@ "line": { "color": "green", "width": 3 - }, - "showscale": false + } } ], "layout": { "width": 500, "height": 600, - "showlegend": true, - "xaxis": { - "range": [-0.5, 2.5] - }, - "yaxis": { - "range": [-0.5, 2.5] - } + "showlegend": true } } diff --git a/test/image/mocks/quiver_colorscale.json b/test/image/mocks/quiver_colorscale.json index a9471491013..897cb5cca51 100644 --- a/test/image/mocks/quiver_colorscale.json +++ b/test/image/mocks/quiver_colorscale.json @@ -23,12 +23,6 @@ ], "layout": { "width": 600, - "height": 500, - "xaxis": { - "range": [-0.5, 2.5] - }, - "yaxis": { - "range": [-0.5, 2.5] - } + "height": 500 } } diff --git a/test/image/mocks/quiver_custom-colorscale.json b/test/image/mocks/quiver_custom-colorscale.json index 75461f435d8..9cf8854a094 100644 --- a/test/image/mocks/quiver_custom-colorscale.json +++ b/test/image/mocks/quiver_custom-colorscale.json @@ -30,12 +30,6 @@ "layout": { "title": {"text": "Quiver with Custom Scalar Field"}, "width": 600, - "height": 500, - "xaxis": { - "range": [-0.5, 2.5] - }, - "yaxis": { - "range": [-0.5, 2.5] - } + "height": 500 } } diff --git a/test/image/mocks/quiver_multi-trace.json b/test/image/mocks/quiver_multi-trace.json new file mode 100644 index 00000000000..f6332936b93 --- /dev/null +++ b/test/image/mocks/quiver_multi-trace.json @@ -0,0 +1,40 @@ +{ + "data": [ + { + "type": "quiver", + "name": "Field A", + "x": [0, 1, 2, 0, 1, 2], + "y": [0, 0, 0, 1, 1, 1], + "u": [1, 1.5, 2, 1, 1.5, 2], + "v": [0.5, 1, 0.5, 1, 1.5, 1], + "sizemode": "scaled", + "sizeref": 0.4, + "anchor": "tail", + "line": { + "color": "red", + "width": 2 + } + }, + { + "type": "quiver", + "name": "Field B", + "x": [3, 4, 5, 3, 4, 5], + "y": [0, 0, 0, 1, 1, 1], + "u": [-1, -1.5, -2, -1, -1.5, -2], + "v": [1, 0.5, 1, 0.5, 1, 0.5], + "sizemode": "scaled", + "sizeref": 0.4, + "anchor": "tail", + "line": { + "color": "blue", + "width": 2 + } + } + ], + "layout": { + "title": {"text": "Multiple Quiver Traces"}, + "width": 700, + "height": 500, + "showlegend": true + } +} diff --git a/test/image/mocks/quiver_simple.json b/test/image/mocks/quiver_simple.json index 3b9edbf5f78..b1539e017d0 100644 --- a/test/image/mocks/quiver_simple.json +++ b/test/image/mocks/quiver_simple.json @@ -16,12 +16,6 @@ ], "layout": { "width": 500, - "height": 500, - "xaxis": { - "range": [-0.5, 2.5] - }, - "yaxis": { - "range": [-0.5, 2.5] - } + "height": 500 } } diff --git a/test/image/mocks/quiver_sizemode.json b/test/image/mocks/quiver_sizemode.json index 4a8ade18ebd..7b412afaded 100644 --- a/test/image/mocks/quiver_sizemode.json +++ b/test/image/mocks/quiver_sizemode.json @@ -14,7 +14,6 @@ "color": "red", "width": 2 }, - "showscale": false, "xaxis": "x", "yaxis": "y" }, @@ -32,7 +31,6 @@ "color": "blue", "width": 2 }, - "showscale": false, "xaxis": "x2", "yaxis": "y2" }, @@ -50,7 +48,6 @@ "color": "green", "width": 2 }, - "showscale": false, "xaxis": "x3", "yaxis": "y3" } @@ -61,32 +58,26 @@ "showlegend": true, "xaxis": { "domain": [0, 0.3], - "range": [-0.5, 2.5], "title": {"text": "scaled"} }, "yaxis": { - "domain": [0, 1], - "range": [-0.5, 0.5] + "domain": [0, 1] }, "xaxis2": { "domain": [0.35, 0.65], - "range": [-0.5, 2.5], "title": {"text": "absolute"} }, "yaxis2": { "domain": [0, 1], - "anchor": "x2", - "range": [0.5, 1.5] + "anchor": "x2" }, "xaxis3": { "domain": [0.7, 1], - "range": [-0.5, 2.5], "title": {"text": "raw"} }, "yaxis3": { "domain": [0, 1], - "anchor": "x3", - "range": [1.5, 2.5] + "anchor": "x3" } } } diff --git a/test/image/mocks/quiver_wind.json b/test/image/mocks/quiver_wind.json index 9ae94159d0e..cea3a550e17 100644 --- a/test/image/mocks/quiver_wind.json +++ b/test/image/mocks/quiver_wind.json @@ -26,14 +26,16 @@ "sizemode": "scaled", "sizeref": 0.2, "anchor": "center", - "colorscale": "Jet", - "showscale": true, + "marker": { + "colorscale": "Jet", + "showscale": true, + "colorbar": { + "title": {"text": "Speed"}, + "x": 1.02 + } + }, "line": { "width": 1.5 - }, - "colorbar": { - "title": {"text": "Speed"}, - "x": 1.02 } } ], @@ -42,12 +44,10 @@ "width": 700, "height": 600, "xaxis": { - "title": {"text": "X"}, - "range": [-0.2, 3.2] + "title": {"text": "X"} }, "yaxis": { - "title": {"text": "Y"}, - "range": [-0.2, 2.2] + "title": {"text": "Y"} } } } diff --git a/test/image/mocks/quiver_zero-vectors.json b/test/image/mocks/quiver_zero-vectors.json index aeb8760aeb2..b7384edcb40 100644 --- a/test/image/mocks/quiver_zero-vectors.json +++ b/test/image/mocks/quiver_zero-vectors.json @@ -13,19 +13,12 @@ "line": { "color": "purple", "width": 2 - }, - "showscale": false + } } ], "layout": { "title": {"text": "Quiver with Zero-Length Vectors"}, "width": 600, - "height": 400, - "xaxis": { - "range": [-0.5, 4.5] - }, - "yaxis": { - "range": [0, 2] - } + "height": 400 } } From 13bb96a5642cc0f06f24c7b6096f04f7a125a46f Mon Sep 17 00:00:00 2001 From: degzhaus Date: Mon, 16 Feb 2026 13:12:28 -0800 Subject: [PATCH 21/46] Add legend line icon for quiver traces by including quiver in getStyleGuide showLine check --- src/components/legend/style.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/legend/style.js b/src/components/legend/style.js index d2b3350c0c8..16ff8e716a4 100644 --- a/src/components/legend/style.js +++ b/src/components/legend/style.js @@ -683,7 +683,7 @@ function getGradientDirection(reversescale, isRadial) { function getStyleGuide(d) { var trace = d[0].trace; var contours = trace.contours; - var showLine = subTypes.hasLines(trace); + var showLine = subTypes.hasLines(trace) || (trace.visible && trace.type === 'quiver'); var showMarker = subTypes.hasMarkers(trace); var showFill = trace.visible && trace.fill && trace.fill !== 'none'; From d4ad7baa25b2c8bea120fff63ee46d825e9e164f Mon Sep 17 00:00:00 2001 From: degzhaus Date: Mon, 16 Feb 2026 13:14:31 -0800 Subject: [PATCH 22/46] Add marker_colorbar config to quiver module so colorbars render correctly --- src/traces/quiver/index.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/traces/quiver/index.js b/src/traces/quiver/index.js index f01dc527851..42d17716358 100644 --- a/src/traces/quiver/index.js +++ b/src/traces/quiver/index.js @@ -18,6 +18,7 @@ module.exports = { formatLabels: require('./format_labels'), eventData: require('./event_data'), selectPoints: require('../scatter/select'), + colorbar: require('../scatter/marker_colorbar'), animatable: true, meta: { From 7556092cd7484474db8712e7d9bb5ee7deb6a79f Mon Sep 17 00:00:00 2001 From: degzhaus Date: Mon, 16 Feb 2026 13:35:13 -0800 Subject: [PATCH 23/46] Implement visual text label rendering for quiver using shared Drawing.textPointStyle utility --- src/traces/quiver/calc.js | 12 ++++++++++++ src/traces/quiver/plot.js | 30 +++++++++++++++++++++++++++++ test/image/mocks/quiver_simple.json | 3 +++ 3 files changed, 45 insertions(+) diff --git a/src/traces/quiver/calc.js b/src/traces/quiver/calc.js index 4423b02abe4..c7a13bca831 100644 --- a/src/traces/quiver/calc.js +++ b/src/traces/quiver/calc.js @@ -121,6 +121,18 @@ module.exports = function calc(gd, trace) { trace._extremes[xa._id] = Axes.findExtremes(xa, allX, {padded: true}); trace._extremes[ya._id] = Axes.findExtremes(ya, allY, {padded: true}); + // Merge text arrays into calcdata for Drawing.textPointStyle + Lib.mergeArray(trace.text, cd, 'tx'); + Lib.mergeArray(trace.textposition, cd, 'tp'); + if(trace.textfont) { + Lib.mergeArrayCastPositive(trace.textfont.size, cd, 'ts'); + Lib.mergeArray(trace.textfont.color, cd, 'tc'); + Lib.mergeArray(trace.textfont.family, cd, 'tf'); + Lib.mergeArray(trace.textfont.weight, cd, 'tw'); + Lib.mergeArray(trace.textfont.style, cd, 'ty'); + Lib.mergeArray(trace.textfont.variant, cd, 'tv'); + } + // Colorscale cmin/cmax computation: prefer provided marker.color, else magnitude if(trace._hasColorscale) { var vals = hasMarkerColorArray ? [cMin, cMax] : [normMin, normMax]; diff --git a/src/traces/quiver/plot.js b/src/traces/quiver/plot.js index 86a2f723c2a..3e2c13ac3aa 100644 --- a/src/traces/quiver/plot.js +++ b/src/traces/quiver/plot.js @@ -193,6 +193,36 @@ function plotOne(gd, idx, plotinfo, cdscatter, cdscatterAll, element, transition }); } + // Render text labels at data points + var textGroup = d3.select(element).selectAll('g.text') + .data([cdscatter]); + + textGroup.enter().append('g').classed('text', true); + + Drawing.setClipUrl(textGroup, plotinfo.layerClipId, gd); + + var textJoin = textGroup.selectAll('g.textpoint') + .data(cdscatter); + + textJoin.enter().append('g').classed('textpoint', true).append('text'); + textJoin.exit().remove(); + + textJoin.each(function(d) { + var g = d3.select(this); + var hasNode = Drawing.translatePoint(d, g.select('text'), xa, ya); + if(!hasNode) g.remove(); + }); + + textJoin.selectAll('text') + .call(Drawing.textPointStyle, trace, gd) + .each(function(d) { + var x = xa.c2p(d.x); + var y = ya.c2p(d.y); + d3.select(this).selectAll('tspan.line').each(function() { + d3.select(this).attr({x: x, y: y}); + }); + }); + // Handle transitions if(transitionOpts && transitionOpts.duration > 0) { var transition = d3.transition() diff --git a/test/image/mocks/quiver_simple.json b/test/image/mocks/quiver_simple.json index b1539e017d0..b7c0aa6d581 100644 --- a/test/image/mocks/quiver_simple.json +++ b/test/image/mocks/quiver_simple.json @@ -6,6 +6,9 @@ "y": [0, 0, 0, 1, 1, 1, 2, 2, 2], "u": [1, 0, -1, 1, 0, -1, 1, 0, -1], "v": [0, 1, 0, 0, 1, 0, 0, 1, 0], + "text": ["A", "B", "C", "D", "E", "F", "G", "H", "I"], + "textposition": "top center", + "textfont": { "size": 12 }, "sizemode": "scaled", "sizeref": 0.5, "anchor": "tail", From fa078c2143f5afead65ffc6550285a76a9d08ef6 Mon Sep 17 00:00:00 2001 From: degzhaus Date: Mon, 16 Feb 2026 13:38:27 -0800 Subject: [PATCH 24/46] Implement per-arrow selected/unselected styling with opacity dimming for unselected arrows --- src/traces/quiver/style.js | 35 ++++++++++++++++++++++++++++++++--- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/src/traces/quiver/style.js b/src/traces/quiver/style.js index 3e910b6d091..c65dede56a9 100644 --- a/src/traces/quiver/style.js +++ b/src/traces/quiver/style.js @@ -3,6 +3,8 @@ var d3 = require('@plotly/d3'); var Drawing = require('../../components/drawing'); +var Color = require('../../components/color'); +var DESELECTDIM = require('../../constants/interactions').DESELECTDIM; function style(gd) { var s = d3.select(gd).selectAll('g.trace.quiver'); @@ -22,9 +24,36 @@ function styleOnSelect(gd, cd, sel) { if(!sel) return; - // Style the line paths based on selection state - sel.selectAll('path.js-line') - .call(Drawing.lineGroupStyle, line.width, line.color, line.dash); + if(trace.selectedpoints) { + var selectedAttrs = trace.selected || {}; + var unselectedAttrs = trace.unselected || {}; + var selectedLine = selectedAttrs.line || {}; + var unselectedLine = unselectedAttrs.line || {}; + + sel.selectAll('path.js-line').each(function(d) { + var path = d3.select(this); + + if(d.selected) { + var sc = selectedLine.color || line.color; + var sw = selectedLine.width !== undefined ? selectedLine.width : line.width; + Drawing.lineGroupStyle(path, sw, sc, line.dash); + } else { + var uc = unselectedLine.color; + var uw = unselectedLine.width; + if(!uc) { + uc = line.color ? Color.addOpacity(line.color, DESELECTDIM) : undefined; + } + if(uw === undefined) uw = line.width; + Drawing.lineGroupStyle(path, uw, uc, line.dash); + } + }); + + Drawing.selectedTextStyle(sel.selectAll('text'), trace); + } else { + sel.selectAll('path.js-line') + .call(Drawing.lineGroupStyle, line.width, line.color, line.dash); + Drawing.textPointStyle(sel.selectAll('text'), trace, gd); + } } module.exports = { From 9cb41db274b73cdf7cd9aa0efb1329536c158a9c Mon Sep 17 00:00:00 2001 From: degzhaus Date: Mon, 16 Feb 2026 13:40:31 -0800 Subject: [PATCH 25/46] Run npm run schema --- test/plot-schema.json | 1886 +++++++++++++++++++++-------------------- 1 file changed, 945 insertions(+), 941 deletions(-) diff --git a/test/plot-schema.json b/test/plot-schema.json index 79222983c5a..d5fe0d3b366 100644 --- a/test/plot-schema.json +++ b/test/plot-schema.json @@ -57657,266 +57657,120 @@ "min": 0.1, "valType": "number" }, - "autocolorscale": { - "description": "Determines whether the colorscale is a default palette (`autocolorscale: true`) or the palette determined by `colorscale`. In case `colorscale` is unspecified or `autocolorscale` is true, the default palette will be chosen according to whether numbers in the `color` array are all positive, all negative or mixed.", - "dflt": true, - "editType": "calc", - "impliedEdits": {}, - "valType": "boolean" - }, - "c": { - "anim": true, - "description": "Sets the scalar values used to map colors via the colorscale. If not provided, the magnitude sqrt(u^2 + v^2) is used.", + "customdata": { + "description": "Assigns extra data each datum. This may be useful when listening to hover, click and selection events. Note that, *scatter* traces also appends customdata items in the markers DOM elements", "editType": "calc", "valType": "data_array" }, - "cauto": { - "description": "Determines whether or not the color domain is computed with respect to the input data (here u/v norm) or the bounds set in `cmin` and `cmax` Defaults to `false` when `cmin` and `cmax` are set by the user.", - "dflt": true, - "editType": "calc", - "impliedEdits": {}, - "valType": "boolean" - }, - "cmax": { - "description": "Sets the upper bound of the color domain. Value should have the same units as u/v norm and if set, `cmin` must be set as well.", - "dflt": null, - "editType": "calc", - "impliedEdits": { - "cauto": false - }, - "valType": "number" + "customdatasrc": { + "description": "Sets the source reference on Chart Studio Cloud for `customdata`.", + "editType": "none", + "valType": "string" }, - "cmid": { - "description": "Sets the mid-point of the color domain by scaling `cmin` and/or `cmax` to be equidistant to this point. Value should have the same units as u/v norm. Has no effect when `cauto` is `false`.", - "dflt": null, + "hoverdistance": { + "description": "Maximum distance (in pixels) to look for nearby arrows on hover.", + "dflt": 20, "editType": "calc", - "impliedEdits": {}, + "min": -1, "valType": "number" }, - "cmin": { - "description": "Sets the lower bound of the color domain. Value should have the same units as u/v norm and if set, `cmax` must be set as well.", - "dflt": null, - "editType": "calc", - "impliedEdits": { - "cauto": false - }, - "valType": "number" + "hoverinfo": { + "arrayOk": true, + "description": "Determines which trace information appear on hover. If `none` or `skip` are set, no information is displayed upon hovering. But, if `none` is set, click and hover events are still fired.", + "dflt": "all", + "editType": "none", + "extras": [ + "all", + "none", + "skip" + ], + "flags": [ + "x", + "y", + "u", + "v", + "text", + "name" + ], + "valType": "flaglist" }, - "coloraxis": { - "description": "Sets a reference to a shared color axis. References to these shared color axes are *coloraxis*, *coloraxis2*, *coloraxis3*, etc. Settings for these shared color axes are set in the layout, under `layout.coloraxis`, `layout.coloraxis2`, etc. Note that multiple color scales can be linked to the same color axis.", - "dflt": null, - "editType": "calc", - "regex": "/^coloraxis([2-9]|[1-9][0-9]+)?$/", - "valType": "subplotid" + "hoverinfosrc": { + "description": "Sets the source reference on Chart Studio Cloud for `hoverinfo`.", + "editType": "none", + "valType": "string" }, - "colorbar": { - "bgcolor": { - "description": "Sets the color of padded area.", - "dflt": "rgba(0,0,0,0)", - "editType": "colorbars", - "valType": "color" - }, - "bordercolor": { - "description": "Sets the axis line color.", - "dflt": "#444", - "editType": "colorbars", - "valType": "color" - }, - "borderwidth": { - "description": "Sets the width (in px) or the border enclosing this color bar.", - "dflt": 0, - "editType": "colorbars", - "min": 0, - "valType": "number" - }, - "dtick": { - "description": "Sets the step in-between ticks on this axis. Use with `tick0`. Must be a positive number, or special strings available to *log* and *date* axes. If the axis `type` is *log*, then ticks are set every 10^(n*dtick) where n is the tick number. For example, to set a tick mark at 1, 10, 100, 1000, ... set dtick to 1. To set tick marks at 1, 100, 10000, ... set dtick to 2. To set tick marks at 1, 5, 25, 125, 625, 3125, ... set dtick to log_10(5), or 0.69897000433. *log* has several special values; *L*, where `f` is a positive number, gives ticks linearly spaced in value (but not position). For example `tick0` = 0.1, `dtick` = *L0.5* will put ticks at 0.1, 0.6, 1.1, 1.6 etc. To show powers of 10 plus small digits between, use *D1* (all digits) or *D2* (only 2 and 5). `tick0` is ignored for *D1* and *D2*. If the axis `type` is *date*, then you must convert the time to milliseconds. For example, to set the interval between ticks to one day, set `dtick` to 86400000.0. *date* also has special values *M* gives ticks spaced by a number of months. `n` must be a positive integer. To set ticks on the 15th of every third month, set `tick0` to *2000-01-15* and `dtick` to *M3*. To set ticks every 4 years, set `dtick` to *M48*", - "editType": "colorbars", - "impliedEdits": { - "tickmode": "linear" - }, - "valType": "any" - }, - "editType": "colorbars", - "exponentformat": { - "description": "Determines a formatting rule for the tick exponents. For example, consider the number 1,000,000,000. If *none*, it appears as 1,000,000,000. If *e*, 1e+9. If *E*, 1E+9. If *power*, 1x10^9 (with 9 in a super script). If *SI*, 1G. If *B*, 1B. *SI* uses prefixes from \"femto\" f (10^-15) to \"tera\" T (10^12). *SI extended* covers instead the full SI range from \"quecto\" q (10^-30) to \"quetta\" Q (10^30). If *SI* or *SI extended* is used and the exponent is beyond the above ranges, the formatting rule will automatically be switched to the power notation.", - "dflt": "B", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "none", - "e", - "E", - "power", - "SI", - "B", - "SI extended" - ] - }, - "labelalias": { - "description": "Replacement text for specific tick or hover labels. For example using {US: 'USA', CA: 'Canada'} changes US to USA and CA to Canada. The labels we would have shown must match the keys exactly, after adding any tickprefix or ticksuffix. For negative numbers the minus sign symbol used (U+2212) is wider than the regular ascii dash. That means you need to use −1 instead of -1. labelalias can be used with any axis type, and both keys (if needed) and values (if desired) can include html-like tags or MathJax.", - "dflt": false, - "editType": "colorbars", - "valType": "any" - }, - "len": { - "description": "Sets the length of the color bar This measure excludes the padding of both ends. That is, the color bar length is this length minus the padding on both ends.", - "dflt": 1, - "editType": "colorbars", - "min": 0, - "valType": "number" - }, - "lenmode": { - "description": "Determines whether this color bar's length (i.e. the measure in the color variation direction) is set in units of plot *fraction* or in *pixels. Use `len` to set the value.", - "dflt": "fraction", - "editType": "colorbars", + "hoverlabel": { + "align": { + "arrayOk": true, + "description": "Sets the horizontal alignment of the text content within hover label box. Has an effect only if the hover label text spans more two or more lines", + "dflt": "auto", + "editType": "none", "valType": "enumerated", "values": [ - "fraction", - "pixels" + "left", + "right", + "auto" ] }, - "minexponent": { - "description": "Hide SI prefix for 10^n if |n| is below this number. This only has an effect when `tickformat` is *SI* or *B*.", - "dflt": 3, - "editType": "colorbars", - "min": 0, - "valType": "number" - }, - "nticks": { - "description": "Specifies the maximum number of ticks for the particular axis. The actual number of ticks will be chosen automatically to be less than or equal to `nticks`. Has an effect only if `tickmode` is set to *auto*.", - "dflt": 0, - "editType": "colorbars", - "min": 0, - "valType": "integer" - }, - "orientation": { - "description": "Sets the orientation of the colorbar.", - "dflt": "v", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "h", - "v" - ] + "alignsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `align`.", + "editType": "none", + "valType": "string" }, - "outlinecolor": { - "description": "Sets the axis line color.", - "dflt": "#444", - "editType": "colorbars", + "bgcolor": { + "arrayOk": true, + "description": "Sets the background color of the hover labels for this trace", + "editType": "none", "valType": "color" }, - "outlinewidth": { - "description": "Sets the width (in px) of the axis line.", - "dflt": 1, - "editType": "colorbars", - "min": 0, - "valType": "number" - }, - "role": "object", - "separatethousands": { - "description": "If \"true\", even 4-digit integers are separated", - "dflt": false, - "editType": "colorbars", - "valType": "boolean" - }, - "showexponent": { - "description": "If *all*, all exponents are shown besides their significands. If *first*, only the exponent of the first tick is shown. If *last*, only the exponent of the last tick is shown. If *none*, no exponents appear.", - "dflt": "all", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "all", - "first", - "last", - "none" - ] - }, - "showticklabels": { - "description": "Determines whether or not the tick labels are drawn.", - "dflt": true, - "editType": "colorbars", - "valType": "boolean" - }, - "showtickprefix": { - "description": "If *all*, all tick labels are displayed with a prefix. If *first*, only the first tick is displayed with a prefix. If *last*, only the last tick is displayed with a suffix. If *none*, tick prefixes are hidden.", - "dflt": "all", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "all", - "first", - "last", - "none" - ] + "bgcolorsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `bgcolor`.", + "editType": "none", + "valType": "string" }, - "showticksuffix": { - "description": "Same as `showtickprefix` but for tick suffixes.", - "dflt": "all", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "all", - "first", - "last", - "none" - ] + "bordercolor": { + "arrayOk": true, + "description": "Sets the border color of the hover labels for this trace.", + "editType": "none", + "valType": "color" }, - "thickness": { - "description": "Sets the thickness of the color bar This measure excludes the size of the padding, ticks and labels.", - "dflt": 30, - "editType": "colorbars", - "min": 0, - "valType": "number" + "bordercolorsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `bordercolor`.", + "editType": "none", + "valType": "string" }, - "thicknessmode": { - "description": "Determines whether this color bar's thickness (i.e. the measure in the constant color direction) is set in units of plot *fraction* or in *pixels*. Use `thickness` to set the value.", - "dflt": "pixels", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "fraction", - "pixels" - ] - }, - "tick0": { - "description": "Sets the placement of the first tick on this axis. Use with `dtick`. If the axis `type` is *log*, then you must take the log of your starting tick (e.g. to set the starting tick to 100, set the `tick0` to 2) except when `dtick`=*L* (see `dtick` for more info). If the axis `type` is *date*, it should be a date string, like date data. If the axis `type` is *category*, it should be a number, using the scale where each category is assigned a serial number from zero in the order it appears.", - "editType": "colorbars", - "impliedEdits": { - "tickmode": "linear" - }, - "valType": "any" - }, - "tickangle": { - "description": "Sets the angle of the tick labels with respect to the horizontal. For example, a `tickangle` of -90 draws the tick labels vertically.", - "dflt": "auto", - "editType": "colorbars", - "valType": "angle" - }, - "tickcolor": { - "description": "Sets the tick color.", - "dflt": "#444", - "editType": "colorbars", - "valType": "color" - }, - "tickfont": { + "editType": "none", + "font": { "color": { - "editType": "colorbars", + "arrayOk": true, + "editType": "none", "valType": "color" }, - "description": "Sets the color bar's tick label font", - "editType": "colorbars", + "colorsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `color`.", + "editType": "none", + "valType": "string" + }, + "description": "Sets the font used in hover labels.", + "editType": "none", "family": { + "arrayOk": true, "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", - "editType": "colorbars", + "editType": "none", "noBlank": true, "strict": true, "valType": "string" }, + "familysrc": { + "description": "Sets the source reference on Chart Studio Cloud for `family`.", + "editType": "none", + "valType": "string" + }, "lineposition": { + "arrayOk": true, "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", "dflt": "none", - "editType": "colorbars", + "editType": "none", "extras": [ "none" ], @@ -57927,32 +57781,56 @@ ], "valType": "flaglist" }, + "linepositionsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `lineposition`.", + "editType": "none", + "valType": "string" + }, "role": "object", "shadow": { + "arrayOk": true, "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", "dflt": "none", - "editType": "colorbars", + "editType": "none", + "valType": "string" + }, + "shadowsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `shadow`.", + "editType": "none", "valType": "string" }, "size": { - "editType": "colorbars", + "arrayOk": true, + "editType": "none", "min": 1, "valType": "number" }, + "sizesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `size`.", + "editType": "none", + "valType": "string" + }, "style": { + "arrayOk": true, "description": "Sets whether a font should be styled with a normal or italic face from its family.", "dflt": "normal", - "editType": "colorbars", + "editType": "none", "valType": "enumerated", "values": [ "normal", "italic" ] }, + "stylesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `style`.", + "editType": "none", + "valType": "string" + }, "textcase": { + "arrayOk": true, "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", "dflt": "normal", - "editType": "colorbars", + "editType": "none", "valType": "enumerated", "values": [ "normal", @@ -57961,10 +57839,16 @@ "lower" ] }, + "textcasesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `textcase`.", + "editType": "none", + "valType": "string" + }, "variant": { + "arrayOk": true, "description": "Sets the variant of the font.", "dflt": "normal", - "editType": "colorbars", + "editType": "none", "valType": "enumerated", "values": [ "normal", @@ -57975,10 +57859,16 @@ "unicase" ] }, + "variantsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `variant`.", + "editType": "none", + "valType": "string" + }, "weight": { + "arrayOk": true, "description": "Sets the weight (or boldness) of the font.", "dflt": "normal", - "editType": "colorbars", + "editType": "none", "extras": [ "normal", "bold" @@ -57986,464 +57876,89 @@ "max": 1000, "min": 1, "valType": "integer" - } - }, - "tickformat": { - "description": "Sets the tick label formatting rule using d3 formatting mini-languages which are very similar to those in Python. For numbers, see: https://github.com/d3/d3-format/tree/v1.4.5#d3-format. And for dates see: https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format. We add two items to d3's date formatter: *%h* for half of the year as a decimal number as well as *%{n}f* for fractional seconds with n digits. For example, *2016-10-13 09:15:23.456* with tickformat *%H~%M~%S.%2f* would display *09~15~23.46*", - "dflt": "", - "editType": "colorbars", - "valType": "string" - }, - "tickformatstops": { - "items": { - "tickformatstop": { - "dtickrange": { - "description": "range [*min*, *max*], where *min*, *max* - dtick values which describe some zoom level, it is possible to omit *min* or *max* value by passing *null*", - "editType": "colorbars", - "items": [ - { - "editType": "colorbars", - "valType": "any" - }, - { - "editType": "colorbars", - "valType": "any" - } - ], - "valType": "info_array" - }, - "editType": "colorbars", - "enabled": { - "description": "Determines whether or not this stop is used. If `false`, this stop is ignored even within its `dtickrange`.", - "dflt": true, - "editType": "colorbars", - "valType": "boolean" - }, - "name": { - "description": "When used in a template, named items are created in the output figure in addition to any items the figure already has in this array. You can modify these items in the output figure by making your own item with `templateitemname` matching this `name` alongside your modifications (including `visible: false` or `enabled: false` to hide it). Has no effect outside of a template.", - "editType": "colorbars", - "valType": "string" - }, - "role": "object", - "templateitemname": { - "description": "Used to refer to a named item in this array in the template. Named items from the template will be created even without a matching item in the input figure, but you can modify one by making an item with `templateitemname` matching its `name`, alongside your modifications (including `visible: false` or `enabled: false` to hide it). If there is no template or no matching item, this item will be hidden unless you explicitly show it with `visible: true`.", - "editType": "colorbars", - "valType": "string" - }, - "value": { - "description": "string - dtickformat for described zoom level, the same as *tickformat*", - "dflt": "", - "editType": "colorbars", - "valType": "string" - } - } }, - "role": "object" - }, - "ticklabeloverflow": { - "description": "Determines how we handle tick labels that would overflow either the graph div or the domain of the axis. The default value for inside tick labels is *hide past domain*. In other cases the default is *hide past div*.", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "allow", - "hide past div", - "hide past domain" - ] - }, - "ticklabelposition": { - "description": "Determines where tick labels are drawn relative to the ticks. Left and right options are used when `orientation` is *h*, top and bottom when `orientation` is *v*.", - "dflt": "outside", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "outside", - "inside", - "outside top", - "inside top", - "outside left", - "inside left", - "outside right", - "inside right", - "outside bottom", - "inside bottom" - ] + "weightsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `weight`.", + "editType": "none", + "valType": "string" + } }, - "ticklabelstep": { - "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", - "dflt": 1, - "editType": "colorbars", - "min": 1, + "namelength": { + "arrayOk": true, + "description": "Sets the default length (in number of characters) of the trace name in the hover labels for all traces. -1 shows the whole name regardless of length. 0-3 shows the first 0-3 characters, and an integer >3 will show the whole name if it is less than that many characters, but if it is longer, will truncate to `namelength - 3` characters and add an ellipsis.", + "dflt": 15, + "editType": "none", + "min": -1, "valType": "integer" }, - "ticklen": { - "description": "Sets the tick length (in px).", - "dflt": 5, - "editType": "colorbars", - "min": 0, - "valType": "number" - }, - "tickmode": { - "description": "Sets the tick mode for this axis. If *auto*, the number of ticks is set via `nticks`. If *linear*, the placement of the ticks is determined by a starting position `tick0` and a tick step `dtick` (*linear* is the default value if `tick0` and `dtick` are provided). If *array*, the placement of the ticks is set via `tickvals` and the tick text is `ticktext`. (*array* is the default value if `tickvals` is provided).", - "editType": "colorbars", - "impliedEdits": {}, - "valType": "enumerated", - "values": [ - "auto", - "linear", - "array" - ] - }, - "tickprefix": { - "description": "Sets a tick label prefix.", - "dflt": "", - "editType": "colorbars", - "valType": "string" - }, - "ticks": { - "description": "Determines whether ticks are drawn or not. If **, this axis' ticks are not drawn. If *outside* (*inside*), this axis' are drawn outside (inside) the axis lines.", - "dflt": "", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "outside", - "inside", - "" - ] - }, - "ticksuffix": { - "description": "Sets a tick label suffix.", - "dflt": "", - "editType": "colorbars", - "valType": "string" - }, - "ticktext": { - "description": "Sets the text displayed at the ticks position via `tickvals`. Only has an effect if `tickmode` is set to *array*. Used with `tickvals`.", - "editType": "colorbars", - "valType": "data_array" - }, - "ticktextsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `ticktext`.", + "namelengthsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `namelength`.", "editType": "none", "valType": "string" }, - "tickvals": { - "description": "Sets the values at which ticks on this axis appear. Only has an effect if `tickmode` is set to *array*. Used with `ticktext`.", - "editType": "colorbars", - "valType": "data_array" - }, - "tickvalssrc": { - "description": "Sets the source reference on Chart Studio Cloud for `tickvals`.", + "role": "object", + "showarrow": { + "description": "Sets whether or not to show the hover label arrow/triangle pointing to the data point.", + "dflt": true, "editType": "none", - "valType": "string" - }, - "tickwidth": { - "description": "Sets the tick width (in px).", - "dflt": 1, - "editType": "colorbars", - "min": 0, - "valType": "number" - }, - "title": { - "editType": "colorbars", - "font": { - "color": { - "editType": "colorbars", - "valType": "color" - }, - "description": "Sets this color bar's title font.", - "editType": "colorbars", - "family": { - "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", - "editType": "colorbars", - "noBlank": true, - "strict": true, - "valType": "string" - }, - "lineposition": { - "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", - "dflt": "none", - "editType": "colorbars", - "extras": [ - "none" - ], - "flags": [ - "under", - "over", - "through" - ], - "valType": "flaglist" - }, - "role": "object", - "shadow": { - "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", - "dflt": "none", - "editType": "colorbars", - "valType": "string" - }, - "size": { - "editType": "colorbars", - "min": 1, - "valType": "number" - }, - "style": { - "description": "Sets whether a font should be styled with a normal or italic face from its family.", - "dflt": "normal", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "normal", - "italic" - ] - }, - "textcase": { - "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", - "dflt": "normal", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "normal", - "word caps", - "upper", - "lower" - ] - }, - "variant": { - "description": "Sets the variant of the font.", - "dflt": "normal", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "normal", - "small-caps", - "all-small-caps", - "all-petite-caps", - "petite-caps", - "unicase" - ] - }, - "weight": { - "description": "Sets the weight (or boldness) of the font.", - "dflt": "normal", - "editType": "colorbars", - "extras": [ - "normal", - "bold" - ], - "max": 1000, - "min": 1, - "valType": "integer" - } - }, - "role": "object", - "side": { - "description": "Determines the location of color bar's title with respect to the color bar. Defaults to *top* when `orientation` if *v* and defaults to *right* when `orientation` if *h*.", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "right", - "top", - "bottom" - ] - }, - "text": { - "description": "Sets the title of the color bar.", - "editType": "colorbars", - "valType": "string" - } - }, - "x": { - "description": "Sets the x position with respect to `xref` of the color bar (in plot fraction). When `xref` is *paper*, defaults to 1.02 when `orientation` is *v* and 0.5 when `orientation` is *h*. When `xref` is *container*, defaults to *1* when `orientation` is *v* and 0.5 when `orientation` is *h*. Must be between *0* and *1* if `xref` is *container* and between *-2* and *3* if `xref` is *paper*.", - "editType": "colorbars", - "valType": "number" - }, - "xanchor": { - "description": "Sets this color bar's horizontal position anchor. This anchor binds the `x` position to the *left*, *center* or *right* of the color bar. Defaults to *left* when `orientation` is *v* and *center* when `orientation` is *h*.", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "left", - "center", - "right" - ] - }, - "xpad": { - "description": "Sets the amount of padding (in px) along the x direction.", - "dflt": 10, - "editType": "colorbars", - "min": 0, - "valType": "number" - }, - "xref": { - "description": "Sets the container `x` refers to. *container* spans the entire `width` of the plot. *paper* refers to the width of the plotting area only.", - "dflt": "paper", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "container", - "paper" - ] - }, - "y": { - "description": "Sets the y position with respect to `yref` of the color bar (in plot fraction). When `yref` is *paper*, defaults to 0.5 when `orientation` is *v* and 1.02 when `orientation` is *h*. When `yref` is *container*, defaults to 0.5 when `orientation` is *v* and 1 when `orientation` is *h*. Must be between *0* and *1* if `yref` is *container* and between *-2* and *3* if `yref` is *paper*.", - "editType": "colorbars", - "valType": "number" - }, - "yanchor": { - "description": "Sets this color bar's vertical position anchor This anchor binds the `y` position to the *top*, *middle* or *bottom* of the color bar. Defaults to *middle* when `orientation` is *v* and *bottom* when `orientation` is *h*.", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "top", - "middle", - "bottom" - ] - }, - "ypad": { - "description": "Sets the amount of padding (in px) along the y direction.", - "dflt": 10, - "editType": "colorbars", - "min": 0, - "valType": "number" - }, - "yref": { - "description": "Sets the container `y` refers to. *container* spans the entire `height` of the plot. *paper* refers to the height of the plotting area only.", - "dflt": "paper", - "editType": "colorbars", - "valType": "enumerated", - "values": [ - "container", - "paper" - ] + "valType": "boolean" } }, - "colorscale": { - "description": "Sets the colorscale. The colorscale must be an array containing arrays mapping a normalized value to an rgb, rgba, hex, hsl, hsv, or named color string. At minimum, a mapping for the lowest (0) and highest (1) values are required. For example, `[[0, 'rgb(0,0,255)'], [1, 'rgb(255,0,0)']]`. To control the bounds of the colorscale in color space, use `cmin` and `cmax`. Alternatively, `colorscale` may be a palette name string of the following list: Blackbody,Bluered,Blues,Cividis,Earth,Electric,Greens,Greys,Hot,Jet,Picnic,Portland,Rainbow,RdBu,Reds,Viridis,YlGnBu,YlOrRd.", - "dflt": null, - "editType": "calc", - "impliedEdits": { - "autocolorscale": false - }, - "valType": "colorscale" + "hovertemplate": { + "arrayOk": true, + "description": "Template string used for rendering the information that appear on hover box. Note that this will override `hoverinfo`. Variables are inserted using %{variable}, for example \"y: %{y}\" as well as %{xother}, {%_xother}, {%_xother_}, {%xother_}. When showing info for several points, *xother* will be added to those with different x positions from the first point. An underscore before or after *(x|y)other* will add a space on that side, only when this field is shown. Numbers are formatted using d3-format's syntax %{variable:d3-format}, for example \"Price: %{y:$.2f}\". https://github.com/d3/d3-format/tree/v1.4.5#d3-format for details on the formatting syntax. Dates are formatted using d3-time-format's syntax %{variable|d3-time-format}, for example \"Day: %{2019-01-01|%A}\". https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format for details on the date formatting syntax. Variables that can't be found will be replaced with the specifier. For example, a template of \"data: %{x}, %{y}\" will result in a value of \"data: 1, %{y}\" if x is 1 and y is missing. Variables with an undefined value will be replaced with the fallback value. The variables available in `hovertemplate` are the ones emitted as event data described at this link https://plotly.com/javascript/plotlyjs-events/#event-data. Additionally, all attributes that can be specified per-point (the ones that are `arrayOk: true`) are available. Finally, the template string has access to variables `x`, `y`, `u`, `v`, `text` and `name`. Anything contained in tag `` is displayed in the secondary box, for example `%{fullData.name}`. To hide the secondary box completely, use an empty tag ``.", + "dflt": "", + "editType": "none", + "valType": "string" }, - "csrc": { - "description": "Sets the source reference on Chart Studio Cloud for `c`.", + "hovertemplatesrc": { + "description": "Sets the source reference on Chart Studio Cloud for `hovertemplate`.", "editType": "none", "valType": "string" }, - "customdata": { - "description": "Assigns extra data each datum. This may be useful when listening to hover, click and selection events. Note that, *scatter* traces also appends customdata items in the markers DOM elements", + "ids": { + "anim": true, + "description": "Assigns id labels to each datum. These ids for object constancy of data points during animation. Should be an array of strings, not numbers or any other type.", "editType": "calc", "valType": "data_array" }, - "customdatasrc": { - "description": "Sets the source reference on Chart Studio Cloud for `customdata`.", + "idssrc": { + "description": "Sets the source reference on Chart Studio Cloud for `ids`.", "editType": "none", "valType": "string" }, - "hoverdistance": { - "description": "Maximum distance (in pixels) to look for nearby arrows on hover.", - "dflt": 20, - "editType": "calc", - "min": -1, - "valType": "number" - }, - "hoverinfo": { - "arrayOk": true, - "description": "Determines which trace information appear on hover. If `none` or `skip` are set, no information is displayed upon hovering. But, if `none` is set, click and hover events are still fired.", - "dflt": "all", - "editType": "none", - "extras": [ - "all", - "none", - "skip" - ], - "flags": [ - "x", - "y", - "u", - "v", - "text", - "name" - ], - "valType": "flaglist" + "legend": { + "description": "Sets the reference to a legend to show this trace in. References to these legends are *legend*, *legend2*, *legend3*, etc. Settings for these legends are set in the layout, under `layout.legend`, `layout.legend2`, etc.", + "dflt": "legend", + "editType": "style", + "valType": "subplotid" }, - "hoverinfosrc": { - "description": "Sets the source reference on Chart Studio Cloud for `hoverinfo`.", - "editType": "none", + "legendgroup": { + "description": "Sets the legend group for this trace. Traces and shapes part of the same legend group hide/show at the same time when toggling legend items.", + "dflt": "", + "editType": "style", "valType": "string" }, - "hoverlabel": { - "align": { - "arrayOk": true, - "description": "Sets the horizontal alignment of the text content within hover label box. Has an effect only if the hover label text spans more two or more lines", - "dflt": "auto", - "editType": "none", - "valType": "enumerated", - "values": [ - "left", - "right", - "auto" - ] - }, - "alignsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `align`.", - "editType": "none", - "valType": "string" - }, - "bgcolor": { - "arrayOk": true, - "description": "Sets the background color of the hover labels for this trace", - "editType": "none", - "valType": "color" - }, - "bgcolorsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `bgcolor`.", - "editType": "none", - "valType": "string" - }, - "bordercolor": { - "arrayOk": true, - "description": "Sets the border color of the hover labels for this trace.", - "editType": "none", - "valType": "color" - }, - "bordercolorsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `bordercolor`.", - "editType": "none", - "valType": "string" - }, - "editType": "none", + "legendgrouptitle": { + "editType": "style", "font": { "color": { - "arrayOk": true, - "editType": "none", + "editType": "style", "valType": "color" }, - "colorsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `color`.", - "editType": "none", - "valType": "string" - }, - "description": "Sets the font used in hover labels.", - "editType": "none", + "description": "Sets this legend group's title font.", + "editType": "style", "family": { - "arrayOk": true, "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", - "editType": "none", + "editType": "style", "noBlank": true, "strict": true, "valType": "string" }, - "familysrc": { - "description": "Sets the source reference on Chart Studio Cloud for `family`.", - "editType": "none", - "valType": "string" - }, "lineposition": { - "arrayOk": true, "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", "dflt": "none", - "editType": "none", + "editType": "style", "extras": [ "none" ], @@ -58454,332 +57969,833 @@ ], "valType": "flaglist" }, - "linepositionsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `lineposition`.", - "editType": "none", - "valType": "string" - }, "role": "object", "shadow": { - "arrayOk": true, "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", "dflt": "none", - "editType": "none", + "editType": "style", "valType": "string" }, - "shadowsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `shadow`.", - "editType": "none", - "valType": "string" + "size": { + "editType": "style", + "min": 1, + "valType": "number" + }, + "style": { + "description": "Sets whether a font should be styled with a normal or italic face from its family.", + "dflt": "normal", + "editType": "style", + "valType": "enumerated", + "values": [ + "normal", + "italic" + ] + }, + "textcase": { + "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", + "dflt": "normal", + "editType": "style", + "valType": "enumerated", + "values": [ + "normal", + "word caps", + "upper", + "lower" + ] + }, + "variant": { + "description": "Sets the variant of the font.", + "dflt": "normal", + "editType": "style", + "valType": "enumerated", + "values": [ + "normal", + "small-caps", + "all-small-caps", + "all-petite-caps", + "petite-caps", + "unicase" + ] + }, + "weight": { + "description": "Sets the weight (or boldness) of the font.", + "dflt": "normal", + "editType": "style", + "extras": [ + "normal", + "bold" + ], + "max": 1000, + "min": 1, + "valType": "integer" + } + }, + "role": "object", + "text": { + "description": "Sets the title of the legend group.", + "dflt": "", + "editType": "style", + "valType": "string" + } + }, + "legendrank": { + "description": "Sets the legend rank for this trace. Items and groups with smaller ranks are presented on top/left side while with *reversed* `legend.traceorder` they are on bottom/right side. The default legendrank is 1000, so that you can use ranks less than 1000 to place certain items before all unranked items, and ranks greater than 1000 to go after all unranked items. When having unranked or equal rank items shapes would be displayed after traces i.e. according to their order in data and layout.", + "dflt": 1000, + "editType": "style", + "valType": "number" + }, + "legendwidth": { + "description": "Sets the width (in px or fraction) of the legend for this trace.", + "editType": "style", + "min": 0, + "valType": "number" + }, + "line": { + "color": { + "description": "Sets the color of the arrow lines.", + "dflt": "#000", + "editType": "style", + "valType": "color" + }, + "dash": { + "description": "Sets the dash style of lines. Set to a dash type string (*solid*, *dot*, *dash*, *longdash*, *dashdot*, or *longdashdot*) or a dash length list in px (eg *5px,10px,2px,2px*).", + "dflt": "solid", + "editType": "style", + "valType": "string", + "values": [ + "solid", + "dot", + "dash", + "longdash", + "dashdot", + "longdashdot" + ] + }, + "editType": "style", + "role": "object", + "shape": { + "description": "Determines the line shape.", + "dflt": "linear", + "editType": "plot", + "valType": "enumerated", + "values": [ + "linear", + "spline", + "hv", + "vh", + "hvh", + "vhv" + ] + }, + "simplify": { + "description": "Simplifies lines by removing nearly-overlapping points.", + "dflt": true, + "editType": "plot", + "valType": "boolean" + }, + "smoothing": { + "description": "Has an effect only if `shape` is set to *spline*. Sets the amount of smoothing.", + "dflt": 1, + "editType": "plot", + "max": 1.3, + "min": 0, + "valType": "number" + }, + "width": { + "description": "Sets the width (in px) of the arrow lines.", + "dflt": 1, + "editType": "style", + "min": 0, + "valType": "number" + } + }, + "marker": { + "autocolorscale": { + "description": "Determines whether the colorscale is a default palette (`autocolorscale: true`) or the palette determined by `marker.colorscale`. Has an effect only if in `marker.color` is set to a numerical array. In case `colorscale` is unspecified or `autocolorscale` is true, the default palette will be chosen according to whether numbers in the `color` array are all positive, all negative or mixed.", + "dflt": true, + "editType": "calc", + "impliedEdits": {}, + "valType": "boolean" + }, + "cauto": { + "description": "Determines whether or not the color domain is computed with respect to the input data (here in `marker.color`) or the bounds set in `marker.cmin` and `marker.cmax` Has an effect only if in `marker.color` is set to a numerical array. Defaults to `false` when `marker.cmin` and `marker.cmax` are set by the user.", + "dflt": true, + "editType": "calc", + "impliedEdits": {}, + "valType": "boolean" + }, + "cmax": { + "description": "Sets the upper bound of the color domain. Has an effect only if in `marker.color` is set to a numerical array. Value should have the same units as in `marker.color` and if set, `marker.cmin` must be set as well.", + "dflt": null, + "editType": "calc", + "impliedEdits": { + "cauto": false + }, + "valType": "number" + }, + "cmid": { + "description": "Sets the mid-point of the color domain by scaling `marker.cmin` and/or `marker.cmax` to be equidistant to this point. Has an effect only if in `marker.color` is set to a numerical array. Value should have the same units as in `marker.color`. Has no effect when `marker.cauto` is `false`.", + "dflt": null, + "editType": "calc", + "impliedEdits": {}, + "valType": "number" + }, + "cmin": { + "description": "Sets the lower bound of the color domain. Has an effect only if in `marker.color` is set to a numerical array. Value should have the same units as in `marker.color` and if set, `marker.cmax` must be set as well.", + "dflt": null, + "editType": "calc", + "impliedEdits": { + "cauto": false + }, + "valType": "number" + }, + "color": { + "arrayOk": true, + "description": "Sets the marker color. It accepts either a specific color or an array of numbers that are mapped to the colorscale relative to the max and min values of the array or relative to `marker.cmin` and `marker.cmax` if set.", + "editType": "calc", + "valType": "color" + }, + "coloraxis": { + "description": "Sets a reference to a shared color axis. References to these shared color axes are *coloraxis*, *coloraxis2*, *coloraxis3*, etc. Settings for these shared color axes are set in the layout, under `layout.coloraxis`, `layout.coloraxis2`, etc. Note that multiple color scales can be linked to the same color axis.", + "dflt": null, + "editType": "calc", + "regex": "/^coloraxis([2-9]|[1-9][0-9]+)?$/", + "valType": "subplotid" + }, + "colorbar": { + "bgcolor": { + "description": "Sets the color of padded area.", + "dflt": "rgba(0,0,0,0)", + "editType": "colorbars", + "valType": "color" + }, + "bordercolor": { + "description": "Sets the axis line color.", + "dflt": "#444", + "editType": "colorbars", + "valType": "color" + }, + "borderwidth": { + "description": "Sets the width (in px) or the border enclosing this color bar.", + "dflt": 0, + "editType": "colorbars", + "min": 0, + "valType": "number" + }, + "dtick": { + "description": "Sets the step in-between ticks on this axis. Use with `tick0`. Must be a positive number, or special strings available to *log* and *date* axes. If the axis `type` is *log*, then ticks are set every 10^(n*dtick) where n is the tick number. For example, to set a tick mark at 1, 10, 100, 1000, ... set dtick to 1. To set tick marks at 1, 100, 10000, ... set dtick to 2. To set tick marks at 1, 5, 25, 125, 625, 3125, ... set dtick to log_10(5), or 0.69897000433. *log* has several special values; *L*, where `f` is a positive number, gives ticks linearly spaced in value (but not position). For example `tick0` = 0.1, `dtick` = *L0.5* will put ticks at 0.1, 0.6, 1.1, 1.6 etc. To show powers of 10 plus small digits between, use *D1* (all digits) or *D2* (only 2 and 5). `tick0` is ignored for *D1* and *D2*. If the axis `type` is *date*, then you must convert the time to milliseconds. For example, to set the interval between ticks to one day, set `dtick` to 86400000.0. *date* also has special values *M* gives ticks spaced by a number of months. `n` must be a positive integer. To set ticks on the 15th of every third month, set `tick0` to *2000-01-15* and `dtick` to *M3*. To set ticks every 4 years, set `dtick` to *M48*", + "editType": "colorbars", + "impliedEdits": { + "tickmode": "linear" + }, + "valType": "any" + }, + "editType": "colorbars", + "exponentformat": { + "description": "Determines a formatting rule for the tick exponents. For example, consider the number 1,000,000,000. If *none*, it appears as 1,000,000,000. If *e*, 1e+9. If *E*, 1E+9. If *power*, 1x10^9 (with 9 in a super script). If *SI*, 1G. If *B*, 1B. *SI* uses prefixes from \"femto\" f (10^-15) to \"tera\" T (10^12). *SI extended* covers instead the full SI range from \"quecto\" q (10^-30) to \"quetta\" Q (10^30). If *SI* or *SI extended* is used and the exponent is beyond the above ranges, the formatting rule will automatically be switched to the power notation.", + "dflt": "B", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "none", + "e", + "E", + "power", + "SI", + "B", + "SI extended" + ] + }, + "labelalias": { + "description": "Replacement text for specific tick or hover labels. For example using {US: 'USA', CA: 'Canada'} changes US to USA and CA to Canada. The labels we would have shown must match the keys exactly, after adding any tickprefix or ticksuffix. For negative numbers the minus sign symbol used (U+2212) is wider than the regular ascii dash. That means you need to use −1 instead of -1. labelalias can be used with any axis type, and both keys (if needed) and values (if desired) can include html-like tags or MathJax.", + "dflt": false, + "editType": "colorbars", + "valType": "any" + }, + "len": { + "description": "Sets the length of the color bar This measure excludes the padding of both ends. That is, the color bar length is this length minus the padding on both ends.", + "dflt": 1, + "editType": "colorbars", + "min": 0, + "valType": "number" + }, + "lenmode": { + "description": "Determines whether this color bar's length (i.e. the measure in the color variation direction) is set in units of plot *fraction* or in *pixels. Use `len` to set the value.", + "dflt": "fraction", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "fraction", + "pixels" + ] + }, + "minexponent": { + "description": "Hide SI prefix for 10^n if |n| is below this number. This only has an effect when `tickformat` is *SI* or *B*.", + "dflt": 3, + "editType": "colorbars", + "min": 0, + "valType": "number" + }, + "nticks": { + "description": "Specifies the maximum number of ticks for the particular axis. The actual number of ticks will be chosen automatically to be less than or equal to `nticks`. Has an effect only if `tickmode` is set to *auto*.", + "dflt": 0, + "editType": "colorbars", + "min": 0, + "valType": "integer" + }, + "orientation": { + "description": "Sets the orientation of the colorbar.", + "dflt": "v", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "h", + "v" + ] + }, + "outlinecolor": { + "description": "Sets the axis line color.", + "dflt": "#444", + "editType": "colorbars", + "valType": "color" + }, + "outlinewidth": { + "description": "Sets the width (in px) of the axis line.", + "dflt": 1, + "editType": "colorbars", + "min": 0, + "valType": "number" + }, + "role": "object", + "separatethousands": { + "description": "If \"true\", even 4-digit integers are separated", + "dflt": false, + "editType": "colorbars", + "valType": "boolean" + }, + "showexponent": { + "description": "If *all*, all exponents are shown besides their significands. If *first*, only the exponent of the first tick is shown. If *last*, only the exponent of the last tick is shown. If *none*, no exponents appear.", + "dflt": "all", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "all", + "first", + "last", + "none" + ] + }, + "showticklabels": { + "description": "Determines whether or not the tick labels are drawn.", + "dflt": true, + "editType": "colorbars", + "valType": "boolean" + }, + "showtickprefix": { + "description": "If *all*, all tick labels are displayed with a prefix. If *first*, only the first tick is displayed with a prefix. If *last*, only the last tick is displayed with a suffix. If *none*, tick prefixes are hidden.", + "dflt": "all", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "all", + "first", + "last", + "none" + ] + }, + "showticksuffix": { + "description": "Same as `showtickprefix` but for tick suffixes.", + "dflt": "all", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "all", + "first", + "last", + "none" + ] + }, + "thickness": { + "description": "Sets the thickness of the color bar This measure excludes the size of the padding, ticks and labels.", + "dflt": 30, + "editType": "colorbars", + "min": 0, + "valType": "number" + }, + "thicknessmode": { + "description": "Determines whether this color bar's thickness (i.e. the measure in the constant color direction) is set in units of plot *fraction* or in *pixels*. Use `thickness` to set the value.", + "dflt": "pixels", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "fraction", + "pixels" + ] + }, + "tick0": { + "description": "Sets the placement of the first tick on this axis. Use with `dtick`. If the axis `type` is *log*, then you must take the log of your starting tick (e.g. to set the starting tick to 100, set the `tick0` to 2) except when `dtick`=*L* (see `dtick` for more info). If the axis `type` is *date*, it should be a date string, like date data. If the axis `type` is *category*, it should be a number, using the scale where each category is assigned a serial number from zero in the order it appears.", + "editType": "colorbars", + "impliedEdits": { + "tickmode": "linear" + }, + "valType": "any" + }, + "tickangle": { + "description": "Sets the angle of the tick labels with respect to the horizontal. For example, a `tickangle` of -90 draws the tick labels vertically.", + "dflt": "auto", + "editType": "colorbars", + "valType": "angle" + }, + "tickcolor": { + "description": "Sets the tick color.", + "dflt": "#444", + "editType": "colorbars", + "valType": "color" + }, + "tickfont": { + "color": { + "editType": "colorbars", + "valType": "color" + }, + "description": "Sets the color bar's tick label font", + "editType": "colorbars", + "family": { + "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", + "editType": "colorbars", + "noBlank": true, + "strict": true, + "valType": "string" + }, + "lineposition": { + "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", + "dflt": "none", + "editType": "colorbars", + "extras": [ + "none" + ], + "flags": [ + "under", + "over", + "through" + ], + "valType": "flaglist" + }, + "role": "object", + "shadow": { + "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", + "dflt": "none", + "editType": "colorbars", + "valType": "string" + }, + "size": { + "editType": "colorbars", + "min": 1, + "valType": "number" + }, + "style": { + "description": "Sets whether a font should be styled with a normal or italic face from its family.", + "dflt": "normal", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "normal", + "italic" + ] + }, + "textcase": { + "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", + "dflt": "normal", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "normal", + "word caps", + "upper", + "lower" + ] + }, + "variant": { + "description": "Sets the variant of the font.", + "dflt": "normal", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "normal", + "small-caps", + "all-small-caps", + "all-petite-caps", + "petite-caps", + "unicase" + ] + }, + "weight": { + "description": "Sets the weight (or boldness) of the font.", + "dflt": "normal", + "editType": "colorbars", + "extras": [ + "normal", + "bold" + ], + "max": 1000, + "min": 1, + "valType": "integer" + } + }, + "tickformat": { + "description": "Sets the tick label formatting rule using d3 formatting mini-languages which are very similar to those in Python. For numbers, see: https://github.com/d3/d3-format/tree/v1.4.5#d3-format. And for dates see: https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format. We add two items to d3's date formatter: *%h* for half of the year as a decimal number as well as *%{n}f* for fractional seconds with n digits. For example, *2016-10-13 09:15:23.456* with tickformat *%H~%M~%S.%2f* would display *09~15~23.46*", + "dflt": "", + "editType": "colorbars", + "valType": "string" + }, + "tickformatstops": { + "items": { + "tickformatstop": { + "dtickrange": { + "description": "range [*min*, *max*], where *min*, *max* - dtick values which describe some zoom level, it is possible to omit *min* or *max* value by passing *null*", + "editType": "colorbars", + "items": [ + { + "editType": "colorbars", + "valType": "any" + }, + { + "editType": "colorbars", + "valType": "any" + } + ], + "valType": "info_array" + }, + "editType": "colorbars", + "enabled": { + "description": "Determines whether or not this stop is used. If `false`, this stop is ignored even within its `dtickrange`.", + "dflt": true, + "editType": "colorbars", + "valType": "boolean" + }, + "name": { + "description": "When used in a template, named items are created in the output figure in addition to any items the figure already has in this array. You can modify these items in the output figure by making your own item with `templateitemname` matching this `name` alongside your modifications (including `visible: false` or `enabled: false` to hide it). Has no effect outside of a template.", + "editType": "colorbars", + "valType": "string" + }, + "role": "object", + "templateitemname": { + "description": "Used to refer to a named item in this array in the template. Named items from the template will be created even without a matching item in the input figure, but you can modify one by making an item with `templateitemname` matching its `name`, alongside your modifications (including `visible: false` or `enabled: false` to hide it). If there is no template or no matching item, this item will be hidden unless you explicitly show it with `visible: true`.", + "editType": "colorbars", + "valType": "string" + }, + "value": { + "description": "string - dtickformat for described zoom level, the same as *tickformat*", + "dflt": "", + "editType": "colorbars", + "valType": "string" + } + } + }, + "role": "object" + }, + "ticklabeloverflow": { + "description": "Determines how we handle tick labels that would overflow either the graph div or the domain of the axis. The default value for inside tick labels is *hide past domain*. In other cases the default is *hide past div*.", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "allow", + "hide past div", + "hide past domain" + ] + }, + "ticklabelposition": { + "description": "Determines where tick labels are drawn relative to the ticks. Left and right options are used when `orientation` is *h*, top and bottom when `orientation` is *v*.", + "dflt": "outside", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "outside", + "inside", + "outside top", + "inside top", + "outside left", + "inside left", + "outside right", + "inside right", + "outside bottom", + "inside bottom" + ] }, - "size": { - "arrayOk": true, - "editType": "none", + "ticklabelstep": { + "description": "Sets the spacing between tick labels as compared to the spacing between ticks. A value of 1 (default) means each tick gets a label. A value of 2 means shows every 2nd label. A larger value n means only every nth tick is labeled. `tick0` determines which labels are shown. Not implemented for axes with `type` *log* or *multicategory*, or when `tickmode` is *array*.", + "dflt": 1, + "editType": "colorbars", "min": 1, - "valType": "number" + "valType": "integer" }, - "sizesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `size`.", - "editType": "none", - "valType": "string" + "ticklen": { + "description": "Sets the tick length (in px).", + "dflt": 5, + "editType": "colorbars", + "min": 0, + "valType": "number" }, - "style": { - "arrayOk": true, - "description": "Sets whether a font should be styled with a normal or italic face from its family.", - "dflt": "normal", - "editType": "none", + "tickmode": { + "description": "Sets the tick mode for this axis. If *auto*, the number of ticks is set via `nticks`. If *linear*, the placement of the ticks is determined by a starting position `tick0` and a tick step `dtick` (*linear* is the default value if `tick0` and `dtick` are provided). If *array*, the placement of the ticks is set via `tickvals` and the tick text is `ticktext`. (*array* is the default value if `tickvals` is provided).", + "editType": "colorbars", + "impliedEdits": {}, "valType": "enumerated", "values": [ - "normal", - "italic" + "auto", + "linear", + "array" ] }, - "stylesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `style`.", - "editType": "none", + "tickprefix": { + "description": "Sets a tick label prefix.", + "dflt": "", + "editType": "colorbars", "valType": "string" }, - "textcase": { - "arrayOk": true, - "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", - "dflt": "normal", - "editType": "none", + "ticks": { + "description": "Determines whether ticks are drawn or not. If **, this axis' ticks are not drawn. If *outside* (*inside*), this axis' are drawn outside (inside) the axis lines.", + "dflt": "", + "editType": "colorbars", "valType": "enumerated", "values": [ - "normal", - "word caps", - "upper", - "lower" + "outside", + "inside", + "" ] }, - "textcasesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `textcase`.", - "editType": "none", + "ticksuffix": { + "description": "Sets a tick label suffix.", + "dflt": "", + "editType": "colorbars", "valType": "string" }, - "variant": { - "arrayOk": true, - "description": "Sets the variant of the font.", - "dflt": "normal", - "editType": "none", - "valType": "enumerated", - "values": [ - "normal", - "small-caps", - "all-small-caps", - "all-petite-caps", - "petite-caps", - "unicase" - ] + "ticktext": { + "description": "Sets the text displayed at the ticks position via `tickvals`. Only has an effect if `tickmode` is set to *array*. Used with `tickvals`.", + "editType": "colorbars", + "valType": "data_array" }, - "variantsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `variant`.", + "ticktextsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `ticktext`.", "editType": "none", "valType": "string" }, - "weight": { - "arrayOk": true, - "description": "Sets the weight (or boldness) of the font.", - "dflt": "normal", - "editType": "none", - "extras": [ - "normal", - "bold" - ], - "max": 1000, - "min": 1, - "valType": "integer" + "tickvals": { + "description": "Sets the values at which ticks on this axis appear. Only has an effect if `tickmode` is set to *array*. Used with `ticktext`.", + "editType": "colorbars", + "valType": "data_array" }, - "weightsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `weight`.", + "tickvalssrc": { + "description": "Sets the source reference on Chart Studio Cloud for `tickvals`.", "editType": "none", "valType": "string" - } - }, - "namelength": { - "arrayOk": true, - "description": "Sets the default length (in number of characters) of the trace name in the hover labels for all traces. -1 shows the whole name regardless of length. 0-3 shows the first 0-3 characters, and an integer >3 will show the whole name if it is less than that many characters, but if it is longer, will truncate to `namelength - 3` characters and add an ellipsis.", - "dflt": 15, - "editType": "none", - "min": -1, - "valType": "integer" - }, - "namelengthsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `namelength`.", - "editType": "none", - "valType": "string" - }, - "role": "object", - "showarrow": { - "description": "Sets whether or not to show the hover label arrow/triangle pointing to the data point.", - "dflt": true, - "editType": "none", - "valType": "boolean" - } - }, - "hovertemplate": { - "arrayOk": true, - "description": "Template string used for rendering the information that appear on hover box. Note that this will override `hoverinfo`. Variables are inserted using %{variable}, for example \"y: %{y}\" as well as %{xother}, {%_xother}, {%_xother_}, {%xother_}. When showing info for several points, *xother* will be added to those with different x positions from the first point. An underscore before or after *(x|y)other* will add a space on that side, only when this field is shown. Numbers are formatted using d3-format's syntax %{variable:d3-format}, for example \"Price: %{y:$.2f}\". https://github.com/d3/d3-format/tree/v1.4.5#d3-format for details on the formatting syntax. Dates are formatted using d3-time-format's syntax %{variable|d3-time-format}, for example \"Day: %{2019-01-01|%A}\". https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format for details on the date formatting syntax. Variables that can't be found will be replaced with the specifier. For example, a template of \"data: %{x}, %{y}\" will result in a value of \"data: 1, %{y}\" if x is 1 and y is missing. Variables with an undefined value will be replaced with the fallback value. The variables available in `hovertemplate` are the ones emitted as event data described at this link https://plotly.com/javascript/plotlyjs-events/#event-data. Additionally, all attributes that can be specified per-point (the ones that are `arrayOk: true`) are available. Finally, the template string has access to variables `x`, `y`, `u`, `v`, `text` and `name`. Anything contained in tag `` is displayed in the secondary box, for example `%{fullData.name}`. To hide the secondary box completely, use an empty tag ``.", - "dflt": "", - "editType": "none", - "valType": "string" - }, - "hovertemplatesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `hovertemplate`.", - "editType": "none", - "valType": "string" - }, - "ids": { - "anim": true, - "description": "Assigns id labels to each datum. These ids for object constancy of data points during animation. Should be an array of strings, not numbers or any other type.", - "editType": "calc", - "valType": "data_array" - }, - "idssrc": { - "description": "Sets the source reference on Chart Studio Cloud for `ids`.", - "editType": "none", - "valType": "string" - }, - "legend": { - "description": "Sets the reference to a legend to show this trace in. References to these legends are *legend*, *legend2*, *legend3*, etc. Settings for these legends are set in the layout, under `layout.legend`, `layout.legend2`, etc.", - "dflt": "legend", - "editType": "style", - "valType": "subplotid" - }, - "legendgroup": { - "description": "Sets the legend group for this trace. Traces and shapes part of the same legend group hide/show at the same time when toggling legend items.", - "dflt": "", - "editType": "style", - "valType": "string" - }, - "legendgrouptitle": { - "editType": "style", - "font": { - "color": { - "editType": "style", - "valType": "color" }, - "description": "Sets this legend group's title font.", - "editType": "style", - "family": { - "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", - "editType": "style", - "noBlank": true, - "strict": true, - "valType": "string" + "tickwidth": { + "description": "Sets the tick width (in px).", + "dflt": 1, + "editType": "colorbars", + "min": 0, + "valType": "number" + }, + "title": { + "editType": "colorbars", + "font": { + "color": { + "editType": "colorbars", + "valType": "color" + }, + "description": "Sets this color bar's title font.", + "editType": "colorbars", + "family": { + "description": "HTML font family - the typeface that will be applied by the web browser. The web browser can only apply a font if it is available on the system where it runs. Provide multiple font families, separated by commas, to indicate the order in which to apply fonts if they aren't available.", + "editType": "colorbars", + "noBlank": true, + "strict": true, + "valType": "string" + }, + "lineposition": { + "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", + "dflt": "none", + "editType": "colorbars", + "extras": [ + "none" + ], + "flags": [ + "under", + "over", + "through" + ], + "valType": "flaglist" + }, + "role": "object", + "shadow": { + "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", + "dflt": "none", + "editType": "colorbars", + "valType": "string" + }, + "size": { + "editType": "colorbars", + "min": 1, + "valType": "number" + }, + "style": { + "description": "Sets whether a font should be styled with a normal or italic face from its family.", + "dflt": "normal", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "normal", + "italic" + ] + }, + "textcase": { + "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", + "dflt": "normal", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "normal", + "word caps", + "upper", + "lower" + ] + }, + "variant": { + "description": "Sets the variant of the font.", + "dflt": "normal", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "normal", + "small-caps", + "all-small-caps", + "all-petite-caps", + "petite-caps", + "unicase" + ] + }, + "weight": { + "description": "Sets the weight (or boldness) of the font.", + "dflt": "normal", + "editType": "colorbars", + "extras": [ + "normal", + "bold" + ], + "max": 1000, + "min": 1, + "valType": "integer" + } + }, + "role": "object", + "side": { + "description": "Determines the location of color bar's title with respect to the color bar. Defaults to *top* when `orientation` if *v* and defaults to *right* when `orientation` if *h*.", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "right", + "top", + "bottom" + ] + }, + "text": { + "description": "Sets the title of the color bar.", + "editType": "colorbars", + "valType": "string" + } }, - "lineposition": { - "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", - "dflt": "none", - "editType": "style", - "extras": [ - "none" - ], - "flags": [ - "under", - "over", - "through" - ], - "valType": "flaglist" + "x": { + "description": "Sets the x position with respect to `xref` of the color bar (in plot fraction). When `xref` is *paper*, defaults to 1.02 when `orientation` is *v* and 0.5 when `orientation` is *h*. When `xref` is *container*, defaults to *1* when `orientation` is *v* and 0.5 when `orientation` is *h*. Must be between *0* and *1* if `xref` is *container* and between *-2* and *3* if `xref` is *paper*.", + "editType": "colorbars", + "valType": "number" }, - "role": "object", - "shadow": { - "description": "Sets the shape and color of the shadow behind text. *auto* places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options.", - "dflt": "none", - "editType": "style", - "valType": "string" + "xanchor": { + "description": "Sets this color bar's horizontal position anchor. This anchor binds the `x` position to the *left*, *center* or *right* of the color bar. Defaults to *left* when `orientation` is *v* and *center* when `orientation` is *h*.", + "editType": "colorbars", + "valType": "enumerated", + "values": [ + "left", + "center", + "right" + ] }, - "size": { - "editType": "style", - "min": 1, + "xpad": { + "description": "Sets the amount of padding (in px) along the x direction.", + "dflt": 10, + "editType": "colorbars", + "min": 0, "valType": "number" }, - "style": { - "description": "Sets whether a font should be styled with a normal or italic face from its family.", - "dflt": "normal", - "editType": "style", + "xref": { + "description": "Sets the container `x` refers to. *container* spans the entire `width` of the plot. *paper* refers to the width of the plotting area only.", + "dflt": "paper", + "editType": "colorbars", "valType": "enumerated", "values": [ - "normal", - "italic" + "container", + "paper" ] }, - "textcase": { - "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", - "dflt": "normal", - "editType": "style", + "y": { + "description": "Sets the y position with respect to `yref` of the color bar (in plot fraction). When `yref` is *paper*, defaults to 0.5 when `orientation` is *v* and 1.02 when `orientation` is *h*. When `yref` is *container*, defaults to 0.5 when `orientation` is *v* and 1 when `orientation` is *h*. Must be between *0* and *1* if `yref` is *container* and between *-2* and *3* if `yref` is *paper*.", + "editType": "colorbars", + "valType": "number" + }, + "yanchor": { + "description": "Sets this color bar's vertical position anchor This anchor binds the `y` position to the *top*, *middle* or *bottom* of the color bar. Defaults to *middle* when `orientation` is *v* and *bottom* when `orientation` is *h*.", + "editType": "colorbars", "valType": "enumerated", "values": [ - "normal", - "word caps", - "upper", - "lower" + "top", + "middle", + "bottom" ] }, - "variant": { - "description": "Sets the variant of the font.", - "dflt": "normal", - "editType": "style", + "ypad": { + "description": "Sets the amount of padding (in px) along the y direction.", + "dflt": 10, + "editType": "colorbars", + "min": 0, + "valType": "number" + }, + "yref": { + "description": "Sets the container `y` refers to. *container* spans the entire `height` of the plot. *paper* refers to the height of the plotting area only.", + "dflt": "paper", + "editType": "colorbars", "valType": "enumerated", "values": [ - "normal", - "small-caps", - "all-small-caps", - "all-petite-caps", - "petite-caps", - "unicase" + "container", + "paper" ] - }, - "weight": { - "description": "Sets the weight (or boldness) of the font.", - "dflt": "normal", - "editType": "style", - "extras": [ - "normal", - "bold" - ], - "max": 1000, - "min": 1, - "valType": "integer" } }, - "role": "object", - "text": { - "description": "Sets the title of the legend group.", - "dflt": "", - "editType": "style", - "valType": "string" - } - }, - "legendrank": { - "description": "Sets the legend rank for this trace. Items and groups with smaller ranks are presented on top/left side while with *reversed* `legend.traceorder` they are on bottom/right side. The default legendrank is 1000, so that you can use ranks less than 1000 to place certain items before all unranked items, and ranks greater than 1000 to go after all unranked items. When having unranked or equal rank items shapes would be displayed after traces i.e. according to their order in data and layout.", - "dflt": 1000, - "editType": "style", - "valType": "number" - }, - "legendwidth": { - "description": "Sets the width (in px or fraction) of the legend for this trace.", - "editType": "style", - "min": 0, - "valType": "number" - }, - "line": { - "color": { - "description": "Sets the color of the arrow lines.", - "dflt": "#000", - "editType": "style", - "valType": "color" + "colorscale": { + "description": "Sets the colorscale. Has an effect only if in `marker.color` is set to a numerical array. The colorscale must be an array containing arrays mapping a normalized value to an rgb, rgba, hex, hsl, hsv, or named color string. At minimum, a mapping for the lowest (0) and highest (1) values are required. For example, `[[0, 'rgb(0,0,255)'], [1, 'rgb(255,0,0)']]`. To control the bounds of the colorscale in color space, use `marker.cmin` and `marker.cmax`. Alternatively, `colorscale` may be a palette name string of the following list: Blackbody,Bluered,Blues,Cividis,Earth,Electric,Greens,Greys,Hot,Jet,Picnic,Portland,Rainbow,RdBu,Reds,Viridis,YlGnBu,YlOrRd.", + "dflt": null, + "editType": "calc", + "impliedEdits": { + "autocolorscale": false + }, + "valType": "colorscale" }, - "dash": { - "description": "Sets the dash style of lines. Set to a dash type string (*solid*, *dot*, *dash*, *longdash*, *dashdot*, or *longdashdot*) or a dash length list in px (eg *5px,10px,2px,2px*).", - "dflt": "solid", - "editType": "style", - "valType": "string", - "values": [ - "solid", - "dot", - "dash", - "longdash", - "dashdot", - "longdashdot" - ] + "colorsrc": { + "description": "Sets the source reference on Chart Studio Cloud for `color`.", + "editType": "none", + "valType": "string" }, - "editType": "style", - "role": "object", - "shape": { - "description": "Determines the line shape.", - "dflt": "linear", + "editType": "calc", + "reversescale": { + "description": "Reverses the color mapping if true. Has an effect only if in `marker.color` is set to a numerical array. If true, `marker.cmin` will correspond to the last color in the array and `marker.cmax` will correspond to the first color.", + "dflt": false, "editType": "plot", - "valType": "enumerated", - "values": [ - "linear", - "spline", - "hv", - "vh", - "hvh", - "vhv" - ] + "valType": "boolean" }, - "simplify": { - "description": "Simplifies lines by removing nearly-overlapping points.", + "role": "object", + "showscale": { + "description": "Determines whether or not a colorbar is displayed for this trace. Has an effect only if in `marker.color` is set to a numerical array.", "dflt": true, - "editType": "plot", + "editType": "calc", "valType": "boolean" - }, - "smoothing": { - "description": "Has an effect only if `shape` is set to *spline*. Sets the amount of smoothing.", - "dflt": 1, - "editType": "plot", - "max": 1.3, - "min": 0, - "valType": "number" - }, - "width": { - "description": "Sets the width (in px) of the arrow lines.", - "dflt": 1, - "editType": "style", - "min": 0, - "valType": "number" } }, "meta": { @@ -58806,12 +58822,6 @@ "min": 0, "valType": "number" }, - "reversescale": { - "description": "Reverses the color mapping if true. If true, `cmin` will correspond to the last color in the array and `cmax` will correspond to the first color.", - "dflt": false, - "editType": "plot", - "valType": "boolean" - }, "selected": { "editType": "style", "line": { @@ -58851,12 +58861,6 @@ "editType": "style", "valType": "boolean" }, - "showscale": { - "description": "Determines whether or not a colorbar is displayed for this trace.", - "dflt": true, - "editType": "calc", - "valType": "boolean" - }, "sizemode": { "description": "Determines whether `sizeref` is set as a *scaled* (unitless) scalar (normalized by the max u/v norm in the vector field), as an *absolute* value (in the same units as the vector field), or *raw* to use the raw vector lengths.", "dflt": "scaled", From 7f634ed0c19867b8ecd4f657be00bb15b3ca85ef Mon Sep 17 00:00:00 2001 From: degzhaus Date: Mon, 16 Feb 2026 13:58:00 -0800 Subject: [PATCH 26/46] Fix colorbar crash by ensuring traceOut.marker exists before colorscaleDefaults captures its reference --- src/traces/quiver/defaults.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/traces/quiver/defaults.js b/src/traces/quiver/defaults.js index b0a659ca2b2..1694160d17f 100644 --- a/src/traces/quiver/defaults.js +++ b/src/traces/quiver/defaults.js @@ -68,6 +68,9 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout coerce('vhoverformat'); // Colorscale defaults (adds colorscale, showscale, colorbar, etc.) + // Ensure traceOut.marker exists before colorscaleDefaults, which captures + // a reference to it via npMaybe at the start of its execution. + if(!traceOut.marker) traceOut.marker = {}; coerce('marker.color'); var withColorscale = hasColorscale(traceIn, 'marker') || (traceIn.marker || {}).coloraxis; traceOut._hasColorscale = !!withColorscale; From 37c2a8d55018bb31c20ce4ca5ddbdaeae90af968 Mon Sep 17 00:00:00 2001 From: degzhaus Date: Mon, 9 Mar 2026 09:59:44 -0700 Subject: [PATCH 27/46] Regenerate image baselines --- test/image/baselines/quiver_anchor.png | Bin 25935 -> 37535 bytes test/image/baselines/quiver_arrow-styling.png | Bin 21942 -> 21258 bytes test/image/baselines/quiver_categorical.png | Bin 14650 -> 17320 bytes test/image/baselines/quiver_colorscale.png | Bin 17103 -> 23974 bytes .../baselines/quiver_custom-colorscale.png | Bin 21113 -> 27483 bytes test/image/baselines/quiver_multi-trace.png | Bin 0 -> 30245 bytes test/image/baselines/quiver_simple.png | Bin 14093 -> 16862 bytes test/image/baselines/quiver_sizemode.png | Bin 28936 -> 40498 bytes test/image/baselines/quiver_wind.png | Bin 31990 -> 39094 bytes test/image/baselines/quiver_zero-vectors.png | Bin 14785 -> 18879 bytes test/image/mocks/quiver_categorical.json | 3 +-- 11 files changed, 1 insertion(+), 2 deletions(-) create mode 100644 test/image/baselines/quiver_multi-trace.png diff --git a/test/image/baselines/quiver_anchor.png b/test/image/baselines/quiver_anchor.png index 688e05bc59d4e4e2a947db59296c86df37ae7bd4..3bec0ad57aa62d3298b1d32fe192086df255a077 100644 GIT binary patch literal 37535 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 UtX4XD1n@t#OWI0h*z14&KZJDrY5)KL literal 25935 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 R0xwEo@O1TaS?83{1OSJv?4|$! diff --git a/test/image/baselines/quiver_arrow-styling.png b/test/image/baselines/quiver_arrow-styling.png index 26c92dfce802be0e96450cd95f0f002f6bd54341..f25f952899e553e79ea6e06a9dc4adb41e2ae2cc 100644 GIT binary patch literal 21258 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

F&`;P^_mb8jb38vzs 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 Zm8i?i<3oO|;7%lk<_*2;rE2${{12gCmKOj3 diff --git a/test/image/baselines/quiver_colorscale.png b/test/image/baselines/quiver_colorscale.png index 38108b8f8f9d9df8d1d372aa63bc82f594742343..150f6f7d8833c564cca4abd121d96eac1e207a46 100644 GIT binary patch literal 23974 zcmeIac|4Ts8$aF|JJ}LW%2J(D*(ymH%V|L+RKg%kvSbe#*_%|dpB75OX`x~;*0CEE zWiQLvDP2=cMx$oz`ulu^**ZX>3cgPVvZC-9M z?q$oC@g6*||Jbr+D9o~DzkT3jho8JTV$i&7nbfj_`}Z6_XF==cxFy`eTpAyf_Z-#~ z5EgEJv{GkXB?`CaH(~Tq`)Sm=y#0&QS3)h{8}7u&E-( zrSN8}-%vWstIvLUb{W1x>En3FA6M8oWw&i=TKnY(tRk&n-Y+HfzXAWZq+hJ)e@64= zZ2j+8{NLzl?9cKp%uzFN!H$m_^;G_$p}b?@DO`%Xd8&eY?N ztqfC*bgwHOqT4&Q5zE~@Jmh3#WC~o@>DDihdIPejsI44J@soR{x>-31J4^*pIz_*; z#?)UYH=3-#sOX?{?5Ym?fJ=70JrT}oRDE`X!~yKEDwk~h27FTXAH=gUwGTw4h#!(S zHypqw9oEL$4~N!iVTaFue!_ZV$ufMBvaYulO2$S7rK6*b)f_sA9X^BnyW%kT^Ah`N z#TA&%O@bIx6_m_geUwhH4t7{J_MpO_*kN6RgsbF3v61A)MnR0A56tMqPcveTiHRhK zzJwXSL1t{*$RmL9X}V$e2k}_)dScF5R-=mvtTB8y;fuCkw>VF3j7wHskB{Cij!#Nj zPh9r_J|Z8!_*(1-6l+Y+j{a3#gd4-0vU1{h;k(lKq^BGH?ISq}oN8RM;_|Qv|MiLe zkvp229~;nI1Lxz^mKG-a=khoS?)?f26lILuX=EgrbYplm8 z+qUk2@p-e0S0`ee-4n?U==UX3#QM2?2J@W-9MLqM>>ZTvAH5l!z zXfHpgTUHX(Qk8NKUC#P(wPYg6w^i*5)E4Sx~(6!iGoJ?!l8Sw3pR-U=}qE{AA_Yi9lXZQyIev4hl5nRLzzPEl&poKJ>xn)I@JmlhcVeRUPJ4-Q@*y&EjS?Q+y8&9sG^ zJti(AaA^_Ob~3ns49i@YY)E3K^i_n>`oa|Q95YHN9eK`<@clvEzGEeOhWgcl`mH9O zO9tjRrWb6yqAYqTTE;kUiLtb3`CyLK=s~efTyYNBy_c!6Kqov~(ze(c-K;HydE6$?PRRv^;LmKLS5CM+J_aSv6SZabAXnBaQ|<=93%xzl&rsR&GR zvaFIvp&0wNGJ>bR$$ULMHXY7ZhnTX|nX% zV8iWqWA~2zeQ;O+C9@%K1^*!>_y*sezp7$N-jEi&UDcA3%)8PH={bad$u9ZG&N{b~hTsLTjOvP`VAecrMm;R!y#e!S z1)WZG@68Om@)uXv2L-<=!qLR`hjvC(^APmnRoIG5z423B9u4jF=%wEEaxSErioZJ5 z3`Vg9-8tr7-Ad>9y%k6X)6azTS@HcYrwUJ>9V>Y4SQ8^RAd%G&mcA+G0y%WAQpIlg zGI7bp7mG#bc=3kpW~kKVn55;pO2i2ld(k`URp@2hM^QR=^F1RUp{R4lrCCP}c*ah& zq+7JB&(@5Gl;+06%9zM7mS6L&tf~m{U99TXstLPVY<7_zlju9t)qTN(#M!-X*sI&q zSO7!!tlDsswc%_5$G~81?5V)T$;2SLc(I*Mw%=YXrc(Hrv@3aQ?K^iuC1JR{)cHp(Qg6K(lbbP$CUA$*Z$>JQ<=)P9O z>p%|@L%!rg;{w_JP~M z^0WmpC)t+9W;UTxA9QvUwbW$kyQo-r_4V&CC?}g1;hfKeHTd_mWH+d<_LDa%Cs)_j zF7Hd$j*=*kd_^$HzQEDkotWy4?_XTfiV$Pt&n_Czb!g$1kk?ltN_f8$G|RFM0Y~aw zuK!1&xU^S2eX^h{+suXG@S2P-*XJEzuDpx36Fs5abMC&l+cUvE=L^i!AhF!bUr=-^ zy=>9Pv8UMkebZ(7$#aaR%STH&37b4?b}^<=GGhuU4>VYgXk9z+bzFi z=qtNesPd*=L1T2o4ZWOldeV0ev|0v=-+6jl$?<|+Ntd=pe*9x_8wyLO#MEbA2fY?~$n(&) z?l#-0uBAkV!A1FJ-QI=#+s$(wqFXX7d-c?3t*PzVb`NCsU^T1F@~YsVc{gN*Q+-#W zjS~p0G151l6SLT3<}sJ`f;95jWLmQw4WHd4PvpN=4c_EM46SUbxhZ~iXfREc%Rpkl zs=rRTce(mRdAGz_{)i&;wTxIJ7q89L!OsoUhi~!!L9}A;?YY@$gzaatzKP7z6&Kx& zPr5Gei0!B4OHhjOC4RGlg+lGW*{&m=4SU2b+m|xx*oQ0OQ~U7pHO0LArfQxlu?N|=~N?wiIsgzd*B4Hz{Zwc#S%BeBcO$(7#&oJB7@&MM*--QkmOc7|@0 zFi+HDti4BXxFTxl_o~ZTlX3kbJ(duU(hdii{JUChj57y;* zUUbC@8moBNP5|6qNLwdqvXz*x_IpAcncMZ2^3yyQLH94uK7kFenQk$*WLvuNyoNb3 zSZuk>T*9(UwQM8aFkw!!6jzQ+X6Djb;*-@b3gFLq3%5xw^`CpoqRA}glGTt-Jeov< z(aeOq6+9LvCZ%a)rt%E2y3$WAyHLD&pz*b+mhm%De6&`o#m89$oa7|Dzud`9xIkjh z*!{)}=REK4Y3alPeyUOK{WNUEoQ9n!#*D(3$5W3O zJcJ_2K#B_gV%to2&>J!r;YmgBTu1S4(UfHf+R&8WOuUlXS1M23nX$@gFh28G@YuE{o%>WX8&u7{(6v{2 z-my^>f*HA&QYotgy)UhoCO(;s&I!srsdL#=Y#~z)Q_z#IbnCVPKKi!VL2Y4PI78NE zqL?^}s+0LCKEh4yR#HlC`WunE^lQE2wmuL;XqQASwlYL<5Z(#;iR!r5c#i7cM?3^Y z`4PunWsU2dK`3*S&iR?L%@a5xJ$|c9n|VJ4JCet0G=kHNlKma?tR>If9P4~yk{It> z$t_;`{BTCN3$}$*mj5xg>bu#&L=u8taXsF4aq9ks-JY%H)73H=7%i>K$19i{aJ9Kn zZCUIbXMB%H>0r48cvvZ-JQPgSNlVrxo}$#poh!ijon?pvX;rzCmk;NS@|LlUFHP8J zW8w*03Ked=k3E5P#=zJfKE-$?_p>ai7IET)iuF7&PpyP1~dk#M^@ZO?C;KmEjo!*Qg`a`f8ZLm}hNlb-lom%3is z=q(n<<{|bN!y-u%r{~RuNVTS7@5xb$nQN|Hg16S9*3#tD73le@CHRUzbg&^(b)zxH zWjTY3C2$Z?$387z>21=JLJj6_H$(2nJOsmGru-{{y7Fsn&iUuAN7@zI3^`6{d~Kk;=cMPZ}hOw z%0xRfG-6%%HE58hdkZ#hTFVOgb%NCThnzxYRt$fuW5=3(Z^P zdG^r@dWj067{}J-S&CpCty;=Cw{tUWIAlgq^r7cPWrVS!G4)Q^u{67egjv^C=2*(j zBF(lEUoT%k1cnAiL*5jE$tfjA${$&*#^r^cR41mZEibiMpw=k!VOzf2{el-M79~Cv zmj#M_8M4G4v_;j;ay0X~1W$bdWJp&N(D zqPJ>lefJXRAR4mAvW7A#)ywDq-2KVxiV;iy*AU_md8UhZ+IbFb8i0O2h8c z!x}oGm@)!PB62seN37|Em|NIO*Q>t^r$LaI`e~J7(j}~=D;EBmzqk!;@>a#~<)dGJ z8nf8vFV9_aJ(kgmZin}E7SQupsE;2eWC1d5C!Tz|&~xC4md(2XX3yn|@iUR<3Rz=t zhA?^HH$IX$5D1fa2oT}*a4eo5vSUQZIm0N%R38w(& zAgpSS)`ti1yN zPYd`aC73qTWHcu(B{tR5HkW7C?HKBR_~~_hb^8c0rL4D+Xn9UK7r{_+tZgR{HPa&i z(!aN=febOH=U`Qm;c2eA)M>eum?h>|V9?)%W2N)5XmlKT!fdbBC1EMz6K)apgdcbN zHpzh~?%T1YjAj3Q^)+S!h3%- zFlNq(AbPI31z80D9eL?Ald+KnaY9DfV#gd~%oTEDzS0ZxtBQbhGlP$EdhypJnzHw_B*$b(Yaj`C@wKwjGlC6LH^% z_xw1OI`gSVxoD-%v1P9w9Xv(Fc%XD1RPDG6B;OIg3cig$u3Z3T_ExT%X9RLI5=)PE zPN%fSSx(DNSl<=^_{3Sfg6}8uw9WAAiVWXP+*k&Wr+W#5(H{;EJqAWU@{`eL8>zbl zCl*qW*=%-g&gvD!tkX^A+VCg#Qr}yVyD=Frojy}^D=^5ZF14J!D2}Vn__&bMTDqO2 z#pqFNh-&P{i_7rBs3^0Grp4>B1u-fXAI}zYTIXE)HAbTV3=Fz9=P*Ys_kg_$-M_a| zikMT_wXXU5qdhlP9oTmFAz>2z=Z+B#*JdK~8&}{KcBJOH+>tSLD% z)g^7jQtO-flNu4U=1e>JlmCYh&y>6y@I{32a3d}nFWUjSf5ad%FI$_WGjI7~wN5+sRvd`kD5^bIm zY#z!X=D=js9l~+qH#Az`J_4q>snm)iJ1A+=n&Vq1o2anbMNXxE1{t6`E|!vfQUUj$ z3)EYakjX?3Al^r5vTiy0>_Zs+#dZ6=;P2MH2R2v&FB}Wr@;+<~L=ykJQIk&P0rK1; zJnQsO0;10LZCegO)Jd(8+Z!(pcqQgz#6xDUWYf+$Z?0W7o^mw1X9wEvA)Pgb`-b;1 z0P@F3GQ$UcbcNI=ORY9_aYbae=H8^8KwluQu-~q`2~2IJWoFP%Zd*UVyMCH}YZ$SH zJ0$nf7x9IeUpMRDj_yY0L@~|N9iST{ZH;5+5DHb}8vDC2lB=}*bk5Zm``H|E?i&zO z4)Ajf6K@&vL+QM$+OZa#i2&Gv{dj0C1m$!81VifmB!#vFY2%OP^N_2o9azu;(XX#U9;YDehvG`SvNkt^K;SRlP!q`u{OaWH!EBx3+%K z0(?I+r8k3t?e(;`yo3!xt(^yT>oR-D-&bNCR05-`VW6&cl{!F z>#v(#{8)1Ogulc{LxzrLtmF{GGb%2ks0e)@G$0BHA}$p3$%U>Cv&f#4rXWV=&|l;@ zdc(XP%kkAtAqMohg>BsqXiOXS2O@@8_UW7!^x7V>=@eZI?cCbLC0k}=b^HdP3!|Gb z6Ma~quLzGirFlP%&gF@mN>ipwo+o(R+lPe?fyb?QF1J?>a+LKGP)j0y!cwnzEJ-TT z%~LR&E%PNUxVdz5fDZo=F)Yk>RXRvYx?ZY-?|w1O}?aFwInHsTWv79VkT5iirTE~Y}!a_MqZptVU=ml z>7zrbdbf8}CF{jI_|H!Z$LlUM9iJi3jb=BDCiv1bgC%@kO!xSXtuTHKX{RznKj~2P zg}~loZ;#cg=ZJo};5;|ulO~Z`;a8XFP>xAm<$-0+Ep9kT_rc|8* zrBV|U6H0-H9a0$@s_lzS-pfIOI+A^wX>OLr(rg3ep?;z>JLUXuEEg`Ry*|&f&K&sT zpVJJcPaaJ<72)oj2gY%}t!H1p&-CEV@^Xzg*_d z`6AkzCuHUom5ehedV?i{_Y8pTC%QK(wPpHVu~BL!D@|HXt*)HYQ})mADiq<8B^`W| zV2|s?=JRqh{+fr6c8yo@+|KBVp10r27<;H2XFE?LSrYSfVq`NHne!ZRYdIv&VF_bv zYem-+k8#S9f;_w2o>z^rd4z4PO**lF`QlnXo;%2H0n%FBR_;lW5DLUH?W6QA;fU;f zYkq%roky0Tt2IAOqd}#Ozf=$x^>&T-yQ_Pg3L1*Vpl=DCiTvo!ou5}{DP+SM?! zy$U(@b&~SglcB6Jr$_c5-iM7Az_{@As=c7Quod#}^Ux@H50o-1>A>wB_EvBJ3TRL< zn_$~W%z5x_J^5qk=FupzkA|GFSKZWhaO~Ap%jmbiP6Ha2J|r8e6kbIltC{*-g?!s} z@(Q=@y1xUo3AY$O^%Jxi4DhSj4sX8`6`1Mbn*hk+ADs0=20Dq7c{@~zn0$Xg@eT3{ zlkK_(;H`gPuRi_ht%4eQThUv3$XQW0O&PY*nL+=Nxir+rV+*utqYx60S3cN43Hom= zW;amkyqng?OQ=1lL$I6V8~p|e{IquO-MI-C03FwD+hPjPk@~|YnPYk5Ci9%_Tc062 zb|`Vd2|>xfPMgeF9PcqHJA23}qbSFW>8^DjzJuTpDG@oxr`YN<$03R-Lh!NSY*PhJ z@EZsM;NB0w{W}2n*iV2+pSktbPRUiSSi{+~ndZgHXiPxrvquLY2bNPnL#m4V>e`p1 z9H-HFn+M1#D(!5PkZC1QgQbli>)KKkHoD@Q{1ig<1cd5!5UM#og=!!7>7u;x zE9Y2JJKkyHhSjBs-|X2Bh_6P9Xj|gAIxWG+ZWF0snG@A@eeJ!7N1 z8Rwwbl%3+JagF|6_%Wd1pDC-wS*CBE`T)6l&griCV$s_I&7oh|c}+3d)a#r9f?6E> z@<8eM#T2C=O+3$LyPkM9=bu106*bmN@(iw!#2AnIu7QQEdG=@%ENq%QvasI~NBXsX zy#W!si4KdtcyriAxfS>C0hy6g`n_FkS0GXr-Ml^y&-5)dFOWoI*6Ag40qt_>l}v!_ zkKaEv<0Xk1#ZS%p6*-ih`t@f)k{9LAz^Bc=l|W8e%c5Vx)W)w6$aoa=Cf{;mv7(sv z;L6n)&l6Z$1DxAmvT|y3z5H_17s*=B_-?l|L=g3zB5} z$iBXw^0}&Xm#SZXP7rx6c@4^O3%&xLQ4*Wo1d^x2-*YpQD90Ab+eq$f*uZ9#djA~z zSCG14&7tof4kF(kzgi)IY2uW{5f{>5y@2|ysnz!%0qo=Z@F?e&u~R+ex2NwF&Xg#BAS#9k&JO3dB*qgbw{VY>#APd1pW^5`A8x~eMk zvBATR^--!;pijsHo__A1vHegozRZEw;Z$qGgZCBn8w}PG&r9G+a{GAeMlp*B5? zia*yEvhCorc^gi`xf0TRiytcW?NiD2C(%?I#lURCgvN(m1+bMkkWvKh?w+b7?X;

krl(07ofo31K|+D!Sxt! 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 L-v0Ex*bDy$7IGOo literal 17103 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 diff --git a/test/image/baselines/quiver_custom-colorscale.png b/test/image/baselines/quiver_custom-colorscale.png index 3d8e2191605e7ab7ae30ea700e511cfe25a09bbf..4250a406e67ad204a73034aaac209c3f717e15a3 100644 GIT binary patch literal 27483 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 diff --git a/test/image/baselines/quiver_multi-trace.png b/test/image/baselines/quiver_multi-trace.png new file mode 100644 index 0000000000000000000000000000000000000000..a94291799eb054d9a9dc1cf37217d9066243545a GIT binary patch literal 30245 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 YJ5jf2z&#O^f8Anq*7Qu~pH~9^0}I4#kN^Mx literal 0 HcmV?d00001 diff --git a/test/image/baselines/quiver_simple.png b/test/image/baselines/quiver_simple.png index af35ecc0b8f0fc8ebc9a852249e54b91f0308040..e36b0d54388d8a14102ab410b060762d42fbe3a5 100644 GIT binary patch literal 16862 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 literal 14093 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 literal 28936 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 C?&OmI diff --git a/test/image/baselines/quiver_wind.png b/test/image/baselines/quiver_wind.png index ab33273e57389216324429496246a574e1072e9b..0365bd636c611d59bbb554fa7091704fa4cffc46 100644 GIT binary patch literal 39094 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 feCwaSW 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 AF#rGn literal 31990 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 Date: Mon, 9 Mar 2026 12:03:01 -0700 Subject: [PATCH 28/46] Nest line options under marker.line --- src/traces/quiver/attributes.js | 64 +++---------- src/traces/quiver/defaults.js | 28 +++--- src/traces/quiver/plot.js | 6 +- src/traces/quiver/style.js | 25 +++--- test/image/mocks/quiver_anchor.json | 12 +-- test/image/mocks/quiver_arrow-styling.json | 12 +-- test/image/mocks/quiver_categorical.json | 4 +- test/image/mocks/quiver_colorscale.json | 6 +- .../image/mocks/quiver_custom-colorscale.json | 8 +- test/image/mocks/quiver_multi-trace.json | 8 +- test/image/mocks/quiver_simple.json | 4 +- test/image/mocks/quiver_sizemode.json | 12 +-- test/image/mocks/quiver_wind.json | 6 +- test/image/mocks/quiver_zero-vectors.json | 4 +- test/jasmine/tests/quiver_test.js | 4 +- test/plot-schema.json | 90 ++++++------------- 16 files changed, 107 insertions(+), 186 deletions(-) diff --git a/src/traces/quiver/attributes.js b/src/traces/quiver/attributes.js index 742f31d41ee..16a6a7b68f0 100644 --- a/src/traces/quiver/attributes.js +++ b/src/traces/quiver/attributes.js @@ -4,10 +4,9 @@ var baseAttrs = require('../../plots/attributes'); var hovertemplateAttrs = require('../../plots/template_attributes').hovertemplateAttrs; var fontAttrs = require('../../plots/font_attributes'); var axisHoverFormat = require('../../plots/cartesian/axis_format_attributes').axisHoverFormat; -var dash = require('../../components/drawing/attributes').dash; - var extendFlat = require('../../lib/extend').extendFlat; var colorScaleAttrs = require('../../components/colorscale/attributes'); +var dash = require('../../components/drawing/attributes').dash; var attrs = { x: { @@ -100,54 +99,6 @@ var attrs = { description: 'Deprecated alias for `arrowsize`-based sizing. Prefer using `arrowsize`.' }, - // Line styling for arrows - line: { - color: { - valType: 'color', - dflt: '#000', - editType: 'style', - description: 'Sets the color of the arrow lines.' - }, - width: { - valType: 'number', - min: 0, - dflt: 1, - editType: 'style', - description: 'Sets the width (in px) of the arrow lines.' - }, - dash: dash, - shape: { - valType: 'enumerated', - values: ['linear', 'spline', 'hv', 'vh', 'hvh', 'vhv'], - dflt: 'linear', - editType: 'plot', - description: 'Determines the line shape.' - }, - smoothing: { - valType: 'number', - min: 0, - max: 1.3, - dflt: 1, - editType: 'plot', - description: 'Has an effect only if `shape` is set to *spline*. Sets the amount of smoothing.' - }, - simplify: { - valType: 'boolean', - dflt: true, - editType: 'plot', - description: 'Simplifies lines by removing nearly-overlapping points.' - }, - editType: 'style' - }, - - // Alias consistent with annotations; maps to line.width - arrowwidth: { - valType: 'number', - min: 0.1, - editType: 'style', - description: 'Sets the width (in px) of the arrow line (alias of `line.width`).' - }, - // Text and labels text: { valType: 'data_array', @@ -174,9 +125,20 @@ var attrs = { description: 'Sets the text font.' }), - // Marker (for colorscale-based coloring of arrows) + // Marker: color, colorscale, and line styling for arrows marker: extendFlat( { + line: { + width: { + valType: 'number', + min: 0, + dflt: 1, + editType: 'style', + description: 'Sets the width (in px) of the arrow lines.' + }, + dash: dash, + editType: 'style' + }, editType: 'calc' }, colorScaleAttrs('marker', { diff --git a/src/traces/quiver/defaults.js b/src/traces/quiver/defaults.js index 1694160d17f..7a437f91754 100644 --- a/src/traces/quiver/defaults.js +++ b/src/traces/quiver/defaults.js @@ -38,22 +38,11 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout // Arrow styling coerce('arrowsize'); coerce('arrow_scale'); // back-compat alias - coerce('arrowwidth'); coerce('hoverdistance'); - // Line styling - use coerce for proper validation - coerce('line.color', defaultColor); - // If arrowwidth is set, use it as line.width default - var arrowwidth = traceOut.arrowwidth; - if(arrowwidth !== undefined) { - coerce('line.width', arrowwidth); - } else { - coerce('line.width'); - } - coerce('line.dash'); - coerce('line.shape'); - coerce('line.smoothing'); - coerce('line.simplify'); + // Line styling under marker.line + coerce('marker.line.width'); + coerce('marker.line.dash'); // Text coerce('text'); @@ -71,13 +60,22 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout // Ensure traceOut.marker exists before colorscaleDefaults, which captures // a reference to it via npMaybe at the start of its execution. if(!traceOut.marker) traceOut.marker = {}; - coerce('marker.color'); + coerce('marker.color', defaultColor); var withColorscale = hasColorscale(traceIn, 'marker') || (traceIn.marker || {}).coloraxis; traceOut._hasColorscale = !!withColorscale; if(withColorscale) { colorscaleDefaults(traceIn, traceOut, layout, coerce, { prefix: 'marker.', cLetter: 'c' }); } + // Provide trace.line for compat with shared code (legend, getTraceColor) + var markerLine = traceOut.marker.line || {}; + var mc = traceOut.marker.color; + traceOut.line = { + width: markerLine.width, + color: Lib.isArrayOrTypedArray(mc) ? defaultColor : mc, + dash: markerLine.dash + }; + // Selection styling coerce('selected.line.color'); coerce('selected.line.width'); diff --git a/src/traces/quiver/plot.js b/src/traces/quiver/plot.js index 3e2c13ac3aa..a204a055880 100644 --- a/src/traces/quiver/plot.js +++ b/src/traces/quiver/plot.js @@ -173,11 +173,13 @@ function plotOne(gd, idx, plotinfo, cdscatter, cdscatterAll, element, transition }); // Apply styling using Plotly's standard styling system - Drawing.lineGroupStyle(lineSegments, trace.line && trace.line.width, trace.line && trace.line.color, trace.line && trace.line.dash); + var marker = trace.marker || {}; + var markerLine = marker.line || {}; + var lineColor = Lib.isArrayOrTypedArray(marker.color) ? undefined : marker.color; + Drawing.lineGroupStyle(lineSegments, markerLine.width, lineColor, markerLine.dash); // If colorscale present, color arrows by marker.color or magnitude |(u,v)| if(trace._hasColorscale) { - var marker = trace.marker || {}; var colorFunc = Colorscale.makeColorScaleFuncFromTrace(marker); lineSegments.style('stroke', function(cdi) { var markerColor = marker.color; diff --git a/src/traces/quiver/style.js b/src/traces/quiver/style.js index c65dede56a9..4bcc410bd81 100644 --- a/src/traces/quiver/style.js +++ b/src/traces/quiver/style.js @@ -1,6 +1,7 @@ 'use strict'; var d3 = require('@plotly/d3'); +var Lib = require('../../lib'); var Drawing = require('../../components/drawing'); var Color = require('../../components/color'); @@ -11,16 +12,20 @@ function style(gd) { s.each(function(d) { var trace = d[0].trace; - var line = trace.line || {}; + var marker = trace.marker || {}; + var markerLine = marker.line || {}; + var lineColor = Lib.isArrayOrTypedArray(marker.color) ? undefined : marker.color; d3.select(this).selectAll('path.js-line') - .call(Drawing.lineGroupStyle, line.width, line.color, line.dash); + .call(Drawing.lineGroupStyle, markerLine.width, lineColor, markerLine.dash); }); } function styleOnSelect(gd, cd, sel) { var trace = cd[0].trace; - var line = trace.line || {}; + var marker = trace.marker || {}; + var markerLine = marker.line || {}; + var lineColor = Lib.isArrayOrTypedArray(marker.color) ? undefined : marker.color; if(!sel) return; @@ -34,24 +39,24 @@ function styleOnSelect(gd, cd, sel) { var path = d3.select(this); if(d.selected) { - var sc = selectedLine.color || line.color; - var sw = selectedLine.width !== undefined ? selectedLine.width : line.width; - Drawing.lineGroupStyle(path, sw, sc, line.dash); + var sc = selectedLine.color || lineColor; + var sw = selectedLine.width !== undefined ? selectedLine.width : markerLine.width; + Drawing.lineGroupStyle(path, sw, sc, markerLine.dash); } else { var uc = unselectedLine.color; var uw = unselectedLine.width; if(!uc) { - uc = line.color ? Color.addOpacity(line.color, DESELECTDIM) : undefined; + uc = lineColor ? Color.addOpacity(lineColor, DESELECTDIM) : undefined; } - if(uw === undefined) uw = line.width; - Drawing.lineGroupStyle(path, uw, uc, line.dash); + if(uw === undefined) uw = markerLine.width; + Drawing.lineGroupStyle(path, uw, uc, markerLine.dash); } }); Drawing.selectedTextStyle(sel.selectAll('text'), trace); } else { sel.selectAll('path.js-line') - .call(Drawing.lineGroupStyle, line.width, line.color, line.dash); + .call(Drawing.lineGroupStyle, markerLine.width, lineColor, markerLine.dash); Drawing.textPointStyle(sel.selectAll('text'), trace, gd); } } diff --git a/test/image/mocks/quiver_anchor.json b/test/image/mocks/quiver_anchor.json index c16e5e2d10d..5c9942cebb1 100644 --- a/test/image/mocks/quiver_anchor.json +++ b/test/image/mocks/quiver_anchor.json @@ -10,9 +10,9 @@ "sizemode": "scaled", "sizeref": 0.5, "anchor": "tail", - "line": { + "marker": { "color": "red", - "width": 2 + "line": {"width": 2} }, "xaxis": "x", "yaxis": "y" @@ -27,9 +27,9 @@ "sizemode": "scaled", "sizeref": 0.5, "anchor": "tip", - "line": { + "marker": { "color": "blue", - "width": 2 + "line": {"width": 2} }, "xaxis": "x2", "yaxis": "y2" @@ -44,9 +44,9 @@ "sizemode": "scaled", "sizeref": 0.5, "anchor": "center", - "line": { + "marker": { "color": "green", - "width": 2 + "line": {"width": 2} }, "xaxis": "x3", "yaxis": "y3" diff --git a/test/image/mocks/quiver_arrow-styling.json b/test/image/mocks/quiver_arrow-styling.json index 2a74a96a884..1d7e008fdd7 100644 --- a/test/image/mocks/quiver_arrow-styling.json +++ b/test/image/mocks/quiver_arrow-styling.json @@ -11,9 +11,9 @@ "sizeref": 0.5, "arrowsize": 0.5, "anchor": "tail", - "line": { + "marker": { "color": "red", - "width": 1 + "line": {"width": 1} } }, { @@ -27,9 +27,9 @@ "sizeref": 0.5, "arrowsize": 1.0, "anchor": "tail", - "line": { + "marker": { "color": "blue", - "width": 2 + "line": {"width": 2} } }, { @@ -43,9 +43,9 @@ "sizeref": 0.5, "arrowsize": 2.0, "anchor": "tail", - "line": { + "marker": { "color": "green", - "width": 3 + "line": {"width": 3} } } ], diff --git a/test/image/mocks/quiver_categorical.json b/test/image/mocks/quiver_categorical.json index b2edadee492..5dcd3de9f23 100644 --- a/test/image/mocks/quiver_categorical.json +++ b/test/image/mocks/quiver_categorical.json @@ -9,8 +9,8 @@ "sizemode": "scaled", "sizeref": 0.5, "anchor": "tail", - "line": { - "width": 2 + "marker": { + "line": {"width": 2} } } ], diff --git a/test/image/mocks/quiver_colorscale.json b/test/image/mocks/quiver_colorscale.json index 897cb5cca51..9519c5e4196 100644 --- a/test/image/mocks/quiver_colorscale.json +++ b/test/image/mocks/quiver_colorscale.json @@ -14,10 +14,8 @@ "showscale": true, "colorbar": { "title": {"text": "Magnitude"} - } - }, - "line": { - "width": 2 + }, + "line": {"width": 2} } } ], diff --git a/test/image/mocks/quiver_custom-colorscale.json b/test/image/mocks/quiver_custom-colorscale.json index 9cf8854a094..f1cf7dc2bc1 100644 --- a/test/image/mocks/quiver_custom-colorscale.json +++ b/test/image/mocks/quiver_custom-colorscale.json @@ -17,14 +17,12 @@ "colorbar": { "title": {"text": "Custom Field"}, "x": 1.02 - } + }, + "line": {"width": 2} }, "sizemode": "scaled", "sizeref": 0.25, - "anchor": "tail", - "line": { - "width": 2 - } + "anchor": "tail" } ], "layout": { diff --git a/test/image/mocks/quiver_multi-trace.json b/test/image/mocks/quiver_multi-trace.json index f6332936b93..0b90fb70663 100644 --- a/test/image/mocks/quiver_multi-trace.json +++ b/test/image/mocks/quiver_multi-trace.json @@ -10,9 +10,9 @@ "sizemode": "scaled", "sizeref": 0.4, "anchor": "tail", - "line": { + "marker": { "color": "red", - "width": 2 + "line": {"width": 2} } }, { @@ -25,9 +25,9 @@ "sizemode": "scaled", "sizeref": 0.4, "anchor": "tail", - "line": { + "marker": { "color": "blue", - "width": 2 + "line": {"width": 2} } } ], diff --git a/test/image/mocks/quiver_simple.json b/test/image/mocks/quiver_simple.json index b7c0aa6d581..c3e72e8c85f 100644 --- a/test/image/mocks/quiver_simple.json +++ b/test/image/mocks/quiver_simple.json @@ -12,8 +12,8 @@ "sizemode": "scaled", "sizeref": 0.5, "anchor": "tail", - "line": { - "width": 2 + "marker": { + "line": {"width": 2} } } ], diff --git a/test/image/mocks/quiver_sizemode.json b/test/image/mocks/quiver_sizemode.json index 7b412afaded..654dbc8ed5c 100644 --- a/test/image/mocks/quiver_sizemode.json +++ b/test/image/mocks/quiver_sizemode.json @@ -10,9 +10,9 @@ "sizemode": "scaled", "sizeref": 0.3, "anchor": "tail", - "line": { + "marker": { "color": "red", - "width": 2 + "line": {"width": 2} }, "xaxis": "x", "yaxis": "y" @@ -27,9 +27,9 @@ "sizemode": "absolute", "sizeref": 0.3, "anchor": "tail", - "line": { + "marker": { "color": "blue", - "width": 2 + "line": {"width": 2} }, "xaxis": "x2", "yaxis": "y2" @@ -44,9 +44,9 @@ "sizemode": "raw", "sizeref": 1, "anchor": "tail", - "line": { + "marker": { "color": "green", - "width": 2 + "line": {"width": 2} }, "xaxis": "x3", "yaxis": "y3" diff --git a/test/image/mocks/quiver_wind.json b/test/image/mocks/quiver_wind.json index cea3a550e17..8d5ea5d8a08 100644 --- a/test/image/mocks/quiver_wind.json +++ b/test/image/mocks/quiver_wind.json @@ -32,10 +32,8 @@ "colorbar": { "title": {"text": "Speed"}, "x": 1.02 - } - }, - "line": { - "width": 1.5 + }, + "line": {"width": 1.5} } } ], diff --git a/test/image/mocks/quiver_zero-vectors.json b/test/image/mocks/quiver_zero-vectors.json index b7384edcb40..9c2af92d228 100644 --- a/test/image/mocks/quiver_zero-vectors.json +++ b/test/image/mocks/quiver_zero-vectors.json @@ -10,9 +10,9 @@ "sizemode": "scaled", "sizeref": 0.5, "anchor": "tail", - "line": { + "marker": { "color": "purple", - "width": 2 + "line": {"width": 2} } } ], diff --git a/test/jasmine/tests/quiver_test.js b/test/jasmine/tests/quiver_test.js index 6c829a7278e..7c45a451d77 100644 --- a/test/jasmine/tests/quiver_test.js +++ b/test/jasmine/tests/quiver_test.js @@ -250,7 +250,7 @@ describe('Test quiver interactions', function() { y: [1, 2], u: [1, 0], v: [0, 1], - line: {color: 'red'} + marker: {color: 'red'} }, { type: 'quiver', name: 'trace B', @@ -258,7 +258,7 @@ describe('Test quiver interactions', function() { y: [3, 4], u: [-1, 0], v: [0, -1], - line: {color: 'blue'} + marker: {color: 'blue'} }], { margin: {l: 0, t: 0, r: 0, b: 0}, width: 400, diff --git a/test/plot-schema.json b/test/plot-schema.json index d5fe0d3b366..4927c2428f6 100644 --- a/test/plot-schema.json +++ b/test/plot-schema.json @@ -57651,12 +57651,6 @@ "min": 0.3, "valType": "number" }, - "arrowwidth": { - "description": "Sets the width (in px) of the arrow line (alias of `line.width`).", - "editType": "style", - "min": 0.1, - "valType": "number" - }, "customdata": { "description": "Assigns extra data each datum. This may be useful when listening to hover, click and selection events. Note that, *scatter* traces also appends customdata items in the markers DOM elements", "editType": "calc", @@ -58050,65 +58044,6 @@ "min": 0, "valType": "number" }, - "line": { - "color": { - "description": "Sets the color of the arrow lines.", - "dflt": "#000", - "editType": "style", - "valType": "color" - }, - "dash": { - "description": "Sets the dash style of lines. Set to a dash type string (*solid*, *dot*, *dash*, *longdash*, *dashdot*, or *longdashdot*) or a dash length list in px (eg *5px,10px,2px,2px*).", - "dflt": "solid", - "editType": "style", - "valType": "string", - "values": [ - "solid", - "dot", - "dash", - "longdash", - "dashdot", - "longdashdot" - ] - }, - "editType": "style", - "role": "object", - "shape": { - "description": "Determines the line shape.", - "dflt": "linear", - "editType": "plot", - "valType": "enumerated", - "values": [ - "linear", - "spline", - "hv", - "vh", - "hvh", - "vhv" - ] - }, - "simplify": { - "description": "Simplifies lines by removing nearly-overlapping points.", - "dflt": true, - "editType": "plot", - "valType": "boolean" - }, - "smoothing": { - "description": "Has an effect only if `shape` is set to *spline*. Sets the amount of smoothing.", - "dflt": 1, - "editType": "plot", - "max": 1.3, - "min": 0, - "valType": "number" - }, - "width": { - "description": "Sets the width (in px) of the arrow lines.", - "dflt": 1, - "editType": "style", - "min": 0, - "valType": "number" - } - }, "marker": { "autocolorscale": { "description": "Determines whether the colorscale is a default palette (`autocolorscale: true`) or the palette determined by `marker.colorscale`. Has an effect only if in `marker.color` is set to a numerical array. In case `colorscale` is unspecified or `autocolorscale` is true, the default palette will be chosen according to whether numbers in the `color` array are all positive, all negative or mixed.", @@ -58784,6 +58719,31 @@ "valType": "string" }, "editType": "calc", + "line": { + "dash": { + "description": "Sets the dash style of lines. Set to a dash type string (*solid*, *dot*, *dash*, *longdash*, *dashdot*, or *longdashdot*) or a dash length list in px (eg *5px,10px,2px,2px*).", + "dflt": "solid", + "editType": "style", + "valType": "string", + "values": [ + "solid", + "dot", + "dash", + "longdash", + "dashdot", + "longdashdot" + ] + }, + "editType": "style", + "role": "object", + "width": { + "description": "Sets the width (in px) of the arrow lines.", + "dflt": 1, + "editType": "style", + "min": 0, + "valType": "number" + } + }, "reversescale": { "description": "Reverses the color mapping if true. Has an effect only if in `marker.color` is set to a numerical array. If true, `marker.cmin` will correspond to the last color in the array and `marker.cmax` will correspond to the first color.", "dflt": false, From 37a6cd2104571fa00546816a2f13fbc437da33f6 Mon Sep 17 00:00:00 2001 From: degzhaus Date: Mon, 9 Mar 2026 12:05:32 -0700 Subject: [PATCH 29/46] Move arrowheadsize under marker --- src/traces/quiver/attributes.js | 30 +++++++--------------- src/traces/quiver/defaults.js | 3 +-- src/traces/quiver/plot.js | 7 ++--- test/image/mocks/quiver_arrow-styling.json | 6 ++--- 4 files changed, 17 insertions(+), 29 deletions(-) diff --git a/src/traces/quiver/attributes.js b/src/traces/quiver/attributes.js index 16a6a7b68f0..0c7dd04745f 100644 --- a/src/traces/quiver/attributes.js +++ b/src/traces/quiver/attributes.js @@ -7,6 +7,7 @@ var axisHoverFormat = require('../../plots/cartesian/axis_format_attributes').ax var extendFlat = require('../../lib/extend').extendFlat; var colorScaleAttrs = require('../../components/colorscale/attributes'); var dash = require('../../components/drawing/attributes').dash; +var annotationAttrs = require('../../components/annotations/attributes'); var attrs = { x: { @@ -79,26 +80,6 @@ var attrs = { uhoverformat: axisHoverFormat('u', 'noDate'), vhoverformat: axisHoverFormat('v', 'noDate'), - // Arrowhead sizing, consistent with annotations API naming - arrowsize: { - valType: 'number', - min: 0.3, - dflt: 1, - editType: 'calc', - description: [ - 'Scales the size of the arrow head relative to a base size.', - 'Higher values produce larger heads.' - ].join(' ') - }, - // Back-compat alias - arrow_scale: { - valType: 'number', - min: 0, - max: 1, - editType: 'calc', - description: 'Deprecated alias for `arrowsize`-based sizing. Prefer using `arrowsize`.' - }, - // Text and labels text: { valType: 'data_array', @@ -125,9 +106,16 @@ var attrs = { description: 'Sets the text font.' }), - // Marker: color, colorscale, and line styling for arrows + // Marker: color, colorscale, arrowhead sizing, and line styling for arrows marker: extendFlat( { + arrowsize: extendFlat({}, annotationAttrs.arrowsize, { + editType: 'calc', + description: [ + 'Sets the size of the arrow head relative to `marker.line.width`.', + 'A value of 1 (default) gives a head about 3x as wide as the line.' + ].join(' ') + }), line: { width: { valType: 'number', diff --git a/src/traces/quiver/defaults.js b/src/traces/quiver/defaults.js index 7a437f91754..43016332025 100644 --- a/src/traces/quiver/defaults.js +++ b/src/traces/quiver/defaults.js @@ -36,8 +36,7 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout coerce('anchor'); // Arrow styling - coerce('arrowsize'); - coerce('arrow_scale'); // back-compat alias + coerce('marker.arrowsize'); coerce('hoverdistance'); // Line styling under marker.line diff --git a/src/traces/quiver/plot.js b/src/traces/quiver/plot.js index a204a055880..8cfdc4795ac 100644 --- a/src/traces/quiver/plot.js +++ b/src/traces/quiver/plot.js @@ -102,9 +102,10 @@ function plotOne(gd, idx, plotinfo, cdscatter, cdscatterAll, element, transition var pxPerY = Math.abs(ya.c2p(cdi.y + 1) - ya.c2p(cdi.y)); var scaleRatio = (pxPerX && pxPerY) ? (pxPerY / pxPerX) : 1; var baseHeadScale = 0.2; - var arrowScale = (trace.arrowsize !== undefined) - ? (baseHeadScale * trace.arrowsize) - : (trace.arrow_scale !== undefined ? trace.arrow_scale : baseHeadScale); + var markerArrowsize = (trace.marker || {}).arrowsize; + var arrowScale = (markerArrowsize !== undefined) + ? (baseHeadScale * markerArrowsize) + : baseHeadScale; // Fixed arrowhead wedge angle (radians). // Arrow direction is fully determined by u,v (see barbAng below); // this constant only controls the opening of the head. diff --git a/test/image/mocks/quiver_arrow-styling.json b/test/image/mocks/quiver_arrow-styling.json index 1d7e008fdd7..db51a45a8f3 100644 --- a/test/image/mocks/quiver_arrow-styling.json +++ b/test/image/mocks/quiver_arrow-styling.json @@ -9,10 +9,10 @@ "v": [1, 1, 1], "sizemode": "scaled", "sizeref": 0.5, - "arrowsize": 0.5, "anchor": "tail", "marker": { "color": "red", + "arrowsize": 0.5, "line": {"width": 1} } }, @@ -25,10 +25,10 @@ "v": [1, 1, 1], "sizemode": "scaled", "sizeref": 0.5, - "arrowsize": 1.0, "anchor": "tail", "marker": { "color": "blue", + "arrowsize": 1.0, "line": {"width": 2} } }, @@ -41,10 +41,10 @@ "v": [1, 1, 1], "sizemode": "scaled", "sizeref": 0.5, - "arrowsize": 2.0, "anchor": "tail", "marker": { "color": "green", + "arrowsize": 2.0, "line": {"width": 3} } } From c40a5e0eac30a134fba95db18ff03e87a7b3d720 Mon Sep 17 00:00:00 2001 From: degzhaus Date: Mon, 9 Mar 2026 12:14:00 -0700 Subject: [PATCH 30/46] Run npm run schema --- test/plot-schema.json | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/test/plot-schema.json b/test/plot-schema.json index 4927c2428f6..75647027b32 100644 --- a/test/plot-schema.json +++ b/test/plot-schema.json @@ -57637,20 +57637,6 @@ "middle" ] }, - "arrow_scale": { - "description": "Deprecated alias for `arrowsize`-based sizing. Prefer using `arrowsize`.", - "editType": "calc", - "max": 1, - "min": 0, - "valType": "number" - }, - "arrowsize": { - "description": "Scales the size of the arrow head relative to a base size. Higher values produce larger heads.", - "dflt": 1, - "editType": "calc", - "min": 0.3, - "valType": "number" - }, "customdata": { "description": "Assigns extra data each datum. This may be useful when listening to hover, click and selection events. Note that, *scatter* traces also appends customdata items in the markers DOM elements", "editType": "calc", @@ -58045,6 +58031,13 @@ "valType": "number" }, "marker": { + "arrowsize": { + "description": "Sets the size of the arrow head relative to `marker.line.width`. A value of 1 (default) gives a head about 3x as wide as the line.", + "dflt": 1, + "editType": "calc", + "min": 0.3, + "valType": "number" + }, "autocolorscale": { "description": "Determines whether the colorscale is a default palette (`autocolorscale: true`) or the palette determined by `marker.colorscale`. Has an effect only if in `marker.color` is set to a numerical array. In case `colorscale` is unspecified or `autocolorscale` is true, the default palette will be chosen according to whether numbers in the `color` array are all positive, all negative or mixed.", "dflt": true, From fcb5701d28221cab97391da24f891adbc257881a Mon Sep 17 00:00:00 2001 From: degzhaus Date: Mon, 9 Mar 2026 12:23:24 -0700 Subject: [PATCH 31/46] Regenerate quiver custom colorscale --- .../baselines/quiver_custom-colorscale.png | Bin 27483 -> 27324 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/test/image/baselines/quiver_custom-colorscale.png b/test/image/baselines/quiver_custom-colorscale.png index 4250a406e67ad204a73034aaac209c3f717e15a3..79108fa949d485a60c00200375d765a709398941 100644 GIT binary patch literal 27324 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 E0GXC1y8r+H literal 27483 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 Date: Mon, 9 Mar 2026 12:44:22 -0700 Subject: [PATCH 32/46] Import scatter attributes for x, y coercion --- src/traces/quiver/attributes.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/traces/quiver/attributes.js b/src/traces/quiver/attributes.js index 0c7dd04745f..d53ac5e0239 100644 --- a/src/traces/quiver/attributes.js +++ b/src/traces/quiver/attributes.js @@ -8,6 +8,7 @@ var extendFlat = require('../../lib/extend').extendFlat; var colorScaleAttrs = require('../../components/colorscale/attributes'); var dash = require('../../components/drawing/attributes').dash; var annotationAttrs = require('../../components/annotations/attributes'); +var scatterAttrs = require('../scatter/attributes'); var attrs = { x: { @@ -16,12 +17,16 @@ var attrs = { anim: true, description: 'Sets the x coordinates of the arrow locations.' }, + x0: scatterAttrs.x0, + dx: scatterAttrs.dx, y: { valType: 'data_array', editType: 'calc+clearAxisTypes', anim: true, description: 'Sets the y coordinates of the arrow locations.' }, + y0: scatterAttrs.y0, + dy: scatterAttrs.dy, u: { valType: 'data_array', editType: 'calc', From e46104b9435293d0b21d023a293afc7d9ca21052 Mon Sep 17 00:00:00 2001 From: degzhaus Date: Mon, 9 Mar 2026 12:46:06 -0700 Subject: [PATCH 33/46] Run npm run schema --- test/plot-schema.json | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/test/plot-schema.json b/test/plot-schema.json index 75647027b32..2d1e47073b0 100644 --- a/test/plot-schema.json +++ b/test/plot-schema.json @@ -57647,6 +57647,20 @@ "editType": "none", "valType": "string" }, + "dx": { + "anim": true, + "description": "Sets the x coordinate step. See `x0` for more info.", + "dflt": 1, + "editType": "calc", + "valType": "number" + }, + "dy": { + "anim": true, + "description": "Sets the y coordinate step. See `y0` for more info.", + "dflt": 1, + "editType": "calc", + "valType": "number" + }, "hoverdistance": { "description": "Maximum distance (in pixels) to look for nearby arrows on hover.", "dflt": 20, @@ -59112,6 +59126,13 @@ "editType": "calc+clearAxisTypes", "valType": "data_array" }, + "x0": { + "anim": true, + "description": "Alternate to `x`. Builds a linear space of x coordinates. Use with `dx` where `x0` is the starting coordinate and `dx` the step.", + "dflt": 0, + "editType": "calc+clearAxisTypes", + "valType": "any" + }, "xaxis": { "description": "Sets a reference between this trace's x coordinates and a 2D cartesian x axis. If *x* (the default value), the x coordinates refer to `layout.xaxis`. If *x2*, the x coordinates refer to `layout.xaxis2`, and so on.", "dflt": "x", @@ -59135,6 +59156,13 @@ "editType": "calc+clearAxisTypes", "valType": "data_array" }, + "y0": { + "anim": true, + "description": "Alternate to `y`. Builds a linear space of y coordinates. Use with `dy` where `y0` is the starting coordinate and `dy` the step.", + "dflt": 0, + "editType": "calc+clearAxisTypes", + "valType": "any" + }, "yaxis": { "description": "Sets a reference between this trace's y coordinates and a 2D cartesian y axis. If *y* (the default value), the y coordinates refer to `layout.yaxis`. If *y2*, the y coordinates refer to `layout.yaxis2`, and so on.", "dflt": "y", From 48e4e7e7c7d41eea94539d8c4e1cabf2342bc154 Mon Sep 17 00:00:00 2001 From: degzhaus Date: Mon, 6 Apr 2026 14:10:03 -0700 Subject: [PATCH 34/46] Passing tests --- src/traces/quiver/defaults.js | 7 +++++++ test/jasmine/tests/lib_test.js | 5 +++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/traces/quiver/defaults.js b/src/traces/quiver/defaults.js index 43016332025..cd4199f6ebc 100644 --- a/src/traces/quiver/defaults.js +++ b/src/traces/quiver/defaults.js @@ -11,6 +11,13 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout return Lib.coerce(traceIn, traceOut, attributes, attr, dflt); } + // Quiver requires explicit x and y inputs (no x0/dx or y0/dy fallback). + // Check presence on traceIn and let handleXYDefaults validate lengths. + if(traceIn.x === undefined || traceIn.y === undefined) { + traceOut.visible = false; + return; + } + var len = handleXYDefaults(traceIn, traceOut, layout, coerce); if(!len) { traceOut.visible = false; diff --git a/test/jasmine/tests/lib_test.js b/test/jasmine/tests/lib_test.js index fe1f6b71f0c..ff4a69f1c55 100644 --- a/test/jasmine/tests/lib_test.js +++ b/test/jasmine/tests/lib_test.js @@ -2729,8 +2729,9 @@ describe('Test lib.js:', function () { for (var i = 0; i < 15; i++) { Lib.hovertemplateString({ fallback: '', template: '%{idontexist}' }); } - // Expect 11 since the suppression warning also calls Lib.warn - expect(Lib.warn.calls.count()).toBe(11); + // Depending on prior tests, the suppression warning may already be reached once. + expect(Lib.warn.calls.count()).toBeGreaterThanOrEqual(10); + expect(Lib.warn.calls.count()).toBeLessThanOrEqual(11); }); // This test must come after the warning count since it will affect the count From a2799e2a4a938c6498a0f4e7f7a8661602d9a91f Mon Sep 17 00:00:00 2001 From: degzhaus Date: Tue, 23 Jun 2026 18:32:40 -0700 Subject: [PATCH 35/46] Adjust axis ranges automatically to include full length of arrows --- src/traces/quiver/calc.js | 88 +++++++++++++++++++------- src/traces/quiver/cross_trace_calc.js | 89 +++++++++++++++++++++++++++ src/traces/quiver/index.js | 1 + test/image/mocks/quiver_anchor.json | 30 ++++----- test/image/mocks/quiver_sizemode.json | 30 ++++----- 5 files changed, 185 insertions(+), 53 deletions(-) create mode 100644 src/traces/quiver/cross_trace_calc.js diff --git a/src/traces/quiver/calc.js b/src/traces/quiver/calc.js index c7a13bca831..6452810268a 100644 --- a/src/traces/quiver/calc.js +++ b/src/traces/quiver/calc.js @@ -67,15 +67,33 @@ module.exports = function calc(gd, trace) { // Store maxNorm for use by plot.js trace._maxNorm = normMax; - // Compute arrow endpoints for axis expansion. - // We approximate with scaleRatio=1 (exact for square plots, - // close enough for autorange padding in non-square plots). + // Compute arrow geometry for axis autorange. + // + // The v-component is drawn directly in data space, so each arrow's y-tip is + // exact and we expand the y-axis here with the tip coordinates. The + // u-component is stretched by scaleRatio = pxPerY / pxPerX in plot.js so + // that arrows keep their on-screen angle, which makes an arrow's *horizontal + // pixel extent* depend on the y-scale rather than the x-scale: + // |dx_px| = pxPerY * baseLen * |unitx| + // We therefore expand the x-axis with pixel padding (ppad) rather than + // data-space tips (whose data width would depend on the very x-range we are + // trying to compute). Since that ppad depends on the y-scale - which depends + // on the combined y-extent of every quiver trace sharing the axis - the + // x-axis expansion is finished in crossTraceCalc; here we stash the per-point + // geometry and y-bounds it needs. var sizemode = trace.sizemode || 'scaled'; var sizeref = (trace.sizeref !== undefined) ? trace.sizeref : (sizemode === 'raw' ? 1 : 0.5); var anchor = trace.anchor || 'tail'; + var isTip = anchor === 'tip'; + var isCenter = anchor === 'cm' || anchor === 'center' || anchor === 'middle'; - var allX = new Array(len * 2); - var allY = new Array(len * 2); + var baseX = new Array(len); + var tipsY = new Array(len * 2); + var geomLen = new Array(len); + var geomUx = new Array(len); + + var yMin = Infinity; + var yMax = -Infinity; for(var k = 0; k < len; k++) { var xk = xVals[k]; @@ -93,33 +111,57 @@ module.exports = function calc(gd, trace) { var unitxk = nk ? (uk / nk) : 0; var unityk = nk ? (vk / nk) : 0; - var dxk = unitxk * baseLen; var dyk = unityk * baseLen; - if(anchor === 'tip') { - allX[k * 2] = xk; - allY[k * 2] = yk; - allX[k * 2 + 1] = xk - dxk; - allY[k * 2 + 1] = yk - dyk; - } else if(anchor === 'cm' || anchor === 'center' || anchor === 'middle') { - allX[k * 2] = xk - dxk / 2; - allY[k * 2] = yk - dyk / 2; - allX[k * 2 + 1] = xk + dxk / 2; - allY[k * 2 + 1] = yk + dyk / 2; + geomLen[k] = baseLen; + geomUx[k] = unitxk; + baseX[k] = xk; + + var y0, y1; + if(isTip) { + y1 = yk; + y0 = yk - dyk; + } else if(isCenter) { + y0 = yk - dyk / 2; + y1 = yk + dyk / 2; } else { // tail (default) - allX[k * 2] = xk; - allY[k * 2] = yk; - allX[k * 2 + 1] = xk + dxk; - allY[k * 2 + 1] = yk + dyk; + y0 = yk; + y1 = yk + dyk; + } + tipsY[k * 2] = y0; + tipsY[k * 2 + 1] = y1; + + if(isNumeric(y0)) { + if(y0 < yMin) yMin = y0; + if(y0 > yMax) yMax = y0; + } + if(isNumeric(y1)) { + if(y1 < yMin) yMin = y1; + if(y1 > yMax) yMax = y1; } } - // Expand axes to include both base positions and arrow tips xa._minDtick = 0; ya._minDtick = 0; - trace._extremes[xa._id] = Axes.findExtremes(xa, allX, {padded: true}); - trace._extremes[ya._id] = Axes.findExtremes(ya, allY, {padded: true}); + // y-axis: arrow tips are exact in data space. + trace._extremes[ya._id] = Axes.findExtremes(ya, tipsY, {padded: true}); + + // x-axis: provisional bound from the base positions only; crossTraceCalc + // replaces this with a ppad-based expansion once the combined y-scale across + // all quiver traces on this axis is known. + trace._extremes[xa._id] = Axes.findExtremes(xa, baseX, {padded: true}); + + // Geometry needed to finish the x-axis expansion in crossTraceCalc. + trace._quiver = { + baseX: baseX, + geomLen: geomLen, + geomUx: geomUx, + isTip: isTip, + isCenter: isCenter, + yMin: yMin, + yMax: yMax + }; // Merge text arrays into calcdata for Drawing.textPointStyle Lib.mergeArray(trace.text, cd, 'tx'); diff --git a/src/traces/quiver/cross_trace_calc.js b/src/traces/quiver/cross_trace_calc.js new file mode 100644 index 00000000000..a4879155961 --- /dev/null +++ b/src/traces/quiver/cross_trace_calc.js @@ -0,0 +1,89 @@ +'use strict'; + +var Axes = require('../../plots/cartesian/axes'); + +/** + * Finish quiver x-axis autorange. + * + * An arrow's horizontal pixel extent is `pxPerY * baseLen * |unitx|` (see + * calc.js and plot.js), so it is governed by the y-scale, not the x-scale. The + * y-scale in turn depends on the combined y-extent of every quiver trace sharing + * the axis, which is only known here - after all per-trace calc() runs. We + * estimate pxPerY from that combined extent and expand the x-axis with pixel + * padding so the full arrows stay visible without a hard-coded range. + * + * Runs once per cartesian subplot (see Plots.doCrossTraceCalc). + */ +module.exports = function crossTraceCalc(gd, plotinfo) { + var xa = plotinfo.xaxis; + var ya = plotinfo.yaxis; + var fullData = gd._fullData; + + var traces = []; + var yMin = Infinity; + var yMax = -Infinity; + + for(var i = 0; i < fullData.length; i++) { + var trace = fullData[i]; + if( + trace.visible === true && + trace.type === 'quiver' && + trace.xaxis === xa._id && + trace.yaxis === ya._id && + trace._quiver + ) { + traces.push(trace); + var q = trace._quiver; + if(q.yMin < yMin) yMin = q.yMin; + if(q.yMax > yMax) yMax = q.yMax; + } + } + + if(!traces.length) return; + + // Estimate the final y-scale (pixels per y data unit). The y-axis only gets + // the standard 5%-per-side autorange padding, so its span ends up ~ span/0.9; + // a coincident set of points falls back to the autorange default span of 2. + // Using the quiver-only y-extent is a safe estimate: any extra (e.g. from + // other traces) can only widen the y-range, lowering pxPerY and leaving a + // little extra room on x rather than clipping. + ya.setScale(); + var yDataSpan = (yMax > yMin) ? (yMax - yMin) : 0; + var yEstSpan = yDataSpan > 0 ? (yDataSpan / 0.9) : 2; + var pxPerY = (ya._length && yEstSpan) ? (ya._length / yEstSpan) : 0; + + for(var t = 0; t < traces.length; t++) { + var tr = traces[t]; + var q2 = tr._quiver; + var baseX = q2.baseX; + var geomLen = q2.geomLen; + var geomUx = q2.geomUx; + var len = baseX.length; + + var ppadplus = new Array(len); + var ppadminus = new Array(len); + + for(var j = 0; j < len; j++) { + var xPixExt = pxPerY * geomLen[j] * Math.abs(geomUx[j]); + var plus = 0; + var minus = 0; + if(q2.isCenter) { + plus = minus = xPixExt / 2; + } else if(q2.isTip) { + if(geomUx[j] >= 0) minus = xPixExt; + else plus = xPixExt; + } else { // tail + if(geomUx[j] >= 0) plus = xPixExt; + else minus = xPixExt; + } + ppadplus[j] = plus; + ppadminus[j] = minus; + } + + tr._extremes[xa._id] = Axes.findExtremes(xa, baseX, { + padded: true, + ppadplus: ppadplus, + ppadminus: ppadminus + }); + } +}; diff --git a/src/traces/quiver/index.js b/src/traces/quiver/index.js index 42d17716358..b4183ebac0e 100644 --- a/src/traces/quiver/index.js +++ b/src/traces/quiver/index.js @@ -11,6 +11,7 @@ module.exports = { attributes: require('./attributes'), supplyDefaults: require('./defaults'), calc: require('./calc'), + crossTraceCalc: require('./cross_trace_calc'), plot: require('./plot'), style: require('./style').style, styleOnSelect: require('./style').styleOnSelect, diff --git a/test/image/mocks/quiver_anchor.json b/test/image/mocks/quiver_anchor.json index 5c9942cebb1..db647e0059a 100644 --- a/test/image/mocks/quiver_anchor.json +++ b/test/image/mocks/quiver_anchor.json @@ -3,12 +3,12 @@ { "type": "quiver", "name": "tail anchor", - "x": [1, 1, 1], - "y": [0, 0, 0], - "u": [1, 0, -1], - "v": [1, 1, 1], + "x": [0, 1, 2, 0, 1, 2, 0, 1, 2], + "y": [0, 0, 0, 1, 1, 1, 2, 2, 2], + "u": [1, 1, 1, 1, 1, 1, 1, 1, 1], + "v": [1, 1, 1, 1, 1, 1, 1, 1, 1], "sizemode": "scaled", - "sizeref": 0.5, + "sizeref": 0.4, "anchor": "tail", "marker": { "color": "red", @@ -20,12 +20,12 @@ { "type": "quiver", "name": "tip anchor", - "x": [1, 1, 1], - "y": [1, 1, 1], - "u": [1, 0, -1], - "v": [1, 1, 1], + "x": [0, 1, 2, 0, 1, 2, 0, 1, 2], + "y": [0, 0, 0, 1, 1, 1, 2, 2, 2], + "u": [1, 1, 1, 1, 1, 1, 1, 1, 1], + "v": [1, 1, 1, 1, 1, 1, 1, 1, 1], "sizemode": "scaled", - "sizeref": 0.5, + "sizeref": 0.4, "anchor": "tip", "marker": { "color": "blue", @@ -37,12 +37,12 @@ { "type": "quiver", "name": "center anchor", - "x": [1, 1, 1], - "y": [2, 2, 2], - "u": [1, 0, -1], - "v": [1, 1, 1], + "x": [0, 1, 2, 0, 1, 2, 0, 1, 2], + "y": [0, 0, 0, 1, 1, 1, 2, 2, 2], + "u": [1, 1, 1, 1, 1, 1, 1, 1, 1], + "v": [1, 1, 1, 1, 1, 1, 1, 1, 1], "sizemode": "scaled", - "sizeref": 0.5, + "sizeref": 0.4, "anchor": "center", "marker": { "color": "green", diff --git a/test/image/mocks/quiver_sizemode.json b/test/image/mocks/quiver_sizemode.json index 654dbc8ed5c..f7e1d1cb4c9 100644 --- a/test/image/mocks/quiver_sizemode.json +++ b/test/image/mocks/quiver_sizemode.json @@ -3,12 +3,12 @@ { "type": "quiver", "name": "scaled", - "x": [0, 1, 2], - "y": [0, 0, 0], - "u": [1, 2, 3], - "v": [1, 1, 1], + "x": [0, 1, 2, 0, 1, 2, 0, 1, 2], + "y": [0, 0, 0, 1, 1, 1, 2, 2, 2], + "u": [1, 2, 3, 1, 2, 3, 1, 2, 3], + "v": [1, 1, 1, 1, 1, 1, 1, 1, 1], "sizemode": "scaled", - "sizeref": 0.3, + "sizeref": 0.4, "anchor": "tail", "marker": { "color": "red", @@ -20,12 +20,12 @@ { "type": "quiver", "name": "absolute", - "x": [0, 1, 2], - "y": [1, 1, 1], - "u": [1, 2, 3], - "v": [1, 1, 1], + "x": [0, 1, 2, 0, 1, 2, 0, 1, 2], + "y": [0, 0, 0, 1, 1, 1, 2, 2, 2], + "u": [1, 2, 3, 1, 2, 3, 1, 2, 3], + "v": [1, 1, 1, 1, 1, 1, 1, 1, 1], "sizemode": "absolute", - "sizeref": 0.3, + "sizeref": 0.15, "anchor": "tail", "marker": { "color": "blue", @@ -37,12 +37,12 @@ { "type": "quiver", "name": "raw", - "x": [0, 1, 2], - "y": [2, 2, 2], - "u": [0.3, 0.6, 0.9], - "v": [0.3, 0.3, 0.3], + "x": [0, 1, 2, 0, 1, 2, 0, 1, 2], + "y": [0, 0, 0, 1, 1, 1, 2, 2, 2], + "u": [0.3, 0.6, 0.9, 0.3, 0.6, 0.9, 0.3, 0.6, 0.9], + "v": [0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3], "sizemode": "raw", - "sizeref": 1, + "sizeref": 0.6, "anchor": "tail", "marker": { "color": "green", From 334486499244ce165b2413902a3dec3dda849e00 Mon Sep 17 00:00:00 2001 From: degzhaus Date: Tue, 23 Jun 2026 18:45:56 -0700 Subject: [PATCH 36/46] Honor colorscale --- src/traces/quiver/plot.js | 21 ++------ src/traces/quiver/style.js | 66 ++++++++++++++++++++----- test/image/mocks/quiver_colorscale.json | 1 + 3 files changed, 59 insertions(+), 29 deletions(-) diff --git a/src/traces/quiver/plot.js b/src/traces/quiver/plot.js index 8cfdc4795ac..69b962bfd29 100644 --- a/src/traces/quiver/plot.js +++ b/src/traces/quiver/plot.js @@ -4,7 +4,7 @@ var d3 = require('@plotly/d3'); var Lib = require('../../lib'); var Drawing = require('../../components/drawing'); -var Colorscale = require('../../components/colorscale'); +var colorscaleStroke = require('./style').colorscaleStroke; module.exports = function plot(gd, plotinfo, cdscatter, scatterLayer, transitionOpts, makeOnCompleteCallback) { var join, onComplete; @@ -179,22 +179,9 @@ function plotOne(gd, idx, plotinfo, cdscatter, cdscatterAll, element, transition var lineColor = Lib.isArrayOrTypedArray(marker.color) ? undefined : marker.color; Drawing.lineGroupStyle(lineSegments, markerLine.width, lineColor, markerLine.dash); - // If colorscale present, color arrows by marker.color or magnitude |(u,v)| - if(trace._hasColorscale) { - var colorFunc = Colorscale.makeColorScaleFuncFromTrace(marker); - lineSegments.style('stroke', function(cdi) { - var markerColor = marker.color; - var value; - if(Lib.isArrayOrTypedArray(markerColor) && markerColor.length > cdi.i && isFinite(markerColor[cdi.i])) { - value = markerColor[cdi.i]; - } else { - var uVal = (trace.u && trace.u[cdi.i]) || 0; - var vVal = (trace.v && trace.v[cdi.i]) || 0; - value = Math.sqrt(uVal * uVal + vVal * vVal); - } - return colorFunc(value); - }); - } + // If colorscale present, color arrows by marker.color or magnitude |(u,v)|. + // Shared with style.js so the static render and restyle stay in sync. + if(trace._hasColorscale) colorscaleStroke(lineSegments, trace); // Render text labels at data points var textGroup = d3.select(element).selectAll('g.text') diff --git a/src/traces/quiver/style.js b/src/traces/quiver/style.js index 4bcc410bd81..66312f4837a 100644 --- a/src/traces/quiver/style.js +++ b/src/traces/quiver/style.js @@ -5,8 +5,30 @@ var Lib = require('../../lib'); var Drawing = require('../../components/drawing'); var Color = require('../../components/color'); +var Colorscale = require('../../components/colorscale'); var DESELECTDIM = require('../../constants/interactions').DESELECTDIM; +// Stroke each arrow path according to the trace colorscale, using marker.color +// when it is an array of scalar values, otherwise falling back to the vector +// magnitude |(u, v)|. `paths` may be a multi-path selection or a single path. +function colorscaleStroke(paths, trace) { + var marker = trace.marker || {}; + var colorFunc = Colorscale.makeColorScaleFuncFromTrace(marker); + + paths.style('stroke', function(cdi) { + var markerColor = marker.color; + var value; + if(Lib.isArrayOrTypedArray(markerColor) && markerColor.length > cdi.i && isFinite(markerColor[cdi.i])) { + value = markerColor[cdi.i]; + } else { + var uVal = (trace.u && trace.u[cdi.i]) || 0; + var vVal = (trace.v && trace.v[cdi.i]) || 0; + value = Math.sqrt(uVal * uVal + vVal * vVal); + } + return colorFunc(value); + }); +} + function style(gd) { var s = d3.select(gd).selectAll('g.trace.quiver'); @@ -16,8 +38,12 @@ function style(gd) { var markerLine = marker.line || {}; var lineColor = Lib.isArrayOrTypedArray(marker.color) ? undefined : marker.color; - d3.select(this).selectAll('path.js-line') - .call(Drawing.lineGroupStyle, markerLine.width, lineColor, markerLine.dash); + var paths = d3.select(this).selectAll('path.js-line'); + paths.call(Drawing.lineGroupStyle, markerLine.width, lineColor, markerLine.dash); + + // colorscale strokes must be applied after lineGroupStyle, which would + // otherwise flatten every arrow to a single (line.color) stroke + if(trace._hasColorscale) colorscaleStroke(paths, trace); }); } @@ -26,6 +52,7 @@ function styleOnSelect(gd, cd, sel) { var marker = trace.marker || {}; var markerLine = marker.line || {}; var lineColor = Lib.isArrayOrTypedArray(marker.color) ? undefined : marker.color; + var hasColorscale = trace._hasColorscale; if(!sel) return; @@ -39,29 +66,44 @@ function styleOnSelect(gd, cd, sel) { var path = d3.select(this); if(d.selected) { - var sc = selectedLine.color || lineColor; var sw = selectedLine.width !== undefined ? selectedLine.width : markerLine.width; - Drawing.lineGroupStyle(path, sw, sc, markerLine.dash); + if(selectedLine.color) { + Drawing.lineGroupStyle(path, sw, selectedLine.color, markerLine.dash); + } else if(hasColorscale) { + Drawing.lineGroupStyle(path, sw, lineColor, markerLine.dash); + colorscaleStroke(path, trace); + path.style('stroke-opacity', 1); + } else { + Drawing.lineGroupStyle(path, sw, lineColor, markerLine.dash); + } } else { var uc = unselectedLine.color; - var uw = unselectedLine.width; - if(!uc) { - uc = lineColor ? Color.addOpacity(lineColor, DESELECTDIM) : undefined; + var uw = unselectedLine.width !== undefined ? unselectedLine.width : markerLine.width; + if(uc) { + Drawing.lineGroupStyle(path, uw, uc, markerLine.dash); + } else if(hasColorscale) { + // keep colorscale color but dim via opacity + Drawing.lineGroupStyle(path, uw, lineColor, markerLine.dash); + colorscaleStroke(path, trace); + path.style('stroke-opacity', DESELECTDIM); + } else { + var dimColor = lineColor ? Color.addOpacity(lineColor, DESELECTDIM) : undefined; + Drawing.lineGroupStyle(path, uw, dimColor, markerLine.dash); } - if(uw === undefined) uw = markerLine.width; - Drawing.lineGroupStyle(path, uw, uc, markerLine.dash); } }); Drawing.selectedTextStyle(sel.selectAll('text'), trace); } else { - sel.selectAll('path.js-line') - .call(Drawing.lineGroupStyle, markerLine.width, lineColor, markerLine.dash); + var paths = sel.selectAll('path.js-line'); + paths.call(Drawing.lineGroupStyle, markerLine.width, lineColor, markerLine.dash); + if(hasColorscale) colorscaleStroke(paths, trace); Drawing.textPointStyle(sel.selectAll('text'), trace, gd); } } module.exports = { style: style, - styleOnSelect: styleOnSelect + styleOnSelect: styleOnSelect, + colorscaleStroke: colorscaleStroke }; diff --git a/test/image/mocks/quiver_colorscale.json b/test/image/mocks/quiver_colorscale.json index 9519c5e4196..48e3278a5b9 100644 --- a/test/image/mocks/quiver_colorscale.json +++ b/test/image/mocks/quiver_colorscale.json @@ -10,6 +10,7 @@ "sizeref": 0.3, "anchor": "tail", "marker": { + "color": [1.41, 2.24, 3.16, 2.24, 2.83, 3.61, 3.16, 3.61, 4.24], "colorscale": "Viridis", "showscale": true, "colorbar": { From 94dc00d952c894c6d0761337c78f64a33cc10fe2 Mon Sep 17 00:00:00 2001 From: degzhaus Date: Tue, 23 Jun 2026 18:51:33 -0700 Subject: [PATCH 37/46] Use center, Remove redundant anchor value options --- src/traces/quiver/attributes.js | 4 ++-- src/traces/quiver/calc.js | 2 +- src/traces/quiver/plot.js | 2 +- test/plot-schema.json | 6 ++---- 4 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/traces/quiver/attributes.js b/src/traces/quiver/attributes.js index d53ac5e0239..ef9a9ffa39f 100644 --- a/src/traces/quiver/attributes.js +++ b/src/traces/quiver/attributes.js @@ -63,13 +63,13 @@ var attrs = { }, anchor: { valType: 'enumerated', - values: ['tip', 'tail', 'cm', 'center', 'middle'], + values: ['tip', 'tail', 'center'], dflt: 'tail', editType: 'calc', description: [ 'Sets the arrows\' anchor with respect to their (x,y) positions.', 'Use *tail* to place (x,y) at the base, *tip* to place (x,y) at the head,', - 'or *cm*/*center*/*middle* to center the arrow on (x,y).' + 'or *center* to center the arrow on (x,y).' ].join(' ') }, hoverdistance: { diff --git a/src/traces/quiver/calc.js b/src/traces/quiver/calc.js index 6452810268a..426b658a395 100644 --- a/src/traces/quiver/calc.js +++ b/src/traces/quiver/calc.js @@ -85,7 +85,7 @@ module.exports = function calc(gd, trace) { var sizeref = (trace.sizeref !== undefined) ? trace.sizeref : (sizemode === 'raw' ? 1 : 0.5); var anchor = trace.anchor || 'tail'; var isTip = anchor === 'tip'; - var isCenter = anchor === 'cm' || anchor === 'center' || anchor === 'middle'; + var isCenter = anchor === 'center'; var baseX = new Array(len); var tipsY = new Array(len * 2); diff --git a/src/traces/quiver/plot.js b/src/traces/quiver/plot.js index 69b962bfd29..7c33b1940d3 100644 --- a/src/traces/quiver/plot.js +++ b/src/traces/quiver/plot.js @@ -142,7 +142,7 @@ function plotOne(gd, idx, plotinfo, cdscatter, cdscatterAll, element, transition y1 = cdi.y; x0 = x1 - dx; y0 = y1 - dy; - } else if(anchor === 'cm' || anchor === 'center' || anchor === 'middle') { + } else if(anchor === 'center') { x0 = cdi.x - dx / 2; y0 = cdi.y - dy / 2; x1 = cdi.x + dx / 2; diff --git a/test/plot-schema.json b/test/plot-schema.json index 2d1e47073b0..9414086744b 100644 --- a/test/plot-schema.json +++ b/test/plot-schema.json @@ -57625,16 +57625,14 @@ "animatable": true, "attributes": { "anchor": { - "description": "Sets the arrows' anchor with respect to their (x,y) positions. Use *tail* to place (x,y) at the base, *tip* to place (x,y) at the head, or *cm*/*center*/*middle* to center the arrow on (x,y).", + "description": "Sets the arrows' anchor with respect to their (x,y) positions. Use *tail* to place (x,y) at the base, *tip* to place (x,y) at the head, or *center* to center the arrow on (x,y).", "dflt": "tail", "editType": "calc", "valType": "enumerated", "values": [ "tip", "tail", - "cm", - "center", - "middle" + "center" ] }, "customdata": { From 2e214c7deb7790e7064ae31230f9235fcb0f540e Mon Sep 17 00:00:00 2001 From: degzhaus Date: Tue, 23 Jun 2026 19:00:03 -0700 Subject: [PATCH 38/46] Idiomatic extendFlat usage --- src/traces/quiver/attributes.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/traces/quiver/attributes.js b/src/traces/quiver/attributes.js index ef9a9ffa39f..77b78567fde 100644 --- a/src/traces/quiver/attributes.js +++ b/src/traces/quiver/attributes.js @@ -193,8 +193,9 @@ var attrs = { } }; -// Extend with base attributes (includes hoverinfo, etc.) -extendFlat(attrs, baseAttrs); +// Extend with base attributes (includes hoverinfo, etc.), keeping the +// quiver-specific attributes layered on top of the shared base attributes. +attrs = extendFlat({}, baseAttrs, attrs); // Add hoverinfo with proper flags for quiver // We need to create a new object to avoid mutating the shared base attributes From f3789e6332aad4d126fc3d1b25ea96c1c5ce3f2d Mon Sep 17 00:00:00 2001 From: degzhaus Date: Tue, 23 Jun 2026 19:08:15 -0700 Subject: [PATCH 39/46] Fallback to arrow color with opacity --- src/traces/quiver/style.js | 43 ++++++++++++++++---------------------- 1 file changed, 18 insertions(+), 25 deletions(-) diff --git a/src/traces/quiver/style.js b/src/traces/quiver/style.js index 66312f4837a..4082565b705 100644 --- a/src/traces/quiver/style.js +++ b/src/traces/quiver/style.js @@ -4,7 +4,6 @@ var d3 = require('@plotly/d3'); var Lib = require('../../lib'); var Drawing = require('../../components/drawing'); -var Color = require('../../components/color'); var Colorscale = require('../../components/colorscale'); var DESELECTDIM = require('../../constants/interactions').DESELECTDIM; @@ -64,32 +63,25 @@ function styleOnSelect(gd, cd, sel) { sel.selectAll('path.js-line').each(function(d) { var path = d3.select(this); + var dim = !d.selected; - if(d.selected) { - var sw = selectedLine.width !== undefined ? selectedLine.width : markerLine.width; - if(selectedLine.color) { - Drawing.lineGroupStyle(path, sw, selectedLine.color, markerLine.dash); - } else if(hasColorscale) { - Drawing.lineGroupStyle(path, sw, lineColor, markerLine.dash); - colorscaleStroke(path, trace); - path.style('stroke-opacity', 1); - } else { - Drawing.lineGroupStyle(path, sw, lineColor, markerLine.dash); - } + var explicitColor = dim ? unselectedLine.color : selectedLine.color; + var lineWidth = dim ? + (unselectedLine.width !== undefined ? unselectedLine.width : markerLine.width) : + (selectedLine.width !== undefined ? selectedLine.width : markerLine.width); + + if(explicitColor) { + Drawing.lineGroupStyle(path, lineWidth, explicitColor, markerLine.dash); + path.style('stroke-opacity', 1); } else { - var uc = unselectedLine.color; - var uw = unselectedLine.width !== undefined ? unselectedLine.width : markerLine.width; - if(uc) { - Drawing.lineGroupStyle(path, uw, uc, markerLine.dash); - } else if(hasColorscale) { - // keep colorscale color but dim via opacity - Drawing.lineGroupStyle(path, uw, lineColor, markerLine.dash); - colorscaleStroke(path, trace); - path.style('stroke-opacity', DESELECTDIM); - } else { - var dimColor = lineColor ? Color.addOpacity(lineColor, DESELECTDIM) : undefined; - Drawing.lineGroupStyle(path, uw, dimColor, markerLine.dash); - } + // Fall back to the arrow's own color (scalar marker.color, a + // marker.color array, or the colorscale). When marker.color is an + // array, lineColor is undefined and we cannot bake opacity into a + // color, so we keep each arrow's color and dim unselected arrows + // via stroke-opacity instead. + Drawing.lineGroupStyle(path, lineWidth, lineColor, markerLine.dash); + if(hasColorscale) colorscaleStroke(path, trace); + path.style('stroke-opacity', dim ? DESELECTDIM : 1); } }); @@ -98,6 +90,7 @@ function styleOnSelect(gd, cd, sel) { var paths = sel.selectAll('path.js-line'); paths.call(Drawing.lineGroupStyle, markerLine.width, lineColor, markerLine.dash); if(hasColorscale) colorscaleStroke(paths, trace); + paths.style('stroke-opacity', 1); Drawing.textPointStyle(sel.selectAll('text'), trace, gd); } } From dd71b9435c2a687e27d09126b9a3939914784231 Mon Sep 17 00:00:00 2001 From: degzhaus Date: Tue, 23 Jun 2026 19:13:52 -0700 Subject: [PATCH 40/46] Guard against infinite values --- src/traces/quiver/calc.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/traces/quiver/calc.js b/src/traces/quiver/calc.js index 426b658a395..14c9fbff149 100644 --- a/src/traces/quiver/calc.js +++ b/src/traces/quiver/calc.js @@ -178,6 +178,10 @@ module.exports = function calc(gd, trace) { // Colorscale cmin/cmax computation: prefer provided marker.color, else magnitude if(trace._hasColorscale) { var vals = hasMarkerColorArray ? [cMin, cMax] : [normMin, normMax]; + // Guard against all-invalid input (no finite values found), which would + // otherwise leave the seeds at +/-Infinity and feed them into the + // colorscale calc. Fall back to a neutral [0, 1] range. + if(!isFinite(vals[0]) || !isFinite(vals[1])) vals = [0, 1]; colorscaleCalc(gd, trace, { vals: vals, containerStr: 'marker', From eba15eb1fc19dde1ac54802a1c9f95219a710dc4 Mon Sep 17 00:00:00 2001 From: degzhaus Date: Tue, 23 Jun 2026 19:14:33 -0700 Subject: [PATCH 41/46] Remove unused imports --- test/jasmine/tests/quiver_test.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/test/jasmine/tests/quiver_test.js b/test/jasmine/tests/quiver_test.js index 7c45a451d77..9dca4693cc4 100644 --- a/test/jasmine/tests/quiver_test.js +++ b/test/jasmine/tests/quiver_test.js @@ -1,6 +1,4 @@ var Plotly = require('../../../lib/index'); -var Lib = require('../../../src/lib'); -var d3Select = require('../../strict-d3').select; var supplyAllDefaults = require('../assets/supply_defaults'); var createGraphDiv = require('../assets/create_graph_div'); From 813ab714bce3e06326f0a984afeb323ef5ff6ea4 Mon Sep 17 00:00:00 2001 From: Cameron DeCoster Date: Wed, 24 Jun 2026 16:15:03 -0600 Subject: [PATCH 42/46] Update schema and types --- src/types/core/data.d.ts | 2 + src/types/generated/schema.d.ts | 209 +++++++++++++++++++++++++++++++- test/plot-schema.json | 206 +------------------------------ 3 files changed, 216 insertions(+), 201 deletions(-) diff --git a/src/types/core/data.d.ts b/src/types/core/data.d.ts index 8d393a2e74c..c2af6655232 100644 --- a/src/types/core/data.d.ts +++ b/src/types/core/data.d.ts @@ -41,6 +41,7 @@ import type { ParcoordsData, PieData, PlotType, + QuiverData, SankeyData, Scatter3dData, ScattercarpetData, @@ -101,6 +102,7 @@ export type Data = | Partial | Partial | Partial + | Partial | Partial | Partial | Partial diff --git a/src/types/generated/schema.d.ts b/src/types/generated/schema.d.ts index f4ac6ebdae6..4d762b45321 100644 --- a/src/types/generated/schema.d.ts +++ b/src/types/generated/schema.d.ts @@ -23,7 +23,7 @@ export type PatternShape = '' | '/' | '\\' | 'x' | '-' | '|' | '+' | '.'; export type TransitionEasing = 'linear' | 'quad' | 'cubic' | 'sin' | 'exp' | 'circle' | 'elastic' | 'back' | 'bounce' | 'linear-in' | 'quad-in' | 'cubic-in' | 'sin-in' | 'exp-in' | 'circle-in' | 'elastic-in' | 'back-in' | 'bounce-in' | 'linear-out' | 'quad-out' | 'cubic-out' | 'sin-out' | 'exp-out' | 'circle-out' | 'elastic-out' | 'back-out' | 'bounce-out' | 'linear-in-out' | 'quad-in-out' | 'cubic-in-out' | 'sin-in-out' | 'exp-in-out' | 'circle-in-out' | 'elastic-in-out' | 'back-in-out' | 'bounce-in-out'; -export type TraceType = 'bar' | 'barpolar' | 'box' | 'candlestick' | 'carpet' | 'choropleth' | 'choroplethmap' | 'choroplethmapbox' | 'cone' | 'contour' | 'contourcarpet' | 'densitymap' | 'densitymapbox' | 'funnel' | 'funnelarea' | 'heatmap' | 'histogram' | 'histogram2d' | 'histogram2dcontour' | 'icicle' | 'image' | 'indicator' | 'isosurface' | 'mesh3d' | 'ohlc' | 'parcats' | 'parcoords' | 'pie' | 'sankey' | 'scatter' | 'scatter3d' | 'scattercarpet' | 'scattergeo' | 'scattergl' | 'scattermap' | 'scattermapbox' | 'scatterpolar' | 'scatterpolargl' | 'scattersmith' | 'scatterternary' | 'splom' | 'streamtube' | 'sunburst' | 'surface' | 'table' | 'treemap' | 'violin' | 'volume' | 'waterfall'; +export type TraceType = 'bar' | 'barpolar' | 'box' | 'candlestick' | 'carpet' | 'choropleth' | 'choroplethmap' | 'choroplethmapbox' | 'cone' | 'contour' | 'contourcarpet' | 'densitymap' | 'densitymapbox' | 'funnel' | 'funnelarea' | 'heatmap' | 'histogram' | 'histogram2d' | 'histogram2dcontour' | 'icicle' | 'image' | 'indicator' | 'isosurface' | 'mesh3d' | 'ohlc' | 'parcats' | 'parcoords' | 'pie' | 'quiver' | 'sankey' | 'scatter' | 'scatter3d' | 'scattercarpet' | 'scattergeo' | 'scattergl' | 'scattermap' | 'scattermapbox' | 'scatterpolar' | 'scatterpolargl' | 'scattersmith' | 'scatterternary' | 'splom' | 'streamtube' | 'sunburst' | 'surface' | 'table' | 'treemap' | 'violin' | 'volume' | 'waterfall'; /** @deprecated Renamed to TraceType. */ export type PlotType = TraceType; @@ -6959,6 +6959,213 @@ export interface PieData { visible?: true | false | 'legendonly'; } +export interface QuiverData { + /** + * Sets the arrows' anchor with respect to their (x,y) positions. Use *tail* to place (x,y) at the base, *tip* to place (x,y) at the head, or *center* to center the arrow on (x,y). + * @default 'tail' + */ + anchor?: 'tip' | 'tail' | 'center'; + /** Assigns extra data each datum. This may be useful when listening to hover, click and selection events. Note that, *scatter* traces also appends customdata items in the markers DOM elements */ + customdata?: Datum[] | Datum[][] | TypedArray; + /** + * Sets the x coordinate step. See `x0` for more info. + * @default 1 + */ + dx?: number; + /** + * Sets the y coordinate step. See `y0` for more info. + * @default 1 + */ + dy?: number; + /** + * Maximum distance (in pixels) to look for nearby arrows on hover. + * @default 20 + * Minimum: -1 + */ + hoverdistance?: number; + /** + * Determines which trace information appear on hover. If `none` or `skip` are set, no information is displayed upon hovering. But, if `none` is set, click and hover events are still fired. + * @default 'all' + */ + hoverinfo?: 'x' | 'y' | 'u' | 'v' | 'text' | 'name' | 'all' | 'none' | 'skip' | (string & {}) | ('x' | 'y' | 'u' | 'v' | 'text' | 'name' | 'all' | 'none' | 'skip' | (string & {}))[]; + hoverlabel?: HoverLabel; + /** Template string used for rendering the information that appear on hover box. Note that this will override `hoverinfo`. Variables are inserted using %{variable}, for example "y: %{y}" as well as %{xother}, {%_xother}, {%_xother_}, {%xother_}. When showing info for several points, *xother* will be added to those with different x positions from the first point. An underscore before or after *(x|y)other* will add a space on that side, only when this field is shown. Numbers are formatted using d3-format's syntax %{variable:d3-format}, for example "Price: %{y:$.2f}". https://github.com/d3/d3-format/tree/v1.4.5#d3-format for details on the formatting syntax. Dates are formatted using d3-time-format's syntax %{variable|d3-time-format}, for example "Day: %{2019-01-01|%A}". https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format for details on the date formatting syntax. Variables that can't be found will be replaced with the specifier. For example, a template of "data: %{x}, %{y}" will result in a value of "data: 1, %{y}" if x is 1 and y is missing. Variables with an undefined value will be replaced with the fallback value. The variables available in `hovertemplate` are the ones emitted as event data described at this link https://plotly.com/javascript/plotlyjs-events/#event-data. Additionally, all attributes that can be specified per-point (the ones that are `arrayOk: true`) are available. Finally, the template string has access to variables `x`, `y`, `u`, `v`, `text` and `name`. Anything contained in tag `` is displayed in the secondary box, for example `%{fullData.name}`. To hide the secondary box completely, use an empty tag ``. */ + hovertemplate?: string | string[]; + /** Assigns id labels to each datum. These ids for object constancy of data points during animation. Should be an array of strings, not numbers or any other type. */ + ids?: Datum[] | Datum[][] | TypedArray; + /** + * Sets the reference to a legend to show this trace in. References to these legends are *legend*, *legend2*, *legend3*, etc. Settings for these legends are set in the layout, under `layout.legend`, `layout.legend2`, etc. + * @default 'legend' + */ + legend?: string; + /** Sets the legend group for this trace. Traces and shapes part of the same legend group hide/show at the same time when toggling legend items. */ + legendgroup?: string; + legendgrouptitle?: LegendGroupTitle; + /** + * Sets the legend rank for this trace. Items and groups with smaller ranks are presented on top/left side while with *reversed* `legend.traceorder` they are on bottom/right side. The default legendrank is 1000, so that you can use ranks less than 1000 to place certain items before all unranked items, and ranks greater than 1000 to go after all unranked items. When having unranked or equal rank items shapes would be displayed after traces i.e. according to their order in data and layout. + * @default 1000 + */ + legendrank?: number; + /** + * Sets the width (in px or fraction) of the legend for this trace. + * Minimum: 0 + */ + legendwidth?: number; + marker?: { + /** + * Sets the size of the arrow head relative to `marker.line.width`. A value of 1 (default) gives a head about 3x as wide as the line. + * @default 1 + * Minimum: 0.3 + */ + arrowsize?: number; + /** + * Determines whether the colorscale is a default palette (`autocolorscale: true`) or the palette determined by `marker.colorscale`. Has an effect only if in `marker.color` is set to a numerical array. In case `colorscale` is unspecified or `autocolorscale` is true, the default palette will be chosen according to whether numbers in the `color` array are all positive, all negative or mixed. + * @default true + */ + autocolorscale?: boolean; + /** + * Determines whether or not the color domain is computed with respect to the input data (here in `marker.color`) or the bounds set in `marker.cmin` and `marker.cmax` Has an effect only if in `marker.color` is set to a numerical array. Defaults to `false` when `marker.cmin` and `marker.cmax` are set by the user. + * @default true + */ + cauto?: boolean; + /** + * Sets the upper bound of the color domain. Has an effect only if in `marker.color` is set to a numerical array. Value should have the same units as in `marker.color` and if set, `marker.cmin` must be set as well. + * Setting this also sets: cauto = false + */ + cmax?: number; + /** Sets the mid-point of the color domain by scaling `marker.cmin` and/or `marker.cmax` to be equidistant to this point. Has an effect only if in `marker.color` is set to a numerical array. Value should have the same units as in `marker.color`. Has no effect when `marker.cauto` is `false`. */ + cmid?: number; + /** + * Sets the lower bound of the color domain. Has an effect only if in `marker.color` is set to a numerical array. Value should have the same units as in `marker.color` and if set, `marker.cmax` must be set as well. + * Setting this also sets: cauto = false + */ + cmin?: number; + /** Sets the marker color. It accepts either a specific color or an array of numbers that are mapped to the colorscale relative to the max and min values of the array or relative to `marker.cmin` and `marker.cmax` if set. */ + color?: Color | Color[]; + /** Sets a reference to a shared color axis. References to these shared color axes are *coloraxis*, *coloraxis2*, *coloraxis3*, etc. Settings for these shared color axes are set in the layout, under `layout.coloraxis`, `layout.coloraxis2`, etc. Note that multiple color scales can be linked to the same color axis. */ + coloraxis?: string; + colorbar?: ColorBar; + /** + * Sets the colorscale. Has an effect only if in `marker.color` is set to a numerical array. The colorscale must be an array containing arrays mapping a normalized value to an rgb, rgba, hex, hsl, hsla, hwb, or named color string. At minimum, a mapping for the lowest (0) and highest (1) values are required. For example, `[[0, 'rgb(0,0,255)'], [1, 'rgb(255,0,0)']]`. To control the bounds of the colorscale in color space, use `marker.cmin` and `marker.cmax`. Alternatively, `colorscale` may be a palette name string of the following list: Blackbody,Bluered,Blues,Cividis,Earth,Electric,Greens,Greys,Hot,Jet,Picnic,Portland,Rainbow,RdBu,Reds,Viridis,YlGnBu,YlOrRd. + * Setting this also sets: autocolorscale = false + */ + colorscale?: ColorScale; + line?: { + /** + * Sets the dash style of lines. Set to a dash type string (*solid*, *dot*, *dash*, *longdash*, *dashdot*, or *longdashdot*) or a dash length list in px (eg *5px,10px,2px,2px*). + * @default 'solid' + */ + dash?: Dash; + /** + * Sets the width (in px) of the arrow lines. + * @default 1 + * Minimum: 0 + */ + width?: number; + }; + /** + * Reverses the color mapping if true. Has an effect only if in `marker.color` is set to a numerical array. If true, `marker.cmin` will correspond to the last color in the array and `marker.cmax` will correspond to the first color. + * @default false + */ + reversescale?: boolean; + /** + * Determines whether or not a colorbar is displayed for this trace. Has an effect only if in `marker.color` is set to a numerical array. + * @default true + */ + showscale?: boolean; + }; + /** Assigns extra meta information associated with this trace that can be used in various text attributes. Attributes such as trace `name`, graph, axis and colorbar `title.text`, annotation `text` `rangeselector`, `updatemenues` and `sliders` `label` text all support `meta`. To access the trace `meta` values in an attribute in the same trace, simply use `%{meta[i]}` where `i` is the index or key of the `meta` item in question. To access trace `meta` in layout attributes, use `%{data[n[.meta[i]}` where `i` is the index or key of the `meta` and `n` is the trace index. */ + meta?: any; + /** Sets the trace name. The trace name appears as the legend item and on hover. */ + name?: string; + /** + * Sets the opacity of the trace. + * @default 1 + * Range: [0, 1] + */ + opacity?: number; + selected?: { + line?: _internal.ErrorY; + textfont?: Font; + }; + /** Array containing integer indices of selected points. Has an effect only for traces that support selections. Note that an empty array means an empty selection where the `unselected` are turned on for all points, whereas, any other non-array values means no selection all where the `selected` and `unselected` styles have no effect. */ + selectedpoints?: any; + /** + * Determines whether or not an item corresponding to this trace is shown in the legend. + * @default true + */ + showlegend?: boolean; + /** + * Determines whether `sizeref` is set as a *scaled* (unitless) scalar (normalized by the max u/v norm in the vector field), as an *absolute* value (in the same units as the vector field), or *raw* to use the raw vector lengths. + * @default 'scaled' + */ + sizemode?: 'scaled' | 'absolute' | 'raw'; + /** + * Adjusts the arrow size scaling. The arrow length is determined by the vector norm multiplied by `sizeref`, optionally normalized when `sizemode` is *scaled*. + * Minimum: 0 + */ + sizeref?: number; + /** Sets text elements associated with each (x,y) pair. */ + text?: Datum[] | Datum[][] | TypedArray; + /** Sets the text font. */ + textfont?: FontArray; + /** + * Sets the positions of the `text` elements with respects to the (x,y) coordinates. + * @default 'middle center' + */ + textposition?: 'top left' | 'top center' | 'top right' | 'middle left' | 'middle center' | 'middle right' | 'bottom left' | 'bottom center' | 'bottom right'; + type?: 'quiver'; + /** Sets the x components of the arrow vectors. */ + u?: Datum[] | Datum[][] | TypedArray; + /** Sets the hover text formatting rule for `u` using d3 formatting mini-languages which are very similar to those in Python. For numbers, see: https://github.com/d3/d3-format/tree/v1.4.5#d3-format.By default the values are formatted using generic number format. */ + uhoverformat?: string; + /** Assign an id to this trace, Use this to provide object constancy between traces during animations and transitions. */ + uid?: string; + /** Controls persistence of some user-driven changes to the trace: `constraintrange` in `parcoords` traces, as well as some `editable: true` modifications such as `name` and `colorbar.title`. Defaults to `layout.uirevision`. Note that other user-driven trace attribute changes are controlled by `layout` attributes: `trace.visible` is controlled by `layout.legend.uirevision`, `selectedpoints` is controlled by `layout.selectionrevision`, and `colorbar.(x|y)` (accessible with `config: {editable: true}`) is controlled by `layout.editrevision`. Trace changes are tracked by `uid`, which only falls back on trace index if no `uid` is provided. So if your app can add/remove traces before the end of the `data` array, such that the same trace has a different index, you can still preserve user-driven changes if you give each trace a `uid` that stays with it as it moves. */ + uirevision?: any; + unselected?: { + line?: _internal.ErrorY; + textfont?: Font; + }; + /** Sets the y components of the arrow vectors. */ + v?: Datum[] | Datum[][] | TypedArray; + /** Sets the hover text formatting rule for `v` using d3 formatting mini-languages which are very similar to those in Python. For numbers, see: https://github.com/d3/d3-format/tree/v1.4.5#d3-format.By default the values are formatted using generic number format. */ + vhoverformat?: string; + /** + * Determines whether or not this trace is visible. If *legendonly*, the trace is not drawn, but can appear as a legend item (provided that the legend itself is visible). + * @default true + */ + visible?: true | false | 'legendonly'; + /** Sets the x coordinates of the arrow locations. */ + x?: Datum[] | Datum[][] | TypedArray; + /** + * Alternate to `x`. Builds a linear space of x coordinates. Use with `dx` where `x0` is the starting coordinate and `dx` the step. + * @default 0 + */ + x0?: any; + /** + * Sets a reference between this trace's x coordinates and a 2D cartesian x axis. If *x* (the default value), the x coordinates refer to `layout.xaxis`. If *x2*, the x coordinates refer to `layout.xaxis2`, and so on. + * @default 'x' + */ + xaxis?: string; + /** Sets the hover text formatting rule for `x` using d3 formatting mini-languages which are very similar to those in Python. For numbers, see: https://github.com/d3/d3-format/tree/v1.4.5#d3-format. And for dates see: https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format. We add two items to d3's date formatter: *%h* for half of the year as a decimal number as well as *%{n}f* for fractional seconds with n digits. For example, *2016-10-13 09:15:23.456* with tickformat *%H~%M~%S.%2f* would display *09~15~23.46*By default the values are formatted using `xaxis.hoverformat`. */ + xhoverformat?: string; + /** Sets the y coordinates of the arrow locations. */ + y?: Datum[] | Datum[][] | TypedArray; + /** + * Alternate to `y`. Builds a linear space of y coordinates. Use with `dy` where `y0` is the starting coordinate and `dy` the step. + * @default 0 + */ + y0?: any; + /** + * Sets a reference between this trace's y coordinates and a 2D cartesian y axis. If *y* (the default value), the y coordinates refer to `layout.yaxis`. If *y2*, the y coordinates refer to `layout.yaxis2`, and so on. + * @default 'y' + */ + yaxis?: string; + /** Sets the hover text formatting rule for `y` using d3 formatting mini-languages which are very similar to those in Python. For numbers, see: https://github.com/d3/d3-format/tree/v1.4.5#d3-format. And for dates see: https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format. We add two items to d3's date formatter: *%h* for half of the year as a decimal number as well as *%{n}f* for fractional seconds with n digits. For example, *2016-10-13 09:15:23.456* with tickformat *%H~%M~%S.%2f* would display *09~15~23.46*By default the values are formatted using `yaxis.hoverformat`. */ + yhoverformat?: string; +} + export interface SankeyData { /** * If value is `snap` (the default), the node arrangement is assisted by automatic snapping of elements to preserve space between nodes specified via `nodepad`. If value is `perpendicular`, the nodes can only move along a line perpendicular to the flow. If value is `freeform`, the nodes can freely move on the plane. If value is `fixed`, the nodes are stationary. diff --git a/test/plot-schema.json b/test/plot-schema.json index 88eea6c5a64..e104dd578c6 100644 --- a/test/plot-schema.json +++ b/test/plot-schema.json @@ -52471,11 +52471,6 @@ "editType": "calc", "valType": "data_array" }, - "customdatasrc": { - "description": "Sets the source reference on Chart Studio Cloud for `customdata`.", - "editType": "none", - "valType": "string" - }, "dx": { "anim": true, "description": "Sets the x coordinate step. See `x0` for more info.", @@ -52517,11 +52512,6 @@ ], "valType": "flaglist" }, - "hoverinfosrc": { - "description": "Sets the source reference on Chart Studio Cloud for `hoverinfo`.", - "editType": "none", - "valType": "string" - }, "hoverlabel": { "align": { "arrayOk": true, @@ -52535,33 +52525,18 @@ "auto" ] }, - "alignsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `align`.", - "editType": "none", - "valType": "string" - }, "bgcolor": { "arrayOk": true, "description": "Sets the background color of the hover labels for this trace", "editType": "none", "valType": "color" }, - "bgcolorsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `bgcolor`.", - "editType": "none", - "valType": "string" - }, "bordercolor": { "arrayOk": true, "description": "Sets the border color of the hover labels for this trace.", "editType": "none", "valType": "color" }, - "bordercolorsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `bordercolor`.", - "editType": "none", - "valType": "string" - }, "editType": "none", "font": { "color": { @@ -52569,11 +52544,6 @@ "editType": "none", "valType": "color" }, - "colorsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `color`.", - "editType": "none", - "valType": "string" - }, "description": "Sets the font used in hover labels.", "editType": "none", "family": { @@ -52584,11 +52554,6 @@ "strict": true, "valType": "string" }, - "familysrc": { - "description": "Sets the source reference on Chart Studio Cloud for `family`.", - "editType": "none", - "valType": "string" - }, "lineposition": { "arrayOk": true, "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", @@ -52604,11 +52569,6 @@ ], "valType": "flaglist" }, - "linepositionsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `lineposition`.", - "editType": "none", - "valType": "string" - }, "role": "object", "shadow": { "arrayOk": true, @@ -52617,22 +52577,12 @@ "editType": "none", "valType": "string" }, - "shadowsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `shadow`.", - "editType": "none", - "valType": "string" - }, "size": { "arrayOk": true, "editType": "none", "min": 1, "valType": "number" }, - "sizesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `size`.", - "editType": "none", - "valType": "string" - }, "style": { "arrayOk": true, "description": "Sets whether a font should be styled with a normal or italic face from its family.", @@ -52644,11 +52594,6 @@ "italic" ] }, - "stylesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `style`.", - "editType": "none", - "valType": "string" - }, "textcase": { "arrayOk": true, "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", @@ -52662,11 +52607,6 @@ "lower" ] }, - "textcasesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `textcase`.", - "editType": "none", - "valType": "string" - }, "variant": { "arrayOk": true, "description": "Sets the variant of the font.", @@ -52682,11 +52622,6 @@ "unicase" ] }, - "variantsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `variant`.", - "editType": "none", - "valType": "string" - }, "weight": { "arrayOk": true, "description": "Sets the weight (or boldness) of the font.", @@ -52699,11 +52634,6 @@ "max": 1000, "min": 1, "valType": "integer" - }, - "weightsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `weight`.", - "editType": "none", - "valType": "string" } }, "namelength": { @@ -52714,11 +52644,6 @@ "min": -1, "valType": "integer" }, - "namelengthsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `namelength`.", - "editType": "none", - "valType": "string" - }, "role": "object", "showarrow": { "description": "Sets whether or not to show the hover label arrow/triangle pointing to the data point.", @@ -52734,22 +52659,12 @@ "editType": "none", "valType": "string" }, - "hovertemplatesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `hovertemplate`.", - "editType": "none", - "valType": "string" - }, "ids": { "anim": true, "description": "Assigns id labels to each datum. These ids for object constancy of data points during animation. Should be an array of strings, not numbers or any other type.", "editType": "calc", "valType": "data_array" }, - "idssrc": { - "description": "Sets the source reference on Chart Studio Cloud for `ids`.", - "editType": "none", - "valType": "string" - }, "legend": { "description": "Sets the reference to a legend to show this trace in. References to these legends are *legend*, *legend2*, *legend3*, etc. Settings for these legends are set in the layout, under `layout.legend`, `layout.legend2`, etc.", "dflt": "legend", @@ -53345,21 +53260,11 @@ "editType": "colorbars", "valType": "data_array" }, - "ticktextsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `ticktext`.", - "editType": "none", - "valType": "string" - }, "tickvals": { "description": "Sets the values at which ticks on this axis appear. Only has an effect if `tickmode` is set to *array*. Used with `ticktext`.", "editType": "colorbars", "valType": "data_array" }, - "tickvalssrc": { - "description": "Sets the source reference on Chart Studio Cloud for `tickvals`.", - "editType": "none", - "valType": "string" - }, "tickwidth": { "description": "Sets the tick width (in px).", "dflt": 1, @@ -53460,7 +53365,7 @@ }, "role": "object", "side": { - "description": "Determines the location of color bar's title with respect to the color bar. Defaults to *top* when `orientation` if *v* and defaults to *right* when `orientation` if *h*.", + "description": "Determines the location of color bar's title with respect to the color bar. Defaults to *top* when `orientation` is *v* and defaults to *right* when `orientation` is *h*.", "editType": "colorbars", "valType": "enumerated", "values": [ @@ -53541,7 +53446,7 @@ } }, "colorscale": { - "description": "Sets the colorscale. Has an effect only if in `marker.color` is set to a numerical array. The colorscale must be an array containing arrays mapping a normalized value to an rgb, rgba, hex, hsl, hsv, or named color string. At minimum, a mapping for the lowest (0) and highest (1) values are required. For example, `[[0, 'rgb(0,0,255)'], [1, 'rgb(255,0,0)']]`. To control the bounds of the colorscale in color space, use `marker.cmin` and `marker.cmax`. Alternatively, `colorscale` may be a palette name string of the following list: Blackbody,Bluered,Blues,Cividis,Earth,Electric,Greens,Greys,Hot,Jet,Picnic,Portland,Rainbow,RdBu,Reds,Viridis,YlGnBu,YlOrRd.", + "description": "Sets the colorscale. Has an effect only if in `marker.color` is set to a numerical array. The colorscale must be an array containing arrays mapping a normalized value to an rgb, rgba, hex, hsl, hsla, hwb, or named color string. At minimum, a mapping for the lowest (0) and highest (1) values are required. For example, `[[0, 'rgb(0,0,255)'], [1, 'rgb(255,0,0)']]`. To control the bounds of the colorscale in color space, use `marker.cmin` and `marker.cmax`. Alternatively, `colorscale` may be a palette name string of the following list: Blackbody,Bluered,Blues,Cividis,Earth,Electric,Greens,Greys,Hot,Jet,Picnic,Portland,Rainbow,RdBu,Reds,Viridis,YlGnBu,YlOrRd.", "dflt": null, "editType": "calc", "impliedEdits": { @@ -53549,11 +53454,6 @@ }, "valType": "colorscale" }, - "colorsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `color`.", - "editType": "none", - "valType": "string" - }, "editType": "calc", "line": { "dash": { @@ -53600,11 +53500,6 @@ "editType": "plot", "valType": "any" }, - "metasrc": { - "description": "Sets the source reference on Chart Studio Cloud for `meta`.", - "editType": "none", - "valType": "string" - }, "name": { "description": "Sets the trace name. The trace name appears as the legend item and on hover.", "editType": "style", @@ -53674,25 +53569,6 @@ "min": 0, "valType": "number" }, - "stream": { - "editType": "calc", - "maxpoints": { - "description": "Sets the maximum number of points to keep on the plots from an incoming stream. If `maxpoints` is set to *50*, only the newest 50 points will be displayed on the plot.", - "dflt": 500, - "editType": "calc", - "max": 10000, - "min": 0, - "valType": "number" - }, - "role": "object", - "token": { - "description": "The stream id number links a data trace on a plot with a stream. See https://chart-studio.plotly.com/settings for more details.", - "editType": "calc", - "noBlank": true, - "strict": true, - "valType": "string" - } - }, "text": { "anim": true, "description": "Sets text elements associated with each (x,y) pair.", @@ -53705,11 +53581,6 @@ "editType": "style", "valType": "color" }, - "colorsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `color`.", - "editType": "none", - "valType": "string" - }, "description": "Sets the text font.", "editType": "calc", "family": { @@ -53720,11 +53591,6 @@ "strict": true, "valType": "string" }, - "familysrc": { - "description": "Sets the source reference on Chart Studio Cloud for `family`.", - "editType": "none", - "valType": "string" - }, "lineposition": { "arrayOk": true, "description": "Sets the kind of decoration line(s) with text, such as an *under*, *over* or *through* as well as combinations e.g. *under+over*, etc.", @@ -53740,11 +53606,6 @@ ], "valType": "flaglist" }, - "linepositionsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `lineposition`.", - "editType": "none", - "valType": "string" - }, "role": "object", "shadow": { "arrayOk": true, @@ -53753,22 +53614,12 @@ "editType": "calc", "valType": "string" }, - "shadowsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `shadow`.", - "editType": "none", - "valType": "string" - }, "size": { "arrayOk": true, "editType": "calc", "min": 1, "valType": "number" }, - "sizesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `size`.", - "editType": "none", - "valType": "string" - }, "style": { "arrayOk": true, "description": "Sets whether a font should be styled with a normal or italic face from its family.", @@ -53780,11 +53631,6 @@ "italic" ] }, - "stylesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `style`.", - "editType": "none", - "valType": "string" - }, "textcase": { "arrayOk": true, "description": "Sets capitalization of text. It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.", @@ -53798,11 +53644,6 @@ "lower" ] }, - "textcasesrc": { - "description": "Sets the source reference on Chart Studio Cloud for `textcase`.", - "editType": "none", - "valType": "string" - }, "variant": { "arrayOk": true, "description": "Sets the variant of the font.", @@ -53818,11 +53659,6 @@ "unicase" ] }, - "variantsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `variant`.", - "editType": "none", - "valType": "string" - }, "weight": { "arrayOk": true, "description": "Sets the weight (or boldness) of the font.", @@ -53835,11 +53671,6 @@ "max": 1000, "min": 1, "valType": "integer" - }, - "weightsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `weight`.", - "editType": "none", - "valType": "string" } }, "textposition": { @@ -53859,11 +53690,6 @@ "bottom right" ] }, - "textsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `text`.", - "editType": "none", - "valType": "string" - }, "type": "quiver", "u": { "anim": true, @@ -53872,7 +53698,7 @@ "valType": "data_array" }, "uhoverformat": { - "description": "Sets the hover text formatting rulefor `u` using d3 formatting mini-languages which are very similar to those in Python. For numbers, see: https://github.com/d3/d3-format/tree/v1.4.5#d3-format.By default the values are formatted using generic number format.", + "description": "Sets the hover text formatting rule for `u` using d3 formatting mini-languages which are very similar to those in Python. For numbers, see: https://github.com/d3/d3-format/tree/v1.4.5#d3-format.By default the values are formatted using generic number format.", "dflt": "", "editType": "none", "valType": "string" @@ -53916,11 +53742,6 @@ "role": "object" } }, - "usrc": { - "description": "Sets the source reference on Chart Studio Cloud for `u`.", - "editType": "none", - "valType": "string" - }, "v": { "anim": true, "description": "Sets the y components of the arrow vectors.", @@ -53928,7 +53749,7 @@ "valType": "data_array" }, "vhoverformat": { - "description": "Sets the hover text formatting rulefor `v` using d3 formatting mini-languages which are very similar to those in Python. For numbers, see: https://github.com/d3/d3-format/tree/v1.4.5#d3-format.By default the values are formatted using generic number format.", + "description": "Sets the hover text formatting rule for `v` using d3 formatting mini-languages which are very similar to those in Python. For numbers, see: https://github.com/d3/d3-format/tree/v1.4.5#d3-format.By default the values are formatted using generic number format.", "dflt": "", "editType": "none", "valType": "string" @@ -53944,11 +53765,6 @@ "legendonly" ] }, - "vsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `v`.", - "editType": "none", - "valType": "string" - }, "x": { "anim": true, "description": "Sets the x coordinates of the arrow locations.", @@ -53969,16 +53785,11 @@ "valType": "subplotid" }, "xhoverformat": { - "description": "Sets the hover text formatting rulefor `x` using d3 formatting mini-languages which are very similar to those in Python. For numbers, see: https://github.com/d3/d3-format/tree/v1.4.5#d3-format. And for dates see: https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format. We add two items to d3's date formatter: *%h* for half of the year as a decimal number as well as *%{n}f* for fractional seconds with n digits. For example, *2016-10-13 09:15:23.456* with tickformat *%H~%M~%S.%2f* would display *09~15~23.46*By default the values are formatted using `xaxis.hoverformat`.", + "description": "Sets the hover text formatting rule for `x` using d3 formatting mini-languages which are very similar to those in Python. For numbers, see: https://github.com/d3/d3-format/tree/v1.4.5#d3-format. And for dates see: https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format. We add two items to d3's date formatter: *%h* for half of the year as a decimal number as well as *%{n}f* for fractional seconds with n digits. For example, *2016-10-13 09:15:23.456* with tickformat *%H~%M~%S.%2f* would display *09~15~23.46*By default the values are formatted using `xaxis.hoverformat`.", "dflt": "", "editType": "none", "valType": "string" }, - "xsrc": { - "description": "Sets the source reference on Chart Studio Cloud for `x`.", - "editType": "none", - "valType": "string" - }, "y": { "anim": true, "description": "Sets the y coordinates of the arrow locations.", @@ -53999,15 +53810,10 @@ "valType": "subplotid" }, "yhoverformat": { - "description": "Sets the hover text formatting rulefor `y` using d3 formatting mini-languages which are very similar to those in Python. For numbers, see: https://github.com/d3/d3-format/tree/v1.4.5#d3-format. And for dates see: https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format. We add two items to d3's date formatter: *%h* for half of the year as a decimal number as well as *%{n}f* for fractional seconds with n digits. For example, *2016-10-13 09:15:23.456* with tickformat *%H~%M~%S.%2f* would display *09~15~23.46*By default the values are formatted using `yaxis.hoverformat`.", + "description": "Sets the hover text formatting rule for `y` using d3 formatting mini-languages which are very similar to those in Python. For numbers, see: https://github.com/d3/d3-format/tree/v1.4.5#d3-format. And for dates see: https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format. We add two items to d3's date formatter: *%h* for half of the year as a decimal number as well as *%{n}f* for fractional seconds with n digits. For example, *2016-10-13 09:15:23.456* with tickformat *%H~%M~%S.%2f* would display *09~15~23.46*By default the values are formatted using `yaxis.hoverformat`.", "dflt": "", "editType": "none", "valType": "string" - }, - "ysrc": { - "description": "Sets the source reference on Chart Studio Cloud for `y`.", - "editType": "none", - "valType": "string" } }, "categories": [ From 0a76daf89a9aa5e703fe494422e9aed2240fc452 Mon Sep 17 00:00:00 2001 From: degzhaus Date: Wed, 24 Jun 2026 15:48:03 -0700 Subject: [PATCH 43/46] Regenerate image baselines --- test/image/baselines/quiver_anchor.png | Bin 37535 -> 32284 bytes test/image/baselines/quiver_arrow-styling.png | Bin 21258 -> 23713 bytes test/image/baselines/quiver_colorscale.png | Bin 23974 -> 24184 bytes .../baselines/quiver_custom-colorscale.png | Bin 27324 -> 25904 bytes test/image/baselines/quiver_multi-trace.png | Bin 30245 -> 31363 bytes test/image/baselines/quiver_sizemode.png | Bin 40498 -> 31804 bytes test/image/baselines/quiver_wind.png | Bin 39094 -> 40592 bytes test/image/baselines/quiver_zero-vectors.png | Bin 18879 -> 23976 bytes 8 files changed, 0 insertions(+), 0 deletions(-) diff --git a/test/image/baselines/quiver_anchor.png b/test/image/baselines/quiver_anchor.png index 3bec0ad57aa62d3298b1d32fe192086df255a077..d559c4d98b409f19d7855f2c9e5459f188e31df0 100644 GIT binary patch literal 32284 zcmbq*by$?$^FAygDIg(=AfkYPgd!llSb!kiNGaV&HwywHt#l*Z-BKdmEwO;ouq@s6 zJB#u9`S<&~uJ`4_=i$`MoH;Z1+~@I=krE}uyN-v3hDInZ_EZiH4dWde8hQv0Hh8iZ zk)Mc$MvNx@R7Al69RbHZQP@6f-P|u2sAGOQ_PP7xJ*)FDI`09x;_^`X{Q0-?sslgh zMk#Jhgnw+Kcv1EAgZbBIqk$3;x;gil^3=|^c?Tuyqo+^Yto7YW;-VdQm*RLAo$FBl zIWC;^9LCM_lb3H1p<@z5(fGM`I3SKR#1vh2y3a`dQ3@LD9q5IW;SKgQp3MEf0|2Fo ziFtT%++urh+rvW(^B++_4?%-Y3o+b_QJ2Y+{)koV6VOYHHWS5fjejK3ra^TGlf(mJ zmW$Qh!MiV^SpQf_n>+eQUm{ARlWaqHe{BaP5wRL*4CHI+Xe`!W z)A_aVFnJG;!Z?pEHeAeq7tkgS^c6R0s&E~Kz%4|X(Qmn)0K@7^G;5DR_4C_CP_Npo zK?8y5hFqFolAFS8^G4a2%zKmqDu-1Ke)nuVUT;>x{q%RwZdmMeF=+ z6Q~BX!(cjD6lo~aPC9{v{jqi&-KRifx4Z6P{^}NGBNr>Cbp{Q_N(|b6+lh=JB$pkm zYlagY@;K3qIQ!R5LQOX0CL|XNQbh|CgRkz#_wUB=NW^+uZjSkmw`Mu>(Jul0=}!nO zSNA09(#5!cezakrr1|}Q?qescyVQT40&{R72g@C0?R2{30et}Zy^X=(WMRO5M9j>U zE(}P!2JOl3{-Mw|`(LU9^40R-dW!nTdz6uX@_zbP_OMsvNmF1^8Xg{fHRQbi%CbQV zGL#+%gfNe(YxlPSYD%=qSZ`TqyA<_S0{=%>2Qr`+Un*~AEUcy5e+3M-s}nH(!BvT6 zFwjenSHC9+{y-I_LkOQgYHoPy9%a8IkA_|klz5~kA@kctF3bZp{f#m-^yC5_qVOkw zR`yoZBZkfcio_)*UYO!eY5A{j99?yf`9(h34Rk(Xi$en8D`D>8SwY= zHfllt>pZdxENxf*6-5#UCU6>W_)8*i!Wf`@fAt7O$0sJH*k~~rCV?jPVXA2T5fiN( zFscEs->zZniAUM5ZPefe2Do&m`0rkHqewCbbA}cJIk$J*zxlUoG)VMSZ9kk;1<+Ai z9NGVFiqsdhr}MC;j4e|x%Ec^w%o?M}abGV?!jxNw&^IGkDC#l+v)8i@ZHLiH+; z{}DqHcocFD$-VXG)r>T-ad-2p#uqy|BnL7?bs<04jVqu*a^N$?-_k+Z2sU`tW(&;r z)wJi(&A)P{C57C>fPDcI>gw$7c=4Yb1M}H}cyltM>-;b^86o@I;KDwEL4=Xr`ik>s zCKpyDLkpyXRh+EaU5JM9@5%~adU#k;VcrDO4~FED{%r(R1r79;IS5gm)7oQZGW~va z=N{Oj9M?F1OAT6%r6PoS1vLf=mY)@4`mgt8k|YISDJj5!u3Ir(|96^KNN6q6fk|_+ z_H6x+Q$kO~(dDAu@k1Z}_pkuA4a}jCmd9C1DaQMMyhAS-*0o$D^D^Y{R)gAqx}5U_ z!?Kyuue=8v>_F9{`nUL?J>XPWK%}Sq{54TsO%M8u4(B3412;425tKGA1{VuQn+FR+ z2V04v;kiEfKlXfA-6PAJ846X&R8QD_{%0$JX0WehcgsgG-!*ekUbu_DtH2WnW_Vt~ zZGxK5f7AR1v>VX=m=03K46XfVfDLd)Ex|v;fj{-A$IK-B(?&)Ln8{nngNs8PSU9ov zwO_rZJ^}qxXNURy>HZFT1FAK&1qg`qdAH|3Vt!AdeFKI-osOf4Y5(J9l5q|!1#xj) zD`hjU{2B7XfI@J=xI0X~5(xs1#VrBXNNEfjVjCh@)l1*bzp#jIC%?6Eyk2jzz0gf! z6rii6-5tZV0$l$d%SSIRl``XSZnN<)FRotm@biONqCAZn?wat8#sNmDxXe}>=dMd! z?Rm_WH>BL0#}54u>9ru%bRoQ8z%JF2)Grj;^Z(4fO%ObvoX{Vl1P3{5!`2^}!30pJ z>nFl?;|t-Yih9WXdevqC8n{eV=TiM%&>cFcCeU!w49X*!e=7O0159Z=_>Og1o_tcQ|7`LC`NF6`zg zWPP@pZ7~{16*nHrBoW^KC_xoc{o81vN|;;sX}j?5;6FnHDj3RDl{bj9@?loW&0HDI zSzSsA9{K#tzgV3qBIu7I4_<*YVUgv1VXgPQyT&NQFgR zyUVa3+vbEt{qT0LaKTiqbB(nryjpQ}w4m3x;&rnV;War~;qyu6oZYtaCl5N^_r?gT zk5)Ry3w1E;a9x6hj}b(>YbMiG-3gPX!dCWCkoD7Qq;fpZynyT0HX{~W=)ubLHd4@O zW15IT=nbrQv+*O*(7Lx9Rz9uS)ECwDFWW(kzEtLwB8e_vg;sDopD;ik6N%MzKX~I) zdVV&bs4Tu1&)A)?Hj#al{d(HvcD!B8PKL1fY>T-2X-+}*;zS3g)KlBRmvWyN1}d%O zj`!+vS3Z!l*mQG^E}d-mj`r}c-^fpiN9gCoJ}P>wt(^Dy{+n!L`Z811XT3t|;-|;T`*Rdis(21F z`S!?xx|IFll$(OtDL476J?O8f??(IUuQXh`JfwAYcva)!8eQ$#?y4WTOj1?-@hN}& z?ujZN;z!fNAG5ee+dINnGoMbn{#Xt;-;|kz=Z_Jb zStiO^)&|Ri(q3E>*3#`6j7yDpM@jX@;SWutO82Mm;^@r^WDEl&bo4Bnd{w#9me=gO!TX8*drc#V z*1hw`@Whq;pkVtU&qRvKF}s|y*dUX)ar~0(jL%`ouY6ph-~AT1C6MasBbry)FpNvab8Vr;6wPK|JK5`V3+m6t zu_e}&@?T|5nAg0F)Ub=@ujhJnwZk;nef(fPQVS_ngREZNSuLpdVOWheNa!CkNX(Op z=d0=@d>O@Kkq}$2USa+rp_N9xcE%ImW=y@OpdVfcJlS!>t`Msl?55Ib(wo+sIiC`RRJGX79|+_r&8t;!Ql7_`db2Efq1R9uqIVB@%ilKUTse>> znJp5<#qCP1)WNfm9v*Cu-@`3<8+&dEXCVTWr5~TZC8f+CD?1{q+)oj(={D_V5wRf zh{U;8lR|2-@G08Z1f=60$(EUnj)XDEL$U@w(o5JV&%8SMvfVTI3Ff~fN^Pq!L-UQp zY^=CB-n{V#mBp7I`4hXNTI=bDS)$OTjJzLdY_J?^`r@&a;993}F^1$QsCR?%>0+Wk zJtp>AL=$TTCia0=Hq;AyU@$Lh^Age2%;iCUR^mtOeuwcj$H>4U1KMHo zOyx4ogPw@k!aSbOO*m@`t{G-;T)tg7I1QebxO1MhnP@Y9HmS;rE`Kliwd^xijoMO` z7nU16v+D$xb&D;~e-QGBEh9g7?jNXR%HD8VO3qfu`e^rE=Tezr|6}3Polo@6E6kWZ zr{kqYvkQ631qpW3uKVu~C(6xMBg_sj^Ue{oYFwXWCx_Ljh;$@ z@{CK3US|aCjiZ?={PFg8-uL154l{JsSRc6S%bd=@))_NJ@^5%y6TWr7()n^jmEAG| zQF2{2z8DLlEcHScXYw_B=<~;^9j6o=qc_p40c}{ zlolqOwqntXc&}SS^~iQbVgK@v??rFmqK}{0BkrY~z6y6$GiZ!u?e%d#UgM#*Y(VE$ z`J4ls&7n038B#$wN6f^$BCEjjY=ULux5(bhP1lgcu8?|QxH6jy~uDNN9a+ypx@jfD8f z)GJJl8Xx<3pGc})>HcVLC?a=I&6OZszcTT*e~EUXt8+UI#v=rWQ8OM0-)6>~hO>E# zuc&6HV|nd8@`J0!^D7rG#9P#<8jrF`kaq+&Ygz~DN)M@--E@3foS}{w_p*(6epS7} zvyoIP1R<@yk9<49R=kh9UdM0eCg%l7*0wxzX-8gBlX>J^4pAOTgWD4=B;Qn@*;$kt z9ZVF+%MQ<8*>x*e?d+@@;#$j>-CuyQYa>*}2ys+6z8kzvYzVPAB#AWX<}$HyJzlk4 zwW_E#+IfxdQgtFxF|X!qQD)mTq9$Zhm9TsofE3)+9E)H1ZcVPVLgS41QFlaA?O(xQ z2`$WUK}aQF8Ezx=mNCUf^3*e$Ad7B$ZOaCUt_;oweVvF_YWuj{{+K?vFne&;I197I zCAK8rt-51m4HDi3j<3;9x{?H6502H?h9_9}JaDnRMlu65_R99B?@>68;q;9lL}5nm<+5@sWKc6?LQ)ykfcaEuV^a1$&h$anm39AzD8Q-du8K6W;ygZ zk%s5-d!t=voOpF#`CBPh%hy-^+>Q1&KPC?QU(Dtb( zR1>DX;oYlgd396&oM%|4;4+ewU>yA1cm_IvrQCGIZCj z5L|okt@!SgK%RPqo%`pnD<+QiQ;r7qLaQ$;{1MzUgFzmB8B{HK6pcxpA(p+KA}0M_ z+8jE3`xUIX*ray&Hw>O~L~+DYeIq7dKvGZ>sIegCaj;1XpuCIUE$UBo^EOrQ?@a{? z4v??!f4gVF%;(uSM}~|2$@(^>WKUq#19pInI9gjs+@aiAAd6=qBRJdgC##feif=Sb zdeBnEse&!F{0RqJqJqif1H7M(@}9)qy;7CNnFQySo>-Qwo9-t?YI;dlrN?e{(v#OD zPt-S07JL2qz5HriOSY)WTyyil=A61V*Q5Q@rz`YVe(bC@FdHl(z_0>m3HzkYaVPYE zu~GY{K8zO!8v{rDgppDb!pb2bgzaTfyBmQZk#jC(Dg01Oft|O!uVA0zb|Z~w)YZ_x zZ`D;(d7{NEd_`~Wjia>NNh)^TgFf4ugF=6f_p5lfXgn1MSIAtY7YIE?)0+mggvU!Tgi&X-xMRmo)wEOhLDkFm%XEGAq zm`z~4RyWqlC(Lz7O=#+r^3+}^j=DR!zdU`Lt$r2~@0;1_rXiBG7 zakW~b?+7CJ{ZwR9z=hp?YNrHf$+Ho|o=>LaQkPN+cA%X3qB*4#PAb55IlQChnLDgG zRPxj2rn@k`+AZWg8&eTD*q>gfphwSr|0>K%V*GOGdPw`OJvJ+4DaC<#-J!lJ2B-MI zxA?VGMrpiyP6x9Tli|lzF8-b;Q79X!KDS41`(xi`69Tqcq1L&0ZqMMt=Q_ z0c_6L>D7?_#w7T)JCrs?OY`pmFjCG#)~NkfJ;{N?u>MmkFbn%qZOf5+n_#&1dj<@i zBI;6gwm=YO{Vs&qFPq#}JKZL793nfWmp)v^=HKA=YN4s{zl?nt-&m<@j_oND3DXP$ zkg>is#uWmFjGNR1J#kFK3q=IdQJ7u{QJ*88_XK=JG?;)IS{rzPP{o{eYh*y=nLtxu~sm&_!H37o87 z+=(oEZ~~x*cLu7JmdW`b<=l9Lu}li8go$R$^jC?nFA+r`Yb$oXNRF{VIV$0F{kJ?D zpEggPP!LSnC-UF*Y)tZs6lzSmn)cDr?eLlLs8mM=w(g63Jtw)xjoM`|hQY4cipu0M z@D#C->aY5V?bXl8ffSz+K0geea$c{s)HHz|RL%zB2Xlsi8p&g#a*Mjd^y95#amM)6 zMi?3rv;TxC^D^`&tVv&Og-`a4A*_}T2gJ0QVc zg@16zGR^ecdlF>t@GG~&`D&0>>(=Y7NCm98(mXOK<@b-ozC3qT%cW?cJ9crQ@BxB) z0c2mYsMKA(WhkpLF|CMzipPA2+I}+mleEy7*#`5Dxpngg^4;%mf|mn0dt}z9YHfkR z8m^Ayar>Ln#AX=uCh#32O1K=iba~)Tq>NHS{_J&2EteVNEIn(4B9N`%9B5K18tF49 z!Za_Jl@{Dp7`r;qWJ+H`Oc3#K^W&B8MS2D=>{@gQ+rIOA0pI#e3aoj7ES$xXfW#g< zMMfY1J7~7pziM?vT%+a%dp$yjp}6g=bS&}FvHWOeXc&<&YiL&Yb!q~ds^idTH5(~* zUu}-6?)}4p#ML&@;Gtr!PF-Qv`_2uBxHBWa)yN6|N3u1XG1*xb6;D|L~zIb=qCIa=0>-HH+;G(5HeP!Tnc)TWz<02-sa3 zfK>FSh?*R1{4gi3HX3BGKXQd(oL5Y{u^g+$84admNeNC=FYn!5?G-*pjC3xPG;9IL z@omPK00oE8$wpJLw)Gxjthgtha!GJ^NZxofUt`AMpm=X*(*m1>7@J$^%lTe&mSRo> zvrCY}*FRW*Vs@(V>9Vw1iGJWnz6O;=`TOPWX;jbt--&PRQ=8~@52C!KS6w1s zEkk|fFhFQOU%etff?Z4V^LyZdo_}I^IdHl^UBH;&K=;}y@H!V=%NjBPeyfy9(2lY2 z8EsoYTcMdQNIoXH?~DoTWoE)@nVFg8!kHDn4gz%is%%E>-Z+aucP|F{$t&LaVYAbt z-RkWg{^1IXY0F_ZkXSdb)=ikO=jCc?t+H1=ttY&8g~$EN7M|Ww2ehxY$ko|QXpZ=F zZ_@gR)l#BfW~BDZYL$>By@|;T(fqo6`cg&he$R@1&zYf*J!RtMciH6cQ!teA=ecRE zdw7!-gl2JXI3(#_a&VU1Ib58b*LSjl;j@QNQin)^TgqNkN|xigRI`6!o}C+xNET;=9UA$4s|c@+ zOuW5Lz)<(rC~kJE(~Gbj97#TtAkR>9X?~3)U}#A{8eTD(a@@9YX1rc15h4}5>mXTj zX>Je1$@$jl+v{M%7W+`G#qp06yC3|xRBKY8jm0od>YV7h7kydiV5Z^w-nm^xZx260 zRu-S_31O3Iuk2ADXqB^Ap)p+g_BGt~o{+sa9=XlQW~<59cev)oSU%kDjLy0(FWcj3 z(35@5^t8Iv&8waPnb{_i?r})?-E)5m|I8K&dpCe(Y~k)xvm+_VbW0{f%J0sVpZG(0 zRKi5OFYx+${9T)L+}eRNkaM!yn2~W9Rd;3Wk*BSPK0NWzI6abi>jE zQI-pAj`4F@kBkmC9P$N}XS8mM2H8+~XI-=1D6)q*@2;fjH2Jho9hbC1*WmRs*YsS+ zYdrSqbWoM5pMH!T*Nd1~>R*r9@Y+#u7;ll@;CPJRdJRh~3 zggmt}yq6yiN+ZP9GH6?Zs9BC}(K=18eeNtN6}{=I;Eb%wAgtzb^SMl&%_N`RcHL)r zAk9D4TqKjfFwg#QKC<)rhay=MmxZtR>^7@L!m&ELXmh7y6f{*oLPw_;<$e4xyx9IRcypmr9N(j0$W~sw{f($7T(*>nza24iY_QyXv zwbIx7&C~i_=bJHs-2gS?HPL^|ics1>ND2UCfoE{bFadk%Nf* z)tKB6>7PRLMhcoO=rxW446xiSI{#na#BFhC63q3`NH&cQEipU^5JKK!c=kU`fIY0b z(>--owbHxCC63OM>E1cQQa@DAin0`M1A z5H;*e5;+3kK(06b)#~L$mo2~i`ZFiE!)#zRqPWwh5$mcU=nz>7iovVl%9{PN!NU2d zAaUCLyf#+I>gQ9QX~)I*3}r3X;g=;-eaTODLEyYJY2B*`;yPBQ&&QyQXA8F-T?WzQ zaPw8IT*vJN?~MKB!B&kPP|(RgJ3U@aa7Ok67z@7qZ=k4=u{@YjvrNvSH1sA|FrBmK zQIm#duA|c)Vp&ZxL0~Mt)k*0b1fH^9mxxAi8RJ5VJt95&Y?g`da=>1x!#8JJJ0V{| zSt49@7xb~ToRK&ZaE)^k`B8$6iBp*LmyYf#z?QWnBRM>32~M=WD1F2^}Qmf7yBwNO}J;h2a>e-Z}RY#yk(E$pdi6DkyLbq`!r~*p$4qV4B_9_%e|62$1qMF{bl#ym@xd zD=4bN4&Du`ZzRPz_TenbY}O(y5Okedr`?V&c@I)my1m;)hgI0B#&k z62V|qFYkITVFN0B)y_QmFT$C#RZG%?gpLercSqEJxPXx2^JT%Ez72;>7&yB+BJ_+X z49|83rMW4QL4tcK_LU&+H6ANYi(u1O37UAoUcE%eWildZclix0kN;NR-(bz8|MN2k z8vIvlY^iw$fX-lhw470MwF;x8@|@Kom_|?`OOD=NfLsvrRpG82HUuYCvEl51oSeK_ z!$(l*wKB$9{{RRimFyJR9u5L}#GG%>%B-)`oEkM^Gxk-EwcQHUp&$>>>X)JBx>y^) z@p}XT0YLxzz1t6_sHc`TqT1?D_hK(Un(=sV1QMD-0171oB@DaH4QS#Yg7v^_Od^Va zaqN*G5j`>RTLg?`RE7R6Ja8NN$~f^)4BnkZrp{|+k*?nmb%zU7s%OA)Ye@@iKJ^nQ zGakmv@LnmjTT>g0hw}U4O5fuyoDJglX*H#(S*_CVz7E#W?m5!;w5HF@{??OOy`lF(HynQ2EG3UQEno^DXiR2ISPwbZY-?97n zBaKGibXvOl#+9UOoUkXLDv;rIo3TkF7C!zh*Vbm{O*Cko4*u_$sx9GvpWFj^5=&E1 zg8w>Mz^=7_N`fFD zpJ-xe+o#`g!h9#5bRQpZnY0@6yHpL1X9seh=St4KC&^TI8^rn$~R`xD0~Fb~EZ>H7>!G%oN>q#fS)D z@@2pZl}RN46t)i@wYLFkUs2Ur&f=4-pT^pl4;h!3+{^R}9Q=J|dDLU|Jenm?Wr^8) zv>0;h$z;bkoY#bF5*emiUB+kJx(D)uX|uG!?$W${K!)*ApDK-L2Q(3>F*vvLV={3N!TI_C-16|%N zK->Nsh1CIW;m#?;XU~fO;_PaY&+kYg9pGx_<~+u~xT7BHn7OJBCPT>p_s|U-;>oyXNy}I^bQa z8ee92_Uvzw9Yn6LMg{HS7pAQp>+22P3V8v7LIq>F3r;@N2TSD@8;;BIS_SgWXQfea z=&9u>7nF;D!iLlyCwVIXZ~3Jzt~t z=c)5(ST9s#p~eM29%jA0I-VsZ#V=(`h*k#{-nN4Y%gni;aA# z?V?bTNS1ttF-V1~mp=PX?jO_XYh$8|(}JbyqsWD`U2^{!GthrIT9zt`v`Q!B|1UKX zM9NGdhaMcUCRA_6tQWehrr#X=^k;u9NyspEn>C)#RxY!|p2k!De~8a$kSZ3LKJ*_4 zo3nc8Iw{WsJ0?BBLC^(C&+{a!Uy? z{+iN(IoF{8B%nZLc#XX>pg!&V@V!}WJ#N9=yvnSQIWy%K5E;Bo4xi3sMryY;w_am2 zBJ2DHd3-$8922oz3T$p700bEzK?1izxB$bt5R;i~WF=kSY;`y%1MIzOZ^bORXPea^ zo~nXLeQ}WtF3o*aRZJx|du91&bCajY_Vz~}xMMCGvgh%iYc(efP*-ANbe#ZpnBY(S z;PK(QpNgdT!TFJ`TwL{ICCg|rFLf^jiB1gSZ+cBtn<-qMG5%~DcfoC z(y*NT>KA*nI}vsOHp&DUc?4oLsN;Xf-2_HDi+i6M{TyHB$uIABVJII#A|&}CFdF4= zOmPce{dq-e3-(l2N$Q24nt^ed($gOO?^9(keQP}l zS!rQB8ODEJy;TFV$>6yeE(#J-7_aq0CZLlXfgSakG2A+C>`xL2J3-~G^=2K{Z^;xw zE|U3o0D5Cq!B7%-1|j=>n+b*@Ik)-fbCKM|gxwB$^!SPIWknFN;Op3`iUMB|iq?!W zBX1P@n_c~Ue|lT*<%1fU`jd}i^YfhpE-QexiVqyzq0(W+w2L~|v@#-6>!e2GG+-a! z{pZJVfzFY862?OMAC=CE2G$Aca;Mo%##CLabnsH;z_p~hWP`4dy)n_15!TVsJ0-j4 zd+J#R(pg6G%O$-JY7noq#sPhaf9;Oo2DB%)9mLf;&NH9IxodoHYG#b&y#XmjvgheQ`3Tr+H3ejPq)@!uD}Y&g!>(6blXV3Y_B(Y))9mLG zqp$HQUn#-;p;+wEZL?2cH{HXe_+PF}svaGgEaz3+!N2UPqByO%ybzlvxF4qJB(7HU zxO$OhTCqQp+-Y}srukAUuF|@NJHFcjwEnR-UbbeflTx)sT~TjI3;rRG%2$T%tz;z&xoFh9a%mWHf+0%(U$ zdt+<7;}wy7w&OxQGU9-4wGUUWMpm~OHTjALaZ)g8U%e?Ms0hflGtItzL$T&~g!A7F z(q4pzwVOBjytvMt`|&bg=EsGuF}KgPqnZWA)2^KAk&^lL%n`d?oZ&;odh~Gj^Svhu zO+M*`Jy2SzB_$*nj$1h<1MC6Jmvi<7jV@vIzLm|%F(YQ&x5p$(0fB$PGi^E9bdXO{XyXAcD<4#we5IS_*v1Ik*@ zdR89|nAbc@zhAB~<3&XFUNdzuaXLZ&$)2FV{wu1_{(-q#mulNIJ#}d|y&(jl~Rw&AhO6VVi78N#J?W~s> z?0>oYtyTKnplOnLEkpIzd48!#wH#*9K`Tl1)-X$%@sk-M%_4y})j>?$E!w3G)Yj`V z$5v~*pxz`ZdEITta!tv9I~0fP`2z;9eebW3v1S_de#DBmPZ-KpY`2js$G2IpbA9ws z7dC^F-{Sq~wHu&8ldUq|cyM&4-4%1l*AJ<`O#MR1>U$w!wwyP1(u)pLY2M}3wWj3c z+d&~tyW?cn=Q(|#zL(|J#_1Wq!y7+lrM|7ll=Nz2^lPb^+iH( z+~Cm->f+T~X&9&5LMydr+RiO~1sU0EhTA|Lya5F%tp?L~xs{^OAj@g@<4A6(TE*ps`@+s_tdE`xM|fa)txZUr zA14k~S{0VKR7{(@0&R}ued4nVOP3~^DjKt>*KVmn;<*j5Ys?^P(j?dkrHC}F3q{3< ze)v2gP76B|y(!*G!@{ag;iBN!N}Z-*AD&;89(K(oEUr8IdyN-$i*28%gs@yw3}Klv zymoRWKqyq1itO%p`+)bOWH_p#Dlgq{g9?Dnk?=GgYJ zU8-{IDwq~Ioz!u{(Ukz_jQW-zoBa%QxnI=Fy7u7n&XjYb(lcKI-1PonR$@GCv+Qf* z(Stvm2fi0YJXVf@-lZ(HXHzc?L1=tkulqFR@WdQHFRfd&8WGwW%}MWUIwT}~_%w$5 z<;oaoTruYJz>oQrbWyV->S>PKcP2C((dZ22)TRUOQNAjoJBZmiIUI=8deJM$sJQ6! z#K^Rm->Wr%|9Rrci60eCo%`9bn$00y?f9Z1b>%iJt)~@p`6O#`^#>7+9aF;EY3>yN zxnS+ox~&F$&zL7KKvP5-56jDkBWV|{`{qNfX^qWznzf>}$sUHjTOst|AivkhSo;0! zwBiy6d;PuLC6c()%306Eoj3U3RV(4wO0!On#Lo|W3EN$LRy;5~n|37dR5%=lWZzQF z6pffpyQu>JOIwJ4o8WSP@GZ-(`ya7jdu)+h#-I+NR?eo8E3F*U;JPoaY;ICNJLQ~~ z{KSh_y&?jkI6XsoY6v^r1~lkYa+cKF!C{(?^puz*IahB4_pE1F9h>!uVqE2Q-a|xh z8mn@Aw=-4ep`0w~NrI_IO2jzV zBguMGKpk6C3Y;(2wmfkFK8+EmdyOp{%gcH}jPUxmSpQ{o@D~Q%ctQ+(&gDbZwzQ$= zR)7#jAjn|cI71)#E#8{|9jwdC9@G6?W2H~T>2&wwIx%+f;Z{ACSCbE+JP7?26iQDS zRUgQX$#5953aD`$6u{2qQq%$;6fMPR`CxekpEEiLy>8SVO^*w97|Wy}NZ8RWEW3w~ zoya%O#9k752^N4C#!uU2Xohd5gJP3dp@=?!R%4Cd^^AiOD)v*jQTvJ^Om(3*m;ig) zh11@%5xT3G{1_`9)F}84=RWB*Ca39rRxfi5NA%DF3e`BKmtXAI4M1*jmJZSGQ&>8= z3vOh!=DoJvGT<=e+O`+vh??BH1(;u~9DoObcFXS^(@Q)FOFvq;UYCPXtf%Un6#<_k z7#a6$4DEbgU4PmV-}r5Y-D!=^%7EiOXXok4XXRm6IeV%wEU#JTt<;bHBE69y0CbzY zhgtx+3Dl?cDQN`@7p3Hv%*U~SsaC}*#Ss-ZadLP_LJ(25XV+>8>Yp$4_D{FgZD;p+ zjF;2X##8oaoMsU`3hur~Od8LbS64HNk81m*rCqPPe6!lh`ZR2{A5`gh;8wTMj?Z_R zHV7{`8oLyi=PTuKH_hC<@o#!8FE2pA;gKo+>iat@$Ws%plz^r%Jt}Lt0VrRHesp zuxIca7Ad@Y>x8Ly^&JD_%)*Zv-qX(ImEBkDqieaRy#tZ34ZS~Dz-aYn(|HZ+vYCWmuX?ljc}@mZeMM+4zxxMjjNqA3xK(O&I{$e8lJOw&Eoc z?BC9n&ENyP)PfDLY2GYm1^5!HZ z@L{@gJxVxHo8wlYS#-(;`HGrltGi@L|7)*EUXXDJ_qQn=@rS5)DC?F9j$yVWDr$7aQt`IoA`_RGd?sj&`3spG* zcPhxr7Urn}$qBXqV@nbjyO#IaA{}J_g^oZ9gh`DOUFQSsCuSdQ4kqqrm%NCC<6iN4 zb1MV)-}(%22OL)m)EP+#oEAQ`iE&Ui{&3ViJ2@f37JPFjBvhLNJvTEK(@U0?Midul zFSL6fOmS@dsUMctSa#ZZgap`N++c%sbbB_=27S`+{%AZJq2C*!Rw0$0=@|>muj-|c zyHKO{gSTMAWMVDyZXa?2o*3=3$F81@?<(66;9mXXV5+59i#pl!v(sHfNv~5}N`Psz zSL3MWr)oRa+nk@iLa=~DM;~!vfZfaMo@fug6flH_ zfP;5ETU{InF1{FB*TJA~qQXPFFIL`$&9l*vq-9$K1rjJtg8GQ;m z0cc5gCeEkKXKYAA z`c0P^Hlyt@rg59D`&Ns7%K9Rb=SY6V^}$x#iMKzz#~_B2{TcN|YlV7h{Y>$ocDuzqK7|wUqIR2DRO~!gTtV>@%1K*BQZ_C00-3+d4pN&zKSdRIm>YtAa=UDR{MPPvt+gw_n8hNs*x=3uJCXHsN8`HXXT1WXrpl%*0bOi7qmg#*qsP1Mf#=dC zz0s^w*LLc-SfhBWn%kZ7)=fYLNjm#n!^y$6TCcv2)IWDP^KpQF`3Kv-K1r7tneCL9D(bblw2l?-7 z+OY4y`xI%2{lS|j$&yAcP#;`?j4*gSQ~GakVO*K37f?OAjw4p|fA{r4=L75wR|ZfY zV4+aL``y#;S)Z`ajC%B)zx`dZ`LmWbE3k|k(;kPit|O2?4^gWuz6E+Aw2knC-oh_L z{stWZ0#gT4q@C{cBs%a2dWKv0{P(LF3)BY(EN&VD@C+T+D|9Rg?pw(Lz@5uxNe1A? zY$0k}=ZeZ2X@Jb@4K9_{6zDPl*p^lU66TMRUWgZ1KW}A!<^zZ~gXQ2$o-F5mWXwaO zk7}ic$@ky1e7mDk^x8YY?Z~J*>VDH2Th-jhs6(*};r%LFKCBRs2VbA#k7v-3tc8CZBBj3y#c9WFVt(AZb*1dwpeMvBcth~f@wQbHBxRkDC zqja-=h(22@Gef3oEt+bi|qv`sp0S+Du5%PZfhb^3TPF@{JwiZGiDX=h4k~I)q*2XI)>}4z63WX z!EJtPFB~fN(xBbHR{aI2+ewxV;GepR+TapyjF4;f@gOM$v8LmExVbAh2-8tijhksD z_BhhK^JKe7xVk?D>j3H&?m~+1KUn%5R$%H6sX4({NYcTDvff)yd<;9nm{82Vveo>W zYJc;=^gssbgj{g5+jueFex#dcI(ISAT@zS&E+``L@pN~Kq0s3zDs&~(M`* z%gsfbH+O+>BUQEmSe*qJT*VY#Pc&-m)?Uor{?(ilj2dmF&jiQ;w2)i|h&Qvg z{b7*snFFZbzd&(L8(d;JNB((wI z>PO1(Q2}PRjV9HqfU4#4TSZ+G@S-~D0l;O5nY!$>EC4}-g ztI;dAk{Pk#FMXlRsIWInT=kc?Ao78*)Mu?_y()c5y~hllZgpL^cteO}`^4nMG9)IZ$m%lo>Am>5Ay zDM&WXONmEtOF(9SkVxA<01#jfn@vW8Mr_Q!@87%RqS-intSk$ zvz>wa+Xnr}BTlPrR~9D7_YrNGG6F8Ty*DHt!OjL9yObseE6X{QV&2m7>6m?qI(s%t zGgB)GG+sKOGkyTweXsK-Qvdh}HM7(JizCF&*N=jPj{gp_zazqwyi z!*~`f1Iz0xe0wsco)f|eOu?T|oR5Eklw^AhusC}4Y<*cB2Zd>L_6= zkFdZ18}NLzZvqDQ^VuaJ6=lx6`Q|aNDo>R>kmEA|vZGb8e*&R!Zs!4T{hhF=!?7Zk zqf+`7R5Ny6F32lTh|o(=%s)q311A8!Hqx^`sh+ON!fs3xV|nvtsC#YQktscRXE5sj za1cDWRCDmY|A{wZpFxdb92`2E*TVn3pp$4CTc&aQi{`3L>P@^=|+lRE6+mU%Gm@&IF zv^>#;ZIt0-u2^j5;nQ9nA0H@nFqRg(dq_0PcBpC+ofV6tqCuc6h=o>^jK80v>zNvh zz4cD*Cv%DT;c72JL^%ia5G+v7X5IaYzRpx;0OH*|NK>$Y;EPloH$qadc8!dX%0#gL zp|Tv2dcLYT1*Xx>A}JBYjzPpJ)&thgx;!eyk`fxv%;PmYJC#FGY#piR3B z1a*{C7zS=$SK=lA?m|mVWM=_(n&Nu~lRYZIUKHgH5zYsQ=u2vHGB8e6hErp0ZUGlr z#JrOY@ff)O>3M({S=WECq#v+dZ#0aiA;h7wnvajjkk`p+qVpPrxlSLvg9y}Z@$*xV zcJ@h{|E6OLJeS6M_`>8WA;H}o+NF&4uiyZX<=p+p6ztuh7nlW|EE31EcNIY-0j zn#*(7bEAbfoHD^n2S74F1l<-IE^ALMW~b@7j03fEP>*!Lm&e=p9nW3Js*oJ{s_*_5 zvH}@$x@<7hXGiYnv3e@pd-*UiU~(6pL(P&n&A7QKG`EgkG`8p?W?VipQ`qyVCVr^j zSK6WO!P2^<)aG~wARw>CzX)f%SBm9M7?@60s6VXcb2?Ci_tvWbz3%OIvk2lxs>)od zUNpS1DVD97?;iWE>!Gqvg}t3UAb?X7sqo9*wXn1+^J6Fcf>cKY8{h*TL!2*k6p^e^Y$T%eZ}f-V?KxKKK?d?=fzn?e&XpUFiNAcVV!m`EN>HzST1anc6q_Vs zxk}>k^Xzv9GH!EMyWP#+nYVa-J$jro<=M-hPGZt#ieimW+Qn&t)O_gJ)=aBO!EA^xT8}(AVdl{O~WAR}XYJh@}oQ^c;~?gLt|* zQ#_++Gq`0wQ_!_)_n4JXBQu1*L}s(=_1lf5Viob}oYspo1z8xX<7Zgrhy8DLrGf`i zXqZi@@f9Qd`~(^mTMf$b>#q3xY`w;Pj5VF?o4KVA&` zpbt7WeRxtI_oP0t2AQ!IobKdngB{_hqvLZLmSPl=7G{P|cS*o1%|~!)bVN5yGu*b84AX*9DVfpFj}?jNc+XqlbmYe^{pxE*-jv|Z>t9ekCo z^fU@vIJo_mPS@}w!9;Q(wcSFk{o#{E+U0Y~%+|EI7v0CQe*R=MMp-^nkv7S`-(Bgt z_Cuar_7KC`x?RlTM)=cii-`B;MvbAz%)L%5C`vxAzA#X^ZW!E0o86Vwh(d zS#LUbvV7Zl3ish8#C@Du-1hQA!iSpu&h3}^W->$_%{~(jxlNs7r;-minqw(;?2vCL z-a%087ZW^QH;9oLsv^B}ARx}dnwR249yh?fB)+NQqTiy4g@-9~Y5 zUiD~~Okuf_r;`<@Rf4@#h!JhzX|e65>3J$CVHrv7DGLvg9jHPHr!(HIRt<;L>EYq(W#L9%{v!zlBik7S>o#Mk~qWiv%TxXBwSUAF8dmfBCJ4Y*|( zd4;}vPDAIi+qj0My%vaUc8@MT7&{oqd6t2F9(SsGYP9(D!H<%Y(@B>7dQ=f%U(N7L zBi}@LXFiu>^87LW)b9GxrUDro;)l`b=Fvr1=`Su^kC8UWYpFul$i`o!43_vbbOubn z9EUt>J-jyp!5-|Tp0f1%up#|+FaGL>kpNDjw7xV+jiO$AyMkk2eXE5HA9l6}*@ zcl=$m+W+2QWAgqLj>dCpsHyRBrZ&?y?Cc}t~R z@75;9r(kSFA1}_7+&AOGzP_MYCCNb#C?&^oruMC;Jj>AzJP}Exn8GJ?2H}~Wyydia zUlf_S4}9&kiu&-@XYX$XO4(fE1;bnBQ0gY!psYEIkeVxlS>Y6gFp z+hNKvUe3dQJw?W|T0zxz7%l}5FlO<(Dk^pgN|Y6yp*V%4<`; zk`zV`uq%rAZh(NGW#oWt7+)Hpe;6m`s2&5Ltyh8r03%(+Q1&qVNVJZHXIEfeYdF8s zlX5zEK-4!_=r{g)(Iv-muF}|K?OQ#&Vx-x0Z*Jb2=gblmJKa-73&N_3WJJM?-kG?l zbVC2^6;Hl{imlt%9{OE!ztIgq$icDq@{(<`6;|5&H|(8D^wNhW8vY5yNtX+SPX<8M z0iH7%+fTLAv2K2~Tya9zOnojc{!*`4iEDN><;UZ`-#onIaJUH`c{`4F&D;I~ZPVFXe&!pTM7mMr!*v_Ig<` zYD)uwTy4<2ezk1BrsFSxA`p)*3IzNoF`@XnJx4rr#A7l%tvoOlI{q zN1wR=(%4dzSuzIjt(&=qJKFgq00$jf0b_>7lUX7+nW&VWDg#dJ`pAClilEt49#Rw* z(_OV@>*$+@W)=RGPMGV=7XEVH6zqg%!iSS|L+LBJXv;N<@{9%?-z^=l_aFmZB+`?T zQ?fOGzq_+#pgwd)S#MZhj!VtdtO!FPmi# z#y9+Mg24cmx@QC$@h|Of z-xQO6^)+4owBCFh;igrCDL`f>36i(tF^-?w>elSPh}}Q85E$TVo3}h35Iou3rkUE% zs(0W&Z24{AqN`xkvYYX}>i|N9n|@(Fe&h0wxy zBFF-SZ5KNes+}8ebp_feIcmMR`;Pm3yJ9Yi2or31%F7fI7>5GQ_{v3(tlRl+4Z2i? zC?XYeF9i$IRB8et#OxaHmk`}0K`joIXexjce{nm(#vLzC%=v1|JizecHYF(9+2tfS z!BrylSyNPSZDN+;|LYj30fzxvs~C=yw}?%K`61iPueHq5eBWDJ?E(EWWq9xyD%KFB zsn|E520-Z)_)p9fFRlZiABh0^$@Vlyh=75zI2K=m`M!2Yfe{IMW z5N$gG5q&Dv(JL36M=AP$1%BTdxV4kvf(lp6XeAa)MD69*%-$sM41L zSr0}5MzzqDCHBuZRa}{5S68cTHL6YYoO!PvHjQe$y`^S2=$6WN{EKex@Uvs&M2wU( zyG1)UvTu8={IisSZ|HL>Xe_&2n+9MFf2T#q~tuX3GtO%dyQ^O z-l~S4`1w>Qo4-LLY-;dCCS!?Y2PhOpEV|{$XnCIsoBsNB#*h_YroSN+6}_REDic~+U<@^P};9_Teutl#kf)BhaBf{>JcT5;jx-$K(Z z1Ny_?<5u648F;R!yGRVy9L~_3`c*!waQ^snO&gXQ+0GjyFXQ?8nssDgf2Oo6R{)AF zDQDc#FQ9wAt%BIPaD%N2^7?^QnW%O1mo{Xvj0G7!IC&la6xg+4Q=PzysV2)sus2=f zbSvX|O{GZ@`NW4GTNMPgN-$MN(Q!V4Z5l;Bf@K$`p*>`dsJ!B!VWe7N%EiDL4ZFcp+6Vy#pzW(O5ZaxRl^r^ zNU!W|!SvPQ+9T3i!)SIoH+15YN@15KmRroJ8rJk73k7{r>oP!ubH+{=_OQXzwz5eT zpL3LU#5z?79}k~LpIX{E4lJ=OZ80XQmFuIUF{Ngy)A6-fi<#8oHrGJI4)uT`U2x}0 z*qRHo`4mve@eF`#?(vaO=mo_EX=iBgf&4&u(sfVQFUSKffz+>qLRdu9wLfPS>N(^4*V4zbT+A>NNU#TK+AAUK4q8N(iXbzHV#pqA?w*c;0bl&bPyr=$N?ItKKyVO0} z!rfQvD;H!IPKO|M%nH!zWMGg_VQ- z82+EWV{fqQYBid8Nh(3<`{$*=EFx1Bf{^vh2Q$0UR5V{pd3IO2qreo#(_CLindVe+ z9soo)A#^N*WWBys@o{1eu#k{^cj9fBa_4ZZ{|dOv5_5L6m(_sH-l$FN2fcEO@s1<} z?Ltq5^U$o1#@a$P>MaRQMy0n#GJ70A*^QtJZfmnyT_83H230fsWe}-VU*0vu$wygg z!zkW$G&<(&{p+IdL-SjHosU~j{dqpFds+On%~r7l7Wuz{Tw8 zDyiS%cH3HC$UArwprJ+66rmiBRmSq|RSfpAqB6K6foPrepyEm%$>IQDHnWeCK&$f( z&_sG+6LKylf`!kV}Z zC4mvfw8jT-6ZF1?fJzFDHh-7r&fElP*9XLH3fy*XlPb3ECIhEHy3iVf*1L(DWdwIz z!i{<##wWOysWd$lRvm%C1)3`sKArqP2BwGS55JnZ-LLkdF6DE`EaEbM&W5p^)SNh} zgVo9f^o~h4rCN^Wh;sp8V*JbSmINN|L!bOPrMAW}g*g)5A^2MCZjcy&D4>mAtaBM!ItNp?&z|*nL7`{8##1DI~eAE1HN2EYEeEv>Z zP!Bi5lS+k90SvMp2k@Oysq3Fh_F&l{#kXbze)zEI^&m#cu*VTmjhm`7Z`%5*r^3AI zl-j3Ibh3nK_<})ki{}lnfeOAcWxu86vRq|~!_HOj&NjXuRftbdlf`>c$CT7GO1AeY zAJYRD{~W_zVh;B^yg`9*6QdxmUYv!qlh|_8ao#?fr#rfag}Jh>rAx+?juX@f$pDks z2Ulk|36FRpI z@uXdeicf&jzvo-I)GF3OA0^)?WS?{c_c;xWY1^_U0e$$sGfkkPT*9#2$y{T1o+6z( z`WP~kLOmeu1HiZvb6FqI-vKH|oKpHZ{!T?u4&U|#3l3$#89M&MAI}_2_q!Imrbe;)^Q3bWRes~jG_43QP2(WnD_s^XL?+T68lZmGBP8vIzT945Wf99afUepa{ zHBAU03?}O%7KkKm|MZHzSR~^I>*J7L=>B0o(j=os}^nB$p1YHhJetcgOho=_Ie`eKmP!i5rxYLr?tKO zpFn|U0DYTH3kTKcf1(>Qfca|3)_04Ki2x<3noL!CA7qnZmW9CT;8=IldM_qUljNxV z{?#IKB*^O`j;TM<{2g^7FZ_ym4*p@uiz?sm?{F3fn|x*N0v<;Tw)k zQzq!|XKrSPh|Vu%vKQlpBXsd ztA+m-PF)g(JLJD>&--`yY2?8|ZtLuxT&!t0HHB5Ej*LSCk=)F(@)37S6yMsCkfxylLHDn;DV#Az)Fu1t%wK;#Xv;iKqZD)?g<16(43JxpjgtdP#>CqIYr0!_yyQXZe&SW5VBVfZr zK9(yU`r>EF%6R~eym5p5J98#=1aQ`%Cvv7By_?Y{_yD|0 z(RSMN7WjZ+d{VtNBCzL3q{v@-6^u1X6>ys99h;FpuZ6`HfhnLgbU{)E8GTVZwLp97 zYw!r3^|Ha)FKk;uinTdqusf-YOcl*xcFb|>kU5?>qrb3f z9cwd22@X3ioxlmK8?v9erPx5pBqQ(a>2+J$?*ZhnW!>>5wQ~rm9mC&A9~|18d&gIj2f$oVO;2H*kK%O;^(!9TEu`)3e+_vkjTHbsor)5Z2u!iX}qM=+UwmdS@59= z6UXA$K+mEn-b7Nox7WANPs%;BZ8o_#U;?aOtnx6Pkmcu<^&NT_|FkS%`RII74Y;|C zREfF&3Y9IxO@V#MJ#;63e{Z}u#$XyhkT4jK{IK||pJG@BcXl8p90zs}8fc2CKuay5 zv$1+jMriHqXNGG71MbsgIy3c9Nw|H#)^{xys;#dSzpNOo4D>5pa>cQ$-w`^;On;$+ zz&SmKR*~7;WFUw}r9E*2M;AC&!%4Hx%j5F!FR}18PQU`WrnCwiCvIuy(3NS~eL7(} zUN-fiD_DBx_y-;B#!{`uyXBTNUF?}CiUq8?Y`d=rh&i#dfbWfAH_MMZ~< z>zXx2`U&}oWN^#u$FA`TTJ`4KO?O%IvogmyH)TTGVD{P=IB&M>i1sa&kECH!AWS%>=*2>4#rG z9PW>3SG|cC$sHD-7DRO)W}r>fIcj?7l*hd9w2u+-A@LIh{y)JG&NytKO<8Rwu@ou@ zOIYC{j8CN@VVExfyU$XTEL8s-x>Z>20wG>(EA@CEjfVK4LjMV6@fm74`8w}sSDEYZ zSM?Ahzk!r~tb=R}F@l6M5TRqlMewl&`IH`0&7)Xw-5wxQ(@2e1?cYKp&RDbY zl!1+|7lbaVghO zMc%!HZDfF*7YX!jIX{_&j47bW;*uFShp43~GXe$f!o8TFaMV!Ic2^so)h;rP?l*gw zZWiZd<*)Et4~YtsMb4~S(>;c*jTfwS#wZ)+OmsRdd{gzV<~bbZd36|%paM~XIIwEI z#CL8OV#1zZ`XX#he4+e|t>!8vpAFOwv+>nX0G0*^GJ;7-URVW;_EBJ-jDQ5?@tm+; zFhr9SWJ4T@5GT@mOyj(Dh+hSf8}z{Ammg1>6SI~#>ukM99?2a>&e|%zRBQk(#P{O*sLXn0h3m|jPB7}{!EjzSZ;-B>oR@cT|$9v8Yi;lTUrn5!7uC!|i-Sy4r0n@T z0TE<1`waj#9>Y2L-tvd5$D1K1eS;Xkd0yp>UYz!nhC^w<%qjP*J8xlnI#)7R`NiX* zM@4R_QAby=8{rKVV?V#??6z5GCh7NuOW)=SyUz^XM>@)hQ4LIvr?(KWYxXY-@!-~cnNtdnl$9$v@fZa!31iEBz{ zjDmnm8xz-&R{7j!q?bmfT*ypQLQ(u|ka`X_A_qnKM#bj-NRV>=8bjvS6S}W|bWPjQ zlwa1C2)avPf31e!k9x>JF{2n;NT!tUiC8i_57m;TJd(2B<(k{EK}kOoW2HKSX-S(2 z{JNxb@O)81!<@Yvcc28xTSY@$u9>^PX_9dts`rIc(t?rHo8UT)Q7~Or-|}3$+M?7@ zWj)1M>Ft*FB&!a*hu%Qv=%HyY=fUYijPBtgaZN}6+=Am%YCHGY7x1e6P5wVhRBzL0vv7G6Fn|+d}ebB7PcF?|s5AvMs0V5vFsyV9u zO8cn5T<*ZCie*VFeM9bW_o}*k_1C%|#@-pz>yj4TTz%J!$q2IW7~Kt|H`Nadj2N>Y zA-h&H26>>=kW8tXq&v$1y+w}n*6I@syW}TV80;j2xyDE9`0kj3qJz?R20!Oszqh$IHz(Surh~OA6OpyW4MSCF(C1}@!X_`J-SaNKo@TXMgo?9rr5$js z%&)s^=%!~YE8A`7j`ph*_3|7SZB=~r%oCGPkXy~@%!2Nx&LPXBjdIhj(%V8_ zd}EbKEuKMi$@6WBJlbcKUsRX~g!n=NTTU~7X~-Jwx~L0B!#(NOQOH-xNZmf?Uzu$f zua{Kd{}q~CwqZuWUOHur1bnrA4ILh$`W5*o=IP=v-s;LLW~k9=pL@h-T1=PvZ6o_0 zq~~)?&78SsHlVXpK!rif8PU|0;J(@#Gk8kOCXV8084;`pS>$;{NB7oO6-ax}70hrI$~n=vkVBqBT)T1b2Lz))DjEshpK;E6%eoLwfpn}RV1J_)g#J>-Z|kJ7wE)Lq#+4t%l)(n zbKIRLhZ!@QC>!sJoxLsqX&|}wfbjlO=f9i#OCj_2~|6gs;6>8+x2%9 z1}9cJ?WsMU0#g$NpA7$1XUuDaS_h%vWrL=3K){WE%gbR+yvc|Ps9F}Czx+>iN%E^e z<}lI23o}ap+M7brJ_N z7=rUh{;e*VL&9ai;qumq@ZVEX;aX5ot3X-nS#~#1pYP1?q3`|p0KO}7Ajn#56wOuU zssk7PR<@+K;lT+Oi(5jq{D`L}=0C$XagP7)p6zi`zZGs7f=Q# z4HZ$W{BNBt1dlh0#f;Wph8M5%@92*ngLHQ{DAL_2!qDB#dEDQ3 zzt`F44>&*V>zbdq*7GpyUh7`#zCSS`Fm(ky>}S|0C@6SJin3ZLDCh_j6x1jXCh(Vw zgt812l;_MUL>!+3^_0>Wy$iz&w8w{Ao^|h`cn&qF{kP%Py8u~Pt)l0d-q1O{4K{h-W63iW1`15XMGn%0Ct zw=kUFJ8OYTKmFA%RQLk@?(srn#sWL54gCwW!2Uyv4OPG>&d&5s4x!;%9J_`l=sf&o z0BmKp0=`U~N$4@Kayrk3NDq4c0Ud(4>FEhg&;+$+ek@hT&Js{BJRt>!Dry7I;2CXj zp<-v%-$|6GLATsNz~DgXVqkDBwn9@63>Xnk!Ie$u@oLF1jTHJm^-5=lD3dVHba3MQ zJG9^sry>Iyy(r%LmI z7G`PiSwj0}tu{!405xE=hw#IE4VJ!{w?LE2{x_HXc}|FjxF#p`jV zw08UX?&_1}a4HoQztzhop1CSGu&=0Uwz{v**P^*T3)U2kDu-VD91pf6?i#ukvbeNw z)+}^mChgaSkmDLkzAqxAySXH6dNgybxzkX&%Rln1v3#$Pt)43E7fvnow};w3%y97w zDmtwGqlxk7Apr-K$;Bd8+f7QGY*^QB;$$8-GVY?J7?XS>`&ZAXUSauJac5`mqhu#?G&|~O# z2~QU;#8LR+a){cX}2*3Vc|r=Obp3)*XhNc-wZlW*I^ABQujKgM&_ONZK^YVk?M=s?|0hdOS~+Z<@cLF)t7PFoPfaZsd+{F?Qq>~N`(-*l;8 z?fdRTpUt$6I5z3ID)pLy7{RN=2$Ybxf4tF7-aq#TDBDSZwdj1xBbJUKpR z)>smC-9PUA{>8|nhxpjGXXUkcXYtgg(I`g=+Het6YjbO5^x?to^Rt{slSiq+5{U^D z8}6x#`^yy>tNZnl31|TJYE}?k*OKc>xKb?3E7{}8LT!jqT}h0TK{S!D5yi)igYx!= zt_t(+3hNQN_;#zIWZQRzOnskEhlKKJWm(OF&-dm?8b5CadI_dW`AX`Qyw1WeEY`}! zPWL)diqF@|Rd(Agt#`OOGLM63Lhn^i6k}Y}GbCwGuJ^}Pcyx>7zmc;2@R=zw;D2eq zOhdw|E_;1~94j>vO6)Z(4*Zwl=x+$C5&C8F@E%MQmys#@sP3o2%)YmZ!-?s@H4U zwNjK-$-$|YL*n8$^V#oo@Gr%~j13&;WcyOysuFfB`5wq8#+y{w4E%74vK&0zsz49m zfqbBEA>;U>Ayr#0Ud$|UgaRuZch?C0vcK5Kzl6KGF_aPyQuf$LvYzA{>yPI!B8D0m zRKo|zYfE%4N~IpI*1o^6z&t??B(fyj-(Kn$i{+^%eKl@$%=)y}^SaeTAc4y$u+#r( zaYo2%;9dI2Xf8B=OuVn4_186m}5`E;tGv^{O2TzeF<%FVuR%mi+BvBp!2kC@u_(hXA|~}#6l^h#F`x==n2Gc zOYEy8r{kpBdF+GmD>u$I+_AIx7wvtHtx6uR_lhFFuv;cL%=!kcj=dl0`^L`|Ts{fx zw~cb4-zwB*%KjBKt6G!n+8mOQIJO(G-?HGz7wp`1Z0``Thc{TMfe;5m)5d_R%8`-&SI;Bl1h7gYVlF z6%(qj2-CLeU-qIkM%in{YVW(iA98WYcC*O%o-fFm=mLS?s1okDZg8He#KB0XB;Bzk9loE5&)a& zZI~>}A?%{}ee#W5BIEUUW-RV3wT5Td=3SuJA{3K=qr-OZ0WrB*rg%1V@kjBaUlh`b z+?zfuD-SNI+kvoajrzp{F|3L@Vrok|yd54Sy!UiL+`E zDG?~?eN&Ls2AuhZTq`tUE+2HjUYlvIM;8nB#jRhfRy1S}e}r<29=@EA2HznQ%_iv- z=JX*0P^qgw=(T2=IeJz?@W3eOR!63J^aY_JHaJz1)@JOl*Yn!<87Xfoo+cLO!ayd! zO1XKB>`|{I{sMOiN#=k9gRIAK^$jRANwF z;fPdr4i4L+`Y@5FCJQF*p!Yr_GW9x^b0&+X5oCPYdv%Gc1q!G9TDZ`gLkJa7JDbw? zYd(lE=@kAvBGFr6OZGfpm{#(`2M0DpPvCHL;4Tw_-Un1;i}69y^I4PPpFf?_%Pre* zn5@GHT?V0E8SdRVMa4Vq`C{z30UmwLMF)TTY5OHn5jp&ZJ-!S|Oy#WJOvS9nJOAQx z%sh3BuX<;~U6O`bKqZ49e)O)a{8h0zO6SbF+T%?oe(G>(q0$IX=^{xts{jFrF(o}ITBzD#`Ute~MiW_VzsTLh{X7Su0!ni(# zpd^MhJu#fIje&yThOg91qcn0_Jyr)9BcFFCnxPrhq0sx{_TD2fS+KMGUVX0U69ugj zNL?ZJYiGP@@!G_A9jstXu#1Q5%X{yWzD9jbD>8V($fG?Q$I)dK{c*U^a3a*5`%1k# zi0*`ohf8np)s^PAJVMcthjY8~?CCqh-VBL$Q4h0(g=>wDGnK3w=mlASI_Kk(9oNGI z8sCDW=5T1L{rcQ9Rf?`i-y6z$^>#9Sik4?HE2NQzywJ6jghD zdJ<026;AC<9nRfOLn(;scBYv@*q@j4Y0c~X>^j3sbdrG4j!cnROP+wEUZRytt}2bA z*%z6zSZ^i^&V*W@3}mLhWY706Gu~c!3gJgYilZ(1N;yoZwY7dZi46X;V2^&fIY6}B zW+2u0Lm2^6r^HKVJ7Y9$p^WObZhNHbOj#8X+M^2Lxtb$qnvq`(~B-I65T#5 z=L4rdMswNTH~PmLB5ET$*=rRqR{rFKMN+5;p1#!+YhM8)^O(7vLIU+)YKhBnfn1Z6 z_^Eh_mBX@V9|Z)Hp3*-#Xy~rTAL@_=zvQ*S z7o6h&rwZU~Ez{06&(vcZ<)}Phsb*OomDYdRnetY71-H^%-_K3-V%U}nmPZ_Y#qny7 zEtXLTI~qFcJ4D`m^E?da3>e2Gn#z*#^L;@5Mv9v5iEpzw+bNBJBty6G54qayI;UdG z_2REDb>(89B2Ddw$!(OkeXry5Egxbib?xHTT(^_B5w0y>PbFthQJ3A$@LEog9PgkF zR+rC$Z3gJn>euHFqLG1wbYkwfj8e}EFY5ZM7D7Lp;5N$ex*fs`D#iY06DhaAM>4}c zu@F0iq6Ca`jVDiAv=H9pKPTrxi=dZcMewxzxy@lyx*+OjHRuMe`id_ii^lZ<4)-1_ zs4pB13v%Sc*MACSI;?K-K{R@`#%RU7pqG={Z6xwYrm^xiG)tEeDVf*#_zw5yZAw0m zJ~AR|H9Cc#h5BTZ+2WdH^^md?BA>nNiea5X6Ocz2MorLC=3a4jw-GJx>I7DSaS7kF zph>Y0xe_+=a^Z0{LeRdZv*=L2aPyGUC4b%wqQa1-$bypv3frUC@pZls4 z2usrRHTQOo8W9U${)Cpc1{dW*R0ZiG4uWK)3fh8&FPn=q=J_eVL&FV{hPWl`gxCL2 zQ7!QGBq?@qp^-xC72g|10&O1HKeB|z9HLG9K-Jaw*}K}G-s_K%C(HX$ToqDiH`<27 z=OyAUm?QJk#$LXWKcu!+u=MDAe?Kjt@M_zISTbLhx1-(PW{`CG+@m}SzHwKV<$KMN zJ7}W?843Q`{}y!)%E^}cbDowRJ8Ma{JJI!M_Ej8>KJm$6E?#2Z(1lzql}kOR*j1xLCFisqkfJ}oUA+Jw(jUn%Xaf4M{OecVqo^IcYLGSK^l_q zPhU9QGovB0V5hIPSA49#f>d_;HF9Gua>p_XE2?2k9KZv8RV}Y}F;~ldAGLyV z&YCCc&4$Y?s|a1Zni+da>4Q*pF*7xglH32zn9?&Sv)9AG=Iirz-G=6$OD^Egr8La} z4v$i|Q|E*a=n-WtN6O-6YwnBMU9LnP4%kBSLi-B{>b&Jly2KY;7AYZ57MY~MPO)`? z&Qx586E+R}m}oq;s%Xe-5E3zFWRJ1#bz|Q)7Ui?fq6rGeNy^4^(E?F$9&t6sF{i{d zxtyCE6MoEf7N&}80qSWfN_iia0VwjJlZyWfi`p;+^!j=&@-{sdnG=IXkVB+-#>&AT za8k0z7MG+LZLGvlc(QU%`(Fp*)+m8N!ya>-M8L@XrHE5=snI;YUM}yIzgH3(oVRJ- zMyI{Xqbu!&0qEXX>f^%;pmX0iMO17SrBmK?!kpn>Q&njzaPcU0cZGCqEO0#RaFhNCTKtmjc&Kgh)x z(}HhNWLg6|RpjCJS$i*VTSRp(=x@qPqHgiau^STSib$20nq96hc>DW5DLL9_ar(u3 zhq^FhXPGdSCNk!S_ZMaZP4>@&h-OV*>&}`%y<8Yyua;C}UY9TPm%+VW+{nSRpDC(j z(CGD01=Es?=DvqlN`An93v@WYEdDf7;t8u%l=GTCsdgiBPZ+@m8#g(#iMB6Li4h#= z+`IkgBH1yFP}EP6eHQzS zKqxK)DS1DGnZSjVC)&MxXZL z`wx-M@tepl4<*NY1m}62cSu#7PC^_e%iJNv6N6dpJ4#Kp13WP}=j?hE{9J=>MIg7T zoi|z*tcozbbHAjSM{lfF(<*2_ej5+HcHkZWBl}SrMKh%%&}?~@V&l`p3ZwI|&DWU2 zkNfq@-@H8!u`wzv-T4dwms}_dv^1ZZa2B+qoR>Sk!E;fqvG5e81K+J}(Qnl@QRI0^ z%IUJ)-pVhEp%IwfJ52UxhrenhhyQ8v+c8z3>Ml(Ge?gNvkUIO72mro+8+Dh9H2*>9 z0m{&Amg#s6_WFw@U6v4~QRv86n*)P3*ipmk_8QmlmO5=!0A$^WmqiU6f}N!r7kbsJ zrK;rkY%>bn5kQXrI*i3%D?K=6?^UWGp3U3|jmu-n>TdaMLXI*vGvegdu-2t;LOhG&HkP1t3RvhDG~GcJ~yi4Lf~gN_Vp#h!$bL9d;z z)*{$<9PdR|yF>+6l+1JVUfTw=&N3DPy+Z=io!~MAh3K`&)E4WkPh7+VICQRvf ze#7lgQs*mXy}h$+&yec7Sc1*?1rm2Tj3^t7>lu7xR}n{Y7XBfPBvq#B^n}3sN(Qz1 zT@@>tu+2GZ_Pq71&esnF8@ugX(&lWOOtMeegD*P8jYHS5QRjdP1cP~sQ=7!1C>+Z@ zUiu9c3-+qeZF^_!h*>DK5qouJxINFA75J`g11H-3YbWA~79$hZ8b7LpN+RN|bU`bN z4|z9QZx;OQinywLwX86B20ka{))`QJCgAa+#Hr`hvC!-JSj0-yj*5;c{UFYzQ$R@P zu>~gOHm2lhyJCcheoub7F(gxF+<0_**uDk;eQtNhzcqn`Jss_``Q53fk4 z@N2Tb`=ZB$8#wuCgxEnxtj3KV{?)11{rODq_ZN(GZhuh4?<(vs+yH>6H;JFM?dmVi zKe_?{V1FVVx61-UROAJ4zon@0X@TzZ)p|XI3{*BWRuL5j{3{}757bplPg12#fJ5{T zv-$MvfTKt$FBJhK3YpRg?Ke&eiQCIKW~iPe?0_q-+hV;4J9@Yu)s?ONngx~}c=(*6 zk$5r#ij{Szo_@Qo|I4^UooJD%HQ{3k7xGu(` zRCT7K2SL_0c!xo4-U*9bjP8|Nt@)}v1a(o6_C(-|LFxLCJD+w&?q1X4T*D77LD{U001`!;LEMiEOb+kZD!*?j~mAy{GQ^|z^X$5 z6tpn;Q>vg{GP^>5toYjRNd4*vK009K0s-2H3}6O30n9i`;JseW$0b9o)#J6_@n8CJ z&G+YP$Ex5ey|-Ln=PE4}j6L^j0e-8d$jrwTK*Y|r#?YO2r+=lnE*Bykj{pAJ8qWX)Z2K7LUyKyT;pXqFOLkOUx5J-61Cd;w(N6MX{+D%cE0yYx1!OyGRzm76>*Y! zr+yMnm)6EPmjSsYMb2Y4<}v6f%VHzxVrN|*CNHkCxHg_Q zWhXX$kkqL&jboY+qHH@mD#YQIRI980uA-#>&&_$qkkD;a--BdQ z0Iuqc@tP5oz1pAeb`!`@SbFmszVwOrz4J|#rSFeD?YNpxjIcJZtyva^0Ik0oQrC6N zw@AH&$o`;2Mb-)}P^<6A`aGy{KrQ?ih{Dt8zJsnzfzN;PCVcuGt6D!+ET2CUtNKlB z2$b?*ebfO8p{T?e@IdaEk9CK((4&wW5h{aNy#=ux8$xO57z-!3(vJ2_Mgr4N@%7`U zDh2jK-`SkYb2tl!hw1XfzT-y#G^#G&h6Z0YYjpqtrX5NmGD#(oTesRhrtNxzn$xV! z7%K~u8=NauYcq!CeS4uhptCzw93%vPrvf7eiZAQlKVs&tT?j0QX^Zed<0jo?xtWv+ zU7<`uVE?!_5%ir5$u*1iDFFJ5OREcwD1vca>)!~2NrO+eH3f0|=J~IGzLN$pZbBxC z6iOu!k{zS*N2e4jx9eVCeVZS#Rc)aj9M<2wiuq=OWko3s9W$pKJbuXw1XelN$+>{$ z3FFh%-da*e3Au*20#fBhN1<$*mbDcUs_h7Q?5wFV*cpQ=$S3$Rg;5=b+b0gotyy&=+&B;)Q_$2KX&G^8hyIrNFj(S zPMw6HZ|f?`>-fsW7Rua}Jc4@$}d$U9?eOpmrnMu_&Dd)pw zS^?WhMIjl8FJ0&tfL&GJpNWO1R^^ZIARd?t9{BE{uWM{HnSsiY*A2_|D2vYr9M=T* z&Dv8r8)3&BA?&Z3c#bo*BI^X~PQ>?&G`(An2ga`mueYNa; zX%+%j29JU#Jn)FY?bB$Eh~4_FIqyT{Fp-Cr*J5Q3<|}=1&U)ys)A?F)?u?pV9i6f6e z1oZN4Ue}X!T^*jFdng2r?dfuFqExA2t?~i@(x}reI?tHc0lq{2t`K{mwaIw>H8C>9cT&r$1H74mr|2+8wU?2@xNal*c#$j2i^as>TeQmbmQce zBkpotMm=aAah0h{H8lUfiNc9sV0Wy_?~P`fb7lQOR&(Czh+`4`isS9ZiV@_NY9#%6 z`gDRK6f!c<8oYXeEl)Dmfxo~Uz_85V_YkiffPMYbh`T;f7F;7fNaK6dNRTcQsVm{2 z+gV(3-S>sjUS^VJ;OVs@USjdHb* zf5MBJwMg0q$FBGya;pEVOcaT@+{yZr(cg5QxXj9NimnA=d-t)qX(>YXdig>9N*P(| zRPnjF@25*NGZv7O8cDO!85r1k?He6b(CcbrD{|ydn37{vL9huEIBr568THH{FPY0o zu(rJ7l|QDfJ6pi$7os-jT|H;5=qH*n!5L2+dcvqQ+oxg~ZQ*#1K8=2JN0zCCdWCjlE}d$lag!Gz?f-;yg3@!A|!c2WPiVCZRPt0^j{iv>?d-abuAYu zlaW1?V)y(pK_|-rW3W_6XkWd(0mp@RO^WrQ6M*+&0;$`s8!gGeSKv%3m1q|%A}#+q zrKTq~+y67vv<4piZRk+JOZ#4JKuEVb3*&R3aMkQv=gNpQ+j5=mX0a7r3#}d&?GI06 zH)KI@IDPE>6D{COE7C2V49ld!*wt_(%2VYZ=zEnF(F5l1|^8KA(HhD5qTMQxQ2mm?+c|mR{`ncf{9whL5z*gvpS6 z#HZbImw3{9T0NlPHKO97>!!fr6GqGHTe)7JK3OeJ zet)gV#rLl*KH@pUh6pqsGyf|%(4m80dT1FDvd`f_^Nu#qqievoqmd@&DxWPM4wL+O z?Ci)ILPN`uXbBu3B)P~5%5}GsZ23rDBIq0n&u)pcMv`8c?6hI6!_7v@@!`&Cd-!0@ z8`LU6yKk`sQeh1(u$#}rQDRE;Hi%xU?)SVSc)R3zOwlo zJ?%`o2fA^dPqLYtb74ENcHE9;S)6R~Qcz|V$0oNUpMD#=wZnZ@7~G1irT$jJsi6?P zXGw_L7Q;n3>n`nPW~}{aC}X8yjz3L%fz0m3b#))5#|X@+z4g{zEu0B)a#T8D|LeDu zcUV1jYq%|Q@%Eywb7@a0hP~W!i~EFnXjpzHm#MwqHnq2_0Qb9!C$$6ek6#S{Tpd-G zj~uSb_e=c?lv1qvwPQ{RVVP;`v)!3;4OgLH#SG(@27+$h69zx3N}L7~xT3TpEZ4T- zi6(j6Z7(I1=mDk3;8GL#^y*l6u9!l-f1@yy3Hm)(iG&%!ikz^7^*5NKS1r3x4;#BP zKiuzd?02*9k27fH;ba+~D1*c78-|jRBw=Pg$4L9dt0(f2!(T(Wzm>Oi7$5g$#^e0W z#cvEVRX<304@EYO{vlNZF=x;~7?Hgnj0+_qa>e}bP%;%_;@Vm~gUF97v&u&Ke4qf5KJ19FEX6B@RPPWtx5adMoS5fGI=sw-yE$R6$2 zi;QK-uqf^^=@y`tCe`WvBPqbNf%VO#sAw~kLEUm4Kj zeXwoqOOgH!d(Qx+9GSh^@3n`BlrgPKr?^tLhkBMb2n9}`Xc9X_O7~-D4PFQUiY2>+ zI$c)MzU7Wc$r})(d>HKMU~g^=P<-j}Q#*3~BGWg{`f&mNC!NRG4e`maC|RXg8vGcnGHCq1tepKf{#A6! zbg6gZ$N=-%YK)f|W3}_ieYo*G6}ub>w2x%}mfp7!faJW|PrGn7)$hZ4IzO`EioF>~S1mysnFPqc11YpPk z@a#EL3eX!Rt;3$pXJs_swFjv*9#KivD*cZLBXidb52H?0ad-Js_ zAxjVUxABX85{N`&$B_BvshW4%wJ&wJ^W&&G>3#2rfOb~%{RlvEk2xj2*?DHnvCk(D zDlGw5Gaw!`YVoMiPFi|Gpaq{CK733r5vPBF2Jo6!n;E0GV|#>MZgAK|Z-^V9p5rvd zoh&4w`(ixuy#BH`iz8e97Y`!FtnNnHogoScO*`YtX)kSDFWn9P; zC+4VeXu*5f;)lc+(5tJpFEpei+i_SN(1!OEuqvh~o{YnZ(*HBh56P)2%=+?och%)E z5hgh+47m<8?H^D|h%`gs$WMp!gvCz~*P|up#KX*G#qDV$zep*}Wsd>ZbL#?2U^AWQ zm*XqC)B8|1svErG9#PDAD-vy-&~~x6&0(~z%k(mx^nebUq(tW8SW(H8WU|ym1^`Uy zhTmCD(W(+*7o_;NhrCVzwugNCmkd=K!TVTocXc|OvBNY?e65UFe=7(24KOqj_O3tI zko3P*YE7#KXF{J^kafBJ{&F_t+nyaJLglH-l*tcZ?!#lBvg~?5S&uXxa~(Qm#x{I< zh|$Nwz2EeJ%+rsMwZG}hk`@^$RONfjU$B8*gSo%`$edk$z=0N!X@`TEHL_)TM=PHw z51xU1L*Xvk7X-?ppC96_-q8Zv!w)XkEUJ@`cVh-`!F_4RxbqTaq5;sE zUGFR{y?>qC&snOZJB|N9c9>J7vU%;``$0OeO28={ek=G_O8e1&;M6!mLgNsNnves! zCDoyj5ZYg*nWoJNrPSEF_s)16@)AFpXS6NZ_p;4z`uG)CO%`eJq=+bY%@7D2S3W6+ z#<--zRZ@a&UaZ$q^R7+6!zFd;5S9u-;QLKgyiO`fIE`S)bqnByx&2MTh&5<)T|PGH z^|`<;s~9q_8+83;U6UjWl=kt8B931R;*6@TEF~XiM92GbR+T}Pq$Bh=V~A0+@>FZ) zP?GP9tj{lr`|lCQgKvMaW3qr&gCpfLcl*n1bhF6vCcno-5h`y0{7Kk9{pYlck!GIs zR&(l79Wm0mfh<#D61NQ^f(n~| zJ>;umQS%y*?`AHBZml@!)D|7amgNCM-n|jG)f0z)?;Xr^(taq52|fJ0c|prWqGq^I zi_W5UvXruA_KgZVQ5Src!N88}r$>(-2edqT{sTV0T~{y;!jE~|WphT02t8gpz2^EN z5pdd%0(SD?qTuGuGMY1SzA$-z8mq7fo z^K--Yc*>DdsK(o}@gm6g=Lo)(OW)=Pf=e@ZsS|60cJbA*8M3$eyu#*R97c@=(?}~V zkO}7S4g(1<6jX{iwu75Bbt3Kq2sJ*TyeyU^2iM48A`u!QmdvJ&-w-1^xaQ*EVBNR= zyTJT9m8Ugf|fdBMu|7$vNH(u_hErt@qTI^8dmLbJ> zG>HPt>%*tsC5Pkm;CFJAs)W$uhSEK7jbQ@*2++`QREAGKee5fBoG%J{kv9wKwI07d z-7L#_gkc%YQ>X}RHN0sgnmOc`xi^MR<>?SB1tF;{MEa?W6&>NoIa zJ0F!H$O7OuKrLI_1my-aS33{O=@OoQs|L8cTij3oDXPw`b%4GYwz*e1C*g4hbC+X? zq!IaXz)Ya3HIt(h`_G4A*&nB5Vx(WF#eClTPx98}y!$tlrwwM;aI;gaOU>M8Ez(zS z-i@hiog!$b)4o0;cWwV}B!q<3;Ww>oK^x}AH6XU1I(H=yKSH5PAlXFu#R{N(MP+I! zf`yW%AG=%UjrpD}yjE+<2fPJ=asM$;BEOXCsk+%;}vrX%2HpH<-GXFzRUgvq{Vq{yu{JB zyXEbZ&h`xc46nEhYdV0?jn=-`Z@D`em~HhG5_Q_j^f3d3Y>Hkf|AC-&O~_bhdX`)k z>;T~I{Y=>}K)yUx>v-Z?wC)WEopnr!poJPgkF^?~2t)eP)&T~*`JWU%WDN*sL3+$w z8;e?UCeRHl-&n$Bi}gz5Y9grkF%7D%mK8-yv5L9u z1-~zECC^rf)SFrEJCqH~wL7s!{uh=Fd-$+Fo~x1^HBTgsokdHE$L$Zq_UQjOP7H{k zVwSL*gkDrGy;)&4gjV|p0@Fs~C>|rYhJ`pAIa>~4Ad9%o=yL%X2!CMKc%gPatlU&W zKL9olcJ1z?{nW~F+0(&}zD7kC%tT1q)ezMb!xl$45B48-dpu`BFT$11==V0>*7y-$ zV>E^zD;au9(D#Hrrf0TU>y(oZF;JN7E2q~TIt$>II>mZ;_5I%RD1fd$mr3n_j$%8;K$NJ~M(IJ4{FNub z)=Xu`C|I$drb!5VSZw$NF==}F4_+3)x$fsEH9t6PtjB#YXIMHQ#@{7_Bed*^Pc z)T)@3Lm+u2J!E@vxMGI23MgO8=igiZAe>j4=%@nXg&F>zO=<8FT%&@Cv`Q>4zc}Ze z=AbEY{A38SXk=&9N-0$a2ON2Qt4dXB>r5n&uWDh}0T{{$`_a;fT(|Vw4~NzT;>A_{ zHzp~ElT$dyIn(yFJ%i<5m%*Gx^&o;c59#~*GnE@KKWSb*OSw?zS9^*#dP4>UW@T;L zOPc)R3`7s4+<}!YXUKBXo>+T{!k(BgwtVe3^u&cK^;FO#=GZxbxywxr;_9dLUNEl9 zGu9-5SZnxP5N9sf0ID4!@}RIj)o2$7oLL z24&LtoO$#0?mSy%Ay(cJD!Ppo2T% z&w|-sBthM*_}ORc<5#CEQd6&EULc+NqZxxHbltRk4wqY}aFaMsaaH+bAPl6OT@1=q zA3nz|7CH%HV6Ot=(R?fP`=I_{$aI0G46Peksw{|F@Ix?gI6Smeqmul$7NBLNFXNcu z%?U>0-V6yiUc%cCO6eAWFayb1BI)N?w=(umDd@Zk!lWW=G%hIm!?JzlU%CatWG{Rj z{VKylpf-%EB%y#Efm-07K?<;Kts+L%sm@k2 zAmRCi!W6}@#-S|nBPgrJr=K)ajas@z_CQmW36K?HX94oIi|6#~>qZZ6sNx8899t2b zLno{}z+uL_eh>a9bSPtYBNLQr6p3Dq{-}|~N#9!j)0?yl5iA;OkbvW2xPZlD?=eSC zwRrp+-&kZ-SvMgJOr@fFOhRZL2f zn*k8bOCT70Pps84B)wr(mP*c3;WWmK@NWeG@u;?c2@n9|jD@~K$pXq7>yslw%Wg9F zs#;8qvF-GhR+{R#@l5wbm7#G8>LO%V3GgDmY_96Os#IO8IyS^{B+o{eG~hZsJOVs% z)YLqN=LDq{oVRpKD1ne2ZEf{W=12U=qsF^~3?B}4R2tG59jlEq* zkEMw{(5U*L)h4&n;$CeiFKW>fR^u&bij!5N$z7bNvYS8o{i`0CA@fUVG;3^%NrNvp zGfC~6+;dhSYOW6m5hE`Z1W6iI9AD9J*|+#+y`oA+i{Owas>~hC*?IEAc`n)@JG5=- z7o^aqna_+Zf$Nyd-}Cb3fLh$~XZ_0XwwTuvDRhp2?Uv#5#uJxAOiPgu3~X^gwMYWq zv0MJN!Y$v5aXyLMlM=s2ceGafkXB>Ds^_7CG~VxHLb&|iD5bT}x=G!!9qgTre(_Tl zEf26*CO;ENnO6hXVCA6yf`Mqi*g8b}fKx>Ugqoa=oh`RunVy$F#iklw0J^;|i=MYT z#UY6lrB8%_{h(D&_uMr@$PT+@&xkDnhMmx*SNaf0bMoBN==&g}!)BNm*tOTWrIE2m zhdS2bX)^b_WS5%)+G-e<5X28HMh>)}@ah%2iX6PJAdHGiOqJ;kAJFghja6p>Hc9H| zqB>6kM!^+<-Mq@=_rx zkS7UlpZpKejtvL~q1o8s;|W}>#CzM+`4$^_Nv|)jnqPvXuG%Puh9QCnY zobki3gYd+{%S=Z0)2j0^6W%hQKK?qR)pM@cXHqE_{?3i)1N-rxCXvmG&2Q&!m zxn{9vmbhe)|m9Q+# ztf=>FGk{RJIhFViDtbh=nUtBad>D$TYaP^Ygo(pX8XPB?%ozX(vV=ECyDYtTXUk;) zCoKuHjhhc}@}uSu-n^{_h!BBYR@aj&49$bJ=(SyR9v{k#RKV6sY{@;XM54| z=PS+`o)aPgqaQFY` zYxM+voi9~uzd{FyDP)rP;Nw0Q09XGfJ5mw~n58CsE&zVBK*buKRQQg~Ey-qcm~~37 z$pw@}5>)cDYeof(D=xd4Xy!ElCsBKN&nh1=7)B@Im8*$Ol56|%0S2`xB28vNj9FQ* zAvW6dKQvYYi!yvN)#d~Q1pMP)Kmbu5aL34SQJv=xr-@|)jy?#zgYo*m>nI)Y+T#9e zdt6t%DFEy7uYZjT03}LG<|M`RM37Y;nV9oB{80+V?H@M~d8fmDqyAFh!*`5<1UPi9 zC!g1DK14P&ROInbXVMEBnAO>VH*u>+T9}CM52|E=fv@hTe1Pdw-TY$j=dCZ`?se`e zFz)5nn$3^oaghm1m;D`aaLHpT30QsC%&CvNaC(6&Of3!?i{MSh#rDO{!b4A$V`4_d zHrEQA^2moErVSeJnF2-?yZ}Bk3YjT!r_F<6SpP9Rf>!Luhq>J7S(9e+x1DLYj(H;Kw; zR8Q9}N0FwK)6j5&PZh(g2J*a6HST?D_p{BL%3(-g4txulDZ8hLXHSc$4R#s{MX~IQ zk;BT$(af&OiS5cycWjS5c7k|b?2&f4bzmR?1}0A_iw$ZchslNz#QjJfT>~tS61Cxb z+HAn!zWz%a$eHu~h5BLxDIzhYeDySFtH(Jn@O*fAJ{sl?f)sMpmHWICz3E6v! z3Dzddv;P98_gb46^y*Bxsm|-2N1w0gQuFn3x{|QO+^NW;^W<%AXNM39h}pjczf{6j z0~%#MMexhp*0;N9fOXs{q5L8jFv;T)1&mTqCsDm$ZV>_8e4*dSIEn!5xcpBr5##f5 z*2k4RwG=16xLr2DhW!<=AFZW(9*hYAT~DY>ErJ#*499+6uzup+h*&Pp@h4PX2_;3n zIKWsJ^WPX+%O_F><-Sxlzf)BkekTV~i-s-*@RC#I5GLR0Rqp>^Zwb)0Vg^IqxCNVC z_PdT&yDNPkeMq?sb(Un@0CUqDK(e;8>G-$6_@(%p4wT-sfU2{7V1?ytZKuxg9B}y{ zku2;8-$y)B4on&VuQfoMEZe7jW`b~7h5lI$^81S6mnP=tM&N+Qiim?A_IytiFd~DJ z&x_=WteyE6F1{@?F-6ko9Y>0Wp--MJKA^*5v4^bWkmA1haDlRk`)1^EC*~`YF;U`R`r0# ze~F>=odhXV4gEjAq_AgWP$S{r={yTYxYR5}@BuFqyRnc1<Aal%us&Oz zneMLcuJEm@Z&M*LNSu8Sl6Z^4CUbjz-2m~aXL|_s7tQ(NbyRqU)KJt33Z&WEZX^?r z8Npb)Qr&8RIV1(Y)M3I45*rfBFhn80e&Qw{R+VQ+D$%=!p9(XiMe2pb(9u}?m-Dvt z-ReLC@g$~pOn@}|k`A-9GG>#YvEynNZwL+c-qE=0>y@OKJVAxoR69V)y<)LUxPE>R zsN=!MirX0oDa3=Bz1KXr>6fggWJrk4nUToB76KRWep3<`GbWd&k(Q<2sY(&$6@x8@ z5DUKBxX)Q38wbnPdXRY3B@Zo0Fr3c@H#B%CD_O|~${Q5W?4lTR`0gUpsIQ4#5_*vp zZw@UOaF4=$lte7f!A9m|i8b;hW{$TGch9+3;ynM7X-#dO- z?Km9`u4G|aIUaiowc3N((j4TH)3*-F$zo((nOYwh;0=AVEhGH(-t$C zHyI{RXU$i|DSZ$-pHI_>!MS#`;swWFeO}W~0dty=Ly36keN3zdNL!UUA)CUC#DgTRDT6T6A%DIL9H0kUJ~5Yh zxsqfv>dnJJI1h(RWQMD5oC)-R&jlwFGQ7@2|8FjmBPL%$|IAVw4xrB3*gePeH0*p0 zjU)%o9NErhpRn`ZQLsLl5#tdk0~6*e2F?wL+uc%3{vPoB?*UmRCF}A1YCN7;R131t zMr%|iOZ;$Onwo1%03k6`ea8Ubmk@s^jI5(@$M7bylYUXb&qi)zaN26wQ`q@Dm`m^N zdt-V#up3i$Wmh9;u%+!WWe^>}kafsRnaJJ=*CV3Yx$v$2Eic9sOA2SC91%^|UdJ^* zMGy^zkBeg-+L8LfcLpqGNJJc2iB4bTtXo1Faz*|5RF|58I3%y1A2Xx?(%x;8a?bW4 z(lbWYyG(>aQOCz;!AH5FR_h->lQu%kY2-Q>-3y-cXn^hR0RhQ}#-+0F{Ep%ynwT1@ z{N77INJ8wWc*`92wm)?Cq9JYq#_|+Q7N=RMg-8?+?hZdltj6+Y_5ECq=qjx5?xusN z!#g4-Nl*Da^@IxR?vu`A6@=j7N(+nuInDE+!#xYrJL@lgES8iHiIAPdD>T(j>7Wd3)n* zB(qE^jfK)r4&|}!rLPp1rJT0(PFA~1i2Lg+Mg7K}WZXUqWq1HPm#w>d6p|y9v z6Mg(H9GnxFa!_T3qhtMADC(GYU!0BsBKfV13Nb$_WHvxWF;Z?3#k?`R_Uj_hwkoWPe8s*(+zJID7;;s|#bcRu@=R)r*v^X>H z;3N^n5h*uj`sQ&6T94F>+&8}16Rbd<;5E#U5pt57*`31ziS(|a>Y>*{$f~O_02gb$ zU2fjuhuI;1&6g^j#;$S#y8V^gxHGCGVJtcNV0Q9T$%ws1P)7_Zn88{BE$ z0rvxX#Io~*BSs$X^mnUFv1ARTYR2|gs)So4lr=uS@#4W^{J?+m^_q_^P(i|88A{=W z9NwKhWqDit{Yijj?n7;CSOl_Ho3?z0rB}H?6&pvSdh{*u;VRX$uVO@zoA@^3cA~Q^ zoFFX8RGC?m;GG{gmuK2oE1_aY5T}Kv z)gl#MkkhnGRukh%S-%R)^K|3u)Q>BJ%OB2_8unG_5~@_y@+?La5pGzNOJa00Vx<^O zG-SX%ZlCK`1f5)w#tJ&xrwiL$JI{xUZ}-h%2$DrY1e#E4EHzAr?l9T*?HrdpM)QD9 zWf=qVBm^f{Ry-fk(LXDrRVf<5$_U2HcV&!>=n~~-lT4} zATzLCW@j>|?DpbBy?|@O=hH(^jP%#!O`OwP9yz+4IeEZQn=5K{! z+gJRT$AqjwwPmzR^KsDc&SGS*F#(_>IAFQHJ@IURXHQ+|W_~m_d7j`Ve_JIKN`y=` z9aX$1dA$2ZcY!wH!S{2y7vJ#>zUz+Tx&@sOb8pipYVtEjrw{gn?J~Fa2g@_pr-ES{ z`S3vpBy+t>=F*@KLO*oevx5E%?kk1S#fD1iwqu&w8)fQpRkpp3?h>rn3rkBz4grRS zK9+hY%R1-x;WLWKppkN3o@Oj(0dIjxNXQVNes6LDyVru?62>cpMQUEK?)l=OPi>>K z3y1!TOm)tcILJDawjDBan@^r#8|WFUb)qGvWDXD9-_5okcsw9Nw@H)~zR1YOPd_Xn z?wnE&SI&D~;tKN16a;%cLfR;?1cf$qB(qByoRyWJwq?EnPt2wUlp?I6K0qpub&uG8 zXEohZn43?Fw*6TNhi_qcdXQcP-^ub!HQTJQ&ly)H=L1AAnFFVsnsre zRQv4nyVkU-&yIi$j;RXC+(-t9)9OK42_+*tF107C1h^N3NwY(4Qu9d~;RF@P-vlP! z1>rBgyKS!7XQ_3hNC6xlrAHJ9o=tu9S%z=~8v8m+=6RhCDZc;6*(m00U^+7&bOba< zN0{3;1g{f#deum)Bc{w~Qqdk8Kc*}IXEgn>>wOqFoq-@MsiXz1M@&uWPR^l&vby_u zBL@k3oXpc5uyktQpy8-n51f!+pDn*jv%|KWY$1d{d%6>xy;e7ZRi)SDdwOdwAKgXR zo5u%VlxNh7P{Y!>)CoL7r=A1RDVnp14|;(^S`g#J4}UH=F8}MZ6EBYWRo0||xci*y z8DLZ4&`4C;S)J0&k`MkqTV~P53~4`uf?sAgpC3aK+dvFO8-x~pt%e!mrc(eew%-u9 z?E|!OoPs5-8iKQsX4AS6Er|xho<(pw@WDV5#PWB%?0JxZOutR$s!@B+_Y*?yyd6rs zftib#{LBSGCPS)x;DNgVNy4X_?=&iJeNqOyrb}`|_$+wax?tfEEZz1mv@uj|W9?Hx zWG%kzh6N;W&Rj34=|g(7QHPZAS>((WXcV0Lvj}b9BnJas zRbH@+`y472Do2q#{-@>70tezQ0b`3IA0@?3}|u7IWw$BXs|CZ~`tY(pBj zzhy8~W@Zw09RLO$a68AIIqd@b;NY|0@dvCbzZ%`e7E+1I=7Ig({1|aPof87VMkbD4 zWY}$j3iC{H?0hykY3V86YuCYVaqKRX^IDyx2ihAf(2Wfe?ytXO8K}0qET(8!sDs&r zx_tQSkUs=@u_?MS*oJ2lo1(rqZOIwp>0A6WmCDVzwAM}l)j}i`c@#9+Pjza8k3>N) zY%N&1U|eftfM6L`2&@5t!*EG^m%S1k_Dh1I$YG~F`ph`p7?u4}m^=4cxjDr}zI>G^ zW{27T0?i!c;@ajj{T6wo_m-=bmizpjw zDV4x+mIK9;g@%=nC2ckVcWnoNtHNzYcI(jH_YEMQ_n`N&xWi6~Cg|s9TBt5nOBZJF z{Sn?u6*UQJr8Oq!&ymgtr-<$8p#1WMTo4-YXvS_oz7RHe8EzU&t!1v*C4 zzqo^^u~hAiwLKur-}#_1^14@qEG>wsI6 zf6dSlsMoN(KQo6R+=*6@!s$rBmpKpjUNUz9-6kE2#Gc3PvmmrRMF)ehGBS)!e_8)U zy%YF;swZ_c>X@2iR_|y&LQuvL;!TpR4J*}59SvuygkZeiHjCuc*I*>Q^dLDW#q1R5 z(45MeoSR6AL^@9hcAnfoUjt&1m3Rf{cBh4LQ+KabPW?gqE{trLC1Ob}pAfpQ-5$k7 z3(uSDP#1<_lL@5nRYL-S*x7L1oCFXS`+5Xy0rCuUPVrGOP=cd6FLh!b!c4+3{QPo@ z4?y#pMLPZ(hT?m>ub#mCIf&~$H$w)|E-?aofMo1PnmR`sVY&0nOJk1iYH%hh@h^G{ zm}p_jX&*G7@*`YZOuX;`I%9S+Zxd8{tU>{A&Td(;&dBHHiD6=^D%gc2G3w?|N6VihY>p;N{-+q8ld1FO8n)O3b{KR z@bxAT)D}e@9#~J$%Wuq6k!GvRij|Hy0AfNsbrLIq9H9k`4%^#MlnxZBH|*~oMT8vO z))O^;4i~SGlw%j<1qUT%{3;v1pFg%+HxkyFPu|FbbA=%UFHQ?>w}VFrpO7?p+za3J z6gLfvcZH~en3^O+{Pur?oV4dX)KOE33V?%9z-s;0l`FKV5diMK-c80OuZh%uY5`mj zyVQF0*=bBJ`6A;iory9goGSTYls?J~=OTYq8}2#U~ym*1ihvew?)OlpB?jE z*s7s`?+)?i2A8U-qIg1fiN)W7)IJe?#fp<=lSNY$w*!2oN8AFY7}TtN|HIDwMnEm+ z&$%8y2MI>+mAfR=H;N%rqUJYXi8MhSwW+XDx&DUEV50Z+BMh8}&=RIRxENW<(l%p& z9`$66V&`$liTNsHb$J;;`I@8xi98PE+`D0I^G2S+1+hO?8q)^|F$Lq_HV!WHarz;+ z*Km*iW4dwNMh;ewkhLEfO|!dk8jiR`uzL|KS|jUIVJMdFc+J_jv4!9>hcu$H)8T`f zA8Dh^H131Di@B3(6R8N-BlU$~)v`mEwA}SIh3c121WJV&e-{i%V+(W07rAj^hynj|zFG6|Hz(>` z=q|dSJ#ps3UGPaBgCEMRlO_M^>He?pee;6_l#WA%!BA$m$YO$Mj3J45U3|1K)NY+Y zh=mCY#ZRe0YTG)N2Dk?n&xJISTCyPmiA@Thsz`@g`wt6)1q1&}zvr9uD=5-~Zcu8S z$4VroUc*;y!G&%A3pUXusKA+5@G%@Zmru^>3Lt@h=#KeLBhZ7_X+R36`+5hF6acJ=2<6+9_FJt zQG(r7fXGkT==fm5k%~&S?W#(ty5HDJtz$we)iM;ZF}#6jH3y1ZpkY{3^_f81FX4?Z zy-tZ}b9(~hK%8*yDw1m7THUL{xA z7Qv8GMV})WQg@0-#2QlS7%gO_jMPbPaeOMi`pP&bR3H@a!@2uZ%9}!fT@k_dRRl6Z_6{q()Pd6z7>~a%wf`)B@P>MMpqYNitWFG2jUMHS+ zGD1Z$%PeZ=Iu~Bb6?7^!cF^;^v1$K`Jp0$@1b~xj9rU4z#`aA`aB@BP9f79ZS-W;y zi=M*1H-6l7W29AFf%GKU)Mvbt;N<^T83H5t(6I_}xc*`|0u%v7W6m#0{_azOG7#N8 z6bJAflESPymfu&$Ncp(-VCQ{t%Vn(dSt%l)UViG&R(zEtkU1sRU;!>IB;7y$CYGCQ zSRHlqh;YzQ9xXdod~GXXx{@6&*yQAqz^82msxBZz@$cIO!2)MUK1uee|L9W~|20M! z91Rt?C&2D-$?NsJ3QGWvie0(zs4b`Vqx)SEjO;-NzZ`CfdQ)0{QzegX7jc>R*q;Tb zmSW}_RlD=j2*zV;F2{6ppEo|ygR z*2{0n7sZB}?J536{te90MZ)&QXk~C^EsLA+%XUu?RLTmU;Mr&Lw4lFGmMae3`jhkK zHUa(XEZv;`$}Vsu6w_`#hw>vT&Z~sMSoeUv2 zM(g^)m!H5a$jo3q*q@tUQb$a7`}0HIlBEs=kTJCwyMFR!EO<<6jl}Wi3&NR=n&}#t z{a%fZ|F#t5_P6hIa)zLZU(JTqx!kga(^yNP34~HZKIDH>lT%}ye=2LdIk2r85ay1M zFhhmp-CPav82A<%3jVG+`ACr%tYqZFt=3x(w1ed)#~-!Cwj1(@!Uq$>4n*wHRo2~D zjOT%v;A3Jir$8w4J1QITRMUU+>$MMUS&>LcAf#Gw&-Lv6G@I!LpNRZ~v_hO*7nOf9 zC(eDPbE!P-JRSg{`!XR8quMt^1z*hQS?nON?orYY4P&oncn}yKDroby*G?pz7BGJj z7z7FRD@A(80Nv7ju&1syBSLqk92jcVvs;4#t8Dzhsam8u-e(-6jmkU4sgVsK`WFIv z(rmkOeBvp6R4w^KM;iRM$)wZ3H_~;9)(i(oxk9eMmEDaV0U?{$G+w=Nd|_({Sk}C* zJXC68FvDtMZTOy#~(x<#m-OkFdTc`s^|TLP<}Z<8Cl%^mI^l1+q-V5AFE% z*$~R&nYFRXqflbo{=HAG+$}n%hEIo>cGv{Br#^WPLRI<+mY|L}E!5}u0c|I#51+LJ z^hqOF(wFb1!^qz6L@SWb))&Aje=rjNN72aB^QXRBfDKV(31;z8RZg{cDcq7*YXu9D;fFuz1W>}UzM{anr)I%q%yst+)D zx1cm5AcSeC3My;0rR0@uiCMU}2$b&UvAA<5FBEkzX;sWl9813Hae6UHB#30W(&{Br zYJ4hDr&5H&{6IGOoq3&p5a_0Tt2uizcG7GIJ$vYRi&jv$jPdlGXEe9~4ooz(%Tr@- z?ydFG<08{32(9b5!U!s@05U3~vp9#I9brc(i7yqaMxQ-%5?uxiBK7=Wfv<#-|rVb)nYERJhpU!v61?iOY3ymRmV*PpACx zqt7_!aDbs9^`dR3vj*cmnuUS0n>hr$AHkz!Ke;|k zr43oa^>ypAIq)$xGYq?ip7Vel{? z{y41n;lFO6^^@grVKtUC?iJ25Kblh{MJQP)*;168)WH<{I9IgcAy$o6o&VCgM%Jz^ zq18C$n4V-)WtuRBPJ8kPG(Y8L#16kpu1ze+>^0k2jL7a)XTA&>w=11F_%$NwAGF>0 z$o@4CCr;H;bdqN{=m_+BU3?(gE=iJIt~Z~CPQ-+uEOUEh6Y%V~gM13iri6s0(zOTV zY&c7FR9QGH_CAgB%goq)j=SjHv@}Dul4|rWH(r*+GDY}4y6fF9{i`I{dACM1HpoNY z)jIDrE7p*I-CmC63M!`E{=59b0hK&zzenu}RRRaDRV`ZpOZON2_Ha{hU2faQ2fWUJ z*VJ{KkQ%%FHQf%%yl>aW)r5SA=g}|TPZ`;m_kfJ${aTAly7XAOW5YLJE1^0*%$x9d z#VFwV>-nxl70_UmNcZ1z4B#~gFyu*gi|V{4sDM~33r_GXy%MTzNqsl?E3=H>(;4oG zfSswSk*)7v`|1Ip7#W}0jGk`tapMZx#eA$`L1nkW=l6TH%-BmxV1iy8%zaFmI9+_D4p3tlJ0~0>UQdJk}2`+?8t= z9S*;>w9!@5a{+T;e87CajK_3sIWnU_YvU& zJ!d2`G=_P`ZjlW(?9R{Z{5cdWuDf#Q@t1yF|8X8oJ(Oai!UrYP;pio3J@~9l)CY-_ zV%b6HNs!v#94rN7=Gfil z@Pum?W_UCYUxbKVK@Zrk1u18A)A~jNq3U5Or?wnS10AQ?EF#H!vHBqisg2)wmOB7 zR&5Vs)8!I_@;cx>hc2Kky@2zn#-%I~eT!6~u;jq{40jxwXH%+P$$*&aGIxIk=;Yihc;v1=Y%A>e6}nZ_ zy@C?ZWk%KcY$J*%Sf(q~Q36k|YZZTwr6$l?({4hGgH@=;(j_7T`+Ri=32aKWDH-@2 zL0L|{zuL*gPSu{9E9i;|*CD2AUuzr%ILQ+Hajzwmm%Su_!DcSIn+qe5+4S1|@YgXi zq`yO4D9q~#RUogR4bb=7obHVu5GLgOwJvCb#%Nwhxl~N4h>F3sd1!iivEN0HM3}s| zb50nei6#9+(|#X5^Q-KkgY^@;zKoH2H;bjAqPPhgPw-;J{Wk3(8Jx0rC_CQy^)O09 zpk*k16drAOuu#y5#`Vv5LJRJfd_!x?9=LYlzEwdiiD))__m`OQ4z9cC&_2GOW)VZ|K;*8U!)?$zUHxOHoF=zJI>@N4S4I;pT8PILz4j0jmdq8wK{tj-G!QXS$yMEdtsj7 zIgF+}F%_1@U!zJ0gX`WXFZD*ooKrb{@ArwsbN@aVJ4yypFy^Q8XT34udZan%cAPaD z^Tzij-_4((G+d4#8nfZm$Jjrzsr@aR%=wYa1n{9HRV7qTY0(ariG~5uZR(V z5ItY;grKr#TrejP{pEU8$sif--+E$9GFlmfw*)*5w5x5i6&tR|kpPBScwho^4Vw6i z?V$#8k|qcTNVv{xU24&R+ReZNfd_d?ii zVaWAKJJ8t6e-@&I(jO*3V-MdY#KXc5YVp7Be>{!N?O)rL_nZOkEi%o}jBc;UtuV!G zs=|$cK60GkRSE*kCa;+q?ApA6Ng=(~$=`!;-d_y@T^U|ad77}qC{qhn@_g8=T(#;a6cO^Wi54yVAhW7mkTv2 zo26l00TwSe-oE=-Rqyxel}B={kUe=Oh2c{ng%W}coZYfY4}meV~agEEOg zU?hvo!waS8kxQf+RMt@X+p+upEO5d# z>$G(C4#CLKyO9)8wX^COrlIpSe~aeLk)$Z}?gS^g{fGOfCKzzN7T-8DR|4DS)yCaO4b~5Ub0ru| ztdMXOIV2LHLnM|idWNbf{d1rox}-SSe;;?t%?0&`@Rfmjyu0H!GjJr_t9tBuFn7_! zSvv~_nd8t7?*gI3Nb_wE#tS#Ipc-8E8P~oXM*{Y#EYA}j91pCp|FD(X2N#a+(vtQK zKv~|r=5zUcXz|2@<4BuJ&-m25~OS$p-siq0ymuIZJzdb(;nJI{R|6@In>#@8iuR&Q2 zWb%w5uF<2FBD@D0fIQQ|kOMra7}NSkHE_J>%uG-@b2XsM=#=Yta%f<1Dr4x+tcCKW zF-S<2!dpJ8%aFYtQ#j6K?Y~^9!tT4ES$s1H4S)pis0d&^dg((6jaHagGQapvAB zoqu6b)QT20H*gi)k0sNim0{19;uptc<2gaISUH`((#fCmV&d6LmLTV&#N-uFp?)P@ z8Vuls=b+X~VNT>Z^SfW|a?Mdr>Xx!=@sZ?T_z5wa&EGrEFk|UNzMU*qL}}bT^=+sI zww6xtIZ1k=IQ%ZPBRBn%M5=Z+HH${iA_`{dF{t@6_4)!dmRjuh05lTZ_Zg3Zc=KvR zVE&eI>tR&TSozC{64Ic7gS`n48Nb{uchgD0qbmKj7LE3IxAX&;pldj@)^$p9cyw0r z8!DU9i2KY@ES;&;ATkaA zX{&DPH5D9mUGhs~nmU-D=M8@vDoUCiz1i57q?HORq^{NVy)w64JL9=!AHw-#GqQlB z5tNIMYSH&HQFCfm^omcsfndrOLRAf~rU6v8t9iphg+ptyOJ>lttXu!Hy1*SX|Ig8i z@9yyMZx5FkNYOtb!c5wxx#(p^Wt*L#sp(po=$Je)Yqvrm{J}j&dmcYf zV<$NIgR1@J?NB2IFCY&I_A!KC73Uzaq zAppIVgFNF?55IHlNA6((@^uvQQ8gvdSqd_S=_pGio9CDi1Fb48j4TEgpMUq2G|bp9HTh{f7WIkE z%uhy>{(QO-M-bvGG-=Xr{g-IM{}*%q{~>>)gP{|ID0zY-=(_|&tOW3XS%pBE+?X$- z`_Eq?|0-VvC*As|zSN&j{qu$3PB;i**#$TL^&137{>X#HWaZ)M^HscMPumj(EL^3Q zD?*@=`*z*WFKOlaht++uPVn5J`1uDj)^S?Pn}e6@)4j)e>MryY*+VAQd*Bl7duYjV zHf!|cDJV3Q+k@w3#vw;+nhyLjYR?-jg7&@AL>*#Vwnj`wAUPoQ@jm-9^btjfX`g#| z?-_fP^bLq#s!NTkySB%j1f)KNi#&m%!lf&L6E5}dfs)60oURxu^Snol?2MqN;S)*K z8{&dn>!= z+_YF+GD*hx`6(nFR*%UatV4uk5Bus=(eTRCR zrxGt=k!ybV3eH2s=D7v!nM^=ucfe(e^#u7@kXk)x8N#=9cze-xlkYq`&TBvN;&MfY^Pgx5^RMr_a+A*%-#_kf#Neqp+&7P_gDh${qD!0fR#De^?`Pi}d%1+7 zP;RYm!qt^Xw>|rC2G|>p4t;#d17=$=fHLnA%410VXC&YxK9i!`0CDaTrgLN2(KY4f zK2u(Gu&a&!MJM)cKi_)E^wpdo|8wDHtFd~fw#M80)JO8*Bx`Uawtr{2^G#vrnsAV0 z$_OJ9I2a>TCdj(YHL_Jodv#G z)4-pf>%M0Aj|1+Y@0F_j7eWl>m48NdYe?VKuU`2VkQM|rBEWR(lKJz$^2AFX22UcwC-6G)nH^0+vqE1GOuS-fX7B=98k% zDidHd$ph}3TKba1V+(Jp1zydA!b)+OXa`S>kNtx}@rr&?(b5-#iiIPs_Kq5W8Ga&r z8lL)Y_XYD66tv?7`fqe|O?6x{cGpvu6xq>@*mWFg1?#yw4g@3)DokGSX{6~v((q;+ z)Io{X3uyp6Y{oKN_#wqEBZa{>fe#nE2?hG&BPMPuBW@m7n1izdt{TV!l9(o97r9ij zI5BSh1>V8bq=;8vEm6lBXEN#y-bIO?0*!kmx2TzQ#`hD2M2lek2{pGe=*Vh(+ju%G zhgr0?j?2gXif(LjqJx>k{tXCNqhz*|9cm0tR(uF$OdRF@QIkZp+WcL+-l4y!AY<|4 z;Oeu~RPPQ7i7O8c_Kg^+KIdnv5l2aHs46qvc;#5RMz^wC{Hrj^kwRR><|LeNC-W9@ zlzy9b2eD4WrP|IF&f3*RF=J9dPb7Z^9w|oS$iZKf<4kb)=S8(w@Ywe9O=L)t@Tt z!thv(E6L0|#ieFIxz(KbR)U)RzHZK)Sosy<;)B8gKdrU5YbB11sl;VT5~-ZU4i0c! zlP0`G&#Q3ASby2MT1r2dy=D^mnnTCLA^?biHKkOSxS}_rz{%;2IJ4w$Ds{Wyb76dI zu^ndRQJL5yU_dEs&m8$0T2sUFQS&%lQl{JIq|{feFFFo!`^3F-OLUNcUTNd^fXz&1 zI+>-`T}tw_H-0?r?(}duPFu3uB_=(Qz0_hEkAsH>1w5C!MPH~kwFkm!86JsITiv?; zT-S(bQ_4G4J3kXL_;IX`em4UxhA(&8cUs6%26s@zGkavZ7t3_z1wS8iWweg@%Qn$JnWjYOM#78Em$a|!3=SljYn%$ zJ8uM4@s##aI5;YHF3JHUa(IRc^FJ)LDp=~6>+t&8e_MNkBL~zFP4`hzVgE7df82rl zI0(u}u94#Zb_@Rg*V+I3By+%C}a;X8hk7D9d$Z|dc#w5lpXn#xG_uFi7RsQA7)!kX1 zf=7DZKP_pWDO!yw@syt=iT7jK4kiqkxW|W99065kX1?@gy1`4xMUq?KmexTGX9DW)L4fpj+t+L%@3||< z*duw<_X3_O?bcBmv4%c@YgRpd1lxE3hH@Ny(~q6nhiAavd&ASG&UdBZKh+P#-@*c>K(D zM1wMZb{;KD-(R>KR8?9(Js#i<1>dWWAf#+)bDO9uO%L2%KoToY+YIO%4`%jPeZ1iz zy+)@d$lNJD)(}FYlAuUJ)^XI-BO(C!it51jjEhe=TfqwkUbRWWjvY|xP_tCNm~;5E zF9>>qY|AdMfE#e^=(&-Zt&Ojc0jvfmB-IvG=o)Z&j%@xYrS$BgzTC`>hv%2U2dgym znHt{gFI;#G8Hy(@;1csEg6}@5#oo)bxVOu1*z8*=<}yBXLUNu}3VLhIf=082fz00y zc_dcm=Um(fxJJ(eD%yJq@@!I`?XF(B0q$S<)4id#gDnB4sm9v0OVpdP^{so~5Nrc% zx5rK^)TU0X1s(b?O}8|;R6HkMHTQZW^z!N62oiqG4EQLnPAB&0(*^8-w_Kq0=)wTv zR!;bSiZCOGXoX~`-izYn29!P-OtlRs4flEU5r6}o2fSpj1A>;pGaI&*vuI9wC>2H z$@tebT~wW294%jCKC(4KYjLM?rQvJFYJS%7ZV*xrzz<(OLQ=lm|J(4<$GKjR9$S5W zP1pxgp^Z<^rht1cJY~oc2<5OonJoZ)z@vBO?lz8oC39}j>9+dZJ10Wi-G(~@-qtk) zju&U3Q1W^Anvl?fq;Q`f4Cgq?@}OqL^zce%D;U2ijYs#OkfLQa1+sc#bw^a}YzE9*ga|FEM7G*%}#jW>1N;FFH_=Z7H zGvb`f9f0(mxE|g7EB($!xAvK>{(zsKlP2K#->;qG!1y!^4_MD^zqeyCDEl~jSN;*v zh>yT71dyeW`hcKCey{s-;EnRu-QuQ#1)E;D#I*CW2J^C$Z9zdh!q+zPXr&f|APn-l zk-YS^QHAAJC)IWb%R&EC8-u954ux7nz+T*C*;_m2`#A>oqQ;FE-93W@ zVPK>m`+q1|D~4+9$*uKA=!5;WAfG-IaEU*0sp{rj4SYjLh#~?60YMT7Q8bNI!@tJP z*H3U{C`Nxt+FGffF@|oxDP=)87w!`G@MN@-F+EIv8in<#v}T?$4(A??s4qO% zr>y&V&stl;jKpU3gO0?F0PUdsf#-^pGD9*?9p?mn=JWS^EDqj9=oONu2f;2i)i<6& ze@mCw!NlM6g07ZD_swU;$IDpLnrIf+08(^!Tl07cVfC_kzB2@g+C)LSgPDynA*uIp zI+=ro=BxeoIm(xZl>0TNPYz^Tcg3>(1|>?utSxQeOxEN;Fdfq$&uQrheH;k zJ(qGe8WaV1IYLer-PpMpkpCsXkUetI1F)}>bKgOkRYPj;X%bJvUWIMvdN)C{wi&JAG_-o z!S^MSgqriIp(p!Q`bHrKt+U68-pR8TqKhr&qP&*~ueyB@>wWTtDz{BzQnZ%W$9@PQ zAoR$&4{5NSK*?u$g6Uj%^P|%b zHPlSy;FrYwwq`_IzosTq#f_v^{P7h`{GEl+T(O{3;bO*AW^yjA)GHh~F(2+;TC7Xf zI_Mp*bjAn#dHsFbb7a{ECi-d*NicF|3Ztsj!C6>Ck0F!6-oVWqmQr?H-u4a_TUa#b zmo><3nSHM-RZc2K00+W6I7N*OY-H0at=YIyx?-M7Vd=i~iOlSFcKXxrYaV!<&X&xt zZyl~Qt^K;+UpQxbw9ij8ij&v{9=;jAYOkO2tF_c=NH_-45S{#=6GpKOkDovcTAlh6 zRc5kubc?k>;y_X~wIEIB;8oi6-9Wej9Aw$kM2?QOuAcIP+O_7~LAVNW3{uWADf#>t z57$Ma7dRa!mfGnX@KDaM_+USyNvZD8%(_V^l_>Xv@c6sRt73Q!pbpIGXTWZyP3E6w zD7~=y^wVUGR%t`8ochWd%sFSpxH{S7J5YsH-cxRIeiuJ5naUP$Ou>xwsrnP|58|0V!^-WP?)PgcHRy^XwBALm< z=SZJOeO$`vo+L?V>-)Izqoc9zs#zQO7+W^C_8CZ+SC8h3&J3mc^ev1#PTw0YuNA2f*LkN&3-O+R zrn%?hF;_^v=D0bHUO(UR%4IiK?Cv;?^3L3i0FyU0Md2f)jyT=J@+tK#zO1d7C3uz5 zLu((cN)2(G*82_VYckCgOp-&TD}$>x#vxn|jR4S1xuvaCzGU7mvDkmT@2OOTE%dsx z`*AdJZ2W<_)NRL>4CX5#)7;2Y)?B&c=dTPJfDhru<@-Vzg*VGdHMYV~4XxT6*XPoC ziVOy${iZLFxG^1Z95f#NKIzfdP-GhW9IgPZ^mwz{z6xX8&~`O--X?M@ewpC~iy0RdLk z>NkcQ>;-|QDCwUtQ(heY@cxyE0m;8n=IcyHP?(4#{{v%IM(_kJ=_HDOf0zK1OY!fZ z75$1EwmB#4YZV5;tp5|bvf^s~^=J4edH@`4Mb}Nm{~Zq#;-ba>{atz193-2_nb8ya z@1XZC`W^9aZ2UjtSVK}Jd7#td{XfF_dk$#q_`knP5F8HbN+i{npYh*|1$i<4gSr3x zyV1I!t(B?!Y!v@95c0e7D2Jo}V;o_1u!!~_8=U`p@$gv`#^vANy(|BJUZ@9@t0WG! UtX4XD1n@t#OWI0h*z14&KZJDrY5)KL diff --git a/test/image/baselines/quiver_arrow-styling.png b/test/image/baselines/quiver_arrow-styling.png index f25f952899e553e79ea6e06a9dc4adb41e2ae2cc..6792ad18054abffe6fddd4490cbf5efa70c0b3af 100644 GIT binary patch literal 23713 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 literal 21258 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 literal 23974 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

krl(07ofo31K|+D!Sxt! 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 L-v0Ex*bDy$7IGOo diff --git a/test/image/baselines/quiver_custom-colorscale.png b/test/image/baselines/quiver_custom-colorscale.png index 79108fa949d485a60c00200375d765a709398941..1f4cc400bdb79f96b8b0e70da22ab560a1cbeecc 100644 GIT binary patch literal 25904 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 literal 27324 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 E0GXC1y8r+H diff --git a/test/image/baselines/quiver_multi-trace.png b/test/image/baselines/quiver_multi-trace.png index a94291799eb054d9a9dc1cf37217d9066243545a..13ce4d6aa012e7e51a8d410ed525fc24f3f334db 100644 GIT binary patch literal 31363 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 KK7vb`1pXhCmiUYS literal 30245 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 YJ5jf2z&#O^f8Anq*7Qu~pH~9^0}I4#kN^Mx diff --git a/test/image/baselines/quiver_sizemode.png b/test/image/baselines/quiver_sizemode.png index 8e81cf3ebf535e4e85f090b01a4cd416c8a1c9bc..bff61d48ceac127687924a61c04452303805e008 100644 GIT binary patch literal 31804 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 literal 40498 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 diff --git a/test/image/baselines/quiver_wind.png b/test/image/baselines/quiver_wind.png index 0365bd636c611d59bbb554fa7091704fa4cffc46..ced4ea566bde656900e293378c0c6ad9bcdbd6d4 100644 GIT binary patch literal 40592 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 feCwaSW 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 AF#rGn diff --git a/test/image/baselines/quiver_zero-vectors.png b/test/image/baselines/quiver_zero-vectors.png index 9b306e629e0b6b48d584731a966110b81c46a0a8..fddb563d1eb76fa451d3285ce41ac4d6eee5ea6b 100644 GIT binary patch literal 23976 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 Date: Wed, 24 Jun 2026 15:53:20 -0700 Subject: [PATCH 44/46] Add quiver mock to svgMockList --- test/jasmine/assets/mock_lists.js | 1 + 1 file changed, 1 insertion(+) diff --git a/test/jasmine/assets/mock_lists.js b/test/jasmine/assets/mock_lists.js index bf93191c0c3..ade9429a6e5 100644 --- a/test/jasmine/assets/mock_lists.js +++ b/test/jasmine/assets/mock_lists.js @@ -28,6 +28,7 @@ var svgMockList = [ ['layout-colorway', require('../../image/mocks/layout-colorway.json')], ['multicategory', require('../../image/mocks/multicategory.json')], ['polar_categories', require('../../image/mocks/polar_categories.json')], + ['quiver_simple', require('../../image/mocks/quiver_simple.json')], ['polar_direction', require('../../image/mocks/polar_direction.json')], ['polar_wind-rose', require('../../image/mocks/polar_wind-rose.json')], ['range_selector_style', require('../../image/mocks/range_selector_style.json')], From 601ca45eaec824f3c89c4d8af4c53c602fed6239 Mon Sep 17 00:00:00 2001 From: degzhaus Date: Wed, 24 Jun 2026 15:58:06 -0700 Subject: [PATCH 45/46] Add draftlog/7710_add.md for quiver trace type --- draftlogs/7710_add.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 draftlogs/7710_add.md diff --git a/draftlogs/7710_add.md b/draftlogs/7710_add.md new file mode 100644 index 00000000000..2beb5db0a18 --- /dev/null +++ b/draftlogs/7710_add.md @@ -0,0 +1 @@ +- Add `quiver` trace type to visualize vector fields using arrows [[#7710](https://github.com/plotly/plotly.js/pull/7710)] From d92fd9b2a4c13dcbaa66ea60f4a39da70c885f2d Mon Sep 17 00:00:00 2001 From: Cameron DeCoster Date: Thu, 25 Jun 2026 11:22:01 -0600 Subject: [PATCH 46/46] Update types --- src/types/generated/schema.d.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/types/generated/schema.d.ts b/src/types/generated/schema.d.ts index 1a89a0570ba..76b63c68513 100644 --- a/src/types/generated/schema.d.ts +++ b/src/types/generated/schema.d.ts @@ -12335,6 +12335,7 @@ export type Data = | Partial | Partial | Partial + | Partial | Partial | Partial | Partial