Skip to content

Clean up automargin pipeline a bit - #3323

Merged
alexcjohnson merged 7 commits into
multicategoryfrom
clean-defaults-mc
Dec 11, 2018
Merged

Clean up automargin pipeline a bit#3323
alexcjohnson merged 7 commits into
multicategoryfrom
clean-defaults-mc

Conversation

@alexcjohnson

Copy link
Copy Markdown
Collaborator

@etpinard I based this branch off multicategory (including commits from this morning) because we were both working in axis drawing code.

The main goal was to get plots.doAutoMargin out of supplyDefaults - because that can lead to a full redraw of the plot if margins have changed, which is completely inappropriate for supplyDefaults - somehow it never caused explicit problems before, but with big enough changes in Plotly.react, ie #3255, it does.

It turned out the biggest challenge with this was rangesliders. The main thing I did to fix this was to combine rangeslider and axis automargins to happen together - note though that in principle both can contribute independently to the margins, if you have a rangeslider (on the bottom) and a top axis with long labels (oh right, I meant to add a test for that case - I'll add that)

One baseline image, range_slider_rangemode, changed in this PR b2a4b76 - just a little bit, but I believe it was in fact wrong before, as you can see by interacting with this mock on master: start dragging the range and the box expands vertically a little bit, to match what's in the new baseline. On this branch there's no such jump. Not quite sure what in this PR fixed it 😅 but it's fixed.
range_slider_rangemode

@alexcjohnsonalexcjohnson added the bug something broken label Dec 11, 2018
Comment threadtest/jasmine/tests/splom_test.js
Comment threadsrc/plots/cartesian/axes.js
// Figure out which subplot to draw ticks, labels, & axis lines on
// do this as a separate loop so we already have all the
// _mainAxis and _anchorAxis links set
ax._mainSubplot = findMainSubplot(ax, fullLayout);

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

moved this into plots.linkSubplots, which is both a more obvious place for it and happens earlier (in supplyDefaults) so _mainSubplot is available sooner.

Comment threadsrc/plots/plots.js
}
};

function findMainSubplot(ax, fullLayout) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is moving findMainSubplot from lsInner to supplyDefaults necessary? I suspect this will make supplyDefaults for large splom traces significantly slower.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Something or other failed with it in lsInner, though I don't recall what. I'll take a look at 🐎 for large sploms, I'm sure there's a shortcut we can take there.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm sure there's a shortcut we can take there.

Yeah, I would be nice to leave findMainSubplot in supplyDefaults and add a fullLayout._hasOnlyLargeSploms condition to bypass the loop-over-subplot-for-all-axes loops.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Large sploms usually avoid the subplot loop there - the first try based on _anchorAxis works unless the labels are unanchored - upper half with lower labels, or both halves with no diagonal.

Anyway I added an extra collection of counteraxes and subplots per axis in f55e769, which means we don't have to search the full subplot list anymore here (and in fact Axes.getSubplots is completely unused within plotly.js, but we still have it in streambed ATM). So even when splom does go through this loop, it now only takes 0.3ms at 20 dimensions - ~2ms at 50 dimensions if it's O(n^2).

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

works unless the labels are unanchored - upper half with lower labels, or both halves with no diagonal.

Ha right, I remember making that happen 3 or 4 splom-perf PRs ago.

So even when splom does go through this loop, it now only takes 0.3ms at 20 dimensions - ~2ms at 50 dimensions if it's O(n^2).

Beautiful 🐎

@etpinard

Copy link
Copy Markdown
Contributor

The main goal was to get plots.doAutoMargin out of supplyDefaults - because that can lead to a full redraw of the plot if margins have changed, which is completely inappropriate for supplyDefaults

This is fantastic 🎉

but I believe it was in fact wrong before, as you can see by interacting with this mock on master: start dragging the range and the box expands vertically a little bit, to match what's in the new baseline.

Yeah, I agree. The current baseline appears wrong. 👌

Comment threadtest/jasmine/tests/heatmap_test.js Outdated
Comment threadsrc/plots/cartesian/axes.js
@etpinardetpinard added this to the v1.43.0 milestone Dec 11, 2018
this means Axes.getSubplots and Axes.findSubplotsWithAxis are
essentially unused internally, but we have some outside callers
using getSubplots
@alexcjohnson

Copy link
Copy Markdown
CollaboratorAuthor

