Skip to content

Commit

Permalink
Merge pull request #2247 from apalchys/crossline
Browse files Browse the repository at this point in the history
Add spikelines
  • Loading branch information
etpinard authored Jan 17, 2018
2 parents d20d344 + f56413a commit e341edd
Show file tree
Hide file tree
Showing 11 changed files with 788 additions and 131 deletions.
357 changes: 271 additions & 86 deletions src/components/fx/hover.js

Large diffs are not rendered by default.

23 changes: 22 additions & 1 deletion src/components/fx/layout_attributes.js
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,28 @@ module.exports = {
editType: 'modebar',
description: 'Determines the mode of hover interactions.'
},

hoverdistance: {
valType: 'integer',
min: -1,
dflt: 20,
role: 'info',
editType: 'none',
description: [
'Sets the default distance (in pixels) to look for data',
'to add hover labels (-1 means no cutoff, 0 means no looking for data)'
].join(' ')
},
spikedistance: {
valType: 'integer',
min: -1,
dflt: 20,
role: 'info',
editType: 'none',
description: [
'Sets the default distance (in pixels) to look for data to draw',
'spikelines to (-1 means no cutoff, 0 means no looking for data).'
].join(' ')
},
hoverlabel: {
bgcolor: {
valType: 'color',
Expand Down
6 changes: 5 additions & 1 deletion src/components/fx/layout_defaults.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,11 @@ module.exports = function supplyLayoutDefaults(layoutIn, layoutOut, fullData) {
}
else hovermodeDflt = 'closest';

coerce('hovermode', hovermodeDflt);
var hoverMode = coerce('hovermode', hovermodeDflt);
if(hoverMode) {
coerce('hoverdistance');
coerce('spikedistance');
}

// if only mapbox or geo subplots is present on graph,
// reset 'zoom' dragmode to 'pan' until 'zoom' is implemented,
Expand Down
23 changes: 9 additions & 14 deletions src/components/modebar/buttons.js
Original file line number Diff line number Diff line change
Expand Up @@ -181,7 +181,7 @@ function handleCartesian(gd, ev) {
var fullLayout = gd._fullLayout;
var aobj = {};
var axList = axisIds.list(gd, null, true);
var allEnabled = 'on';
var allSpikesEnabled = 'on';

var ax, i;

Expand Down Expand Up @@ -209,8 +209,8 @@ function handleCartesian(gd, ev) {
}
if(ax._showSpikeInitial !== undefined) {
aobj[axName + '.showspikes'] = ax._showSpikeInitial;
if(allEnabled === 'on' && !ax._showSpikeInitial) {
allEnabled = 'off';
if(allSpikesEnabled === 'on' && !ax._showSpikeInitial) {
allSpikesEnabled = 'off';
}
}
}
Expand All @@ -230,24 +230,21 @@ function handleCartesian(gd, ev) {
}
}
}
fullLayout._cartesianSpikesEnabled = allEnabled;
fullLayout._cartesianSpikesEnabled = allSpikesEnabled;
}
else {
// if ALL traces have orientation 'h', 'hovermode': 'x' otherwise: 'y'
if(astr === 'hovermode' && (val === 'x' || val === 'y')) {
val = fullLayout._isHoriz ? 'y' : 'x';
button.setAttribute('data-val', val);
if(val !== 'closest') {
fullLayout._cartesianSpikesEnabled = 'off';
}
} else if(astr === 'hovermode' && val === 'closest') {
for(i = 0; i < axList.length; i++) {
ax = axList[i];
if(allEnabled === 'on' && !ax.showspikes) {
allEnabled = 'off';
if(allSpikesEnabled === 'on' && !ax.showspikes) {
allSpikesEnabled = 'off';
}
}
fullLayout._cartesianSpikesEnabled = allEnabled;
fullLayout._cartesianSpikesEnabled = allSpikesEnabled;
}

aobj[astr] = val;
Expand Down Expand Up @@ -551,12 +548,10 @@ modeBarButtons.toggleSpikelines = {
click: function(gd) {
var fullLayout = gd._fullLayout;

fullLayout._cartesianSpikesEnabled = fullLayout.hovermode === 'closest' ?
(fullLayout._cartesianSpikesEnabled === 'on' ? 'off' : 'on') : 'on';
fullLayout._cartesianSpikesEnabled = fullLayout._cartesianSpikesEnabled === 'on' ? 'off' : 'on';

var aobj = setSpikelineVisibility(gd);

aobj.hovermode = 'closest';
Plotly.relayout(gd, aobj);
}
};
Expand All @@ -571,7 +566,7 @@ function setSpikelineVisibility(gd) {
for(var i = 0; i < axList.length; i++) {
ax = axList[i];
axName = ax._name;
aobj[axName + '.showspikes'] = fullLayout._cartesianSpikesEnabled === 'on' ? true : false;
aobj[axName + '.showspikes'] = fullLayout._cartesianSpikesEnabled === 'on' ? true : ax._showSpikeInitial;
}

return aobj;
Expand Down
10 changes: 5 additions & 5 deletions src/plots/cartesian/axes.js
Original file line number Diff line number Diff line change
Expand Up @@ -398,7 +398,7 @@ axes.saveRangeInitial = function(gd, overwrite) {
axes.saveShowSpikeInitial = function(gd, overwrite) {
var axList = axes.list(gd, '', true),
hasOneAxisChanged = false,
allEnabled = 'on';
allSpikesEnabled = 'on';

for(var i = 0; i < axList.length; i++) {
var ax = axList[i];
Expand All @@ -415,11 +415,11 @@ axes.saveShowSpikeInitial = function(gd, overwrite) {
hasOneAxisChanged = true;
}

if(allEnabled === 'on' && !ax.showspikes) {
allEnabled = 'off';
if(allSpikesEnabled === 'on' && !ax.showspikes) {
allSpikesEnabled = 'off';
}
}
gd._fullLayout._cartesianSpikesEnabled = allEnabled;
gd._fullLayout._cartesianSpikesEnabled = allSpikesEnabled;
return hasOneAxisChanged;
};

Expand Down Expand Up @@ -2168,7 +2168,7 @@ axes.doTicks = function(gd, axid, skipTitle) {
top: pos,
bottom: pos,
left: ax._offset,
rigth: ax._offset + ax._length,
right: ax._offset + ax._length,
width: ax._length,
height: 0
};
Expand Down
8 changes: 8 additions & 0 deletions src/plots/cartesian/layout_attributes.js
Original file line number Diff line number Diff line change
Expand Up @@ -387,6 +387,14 @@ module.exports = {
'plotted on'
].join(' ')
},
spikesnap: {
valType: 'enumerated',
values: ['data', 'cursor'],
dflt: 'data',
role: 'style',
editType: 'none',
description: 'Determines whether spikelines are stuck to the cursor or to the closest datapoints.'
},
tickfont: fontAttrs({
editType: 'ticks',
description: 'Sets the tick font.'
Expand Down
23 changes: 17 additions & 6 deletions src/plots/cartesian/layout_defaults.js
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,10 @@ module.exports = function supplyLayoutDefaults(layoutIn, layoutOut, fullData) {
return Lib.coerce(axLayoutIn, axLayoutOut, layoutAttributes, attr, dflt);
}

function coerce2(attr, dflt) {
return Lib.coerce2(axLayoutIn, axLayoutOut, layoutAttributes, attr, dflt);
}

function getCounterAxes(axLetter) {
return (axLetter === 'x') ? yIds : xIds;
}
Expand Down Expand Up @@ -139,12 +143,19 @@ module.exports = function supplyLayoutDefaults(layoutIn, layoutOut, fullData) {

handleAxisDefaults(axLayoutIn, axLayoutOut, coerce, defaultOptions, layoutOut);

var showSpikes = coerce('showspikes');
if(showSpikes) {
coerce('spikecolor');
coerce('spikethickness');
coerce('spikedash');
coerce('spikemode');
var spikecolor = coerce2('spikecolor'),
spikethickness = coerce2('spikethickness'),
spikedash = coerce2('spikedash'),
spikemode = coerce2('spikemode'),
spikesnap = coerce2('spikesnap'),
showSpikes = coerce('showspikes', !!spikecolor || !!spikethickness || !!spikedash || !!spikemode || !!spikesnap);

if(!showSpikes) {
delete axLayoutOut.spikecolor;
delete axLayoutOut.spikethickness;
delete axLayoutOut.spikedash;
delete axLayoutOut.spikemode;
delete axLayoutOut.spikesnap;
}

var positioningOptions = {
Expand Down
4 changes: 3 additions & 1 deletion src/traces/scatter/hover.js
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,9 @@ module.exports = function hoverPoints(pointData, xval, yval, hovermode) {

y0: yc - rad,
y1: yc + rad,
yLabelVal: di.y
yLabelVal: di.y,

kink: Math.max(minRad, di.mrc || 0)
});

fillHoverText(di, trace, pointData);
Expand Down
Loading

0 comments on commit e341edd

Please sign in to comment.