-
-
Notifications
You must be signed in to change notification settings - Fork 1.9k
add 'width' to box and violin trace #3109
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 27 commits
8f04d13
f76ca97
81cdbe9
5ef2eeb
1c6b26b
2d93a0e
1f9ced8
26f44c4
77b9c9d
243a369
eb5e9da
eea273b
408aacb
0555283
4eb8b44
44e0a88
f8b963b
54aa355
0d4239b
fa3a314
c63780f
c24330d
6e7883d
37786d6
45ae47d
8366c88
ce81377
8885b5e
57cc05a
fe3d7ed
44fa269
f5ba38c
34722d3
d1aed48
c70f7d5
0dea0e9
5e5f9ee
d04c60c
91497e5
657848f
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -13,6 +13,11 @@ var Lib = require('../../lib'); | |
|
||
var orientations = ['v', 'h']; | ||
|
||
|
||
function getPosition(di) { | ||
return di.pos; | ||
} | ||
|
||
function crossTraceCalc(gd, plotinfo) { | ||
var calcdata = gd.calcdata; | ||
var xa = plotinfo.xaxis; | ||
|
@@ -90,19 +95,46 @@ function setPositionOffset(traceType, gd, boxList, posAxis, pad) { | |
var groupgap = fullLayout[traceType + 'groupgap']; | ||
var padfactor = (1 - gap) * (1 - groupgap) * dPos / fullLayout[numKey]; | ||
|
||
// autoscale the x axis - including space for points if they're off the side | ||
// TODO: this will overdo it if the outermost boxes don't have | ||
// their points as far out as the other boxes | ||
var extremes = Axes.findExtremes(posAxis, boxdv.vals, { | ||
vpadminus: dPos + pad[0] * padfactor, | ||
vpadplus: dPos + pad[1] * padfactor | ||
}); | ||
// Find maximum trace width | ||
// we baseline this at dPos | ||
var maxHalfWidth = dPos; | ||
for(i = 0; i < boxList.length; i++) { | ||
calcTrace = calcdata[boxList[i]]; | ||
|
||
if(calcTrace[0].trace.width) { | ||
if(calcTrace[0].trace.width / 2 > maxHalfWidth) { | ||
maxHalfWidth = calcTrace[0].trace.width / 2; | ||
} | ||
} | ||
} | ||
|
||
for(i = 0; i < boxList.length; i++) { | ||
calcTrace = calcdata[boxList[i]]; | ||
// set the width of all boxes | ||
calcTrace[0].t.dPos = dPos; | ||
// link extremes to all boxes | ||
// set the width of this box | ||
// override dPos with trace.width if present | ||
var thisDPos = calcTrace[0].t.dPos = (calcTrace[0].trace.width / 2) || dPos; | ||
var positions = calcTrace.map(getPosition); | ||
// autoscale the x axis - including space for points if they're off the side | ||
// TODO: this will overdo it if the outermost boxes don't have | ||
// their points as far out as the other boxes | ||
var vpadminus = 0; | ||
var vpadplus = 0; | ||
if(calcTrace[0].trace.side === 'positive') { | ||
vpadminus = 0; | ||
vpadplus = thisDPos + pad[1] * padfactor; | ||
} else if(calcTrace[0].trace.side === 'negative') { | ||
vpadminus = thisDPos + pad[0] * padfactor; | ||
vpadplus = 0; | ||
} else { | ||
// if side === 'both' | ||
vpadminus = thisDPos + pad[0] * padfactor; | ||
vpadplus = thisDPos + pad[1] * padfactor; | ||
} | ||
alexcjohnson marked this conversation as resolved.
Show resolved
Hide resolved
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🌴 var side = calcTrace[0].trace.side;
var vpadminus = (side === 'positive') ? 0 : (thisDPos + pad[0] * padfactor);
var vpadplus = (side === 'negative') ? 0 : (thisDPos + pad[1] * padfactor); There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'm a bit worried actually that this will exacerbate the issue in the TODO above. For example what if you have a single-sided violin but the points get drawn on the other side? It looks to me like this algorithm will cut them off entirely. @etpinard thoughts? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. What does 🌴 mean? Don't repeat yourself? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
I noticed another bug - if we choose to show the box, it gets cut in half if we choose DATA: var data = [{
type: 'violin',
x: [0, 5, 7, 8],
points: 'all',
side: 'positive',
box: {
visible: true
},
boxpoints: true,
line: {
color: 'black'
},
fillcolor: '#8dd3c7',
opacity: 0.6,
meanline: {
visible: true
},
y0: 0.0
}]; I think we are going to have to correlate the currently The fact that the image tests passed tells me an example like ^ is not in mocks. I think we should add a single sided violin baseline. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
yeah sorry, DRY - I guess that's just a plotly.js convention.
That's intentional, eg for two back-to-back violins. https://github.com/plotly/plotly.js/blob/master/test/image/baselines/violin_side-by-side.png |
||
|
||
var extremes = Axes.findExtremes(posAxis, positions, { | ||
vpadminus: vpadminus, | ||
vpadplus: vpadplus | ||
}); | ||
calcTrace[0].trace._extremes[posAxis._id] = extremes; | ||
} | ||
|
||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -26,9 +26,15 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout | |
if(traceOut.visible === false) return; | ||
|
||
coerce('bandwidth'); | ||
coerce('scalegroup', traceOut.name); | ||
coerce('scalemode'); | ||
coerce('side'); | ||
var width = coerce('width'); | ||
if(!width) { | ||
coerce('scalegroup', traceOut.name); | ||
coerce('scalemode'); | ||
} else { | ||
traceOut.scalegroup = ''; | ||
traceOut.scalemode = 'width'; | ||
} | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Does anything break if we 🔪 the There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. yes, the violins are not drawn properly: the outlines are filled with black ink |
||
|
||
var span = coerce('span'); | ||
var spanmodeDflt; | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,64 @@ | ||
{ | ||
"data": [{ | ||
"type": "violin", | ||
"width": 0.315, | ||
"x": [0, 5, 7, 8], | ||
"points": "none", | ||
"side": "positive", | ||
"box": { | ||
"visible": false | ||
}, | ||
"boxpoints": false, | ||
"line": { | ||
"color": "black" | ||
}, | ||
"fillcolor": "#8dd3c7", | ||
"opacity": 0.6, | ||
"meanline": { | ||
"visible": false | ||
}, | ||
"y0": 0.0 | ||
}, { | ||
"type": "violin", | ||
"x": [0, 5, 7, 8], | ||
"points": "none", | ||
"side": "positive", | ||
"box": { | ||
"visible": false | ||
}, | ||
"boxpoints": false, | ||
"line": { | ||
"color": "black" | ||
}, | ||
"fillcolor": "#d3c78d", | ||
"opacity": 0.6, | ||
"meanline": { | ||
"visible": false | ||
}, | ||
"y0": 0.1 | ||
}, { | ||
"type": "box", | ||
"width": 0.5421, | ||
"x": [0, 5, 7, 8], | ||
"points": "none", | ||
"side": "positive", | ||
"box": { | ||
"visible": false | ||
}, | ||
"boxpoints": false, | ||
"line": { | ||
"color": "black" | ||
}, | ||
"fillcolor": "#c78dd3", | ||
"opacity": 0.6, | ||
"meanline": { | ||
"visible": false | ||
}, | ||
"y0": 0.2 | ||
}], | ||
"layout": { | ||
"title": "Joyplot - Violin with multiple widths", | ||
"xaxis": {"zeroline": false}, | ||
"violingap": 0 | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -523,6 +523,7 @@ describe('Test violin hover:', function() { | |
Plotly.plot(gd, fig).then(function() { | ||
mouseEvent('mousemove', 250, 250); | ||
assertViolinHoverLine([299.35, 250, 200.65, 250]); | ||
// assertViolinHoverLine([178.67823028564453, 250, 80, 250]); | ||
alexcjohnson marked this conversation as resolved.
Show resolved
Hide resolved
|
||
}) | ||
.catch(failTest) | ||
.then(done); | ||
|
@@ -533,7 +534,7 @@ describe('Test violin hover:', function() { | |
|
||
Plotly.plot(gd, fig).then(function() { | ||
mouseEvent('mousemove', 300, 250); | ||
assertViolinHoverLine([299.35, 250, 250, 250]); | ||
assertViolinHoverLine([178.67823028564453, 250, 80, 250]); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @Kully do you know why this test had to be modified? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I wasn't too sure to be honest. I ran the test a few times but there were only two values the assert was saying was valid, iirc. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Presumably it changed because autorange can shrink depending on |
||
}) | ||
.catch(failTest) | ||
.then(done); | ||
|
@@ -544,7 +545,7 @@ describe('Test violin hover:', function() { | |
|
||
Plotly.plot(gd, fig).then(function() { | ||
mouseEvent('mousemove', 200, 250); | ||
assertViolinHoverLine([200.65, 250, 250, 250]); | ||
assertViolinHoverLine([321.3217315673828, 250, 420, 250]); | ||
}) | ||
.catch(failTest) | ||
.then(done); | ||
|
Uh oh!
There was an error while loading. Please reload this page.