note though that in principle both can contribute independently to the margins, if you have a rangeslider (on the bottom) and a top axis with long labels (oh right, I meant to add a test for that case - I'll add that)

Working on this has uncovered some more bugs - will address those in a separate bugfix PR.

@etpinard

Copy link
Copy Markdown
Contributor

💃 let's get this in #3300

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bugsomething broken

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@alexcjohnson@etpinard
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Clean up automargin pipeline a bit by alexcjohnson · Pull Request #3323 · plotly/plotly.js · GitHub
Skip to content

Clean up automargin pipeline a bit - #3323

Merged
alexcjohnson merged 7 commits into
multicategoryfrom
clean-defaults-mc
Dec 11, 2018
Merged

Clean up automargin pipeline a bit#3323
alexcjohnson merged 7 commits into
multicategoryfrom
clean-defaults-mc

Conversation

@alexcjohnson

Copy link
Copy Markdown
Collaborator

@etpinard I based this branch off multicategory (including commits from this morning) because we were both working in axis drawing code.

The main goal was to get plots.doAutoMargin out of supplyDefaults - because that can lead to a full redraw of the plot if margins have changed, which is completely inappropriate for supplyDefaults - somehow it never caused explicit problems before, but with big enough changes in Plotly.react, ie #3255, it does.

It turned out the biggest challenge with this was rangesliders. The main thing I did to fix this was to combine rangeslider and axis automargins to happen together - note though that in principle both can contribute independently to the margins, if you have a rangeslider (on the bottom) and a top axis with long labels (oh right, I meant to add a test for that case - I'll add that)

One baseline image, range_slider_rangemode, changed in this PR b2a4b76 - just a little bit, but I believe it was in fact wrong before, as you can see by interacting with this mock on master: start dragging the range and the box expands vertically a little bit, to match what's in the new baseline. On this branch there's no such jump. Not quite sure what in this PR fixed it 😅 but it's fixed.
range_slider_rangemode

@alexcjohnsonalexcjohnson added the bug something broken label Dec 11, 2018
Comment threadtest/jasmine/tests/splom_test.js
Comment threadsrc/plots/cartesian/axes.js
// Figure out which subplot to draw ticks, labels, & axis lines on
// do this as a separate loop so we already have all the
// _mainAxis and _anchorAxis links set
ax._mainSubplot = findMainSubplot(ax, fullLayout);

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

moved this into plots.linkSubplots, which is both a more obvious place for it and happens earlier (in supplyDefaults) so _mainSubplot is available sooner.

Comment threadsrc/plots/plots.js
}
};

function findMainSubplot(ax, fullLayout) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is moving findMainSubplot from lsInner to supplyDefaults necessary? I suspect this will make supplyDefaults for large splom traces significantly slower.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Something or other failed with it in lsInner, though I don't recall what. I'll take a look at 🐎 for large sploms, I'm sure there's a shortcut we can take there.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm sure there's a shortcut we can take there.

Yeah, I would be nice to leave findMainSubplot in supplyDefaults and add a fullLayout._hasOnlyLargeSploms condition to bypass the loop-over-subplot-for-all-axes loops.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Large sploms usually avoid the subplot loop there - the first try based on _anchorAxis works unless the labels are unanchored - upper half with lower labels, or both halves with no diagonal.

Anyway I added an extra collection of counteraxes and subplots per axis in f55e769, which means we don't have to search the full subplot list anymore here (and in fact Axes.getSubplots is completely unused within plotly.js, but we still have it in streambed ATM). So even when splom does go through this loop, it now only takes 0.3ms at 20 dimensions - ~2ms at 50 dimensions if it's O(n^2).

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

works unless the labels are unanchored - upper half with lower labels, or both halves with no diagonal.

Ha right, I remember making that happen 3 or 4 splom-perf PRs ago.

So even when splom does go through this loop, it now only takes 0.3ms at 20 dimensions - ~2ms at 50 dimensions if it's O(n^2).

Beautiful 🐎

@etpinard

Copy link
Copy Markdown
Contributor

The main goal was to get plots.doAutoMargin out of supplyDefaults - because that can lead to a full redraw of the plot if margins have changed, which is completely inappropriate for supplyDefaults

This is fantastic 🎉

but I believe it was in fact wrong before, as you can see by interacting with this mock on master: start dragging the range and the box expands vertically a little bit, to match what's in the new baseline.

Yeah, I agree. The current baseline appears wrong. 👌

Comment threadtest/jasmine/tests/heatmap_test.js Outdated
Comment threadsrc/plots/cartesian/axes.js
@etpinardetpinard added this to the v1.43.0 milestone Dec 11, 2018
this means Axes.getSubplots and Axes.findSubplotsWithAxis are
essentially unused internally, but we have some outside callers
using getSubplots
@alexcjohnson

Copy link
Copy Markdown
CollaboratorAuthor

