diff --git a/draftlogs/7451_add.md b/draftlogs/7451_add.md new file mode 100644 index 00000000000..cac0f4747ec --- /dev/null +++ b/draftlogs/7451_add.md @@ -0,0 +1 @@ +- Add `layout.hoverlabel.showarrow` (and `trace.hoverlabel.showarrow`) attribute to allow hiding the triangular caret that appears on the hover label box [[#7451](https://github.com/plotly/plotly.js/pull/7451)] diff --git a/src/components/fx/attributes.js b/src/components/fx/attributes.js index a2548f9eccd..dc5f867b3a6 100644 --- a/src/components/fx/attributes.js +++ b/src/components/fx/attributes.js @@ -21,6 +21,7 @@ module.exports = { }), align: extendFlat({}, hoverLabelAttrs.align, {arrayOk: true}), namelength: extendFlat({}, hoverLabelAttrs.namelength, {arrayOk: true}), + showarrow: extendFlat({}, hoverLabelAttrs.showarrow), editType: 'none' } }; diff --git a/src/components/fx/calc.js b/src/components/fx/calc.js index 9854947a42f..5934a57efaf 100644 --- a/src/components/fx/calc.js +++ b/src/components/fx/calc.js @@ -40,6 +40,7 @@ module.exports = function calc(gd) { fillFn(trace.hoverlabel.font.variant, cd, 'htv'); fillFn(trace.hoverlabel.namelength, cd, 'hnl'); fillFn(trace.hoverlabel.align, cd, 'hta'); + fillFn(trace.hoverlabel.showarrow, cd, 'htsa'); } }; diff --git a/src/components/fx/hover.js b/src/components/fx/hover.js index 80fc4a07cf3..cc2bf4e63bb 100644 --- a/src/components/fx/hover.js +++ b/src/components/fx/hover.js @@ -1922,20 +1922,30 @@ function alignHoverText(hoverLabels, rotateLabels, scaleX, scaleY) { var offsetY = offsets.y; var isMiddle = anchor === 'middle'; + // Get 'showarrow' attribute value from trace hoverlabel settings; + // if trace has no hoverlabel settings, we should show the arrow by default + var showArrow = 'hoverlabel' in d.trace ? d.trace.hoverlabel.showarrow : true; - g.select('path') - .attr('d', isMiddle ? + var pathStr; + if(isMiddle) { // middle aligned: rect centered on data - ('M-' + pX(d.bx / 2 + d.tx2width / 2) + ',' + pY(offsetY - d.by / 2) + - 'h' + pX(d.bx) + 'v' + pY(d.by) + 'h-' + pX(d.bx) + 'Z') : + pathStr = 'M-' + pX(d.bx / 2 + d.tx2width / 2) + ',' + pY(offsetY - d.by / 2) + + 'h' + pX(d.bx) + 'v' + pY(d.by) + 'h-' + pX(d.bx) + 'Z'; + } else if(showArrow) { // left or right aligned: side rect with arrow to data - ('M0,0L' + pX(horzSign * HOVERARROWSIZE + offsetX) + ',' + pY(HOVERARROWSIZE + offsetY) + - 'v' + pY(d.by / 2 - HOVERARROWSIZE) + - 'h' + pX(horzSign * d.bx) + - 'v-' + pY(d.by) + - 'H' + pX(horzSign * HOVERARROWSIZE + offsetX) + - 'V' + pY(offsetY - HOVERARROWSIZE) + - 'Z')); + pathStr = 'M0,0L' + pX(horzSign * HOVERARROWSIZE + offsetX) + ',' + pY(HOVERARROWSIZE + offsetY) + + 'v' + pY(d.by / 2 - HOVERARROWSIZE) + + 'h' + pX(horzSign * d.bx) + + 'v-' + pY(d.by) + + 'H' + pX(horzSign * HOVERARROWSIZE + offsetX) + + 'V' + pY(offsetY - HOVERARROWSIZE) + + 'Z'; + } else { + // left or right aligned: side rect without arrow + pathStr = 'M' + pX(horzSign * HOVERARROWSIZE + offsetX) + ',' + pY(offsetY - d.by / 2) + + 'h' + pX(horzSign * d.bx) + 'v' + pY(d.by) + 'h' + pX(-horzSign * d.bx) + 'Z'; + } + g.select('path').attr('d', pathStr); var posX = offsetX + shiftX.textShiftX; var posY = offsetY + d.ty0 - d.by / 2 + HOVERTEXTPAD; diff --git a/src/components/fx/hoverlabel_defaults.js b/src/components/fx/hoverlabel_defaults.js index 043758e740a..0a0b87ac5c3 100644 --- a/src/components/fx/hoverlabel_defaults.js +++ b/src/components/fx/hoverlabel_defaults.js @@ -36,6 +36,7 @@ module.exports = function handleHoverLabelDefaults(contIn, contOut, coerce, opts coerce('hoverlabel.bgcolor', opts.bgcolor); coerce('hoverlabel.bordercolor', opts.bordercolor); coerce('hoverlabel.namelength', opts.namelength); + coerce('hoverlabel.showarrow', opts.showarrow); Lib.coerceFont(coerce, 'hoverlabel.font', opts.font); coerce('hoverlabel.align', opts.align); }; diff --git a/src/components/fx/layout_attributes.js b/src/components/fx/layout_attributes.js index 0cb8750605b..825b02af289 100644 --- a/src/components/fx/layout_attributes.js +++ b/src/components/fx/layout_attributes.js @@ -165,6 +165,15 @@ module.exports = { '`namelength - 3` characters and add an ellipsis.' ].join(' ') }, + showarrow: { + valType: 'boolean', + dflt: true, + editType: 'none', + description: [ + 'Sets whether or not to show the hover label arrow/triangle', + 'pointing to the data point.' + ].join(' ') + }, editType: 'none' }, diff --git a/test/jasmine/tests/fx_test.js b/test/jasmine/tests/fx_test.js index 3f757713445..d123999e265 100644 --- a/test/jasmine/tests/fx_test.js +++ b/test/jasmine/tests/fx_test.js @@ -179,7 +179,8 @@ describe('Fx defaults', function() { shadow: 'auto', }, align: 'auto', - namelength: 15 + namelength: 15, + showarrow: true, }); expect(out.data[1].hoverlabel).toEqual({ @@ -197,7 +198,8 @@ describe('Fx defaults', function() { shadow: 'auto', }, align: 'auto', - namelength: 15 + namelength: 15, + showarrow: true, }); expect(out.layout.annotations[0].hoverlabel).toEqual({ diff --git a/test/jasmine/tests/hover_label_test.js b/test/jasmine/tests/hover_label_test.js index a9af59100c0..d89f482f9b1 100644 --- a/test/jasmine/tests/hover_label_test.js +++ b/test/jasmine/tests/hover_label_test.js @@ -7038,3 +7038,100 @@ describe('hover on traces with (x|y)hoverformat', function() { .then(done, done.fail); }); }); + +describe('hoverlabel.showarrow', function() { + 'use strict'; + + var gd; + + beforeEach(function() { + gd = createGraphDiv(); + }); + + afterEach(destroyGraphDiv); + + function _hover(x, y) { + mouseEvent('mousemove', x, y); + Lib.clearThrottle(); + } + + function getHoverPath() { + var hoverLabels = d3SelectAll('g.hovertext'); + if (hoverLabels.size() === 0) return null; + return hoverLabels.select('path').attr('d'); + } + + it('should show hover arrow by default', function(done) { + Plotly.newPlot(gd, [{ + x: [1, 2, 3], + y: [1, 2, 1], + type: 'scatter', + mode: 'markers' + }], { + width: 400, + height: 400, + margin: {l: 50, t: 50, r: 50, b: 50} + }) + .then(function() { + _hover(200, 70); // Hover over middle point + }) + .then(delay(HOVERMINTIME * 1.1)) + .then(function() { + var pathD = getHoverPath(); + expect(pathD).not.toBeNull('hover path should exist'); + // Arrow paths contain 'L' commands starting from 0,0 + expect(pathD).toMatch(/^M0,0L/, 'path should contain arrow (L command from 0,0)'); + }) + .then(done, done.fail); + }); + + it('should hide hover arrow when showarrow is false', function(done) { + Plotly.newPlot(gd, [{ + x: [1, 2, 3], + y: [1, 2, 1], + type: 'scatter', + mode: 'markers' + }], { + width: 400, + height: 400, + margin: {l: 50, t: 50, r: 50, b: 50}, + hoverlabel: { showarrow: false } + }) + .then(function() { + _hover(200, 70); // Hover over middle point + }) + .then(delay(HOVERMINTIME * 1.1)) + .then(function() { + var pathD = getHoverPath(); + expect(pathD).not.toBeNull('hover path should exist'); + // No-arrow paths should be simple rectangles (no 'L' commands starting at 0,0)) + expect(pathD).not.toMatch(/^M0,0L/, 'path should not start at 0,0'); + expect(pathD).toMatch(/^M[\d.-]+,[\d.-]+h/, 'path should start with some numeric point and move horizontally'); + }) + .then(done, done.fail); + }); + + it('should work at trace level', function(done) { + Plotly.newPlot(gd, [{ + x: [1, 2, 3], + y: [1, 2, 1], + type: 'scatter', + mode: 'markers', + hoverlabel: { showarrow: false } + }], { + width: 400, + height: 400, + margin: {l: 50, t: 50, r: 50, b: 50} + }) + .then(function() { + _hover(200, 70); // Hover over middle point + }) + .then(delay(HOVERMINTIME * 1.1)) + .then(function() { + var pathD = getHoverPath(); + expect(pathD).not.toBeNull('hover path should exist'); + expect(pathD).not.toMatch(/^M0,0L/, 'trace-level showarrow:false should hide arrow'); + }) + .then(done, done.fail); + }); +}); diff --git a/test/plot-schema.json b/test/plot-schema.json index 5e1c74f3793..4e265992144 100644 --- a/test/plot-schema.json +++ b/test/plot-schema.json @@ -3021,7 +3021,13 @@ "min": -1, "valType": "integer" }, - "role": "object" + "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" + } }, "hovermode": { "description": "Determines the mode of hover interactions. If *closest*, a single hoverlabel will appear for the *closest* point within the `hoverdistance`. If *x* (or *y*), multiple hoverlabels will appear for multiple points at the *closest* x- (or y-) coordinate within the `hoverdistance`, with the caveat that no more than one hoverlabel will appear per trace. If *x unified* (or *y unified*), a single hoverlabel will appear multiple points at the closest x- (or y-) coordinate within the `hoverdistance` with the caveat that no more than one hoverlabel will appear per trace. In this mode, spikelines are enabled by default perpendicular to the specified axis. If false, hover interactions are disabled.", @@ -16767,7 +16773,13 @@ "editType": "none", "valType": "string" }, - "role": "object" + "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, @@ -18966,7 +18978,13 @@ "editType": "none", "valType": "string" }, - "role": "object" + "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, @@ -20548,7 +20566,13 @@ "editType": "none", "valType": "string" }, - "role": "object" + "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 boxes or sample points or both?", @@ -22086,6 +22110,12 @@ "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" + }, "split": { "description": "Show hover information (open, close, high, low) in separate labels.", "dflt": false, @@ -25121,7 +25151,13 @@ "editType": "none", "valType": "string" }, - "role": "object" + "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, @@ -26402,7 +26438,13 @@ "editType": "none", "valType": "string" }, - "role": "object" + "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, @@ -27679,7 +27721,13 @@ "editType": "none", "valType": "string" }, - "role": "object" + "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, @@ -28989,7 +29037,13 @@ "editType": "none", "valType": "string" }, - "role": "object" + "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, @@ -30550,7 +30604,13 @@ "editType": "none", "valType": "string" }, - "role": "object" + "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" + } }, "hoverongaps": { "description": "Determines whether or not gaps (i.e. {nan} or missing values) in the `z` data have hover labels associated with them.", @@ -33373,7 +33433,13 @@ "editType": "none", "valType": "string" }, - "role": "object" + "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, @@ -34588,7 +34654,13 @@ "editType": "none", "valType": "string" }, - "role": "object" + "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, @@ -35253,7 +35325,13 @@ "editType": "none", "valType": "string" }, - "role": "object" + "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, @@ -37281,7 +37359,13 @@ "editType": "none", "valType": "string" }, - "role": "object" + "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, @@ -39112,7 +39196,13 @@ "editType": "none", "valType": "string" }, - "role": "object" + "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" + } }, "hoverongaps": { "description": "Determines whether or not gaps (i.e. {nan} or missing values) in the `z` data have hover labels associated with them.", @@ -40273,7 +40363,13 @@ "editType": "none", "valType": "string" }, - "role": "object" + "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, @@ -42914,7 +43010,13 @@ "editType": "none", "valType": "string" }, - "role": "object" + "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, @@ -44604,7 +44706,13 @@ "editType": "none", "valType": "string" }, - "role": "object" + "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, @@ -45530,7 +45638,13 @@ "editType": "none", "valType": "string" }, - "role": "object" + "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, @@ -47616,7 +47730,13 @@ "editType": "none", "valType": "string" }, - "role": "object" + "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, @@ -50142,7 +50262,13 @@ "editType": "none", "valType": "string" }, - "role": "object" + "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, @@ -51683,7 +51809,13 @@ "editType": "none", "valType": "string" }, - "role": "object" + "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, @@ -52511,6 +52643,12 @@ "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" + }, "split": { "description": "Show hover information (open, close, high, low) in separate labels.", "dflt": false, @@ -55966,7 +56104,13 @@ "editType": "none", "valType": "string" }, - "role": "object" + "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, @@ -57396,7 +57540,13 @@ "editType": "none", "valType": "string" }, - "role": "object" + "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.", @@ -57830,7 +57980,13 @@ "editType": "none", "valType": "string" }, - "role": "object" + "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" + } }, "hovertemplate": { "arrayOk": true, @@ -58195,7 +58351,13 @@ "editType": "none", "valType": "string" }, - "role": "object" + "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" + } }, "hovertemplate": { "arrayOk": true, @@ -59070,7 +59232,13 @@ "editType": "none", "valType": "string" }, - "role": "object" + "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*.", @@ -61808,7 +61976,13 @@ "editType": "none", "valType": "string" }, - "role": "object" + "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, @@ -64252,7 +64426,13 @@ "editType": "none", "valType": "string" }, - "role": "object" + "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*.", @@ -66536,7 +66716,13 @@ "editType": "none", "valType": "string" }, - "role": "object" + "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, @@ -68978,7 +69164,13 @@ "editType": "none", "valType": "string" }, - "role": "object" + "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, @@ -71301,7 +71493,13 @@ "editType": "none", "valType": "string" }, - "role": "object" + "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, @@ -72838,7 +73036,13 @@ "editType": "none", "valType": "string" }, - "role": "object" + "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, @@ -74320,7 +74524,13 @@ "editType": "none", "valType": "string" }, - "role": "object" + "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*.", @@ -76630,7 +76840,13 @@ "editType": "none", "valType": "string" }, - "role": "object" + "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, @@ -78774,7 +78990,13 @@ "editType": "none", "valType": "string" }, - "role": "object" + "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*.", @@ -81083,7 +81305,13 @@ "editType": "none", "valType": "string" }, - "role": "object" + "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*.", @@ -83393,7 +83621,13 @@ "editType": "none", "valType": "string" }, - "role": "object" + "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, @@ -85989,7 +86223,13 @@ "editType": "none", "valType": "string" }, - "role": "object" + "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, @@ -86800,7 +87040,13 @@ "editType": "none", "valType": "string" }, - "role": "object" + "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, @@ -89599,7 +89845,13 @@ "editType": "none", "valType": "string" }, - "role": "object" + "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, @@ -90914,7 +91166,13 @@ "editType": "none", "valType": "string" }, - "role": "object" + "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" + } }, "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.", @@ -91430,7 +91688,13 @@ "editType": "none", "valType": "string" }, - "role": "object" + "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, @@ -93591,7 +93855,13 @@ "editType": "none", "valType": "string" }, - "role": "object" + "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 violins or sample points or the kernel density estimate or any combination of them?", @@ -95705,7 +95975,13 @@ "editType": "none", "valType": "string" }, - "role": "object" + "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, @@ -96656,7 +96932,13 @@ "editType": "none", "valType": "string" }, - "role": "object" + "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,