note though that in principle both can contribute independently to the margins, if you have a rangeslider (on the bottom) and a top axis with long labels (oh right, I meant to add a test for that case - I'll add that)

Working on this has uncovered some more bugs - will address those in a separate bugfix PR.

@etpinard

Copy link
Copy Markdown
Contributor

💃 let's get this in #3300

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bugsomething broken

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@alexcjohnson@etpinard
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Clean up automargin pipeline a bit by alexcjohnson · Pull Request #3323 · plotly/plotly.js · GitHub
Skip to content

Clean up automargin pipeline a bit - #3323

Merged
alexcjohnson merged 7 commits into
multicategoryfrom
clean-defaults-mc
Dec 11, 2018
Merged

Clean up automargin pipeline a bit#3323
alexcjohnson merged 7 commits into
multicategoryfrom
clean-defaults-mc

Conversation

@alexcjohnson

Copy link
Copy Markdown
Collaborator

@etpinard I based this branch off multicategory (including commits from this morning) because we were both working in axis drawing code.

The main goal was to get plots.doAutoMargin out of supplyDefaults - because that can lead to a full redraw of the plot if margins have changed, which is completely inappropriate for supplyDefaults - somehow it never caused explicit problems before, but with big enough changes in Plotly.react, ie #3255, it does.

It turned out the biggest challenge with this was rangesliders. The main thing I did to fix this was to combine rangeslider and axis automargins to happen together - note though that in principle both can contribute independently to the margins, if you have a rangeslider (on the bottom) and a top axis with long labels (oh right, I meant to add a test for that case - I'll add that)

One baseline image, range_slider_rangemode, changed in this PR b2a4b76 - just a little bit, but I believe it was in fact wrong before, as you can see by interacting with this mock on master: start dragging the range and the box expands vertically a little bit, to match what's in the new baseline. On this branch there's no such jump. Not quite sure what in this PR fixed it 😅 but it's fixed.
range_slider_rangemode

@alexcjohnsonalexcjohnson added the bug something broken label Dec 11, 2018
Comment threadtest/jasmine/tests/splom_test.js
Comment threadsrc/plots/cartesian/axes.js
// Figure out which subplot to draw ticks, labels, & axis lines on
// do this as a separate loop so we already have all the
// _mainAxis and _anchorAxis links set
ax._mainSubplot = findMainSubplot(ax, fullLayout);

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

moved this into plots.linkSubplots, which is both a more obvious place for it and happens earlier (in supplyDefaults) so _mainSubplot is available sooner.

Comment threadsrc/plots/plots.js
}
};

function findMainSubplot(ax, fullLayout) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is moving findMainSubplot from lsInner to supplyDefaults necessary? I suspect this will make supplyDefaults for large splom traces significantly slower.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Something or other failed with it in lsInner, though I don't recall what. I'll take a look at 🐎 for large sploms, I'm sure there's a shortcut we can take there.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm sure there's a shortcut we can take there.

Yeah, I would be nice to leave findMainSubplot in supplyDefaults and add a fullLayout._hasOnlyLargeSploms condition to bypass the loop-over-subplot-for-all-axes loops.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Large sploms usually avoid the subplot loop there - the first try based on _anchorAxis works unless the labels are unanchored - upper half with lower labels, or both halves with no diagonal.

Anyway I added an extra collection of counteraxes and subplots per axis in f55e769, which means we don't have to search the full subplot list anymore here (and in fact Axes.getSubplots is completely unused within plotly.js, but we still have it in streambed ATM). So even when splom does go through this loop, it now only takes 0.3ms at 20 dimensions - ~2ms at 50 dimensions if it's O(n^2).

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

works unless the labels are unanchored - upper half with lower labels, or both halves with no diagonal.

Ha right, I remember making that happen 3 or 4 splom-perf PRs ago.

So even when splom does go through this loop, it now only takes 0.3ms at 20 dimensions - ~2ms at 50 dimensions if it's O(n^2).

Beautiful 🐎

@etpinard

Copy link
Copy Markdown
Contributor

The main goal was to get plots.doAutoMargin out of supplyDefaults - because that can lead to a full redraw of the plot if margins have changed, which is completely inappropriate for supplyDefaults

This is fantastic 🎉

but I believe it was in fact wrong before, as you can see by interacting with this mock on master: start dragging the range and the box expands vertically a little bit, to match what's in the new baseline.

Yeah, I agree. The current baseline appears wrong. 👌

Comment threadtest/jasmine/tests/heatmap_test.js Outdated
Comment threadsrc/plots/cartesian/axes.js
@etpinardetpinard added this to the v1.43.0 milestone Dec 11, 2018
this means Axes.getSubplots and Axes.findSubplotsWithAxis are
essentially unused internally, but we have some outside callers
using getSubplots
@alexcjohnson

Copy link
Copy Markdown
CollaboratorAuthor

note though that in principle both can contribute independently to the margins, if you have a rangeslider (on the bottom) and a top axis with long labels (oh right, I meant to add a test for that case - I'll add that)

Working on this has uncovered some more bugs - will address those in a separate bugfix PR.

@etpinard

Copy link
Copy Markdown
Contributor

💃 let's get this in #3300

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bugsomething broken

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@alexcjohnson@etpinard
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Clean up automargin pipeline a bit by alexcjohnson · Pull Request #3323 · plotly/plotly.js · GitHub
Skip to content

Clean up automargin pipeline a bit - #3323

Merged
alexcjohnson merged 7 commits into
multicategoryfrom
clean-defaults-mc
Dec 11, 2018
Merged

Clean up automargin pipeline a bit#3323
alexcjohnson merged 7 commits into
multicategoryfrom
clean-defaults-mc

Conversation

@alexcjohnson

Copy link
Copy Markdown
Collaborator

@etpinard I based this branch off multicategory (including commits from this morning) because we were both working in axis drawing code.

The main goal was to get plots.doAutoMargin out of supplyDefaults - because that can lead to a full redraw of the plot if margins have changed, which is completely inappropriate for supplyDefaults - somehow it never caused explicit problems before, but with big enough changes in Plotly.react, ie #3255, it does.

It turned out the biggest challenge with this was rangesliders. The main thing I did to fix this was to combine rangeslider and axis automargins to happen together - note though that in principle both can contribute independently to the margins, if you have a rangeslider (on the bottom) and a top axis with long labels (oh right, I meant to add a test for that case - I'll add that)

One baseline image, range_slider_rangemode, changed in this PR b2a4b76 - just a little bit, but I believe it was in fact wrong before, as you can see by interacting with this mock on master: start dragging the range and the box expands vertically a little bit, to match what's in the new baseline. On this branch there's no such jump. Not quite sure what in this PR fixed it 😅 but it's fixed.
range_slider_rangemode

@alexcjohnsonalexcjohnson added the bug something broken label Dec 11, 2018
Comment threadtest/jasmine/tests/splom_test.js
Comment threadsrc/plots/cartesian/axes.js
// Figure out which subplot to draw ticks, labels, & axis lines on
// do this as a separate loop so we already have all the
// _mainAxis and _anchorAxis links set
ax._mainSubplot = findMainSubplot(ax, fullLayout);

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

moved this into plots.linkSubplots, which is both a more obvious place for it and happens earlier (in supplyDefaults) so _mainSubplot is available sooner.

Comment threadsrc/plots/plots.js
}
};

function findMainSubplot(ax, fullLayout) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is moving findMainSubplot from lsInner to supplyDefaults necessary? I suspect this will make supplyDefaults for large splom traces significantly slower.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Something or other failed with it in lsInner, though I don't recall what. I'll take a look at 🐎 for large sploms, I'm sure there's a shortcut we can take there.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm sure there's a shortcut we can take there.

Yeah, I would be nice to leave findMainSubplot in supplyDefaults and add a fullLayout._hasOnlyLargeSploms condition to bypass the loop-over-subplot-for-all-axes loops.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Large sploms usually avoid the subplot loop there - the first try based on _anchorAxis works unless the labels are unanchored - upper half with lower labels, or both halves with no diagonal.

Anyway I added an extra collection of counteraxes and subplots per axis in f55e769, which means we don't have to search the full subplot list anymore here (and in fact Axes.getSubplots is completely unused within plotly.js, but we still have it in streambed ATM). So even when splom does go through this loop, it now only takes 0.3ms at 20 dimensions - ~2ms at 50 dimensions if it's O(n^2).

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

works unless the labels are unanchored - upper half with lower labels, or both halves with no diagonal.

Ha right, I remember making that happen 3 or 4 splom-perf PRs ago.

So even when splom does go through this loop, it now only takes 0.3ms at 20 dimensions - ~2ms at 50 dimensions if it's O(n^2).

Beautiful 🐎

@etpinard

Copy link
Copy Markdown
Contributor

The main goal was to get plots.doAutoMargin out of supplyDefaults - because that can lead to a full redraw of the plot if margins have changed, which is completely inappropriate for supplyDefaults

This is fantastic 🎉

but I believe it was in fact wrong before, as you can see by interacting with this mock on master: start dragging the range and the box expands vertically a little bit, to match what's in the new baseline.

Yeah, I agree. The current baseline appears wrong. 👌

Comment threadtest/jasmine/tests/heatmap_test.js Outdated
Comment threadsrc/plots/cartesian/axes.js
@etpinardetpinard added this to the v1.43.0 milestone Dec 11, 2018
this means Axes.getSubplots and Axes.findSubplotsWithAxis are
essentially unused internally, but we have some outside callers
using getSubplots
@alexcjohnson

Copy link
Copy Markdown
CollaboratorAuthor

note though that in principle both can contribute independently to the margins, if you have a rangeslider (on the bottom) and a top axis with long labels (oh right, I meant to add a test for that case - I'll add that)

Working on this has uncovered some more bugs - will address those in a separate bugfix PR.

@etpinard

Copy link
Copy Markdown
Contributor

💃 let's get this in #3300

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bugsomething broken

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@alexcjohnson@etpinard
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' Clean up automargin pipeline a bit by alexcjohnson · Pull Request #3323 · plotly/plotly.js · GitHub
Skip to content

Clean up automargin pipeline a bit - #3323

Merged
alexcjohnson merged 7 commits into
multicategoryfrom
clean-defaults-mc
Dec 11, 2018
Merged

Clean up automargin pipeline a bit#3323
alexcjohnson merged 7 commits into
multicategoryfrom
clean-defaults-mc

Conversation

@alexcjohnson

Copy link
Copy Markdown
Collaborator

@etpinard I based this branch off multicategory (including commits from this morning) because we were both working in axis drawing code.

The main goal was to get plots.doAutoMargin out of supplyDefaults - because that can lead to a full redraw of the plot if margins have changed, which is completely inappropriate for supplyDefaults - somehow it never caused explicit problems before, but with big enough changes in Plotly.react, ie #3255, it does.

It turned out the biggest challenge with this was rangesliders. The main thing I did to fix this was to combine rangeslider and axis automargins to happen together - note though that in principle both can contribute independently to the margins, if you have a rangeslider (on the bottom) and a top axis with long labels (oh right, I meant to add a test for that case - I'll add that)

One baseline image, range_slider_rangemode, changed in this PR b2a4b76 - just a little bit, but I believe it was in fact wrong before, as you can see by interacting with this mock on master: start dragging the range and the box expands vertically a little bit, to match what's in the new baseline. On this branch there's no such jump. Not quite sure what in this PR fixed it 😅 but it's fixed.
range_slider_rangemode

@alexcjohnsonalexcjohnson added the bug something broken label Dec 11, 2018
Comment threadtest/jasmine/tests/splom_test.js
Comment threadsrc/plots/cartesian/axes.js
// Figure out which subplot to draw ticks, labels, & axis lines on
// do this as a separate loop so we already have all the
// _mainAxis and _anchorAxis links set
ax._mainSubplot = findMainSubplot(ax, fullLayout);

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

moved this into plots.linkSubplots, which is both a more obvious place for it and happens earlier (in supplyDefaults) so _mainSubplot is available sooner.

Comment threadsrc/plots/plots.js
}
};

function findMainSubplot(ax, fullLayout) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is moving findMainSubplot from lsInner to supplyDefaults necessary? I suspect this will make supplyDefaults for large splom traces significantly slower.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Something or other failed with it in lsInner, though I don't recall what. I'll take a look at 🐎 for large sploms, I'm sure there's a shortcut we can take there.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm sure there's a shortcut we can take there.

Yeah, I would be nice to leave findMainSubplot in supplyDefaults and add a fullLayout._hasOnlyLargeSploms condition to bypass the loop-over-subplot-for-all-axes loops.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Large sploms usually avoid the subplot loop there - the first try based on _anchorAxis works unless the labels are unanchored - upper half with lower labels, or both halves with no diagonal.

Anyway I added an extra collection of counteraxes and subplots per axis in f55e769, which means we don't have to search the full subplot list anymore here (and in fact Axes.getSubplots is completely unused within plotly.js, but we still have it in streambed ATM). So even when splom does go through this loop, it now only takes 0.3ms at 20 dimensions - ~2ms at 50 dimensions if it's O(n^2).

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

works unless the labels are unanchored - upper half with lower labels, or both halves with no diagonal.

Ha right, I remember making that happen 3 or 4 splom-perf PRs ago.

So even when splom does go through this loop, it now only takes 0.3ms at 20 dimensions - ~2ms at 50 dimensions if it's O(n^2).

Beautiful 🐎

@etpinard

Copy link
Copy Markdown
Contributor

The main goal was to get plots.doAutoMargin out of supplyDefaults - because that can lead to a full redraw of the plot if margins have changed, which is completely inappropriate for supplyDefaults

This is fantastic 🎉

but I believe it was in fact wrong before, as you can see by interacting with this mock on master: start dragging the range and the box expands vertically a little bit, to match what's in the new baseline.

Yeah, I agree. The current baseline appears wrong. 👌

Comment threadtest/jasmine/tests/heatmap_test.js Outdated
Comment threadsrc/plots/cartesian/axes.js
@etpinardetpinard added this to the v1.43.0 milestone Dec 11, 2018
this means Axes.getSubplots and Axes.findSubplotsWithAxis are
essentially unused internally, but we have some outside callers
using getSubplots
@alexcjohnson

Copy link
Copy Markdown
CollaboratorAuthor

note though that in principle both can contribute independently to the margins, if you have a rangeslider (on the bottom) and a top axis with long labels (oh right, I meant to add a test for that case - I'll add that)

Working on this has uncovered some more bugs - will address those in a separate bugfix PR.

@etpinard

Copy link
Copy Markdown
Contributor

💃 let's get this in #3300

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bugsomething broken

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@alexcjohnson@etpinard
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Clean up automargin pipeline a bit by alexcjohnson · Pull Request #3323 · plotly/plotly.js · GitHub
Skip to content

Clean up automargin pipeline a bit - #3323

Merged
alexcjohnson merged 7 commits into
multicategoryfrom
clean-defaults-mc
Dec 11, 2018
Merged

Clean up automargin pipeline a bit#3323
alexcjohnson merged 7 commits into
multicategoryfrom
clean-defaults-mc

Conversation

@alexcjohnson

Copy link
Copy Markdown
Collaborator

@etpinard I based this branch off multicategory (including commits from this morning) because we were both working in axis drawing code.

The main goal was to get plots.doAutoMargin out of supplyDefaults - because that can lead to a full redraw of the plot if margins have changed, which is completely inappropriate for supplyDefaults - somehow it never caused explicit problems before, but with big enough changes in Plotly.react, ie #3255, it does.

It turned out the biggest challenge with this was rangesliders. The main thing I did to fix this was to combine rangeslider and axis automargins to happen together - note though that in principle both can contribute independently to the margins, if you have a rangeslider (on the bottom) and a top axis with long labels (oh right, I meant to add a test for that case - I'll add that)

One baseline image, range_slider_rangemode, changed in this PR b2a4b76 - just a little bit, but I believe it was in fact wrong before, as you can see by interacting with this mock on master: start dragging the range and the box expands vertically a little bit, to match what's in the new baseline. On this branch there's no such jump. Not quite sure what in this PR fixed it 😅 but it's fixed.
range_slider_rangemode

@alexcjohnsonalexcjohnson added the bug something broken label Dec 11, 2018
Comment threadtest/jasmine/tests/splom_test.js
Comment threadsrc/plots/cartesian/axes.js
// Figure out which subplot to draw ticks, labels, & axis lines on
// do this as a separate loop so we already have all the
// _mainAxis and _anchorAxis links set
ax._mainSubplot = findMainSubplot(ax, fullLayout);

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

moved this into plots.linkSubplots, which is both a more obvious place for it and happens earlier (in supplyDefaults) so _mainSubplot is available sooner.

Comment threadsrc/plots/plots.js
}
};

function findMainSubplot(ax, fullLayout) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is moving findMainSubplot from lsInner to supplyDefaults necessary? I suspect this will make supplyDefaults for large splom traces significantly slower.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Something or other failed with it in lsInner, though I don't recall what. I'll take a look at 🐎 for large sploms, I'm sure there's a shortcut we can take there.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm sure there's a shortcut we can take there.

Yeah, I would be nice to leave findMainSubplot in supplyDefaults and add a fullLayout._hasOnlyLargeSploms condition to bypass the loop-over-subplot-for-all-axes loops.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Large sploms usually avoid the subplot loop there - the first try based on _anchorAxis works unless the labels are unanchored - upper half with lower labels, or both halves with no diagonal.

Anyway I added an extra collection of counteraxes and subplots per axis in f55e769, which means we don't have to search the full subplot list anymore here (and in fact Axes.getSubplots is completely unused within plotly.js, but we still have it in streambed ATM). So even when splom does go through this loop, it now only takes 0.3ms at 20 dimensions - ~2ms at 50 dimensions if it's O(n^2).

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

works unless the labels are unanchored - upper half with lower labels, or both halves with no diagonal.

Ha right, I remember making that happen 3 or 4 splom-perf PRs ago.

So even when splom does go through this loop, it now only takes 0.3ms at 20 dimensions - ~2ms at 50 dimensions if it's O(n^2).

Beautiful 🐎

@etpinard

Copy link
Copy Markdown
Contributor

The main goal was to get plots.doAutoMargin out of supplyDefaults - because that can lead to a full redraw of the plot if margins have changed, which is completely inappropriate for supplyDefaults

This is fantastic 🎉

but I believe it was in fact wrong before, as you can see by interacting with this mock on master: start dragging the range and the box expands vertically a little bit, to match what's in the new baseline.

Yeah, I agree. The current baseline appears wrong. 👌

Comment threadtest/jasmine/tests/heatmap_test.js Outdated
Comment threadsrc/plots/cartesian/axes.js
@etpinardetpinard added this to the v1.43.0 milestone Dec 11, 2018
this means Axes.getSubplots and Axes.findSubplotsWithAxis are
essentially unused internally, but we have some outside callers
using getSubplots
@alexcjohnson

Copy link
Copy Markdown
CollaboratorAuthor

note though that in principle both can contribute independently to the margins, if you have a rangeslider (on the bottom) and a top axis with long labels (oh right, I meant to add a test for that case - I'll add that)

Working on this has uncovered some more bugs - will address those in a separate bugfix PR.

@etpinard

Copy link
Copy Markdown
Contributor

💃 let's get this in #3300

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bugsomething broken

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@alexcjohnson@etpinard
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Clean up automargin pipeline a bit by alexcjohnson · Pull Request #3323 · plotly/plotly.js · GitHub
Skip to content

Clean up automargin pipeline a bit - #3323

Merged
alexcjohnson merged 7 commits into
multicategoryfrom
clean-defaults-mc
Dec 11, 2018
Merged

Clean up automargin pipeline a bit#3323
alexcjohnson merged 7 commits into
multicategoryfrom
clean-defaults-mc

Conversation

@alexcjohnson

Copy link
Copy Markdown
Collaborator

@etpinard I based this branch off multicategory (including commits from this morning) because we were both working in axis drawing code.

The main goal was to get plots.doAutoMargin out of supplyDefaults - because that can lead to a full redraw of the plot if margins have changed, which is completely inappropriate for supplyDefaults - somehow it never caused explicit problems before, but with big enough changes in Plotly.react, ie #3255, it does.

It turned out the biggest challenge with this was rangesliders. The main thing I did to fix this was to combine rangeslider and axis automargins to happen together - note though that in principle both can contribute independently to the margins, if you have a rangeslider (on the bottom) and a top axis with long labels (oh right, I meant to add a test for that case - I'll add that)

One baseline image, range_slider_rangemode, changed in this PR b2a4b76 - just a little bit, but I believe it was in fact wrong before, as you can see by interacting with this mock on master: start dragging the range and the box expands vertically a little bit, to match what's in the new baseline. On this branch there's no such jump. Not quite sure what in this PR fixed it 😅 but it's fixed.
range_slider_rangemode

@alexcjohnsonalexcjohnson added the bug something broken label Dec 11, 2018
Comment threadtest/jasmine/tests/splom_test.js
Comment threadsrc/plots/cartesian/axes.js
// Figure out which subplot to draw ticks, labels, & axis lines on
// do this as a separate loop so we already have all the
// _mainAxis and _anchorAxis links set
ax._mainSubplot = findMainSubplot(ax, fullLayout);

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

moved this into plots.linkSubplots, which is both a more obvious place for it and happens earlier (in supplyDefaults) so _mainSubplot is available sooner.

Comment threadsrc/plots/plots.js
}
};

function findMainSubplot(ax, fullLayout) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is moving findMainSubplot from lsInner to supplyDefaults necessary? I suspect this will make supplyDefaults for large splom traces significantly slower.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Something or other failed with it in lsInner, though I don't recall what. I'll take a look at 🐎 for large sploms, I'm sure there's a shortcut we can take there.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm sure there's a shortcut we can take there.

Yeah, I would be nice to leave findMainSubplot in supplyDefaults and add a fullLayout._hasOnlyLargeSploms condition to bypass the loop-over-subplot-for-all-axes loops.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Large sploms usually avoid the subplot loop there - the first try based on _anchorAxis works unless the labels are unanchored - upper half with lower labels, or both halves with no diagonal.

Anyway I added an extra collection of counteraxes and subplots per axis in f55e769, which means we don't have to search the full subplot list anymore here (and in fact Axes.getSubplots is completely unused within plotly.js, but we still have it in streambed ATM). So even when splom does go through this loop, it now only takes 0.3ms at 20 dimensions - ~2ms at 50 dimensions if it's O(n^2).

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

works unless the labels are unanchored - upper half with lower labels, or both halves with no diagonal.

Ha right, I remember making that happen 3 or 4 splom-perf PRs ago.

So even when splom does go through this loop, it now only takes 0.3ms at 20 dimensions - ~2ms at 50 dimensions if it's O(n^2).

Beautiful 🐎

@etpinard

Copy link
Copy Markdown
Contributor

The main goal was to get plots.doAutoMargin out of supplyDefaults - because that can lead to a full redraw of the plot if margins have changed, which is completely inappropriate for supplyDefaults

This is fantastic 🎉

but I believe it was in fact wrong before, as you can see by interacting with this mock on master: start dragging the range and the box expands vertically a little bit, to match what's in the new baseline.

Yeah, I agree. The current baseline appears wrong. 👌

Comment threadtest/jasmine/tests/heatmap_test.js Outdated
Comment threadsrc/plots/cartesian/axes.js
@etpinardetpinard added this to the v1.43.0 milestone Dec 11, 2018
this means Axes.getSubplots and Axes.findSubplotsWithAxis are
essentially unused internally, but we have some outside callers
using getSubplots
@alexcjohnson

Copy link
Copy Markdown
CollaboratorAuthor

note though that in principle both can contribute independently to the margins, if you have a rangeslider (on the bottom) and a top axis with long labels (oh right, I meant to add a test for that case - I'll add that)

Working on this has uncovered some more bugs - will address those in a separate bugfix PR.

@etpinard

Copy link
Copy Markdown
Contributor

💃 let's get this in #3300

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bugsomething broken

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@alexcjohnson@etpinard
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); Clean up automargin pipeline a bit by alexcjohnson · Pull Request #3323 · plotly/plotly.js · GitHub
Skip to content

Clean up automargin pipeline a bit - #3323

Merged
alexcjohnson merged 7 commits into
multicategoryfrom
clean-defaults-mc
Dec 11, 2018
Merged

Clean up automargin pipeline a bit#3323
alexcjohnson merged 7 commits into
multicategoryfrom
clean-defaults-mc

Conversation

@alexcjohnson

Copy link
Copy Markdown
Collaborator

@etpinard I based this branch off multicategory (including commits from this morning) because we were both working in axis drawing code.

The main goal was to get plots.doAutoMargin out of supplyDefaults - because that can lead to a full redraw of the plot if margins have changed, which is completely inappropriate for supplyDefaults - somehow it never caused explicit problems before, but with big enough changes in Plotly.react, ie #3255, it does.

It turned out the biggest challenge with this was rangesliders. The main thing I did to fix this was to combine rangeslider and axis automargins to happen together - note though that in principle both can contribute independently to the margins, if you have a rangeslider (on the bottom) and a top axis with long labels (oh right, I meant to add a test for that case - I'll add that)

One baseline image, range_slider_rangemode, changed in this PR b2a4b76 - just a little bit, but I believe it was in fact wrong before, as you can see by interacting with this mock on master: start dragging the range and the box expands vertically a little bit, to match what's in the new baseline. On this branch there's no such jump. Not quite sure what in this PR fixed it 😅 but it's fixed.
range_slider_rangemode

@alexcjohnsonalexcjohnson added the bug something broken label Dec 11, 2018
Comment threadtest/jasmine/tests/splom_test.js
Comment threadsrc/plots/cartesian/axes.js
// Figure out which subplot to draw ticks, labels, & axis lines on
// do this as a separate loop so we already have all the
// _mainAxis and _anchorAxis links set
ax._mainSubplot = findMainSubplot(ax, fullLayout);

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

moved this into plots.linkSubplots, which is both a more obvious place for it and happens earlier (in supplyDefaults) so _mainSubplot is available sooner.

Comment threadsrc/plots/plots.js
}
};

function findMainSubplot(ax, fullLayout) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is moving findMainSubplot from lsInner to supplyDefaults necessary? I suspect this will make supplyDefaults for large splom traces significantly slower.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Something or other failed with it in lsInner, though I don't recall what. I'll take a look at 🐎 for large sploms, I'm sure there's a shortcut we can take there.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm sure there's a shortcut we can take there.

Yeah, I would be nice to leave findMainSubplot in supplyDefaults and add a fullLayout._hasOnlyLargeSploms condition to bypass the loop-over-subplot-for-all-axes loops.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Large sploms usually avoid the subplot loop there - the first try based on _anchorAxis works unless the labels are unanchored - upper half with lower labels, or both halves with no diagonal.

Anyway I added an extra collection of counteraxes and subplots per axis in f55e769, which means we don't have to search the full subplot list anymore here (and in fact Axes.getSubplots is completely unused within plotly.js, but we still have it in streambed ATM). So even when splom does go through this loop, it now only takes 0.3ms at 20 dimensions - ~2ms at 50 dimensions if it's O(n^2).

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

works unless the labels are unanchored - upper half with lower labels, or both halves with no diagonal.

Ha right, I remember making that happen 3 or 4 splom-perf PRs ago.

So even when splom does go through this loop, it now only takes 0.3ms at 20 dimensions - ~2ms at 50 dimensions if it's O(n^2).

Beautiful 🐎

@etpinard

Copy link
Copy Markdown
Contributor

The main goal was to get plots.doAutoMargin out of supplyDefaults - because that can lead to a full redraw of the plot if margins have changed, which is completely inappropriate for supplyDefaults

This is fantastic 🎉

but I believe it was in fact wrong before, as you can see by interacting with this mock on master: start dragging the range and the box expands vertically a little bit, to match what's in the new baseline.

Yeah, I agree. The current baseline appears wrong. 👌

Comment threadtest/jasmine/tests/heatmap_test.js Outdated
Comment threadsrc/plots/cartesian/axes.js
@etpinardetpinard added this to the v1.43.0 milestone Dec 11, 2018
this means Axes.getSubplots and Axes.findSubplotsWithAxis are
essentially unused internally, but we have some outside callers
using getSubplots
@alexcjohnson

Copy link
Copy Markdown
CollaboratorAuthor

note though that in principle both can contribute independently to the margins, if you have a rangeslider (on the bottom) and a top axis with long labels (oh right, I meant to add a test for that case - I'll add that)

Working on this has uncovered some more bugs - will address those in a separate bugfix PR.

@etpinard

Copy link
Copy Markdown
Contributor

💃 let's get this in #3300

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bugsomething broken

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@alexcjohnson@etpinard