Skip to content

Multiple scattergeo improvement - #1004

Merged
etpinard merged 14 commits into
masterfrom
geo-line-picking
Oct 6, 2016
Merged

Multiple scattergeo improvement#1004
etpinard merged 14 commits into
masterfrom
geo-line-picking

Conversation

@etpinard

@etpinardetpinard commented Oct 4, 2016

Copy link
Copy Markdown
Contributor

fixes#963

and supersedes #964

In brief, this PR brings several ideas from scattermapbox over to scattergeo - while reusing some parts of logic (namely regarding GeoJSON) keeping things 🌴

In details, this PR:

  • fixesStrange behavior with missing values in scattergeo  #963 (thanks again @cpsievert for letting me know)
  • scattergeo traces with non-circle markers now get the correct legend item
  • make scattergeo use a proper calc step
  • make scattergeo use Fx.hover to pick (using calcdata) and draw its hover labels
    • this means that user no longer have to hover over scattergeo data points to trigger hover event / draw labels
    • this means that scattergeo mode: 'lines' now (I mean finally) has a hover handlers!
  • adds support for connecgaps to scattergeo
  • adds support for fill: 'toself' to scattergeo (similar to how scattermapbox implement fill)

🎉 Yay geo line hover text:

gifrecord_2016-10-03_180302

- which is consistent with mapbox subplot,
and comptabitible with Fx.hover
- which skips and cast lon/lat values
- fixes#963
- note that 'locations[i]' -> feature must still be
done at the plot (after the topojson is loaded)
- traces with no data points are given a place-holder calc trace
to retatin fullData.length === gd.calcdata.length,
and make some component (e.g. legend) logic easier
- tag these place-holder traces so that the plot modules
can easily skip over them
- so plotting that data-pt less traces do result in mapbox errors.
- add support for 'connectgaps'
- add support for 'fill: 'toself'
- remove all traces of hover / click handlers
- make Fx.hover pass subplot info to hoverPoints module
- add scattergeo hoverPoints and eventData modules
- mock xaxis and yaxis in geo instances
- factor out is-over-edge logic to use it in hoverPoints
- use 'mousemove' instead of 'mouseover' in test to trigger hover
- until we make choropleth use fullLayout._hoverlayer for
its hover labels.
- the first legend item is now correct!
@etpinardetpinard added bug something broken feature something new status: reviewable labels Oct 4, 2016
@etpinardetpinard added this to the v1.18.0 milestone Oct 4, 2016

@bpostlethwaitebpostlethwaite left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Looks ok to me but I didn't get right into the details for all these changes. If I didn't understand what the code was doing fairly quickly I made a comment about improving the naming or comments.

ya = pointData.ya,
geo = pointData.subplot;

if(cd[0].placeholder) return;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

this is a little mysterious, at least as someone who doesn't look at Plotly.js code daily. Maybe a comment here?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Here's the comment you're looking for: https://github.com/plotly/plotly.js/pull/1004/files#diff-ad4f76ccd6044ed16514297078e13b84R1672

Putting comment about something where it is set is probably more robust than putting it where it is used.

var lonlat = d.lonlat;

// this handles the not-found location feature case
if(lonlat[0] === null || lonlat[1] === null) return Infinity;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

why return Infinity and not say, null

@etpinardetpinardOct 5, 2016

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

because this function returns a distance.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I would have expected NaN I think.

var di = cd[pointData.index],
lonlat = di.lonlat,
pos = c2p(lonlat),
rad = di.mrc || 1;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

is di.mrc undefined or 0? Or could be both and we want it to be 1 regardless. Also why 1? Maybe some comments here

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

di.mrc is set only when there mode includes 'markers', so we need a fallback for mode 'line' and 'text'

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I wish I could gather that from that line of code ;)


var dx = Math.abs(xPx - pos[0]),
dy = Math.abs(yPx - pos[1]),
rad = Math.max(3, d.mrc || 0);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

what are the constraints on radius here for?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

marker pt radii are taken into consideration in the picking routine.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Do you think it will be obvious to someone who is maintaining this code what the 3 and 0 are doing? I didn't get it right away which is usually a sign that a comment may be helpful

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

but perhaps it is obvious ;/


if(!lonlat) continue; // filter the blank points here
// skip over placeholder traces
if(calcTrace[0].placeholder) s.remove();

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

what are placeholder traces?

xa = pointData.xa,
ya = pointData.ya;

if(cd[0].placeholder) return;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

is there another name we can use beside placeholder, a placeholder for _____? How about emptytrace?.

@etpinardetpinardOct 5, 2016

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

we could.

Not sure emptytrace is better though. traceWithNoVisibleDataPoint would be the most verbose. But I think placeholder does the trick as discussed in https://github.com/plotly/plotly.js/pull/1004/files#diff-ad4f76ccd6044ed16514297078e13b84R1672

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

yep placeholder is ok. Perhaps we can expand a little in that original placeholder comment. I still didn't quite understand when they would be necessary

@bpostlethwaite

Copy link
Copy Markdown
Member

Aighty all the comments are nonblocking! There are nice tests and this PR looks like a huge win

Nice work!

@bpostlethwaite

Copy link
Copy Markdown
Member

💃

@etpinard
etpinard merged commit f058e8b into masterOct 6, 2016
@etpinard
etpinard deleted the geo-line-picking branch October 6, 2016 01:12
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bugsomething brokenfeaturesomething new

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Strange behavior with missing values in scattergeo

2 participants

@etpinard@bpostlethwaite
, '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" + '
Multiple scattergeo improvement by etpinard · Pull Request #1004 · plotly/plotly.js · GitHub
Skip to content

Multiple scattergeo improvement - #1004

Merged
etpinard merged 14 commits into
masterfrom
geo-line-picking
Oct 6, 2016
Merged

Multiple scattergeo improvement#1004
etpinard merged 14 commits into
masterfrom
geo-line-picking

Conversation

@etpinard

@etpinardetpinard commented Oct 4, 2016

Copy link
Copy Markdown
Contributor

fixes#963

and supersedes #964

In brief, this PR brings several ideas from scattermapbox over to scattergeo - while reusing some parts of logic (namely regarding GeoJSON) keeping things 🌴

In details, this PR:

  • fixesStrange behavior with missing values in scattergeo  #963 (thanks again @cpsievert for letting me know)
  • scattergeo traces with non-circle markers now get the correct legend item
  • make scattergeo use a proper calc step
  • make scattergeo use Fx.hover to pick (using calcdata) and draw its hover labels
    • this means that user no longer have to hover over scattergeo data points to trigger hover event / draw labels
    • this means that scattergeo mode: 'lines' now (I mean finally) has a hover handlers!
  • adds support for connecgaps to scattergeo
  • adds support for fill: 'toself' to scattergeo (similar to how scattermapbox implement fill)

🎉 Yay geo line hover text:

gifrecord_2016-10-03_180302

- which is consistent with mapbox subplot,
and comptabitible with Fx.hover
- which skips and cast lon/lat values
- fixes#963
- note that 'locations[i]' -> feature must still be
done at the plot (after the topojson is loaded)
- traces with no data points are given a place-holder calc trace
to retatin fullData.length === gd.calcdata.length,
and make some component (e.g. legend) logic easier
- tag these place-holder traces so that the plot modules
can easily skip over them
- so plotting that data-pt less traces do result in mapbox errors.
- add support for 'connectgaps'
- add support for 'fill: 'toself'
- remove all traces of hover / click handlers
- make Fx.hover pass subplot info to hoverPoints module
- add scattergeo hoverPoints and eventData modules
- mock xaxis and yaxis in geo instances
- factor out is-over-edge logic to use it in hoverPoints
- use 'mousemove' instead of 'mouseover' in test to trigger hover
- until we make choropleth use fullLayout._hoverlayer for
its hover labels.
- the first legend item is now correct!
@etpinardetpinard added bug something broken feature something new status: reviewable labels Oct 4, 2016
@etpinardetpinard added this to the v1.18.0 milestone Oct 4, 2016

@bpostlethwaitebpostlethwaite left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Looks ok to me but I didn't get right into the details for all these changes. If I didn't understand what the code was doing fairly quickly I made a comment about improving the naming or comments.

ya = pointData.ya,
geo = pointData.subplot;

if(cd[0].placeholder) return;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

this is a little mysterious, at least as someone who doesn't look at Plotly.js code daily. Maybe a comment here?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Here's the comment you're looking for: https://github.com/plotly/plotly.js/pull/1004/files#diff-ad4f76ccd6044ed16514297078e13b84R1672

Putting comment about something where it is set is probably more robust than putting it where it is used.

var lonlat = d.lonlat;

// this handles the not-found location feature case
if(lonlat[0] === null || lonlat[1] === null) return Infinity;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

why return Infinity and not say, null

@etpinardetpinardOct 5, 2016

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

because this function returns a distance.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I would have expected NaN I think.

var di = cd[pointData.index],
lonlat = di.lonlat,
pos = c2p(lonlat),
rad = di.mrc || 1;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

is di.mrc undefined or 0? Or could be both and we want it to be 1 regardless. Also why 1? Maybe some comments here

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

di.mrc is set only when there mode includes 'markers', so we need a fallback for mode 'line' and 'text'

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I wish I could gather that from that line of code ;)


var dx = Math.abs(xPx - pos[0]),
dy = Math.abs(yPx - pos[1]),
rad = Math.max(3, d.mrc || 0);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

what are the constraints on radius here for?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

marker pt radii are taken into consideration in the picking routine.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Do you think it will be obvious to someone who is maintaining this code what the 3 and 0 are doing? I didn't get it right away which is usually a sign that a comment may be helpful

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

but perhaps it is obvious ;/


if(!lonlat) continue; // filter the blank points here
// skip over placeholder traces
if(calcTrace[0].placeholder) s.remove();

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

what are placeholder traces?

xa = pointData.xa,
ya = pointData.ya;

if(cd[0].placeholder) return;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

is there another name we can use beside placeholder, a placeholder for _____? How about emptytrace?.

@etpinardetpinardOct 5, 2016

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

we could.

Not sure emptytrace is better though. traceWithNoVisibleDataPoint would be the most verbose. But I think placeholder does the trick as discussed in https://github.com/plotly/plotly.js/pull/1004/files#diff-ad4f76ccd6044ed16514297078e13b84R1672

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

yep placeholder is ok. Perhaps we can expand a little in that original placeholder comment. I still didn't quite understand when they would be necessary

@bpostlethwaite

Copy link
Copy Markdown
Member

Aighty all the comments are nonblocking! There are nice tests and this PR looks like a huge win

Nice work!

@bpostlethwaite

Copy link
Copy Markdown
Member

💃

@etpinard
etpinard merged commit f058e8b into masterOct 6, 2016
@etpinard
etpinard deleted the geo-line-picking branch October 6, 2016 01:12
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bugsomething brokenfeaturesomething new

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Strange behavior with missing values in scattergeo

2 participants

@etpinard@bpostlethwaite
, '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('^' + ".*" + ' Multiple scattergeo improvement by etpinard · Pull Request #1004 · plotly/plotly.js · GitHub
Skip to content

Multiple scattergeo improvement - #1004

Merged
etpinard merged 14 commits into
masterfrom
geo-line-picking
Oct 6, 2016
Merged

Multiple scattergeo improvement#1004
etpinard merged 14 commits into
masterfrom
geo-line-picking

Conversation

@etpinard

@etpinardetpinard commented Oct 4, 2016

Copy link
Copy Markdown
Contributor

fixes#963

and supersedes #964

In brief, this PR brings several ideas from scattermapbox over to scattergeo - while reusing some parts of logic (namely regarding GeoJSON) keeping things 🌴

In details, this PR:

  • fixesStrange behavior with missing values in scattergeo  #963 (thanks again @cpsievert for letting me know)
  • scattergeo traces with non-circle markers now get the correct legend item
  • make scattergeo use a proper calc step
  • make scattergeo use Fx.hover to pick (using calcdata) and draw its hover labels
    • this means that user no longer have to hover over scattergeo data points to trigger hover event / draw labels
    • this means that scattergeo mode: 'lines' now (I mean finally) has a hover handlers!
  • adds support for connecgaps to scattergeo
  • adds support for fill: 'toself' to scattergeo (similar to how scattermapbox implement fill)

🎉 Yay geo line hover text:

gifrecord_2016-10-03_180302

- which is consistent with mapbox subplot,
and comptabitible with Fx.hover
- which skips and cast lon/lat values
- fixes#963
- note that 'locations[i]' -> feature must still be
done at the plot (after the topojson is loaded)
- traces with no data points are given a place-holder calc trace
to retatin fullData.length === gd.calcdata.length,
and make some component (e.g. legend) logic easier
- tag these place-holder traces so that the plot modules
can easily skip over them
- so plotting that data-pt less traces do result in mapbox errors.
- add support for 'connectgaps'
- add support for 'fill: 'toself'
- remove all traces of hover / click handlers
- make Fx.hover pass subplot info to hoverPoints module
- add scattergeo hoverPoints and eventData modules
- mock xaxis and yaxis in geo instances
- factor out is-over-edge logic to use it in hoverPoints
- use 'mousemove' instead of 'mouseover' in test to trigger hover
- until we make choropleth use fullLayout._hoverlayer for
its hover labels.
- the first legend item is now correct!
@etpinardetpinard added bug something broken feature something new status: reviewable labels Oct 4, 2016
@etpinardetpinard added this to the v1.18.0 milestone Oct 4, 2016

@bpostlethwaitebpostlethwaite left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Looks ok to me but I didn't get right into the details for all these changes. If I didn't understand what the code was doing fairly quickly I made a comment about improving the naming or comments.

ya = pointData.ya,
geo = pointData.subplot;

if(cd[0].placeholder) return;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

this is a little mysterious, at least as someone who doesn't look at Plotly.js code daily. Maybe a comment here?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Here's the comment you're looking for: https://github.com/plotly/plotly.js/pull/1004/files#diff-ad4f76ccd6044ed16514297078e13b84R1672

Putting comment about something where it is set is probably more robust than putting it where it is used.

var lonlat = d.lonlat;

// this handles the not-found location feature case
if(lonlat[0] === null || lonlat[1] === null) return Infinity;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

why return Infinity and not say, null

@etpinardetpinardOct 5, 2016

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

because this function returns a distance.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I would have expected NaN I think.

var di = cd[pointData.index],
lonlat = di.lonlat,
pos = c2p(lonlat),
rad = di.mrc || 1;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

is di.mrc undefined or 0? Or could be both and we want it to be 1 regardless. Also why 1? Maybe some comments here

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

di.mrc is set only when there mode includes 'markers', so we need a fallback for mode 'line' and 'text'

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I wish I could gather that from that line of code ;)


var dx = Math.abs(xPx - pos[0]),
dy = Math.abs(yPx - pos[1]),
rad = Math.max(3, d.mrc || 0);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

what are the constraints on radius here for?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

marker pt radii are taken into consideration in the picking routine.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Do you think it will be obvious to someone who is maintaining this code what the 3 and 0 are doing? I didn't get it right away which is usually a sign that a comment may be helpful

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

but perhaps it is obvious ;/


if(!lonlat) continue; // filter the blank points here
// skip over placeholder traces
if(calcTrace[0].placeholder) s.remove();

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

what are placeholder traces?

xa = pointData.xa,
ya = pointData.ya;

if(cd[0].placeholder) return;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

is there another name we can use beside placeholder, a placeholder for _____? How about emptytrace?.

@etpinardetpinardOct 5, 2016

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

we could.

Not sure emptytrace is better though. traceWithNoVisibleDataPoint would be the most verbose. But I think placeholder does the trick as discussed in https://github.com/plotly/plotly.js/pull/1004/files#diff-ad4f76ccd6044ed16514297078e13b84R1672

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

yep placeholder is ok. Perhaps we can expand a little in that original placeholder comment. I still didn't quite understand when they would be necessary

@bpostlethwaite

Copy link
Copy Markdown
Member

Aighty all the comments are nonblocking! There are nice tests and this PR looks like a huge win

Nice work!

@bpostlethwaite

Copy link
Copy Markdown
Member

💃

@etpinard
etpinard merged commit f058e8b into masterOct 6, 2016
@etpinard
etpinard deleted the geo-line-picking branch October 6, 2016 01:12
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bugsomething brokenfeaturesomething new

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Strange behavior with missing values in scattergeo

2 participants

@etpinard@bpostlethwaite
, '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('^' + ".*" + ' Multiple scattergeo improvement by etpinard · Pull Request #1004 · plotly/plotly.js · GitHub
Skip to content

Multiple scattergeo improvement - #1004

Merged
etpinard merged 14 commits into
masterfrom
geo-line-picking
Oct 6, 2016
Merged

Multiple scattergeo improvement#1004
etpinard merged 14 commits into
masterfrom
geo-line-picking

Conversation

@etpinard

@etpinardetpinard commented Oct 4, 2016

Copy link
Copy Markdown
Contributor

fixes#963

and supersedes #964

In brief, this PR brings several ideas from scattermapbox over to scattergeo - while reusing some parts of logic (namely regarding GeoJSON) keeping things 🌴

In details, this PR:

  • fixesStrange behavior with missing values in scattergeo  #963 (thanks again @cpsievert for letting me know)
  • scattergeo traces with non-circle markers now get the correct legend item
  • make scattergeo use a proper calc step
  • make scattergeo use Fx.hover to pick (using calcdata) and draw its hover labels
    • this means that user no longer have to hover over scattergeo data points to trigger hover event / draw labels
    • this means that scattergeo mode: 'lines' now (I mean finally) has a hover handlers!
  • adds support for connecgaps to scattergeo
  • adds support for fill: 'toself' to scattergeo (similar to how scattermapbox implement fill)

🎉 Yay geo line hover text:

gifrecord_2016-10-03_180302

- which is consistent with mapbox subplot,
and comptabitible with Fx.hover
- which skips and cast lon/lat values
- fixes#963
- note that 'locations[i]' -> feature must still be
done at the plot (after the topojson is loaded)
- traces with no data points are given a place-holder calc trace
to retatin fullData.length === gd.calcdata.length,
and make some component (e.g. legend) logic easier
- tag these place-holder traces so that the plot modules
can easily skip over them
- so plotting that data-pt less traces do result in mapbox errors.
- add support for 'connectgaps'
- add support for 'fill: 'toself'
- remove all traces of hover / click handlers
- make Fx.hover pass subplot info to hoverPoints module
- add scattergeo hoverPoints and eventData modules
- mock xaxis and yaxis in geo instances
- factor out is-over-edge logic to use it in hoverPoints
- use 'mousemove' instead of 'mouseover' in test to trigger hover
- until we make choropleth use fullLayout._hoverlayer for
its hover labels.
- the first legend item is now correct!
@etpinardetpinard added bug something broken feature something new status: reviewable labels Oct 4, 2016
@etpinardetpinard added this to the v1.18.0 milestone Oct 4, 2016

@bpostlethwaitebpostlethwaite left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Looks ok to me but I didn't get right into the details for all these changes. If I didn't understand what the code was doing fairly quickly I made a comment about improving the naming or comments.

ya = pointData.ya,
geo = pointData.subplot;

if(cd[0].placeholder) return;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

this is a little mysterious, at least as someone who doesn't look at Plotly.js code daily. Maybe a comment here?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Here's the comment you're looking for: https://github.com/plotly/plotly.js/pull/1004/files#diff-ad4f76ccd6044ed16514297078e13b84R1672

Putting comment about something where it is set is probably more robust than putting it where it is used.

var lonlat = d.lonlat;

// this handles the not-found location feature case
if(lonlat[0] === null || lonlat[1] === null) return Infinity;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

why return Infinity and not say, null

@etpinardetpinardOct 5, 2016

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

because this function returns a distance.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I would have expected NaN I think.

var di = cd[pointData.index],
lonlat = di.lonlat,
pos = c2p(lonlat),
rad = di.mrc || 1;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

is di.mrc undefined or 0? Or could be both and we want it to be 1 regardless. Also why 1? Maybe some comments here

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

di.mrc is set only when there mode includes 'markers', so we need a fallback for mode 'line' and 'text'

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I wish I could gather that from that line of code ;)


var dx = Math.abs(xPx - pos[0]),
dy = Math.abs(yPx - pos[1]),
rad = Math.max(3, d.mrc || 0);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

what are the constraints on radius here for?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

marker pt radii are taken into consideration in the picking routine.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Do you think it will be obvious to someone who is maintaining this code what the 3 and 0 are doing? I didn't get it right away which is usually a sign that a comment may be helpful

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

but perhaps it is obvious ;/


if(!lonlat) continue; // filter the blank points here
// skip over placeholder traces
if(calcTrace[0].placeholder) s.remove();

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

what are placeholder traces?

xa = pointData.xa,
ya = pointData.ya;

if(cd[0].placeholder) return;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

is there another name we can use beside placeholder, a placeholder for _____? How about emptytrace?.

@etpinardetpinardOct 5, 2016

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

we could.

Not sure emptytrace is better though. traceWithNoVisibleDataPoint would be the most verbose. But I think placeholder does the trick as discussed in https://github.com/plotly/plotly.js/pull/1004/files#diff-ad4f76ccd6044ed16514297078e13b84R1672

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

yep placeholder is ok. Perhaps we can expand a little in that original placeholder comment. I still didn't quite understand when they would be necessary

@bpostlethwaite

Copy link
Copy Markdown
Member

Aighty all the comments are nonblocking! There are nice tests and this PR looks like a huge win

Nice work!

@bpostlethwaite

Copy link
Copy Markdown
Member

💃

@etpinard
etpinard merged commit f058e8b into masterOct 6, 2016
@etpinard
etpinard deleted the geo-line-picking branch October 6, 2016 01:12
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bugsomething brokenfeaturesomething new

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Strange behavior with missing values in scattergeo

2 participants

@etpinard@bpostlethwaite
, '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" + ' Multiple scattergeo improvement by etpinard · Pull Request #1004 · plotly/plotly.js · GitHub
Skip to content

Multiple scattergeo improvement - #1004

Merged
etpinard merged 14 commits into
masterfrom
geo-line-picking
Oct 6, 2016
Merged

Multiple scattergeo improvement#1004
etpinard merged 14 commits into
masterfrom
geo-line-picking

Conversation

@etpinard

@etpinardetpinard commented Oct 4, 2016

Copy link
Copy Markdown
Contributor

fixes#963

and supersedes #964

In brief, this PR brings several ideas from scattermapbox over to scattergeo - while reusing some parts of logic (namely regarding GeoJSON) keeping things 🌴

In details, this PR:

  • fixesStrange behavior with missing values in scattergeo  #963 (thanks again @cpsievert for letting me know)
  • scattergeo traces with non-circle markers now get the correct legend item
  • make scattergeo use a proper calc step
  • make scattergeo use Fx.hover to pick (using calcdata) and draw its hover labels
    • this means that user no longer have to hover over scattergeo data points to trigger hover event / draw labels
    • this means that scattergeo mode: 'lines' now (I mean finally) has a hover handlers!
  • adds support for connecgaps to scattergeo
  • adds support for fill: 'toself' to scattergeo (similar to how scattermapbox implement fill)

🎉 Yay geo line hover text:

gifrecord_2016-10-03_180302

- which is consistent with mapbox subplot,
and comptabitible with Fx.hover
- which skips and cast lon/lat values
- fixes#963
- note that 'locations[i]' -> feature must still be
done at the plot (after the topojson is loaded)
- traces with no data points are given a place-holder calc trace
to retatin fullData.length === gd.calcdata.length,
and make some component (e.g. legend) logic easier
- tag these place-holder traces so that the plot modules
can easily skip over them
- so plotting that data-pt less traces do result in mapbox errors.
- add support for 'connectgaps'
- add support for 'fill: 'toself'
- remove all traces of hover / click handlers
- make Fx.hover pass subplot info to hoverPoints module
- add scattergeo hoverPoints and eventData modules
- mock xaxis and yaxis in geo instances
- factor out is-over-edge logic to use it in hoverPoints
- use 'mousemove' instead of 'mouseover' in test to trigger hover
- until we make choropleth use fullLayout._hoverlayer for
its hover labels.
- the first legend item is now correct!
@etpinardetpinard added bug something broken feature something new status: reviewable labels Oct 4, 2016
@etpinardetpinard added this to the v1.18.0 milestone Oct 4, 2016

@bpostlethwaitebpostlethwaite left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Looks ok to me but I didn't get right into the details for all these changes. If I didn't understand what the code was doing fairly quickly I made a comment about improving the naming or comments.

ya = pointData.ya,
geo = pointData.subplot;

if(cd[0].placeholder) return;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

this is a little mysterious, at least as someone who doesn't look at Plotly.js code daily. Maybe a comment here?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Here's the comment you're looking for: https://github.com/plotly/plotly.js/pull/1004/files#diff-ad4f76ccd6044ed16514297078e13b84R1672

Putting comment about something where it is set is probably more robust than putting it where it is used.

var lonlat = d.lonlat;

// this handles the not-found location feature case
if(lonlat[0] === null || lonlat[1] === null) return Infinity;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

why return Infinity and not say, null

@etpinardetpinardOct 5, 2016

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

because this function returns a distance.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I would have expected NaN I think.

var di = cd[pointData.index],
lonlat = di.lonlat,
pos = c2p(lonlat),
rad = di.mrc || 1;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

is di.mrc undefined or 0? Or could be both and we want it to be 1 regardless. Also why 1? Maybe some comments here

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

di.mrc is set only when there mode includes 'markers', so we need a fallback for mode 'line' and 'text'

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I wish I could gather that from that line of code ;)


var dx = Math.abs(xPx - pos[0]),
dy = Math.abs(yPx - pos[1]),
rad = Math.max(3, d.mrc || 0);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

what are the constraints on radius here for?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

marker pt radii are taken into consideration in the picking routine.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Do you think it will be obvious to someone who is maintaining this code what the 3 and 0 are doing? I didn't get it right away which is usually a sign that a comment may be helpful

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

but perhaps it is obvious ;/


if(!lonlat) continue; // filter the blank points here
// skip over placeholder traces
if(calcTrace[0].placeholder) s.remove();

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

what are placeholder traces?

xa = pointData.xa,
ya = pointData.ya;

if(cd[0].placeholder) return;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

is there another name we can use beside placeholder, a placeholder for _____? How about emptytrace?.

@etpinardetpinardOct 5, 2016

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

we could.

Not sure emptytrace is better though. traceWithNoVisibleDataPoint would be the most verbose. But I think placeholder does the trick as discussed in https://github.com/plotly/plotly.js/pull/1004/files#diff-ad4f76ccd6044ed16514297078e13b84R1672

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

yep placeholder is ok. Perhaps we can expand a little in that original placeholder comment. I still didn't quite understand when they would be necessary

@bpostlethwaite

Copy link
Copy Markdown
Member

Aighty all the comments are nonblocking! There are nice tests and this PR looks like a huge win

Nice work!

@bpostlethwaite

Copy link
Copy Markdown
Member

💃

@etpinard
etpinard merged commit f058e8b into masterOct 6, 2016
@etpinard
etpinard deleted the geo-line-picking branch October 6, 2016 01:12
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bugsomething brokenfeaturesomething new

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Strange behavior with missing values in scattergeo

2 participants

@etpinard@bpostlethwaite
, '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('^' + ".*" + ' Multiple scattergeo improvement by etpinard · Pull Request #1004 · plotly/plotly.js · GitHub
Skip to content

Multiple scattergeo improvement - #1004

Merged
etpinard merged 14 commits into
masterfrom
geo-line-picking
Oct 6, 2016
Merged

Multiple scattergeo improvement#1004
etpinard merged 14 commits into
masterfrom
geo-line-picking

Conversation

@etpinard

@etpinardetpinard commented Oct 4, 2016

Copy link
Copy Markdown
Contributor

fixes#963

and supersedes #964

In brief, this PR brings several ideas from scattermapbox over to scattergeo - while reusing some parts of logic (namely regarding GeoJSON) keeping things 🌴

In details, this PR:

  • fixesStrange behavior with missing values in scattergeo  #963 (thanks again @cpsievert for letting me know)
  • scattergeo traces with non-circle markers now get the correct legend item
  • make scattergeo use a proper calc step
  • make scattergeo use Fx.hover to pick (using calcdata) and draw its hover labels
    • this means that user no longer have to hover over scattergeo data points to trigger hover event / draw labels
    • this means that scattergeo mode: 'lines' now (I mean finally) has a hover handlers!
  • adds support for connecgaps to scattergeo
  • adds support for fill: 'toself' to scattergeo (similar to how scattermapbox implement fill)

🎉 Yay geo line hover text:

gifrecord_2016-10-03_180302

- which is consistent with mapbox subplot,
and comptabitible with Fx.hover
- which skips and cast lon/lat values
- fixes#963
- note that 'locations[i]' -> feature must still be
done at the plot (after the topojson is loaded)
- traces with no data points are given a place-holder calc trace
to retatin fullData.length === gd.calcdata.length,
and make some component (e.g. legend) logic easier
- tag these place-holder traces so that the plot modules
can easily skip over them
- so plotting that data-pt less traces do result in mapbox errors.
- add support for 'connectgaps'
- add support for 'fill: 'toself'
- remove all traces of hover / click handlers
- make Fx.hover pass subplot info to hoverPoints module
- add scattergeo hoverPoints and eventData modules
- mock xaxis and yaxis in geo instances
- factor out is-over-edge logic to use it in hoverPoints
- use 'mousemove' instead of 'mouseover' in test to trigger hover
- until we make choropleth use fullLayout._hoverlayer for
its hover labels.
- the first legend item is now correct!
@etpinardetpinard added bug something broken feature something new status: reviewable labels Oct 4, 2016
@etpinardetpinard added this to the v1.18.0 milestone Oct 4, 2016

@bpostlethwaitebpostlethwaite left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Looks ok to me but I didn't get right into the details for all these changes. If I didn't understand what the code was doing fairly quickly I made a comment about improving the naming or comments.

ya = pointData.ya,
geo = pointData.subplot;

if(cd[0].placeholder) return;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

this is a little mysterious, at least as someone who doesn't look at Plotly.js code daily. Maybe a comment here?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Here's the comment you're looking for: https://github.com/plotly/plotly.js/pull/1004/files#diff-ad4f76ccd6044ed16514297078e13b84R1672

Putting comment about something where it is set is probably more robust than putting it where it is used.

var lonlat = d.lonlat;

// this handles the not-found location feature case
if(lonlat[0] === null || lonlat[1] === null) return Infinity;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

why return Infinity and not say, null

@etpinardetpinardOct 5, 2016

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

because this function returns a distance.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I would have expected NaN I think.

var di = cd[pointData.index],
lonlat = di.lonlat,
pos = c2p(lonlat),
rad = di.mrc || 1;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

is di.mrc undefined or 0? Or could be both and we want it to be 1 regardless. Also why 1? Maybe some comments here

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

di.mrc is set only when there mode includes 'markers', so we need a fallback for mode 'line' and 'text'

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I wish I could gather that from that line of code ;)


var dx = Math.abs(xPx - pos[0]),
dy = Math.abs(yPx - pos[1]),
rad = Math.max(3, d.mrc || 0);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

what are the constraints on radius here for?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

marker pt radii are taken into consideration in the picking routine.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Do you think it will be obvious to someone who is maintaining this code what the 3 and 0 are doing? I didn't get it right away which is usually a sign that a comment may be helpful

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

but perhaps it is obvious ;/


if(!lonlat) continue; // filter the blank points here
// skip over placeholder traces
if(calcTrace[0].placeholder) s.remove();

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

what are placeholder traces?

xa = pointData.xa,
ya = pointData.ya;

if(cd[0].placeholder) return;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

is there another name we can use beside placeholder, a placeholder for _____? How about emptytrace?.

@etpinardetpinardOct 5, 2016

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

we could.

Not sure emptytrace is better though. traceWithNoVisibleDataPoint would be the most verbose. But I think placeholder does the trick as discussed in https://github.com/plotly/plotly.js/pull/1004/files#diff-ad4f76ccd6044ed16514297078e13b84R1672

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

yep placeholder is ok. Perhaps we can expand a little in that original placeholder comment. I still didn't quite understand when they would be necessary

@bpostlethwaite

Copy link
Copy Markdown
Member

Aighty all the comments are nonblocking! There are nice tests and this PR looks like a huge win

Nice work!

@bpostlethwaite

Copy link
Copy Markdown
Member

💃

@etpinard
etpinard merged commit f058e8b into masterOct 6, 2016
@etpinard
etpinard deleted the geo-line-picking branch October 6, 2016 01:12
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bugsomething brokenfeaturesomething new

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Strange behavior with missing values in scattergeo

2 participants

@etpinard@bpostlethwaite
, '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('^' + ".*" + ' Multiple scattergeo improvement by etpinard · Pull Request #1004 · plotly/plotly.js · GitHub
Skip to content

Multiple scattergeo improvement - #1004

Merged
etpinard merged 14 commits into
masterfrom
geo-line-picking
Oct 6, 2016
Merged

Multiple scattergeo improvement#1004
etpinard merged 14 commits into
masterfrom
geo-line-picking

Conversation

@etpinard

@etpinardetpinard commented Oct 4, 2016

Copy link
Copy Markdown
Contributor

fixes#963

and supersedes #964

In brief, this PR brings several ideas from scattermapbox over to scattergeo - while reusing some parts of logic (namely regarding GeoJSON) keeping things 🌴

In details, this PR:

  • fixesStrange behavior with missing values in scattergeo  #963 (thanks again @cpsievert for letting me know)
  • scattergeo traces with non-circle markers now get the correct legend item
  • make scattergeo use a proper calc step
  • make scattergeo use Fx.hover to pick (using calcdata) and draw its hover labels
    • this means that user no longer have to hover over scattergeo data points to trigger hover event / draw labels
    • this means that scattergeo mode: 'lines' now (I mean finally) has a hover handlers!
  • adds support for connecgaps to scattergeo
  • adds support for fill: 'toself' to scattergeo (similar to how scattermapbox implement fill)

🎉 Yay geo line hover text:

gifrecord_2016-10-03_180302

- which is consistent with mapbox subplot,
and comptabitible with Fx.hover
- which skips and cast lon/lat values
- fixes#963
- note that 'locations[i]' -> feature must still be
done at the plot (after the topojson is loaded)
- traces with no data points are given a place-holder calc trace
to retatin fullData.length === gd.calcdata.length,
and make some component (e.g. legend) logic easier
- tag these place-holder traces so that the plot modules
can easily skip over them
- so plotting that data-pt less traces do result in mapbox errors.
- add support for 'connectgaps'
- add support for 'fill: 'toself'
- remove all traces of hover / click handlers
- make Fx.hover pass subplot info to hoverPoints module
- add scattergeo hoverPoints and eventData modules
- mock xaxis and yaxis in geo instances
- factor out is-over-edge logic to use it in hoverPoints
- use 'mousemove' instead of 'mouseover' in test to trigger hover
- until we make choropleth use fullLayout._hoverlayer for
its hover labels.
- the first legend item is now correct!
@etpinardetpinard added bug something broken feature something new status: reviewable labels Oct 4, 2016
@etpinardetpinard added this to the v1.18.0 milestone Oct 4, 2016

@bpostlethwaitebpostlethwaite left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Looks ok to me but I didn't get right into the details for all these changes. If I didn't understand what the code was doing fairly quickly I made a comment about improving the naming or comments.

ya = pointData.ya,
geo = pointData.subplot;

if(cd[0].placeholder) return;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

this is a little mysterious, at least as someone who doesn't look at Plotly.js code daily. Maybe a comment here?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Here's the comment you're looking for: https://github.com/plotly/plotly.js/pull/1004/files#diff-ad4f76ccd6044ed16514297078e13b84R1672

Putting comment about something where it is set is probably more robust than putting it where it is used.

var lonlat = d.lonlat;

// this handles the not-found location feature case
if(lonlat[0] === null || lonlat[1] === null) return Infinity;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

why return Infinity and not say, null

@etpinardetpinardOct 5, 2016

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

because this function returns a distance.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I would have expected NaN I think.

var di = cd[pointData.index],
lonlat = di.lonlat,
pos = c2p(lonlat),
rad = di.mrc || 1;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

is di.mrc undefined or 0? Or could be both and we want it to be 1 regardless. Also why 1? Maybe some comments here

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

di.mrc is set only when there mode includes 'markers', so we need a fallback for mode 'line' and 'text'

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I wish I could gather that from that line of code ;)


var dx = Math.abs(xPx - pos[0]),
dy = Math.abs(yPx - pos[1]),
rad = Math.max(3, d.mrc || 0);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

what are the constraints on radius here for?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

marker pt radii are taken into consideration in the picking routine.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Do you think it will be obvious to someone who is maintaining this code what the 3 and 0 are doing? I didn't get it right away which is usually a sign that a comment may be helpful

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

but perhaps it is obvious ;/


if(!lonlat) continue; // filter the blank points here
// skip over placeholder traces
if(calcTrace[0].placeholder) s.remove();

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

what are placeholder traces?

xa = pointData.xa,
ya = pointData.ya;

if(cd[0].placeholder) return;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

is there another name we can use beside placeholder, a placeholder for _____? How about emptytrace?.

@etpinardetpinardOct 5, 2016

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

we could.

Not sure emptytrace is better though. traceWithNoVisibleDataPoint would be the most verbose. But I think placeholder does the trick as discussed in https://github.com/plotly/plotly.js/pull/1004/files#diff-ad4f76ccd6044ed16514297078e13b84R1672

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

yep placeholder is ok. Perhaps we can expand a little in that original placeholder comment. I still didn't quite understand when they would be necessary

@bpostlethwaite

Copy link
Copy Markdown
Member

Aighty all the comments are nonblocking! There are nice tests and this PR looks like a huge win

Nice work!

@bpostlethwaite

Copy link
Copy Markdown
Member

💃

@etpinard
etpinard merged commit f058e8b into masterOct 6, 2016
@etpinard
etpinard deleted the geo-line-picking branch October 6, 2016 01:12
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bugsomething brokenfeaturesomething new

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Strange behavior with missing values in scattergeo

2 participants

@etpinard@bpostlethwaite
, '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); } })(); })(); Multiple scattergeo improvement by etpinard · Pull Request #1004 · plotly/plotly.js · GitHub
Skip to content

Multiple scattergeo improvement - #1004

Merged
etpinard merged 14 commits into
masterfrom
geo-line-picking
Oct 6, 2016
Merged

Multiple scattergeo improvement#1004
etpinard merged 14 commits into
masterfrom
geo-line-picking

Conversation

@etpinard

@etpinardetpinard commented Oct 4, 2016

Copy link
Copy Markdown
Contributor

fixes#963

and supersedes #964

In brief, this PR brings several ideas from scattermapbox over to scattergeo - while reusing some parts of logic (namely regarding GeoJSON) keeping things 🌴

In details, this PR:

  • fixesStrange behavior with missing values in scattergeo  #963 (thanks again @cpsievert for letting me know)
  • scattergeo traces with non-circle markers now get the correct legend item
  • make scattergeo use a proper calc step
  • make scattergeo use Fx.hover to pick (using calcdata) and draw its hover labels
    • this means that user no longer have to hover over scattergeo data points to trigger hover event / draw labels
    • this means that scattergeo mode: 'lines' now (I mean finally) has a hover handlers!
  • adds support for connecgaps to scattergeo
  • adds support for fill: 'toself' to scattergeo (similar to how scattermapbox implement fill)

🎉 Yay geo line hover text:

gifrecord_2016-10-03_180302

- which is consistent with mapbox subplot,
and comptabitible with Fx.hover
- which skips and cast lon/lat values
- fixes#963
- note that 'locations[i]' -> feature must still be
done at the plot (after the topojson is loaded)
- traces with no data points are given a place-holder calc trace
to retatin fullData.length === gd.calcdata.length,
and make some component (e.g. legend) logic easier
- tag these place-holder traces so that the plot modules
can easily skip over them
- so plotting that data-pt less traces do result in mapbox errors.
- add support for 'connectgaps'
- add support for 'fill: 'toself'
- remove all traces of hover / click handlers
- make Fx.hover pass subplot info to hoverPoints module
- add scattergeo hoverPoints and eventData modules
- mock xaxis and yaxis in geo instances
- factor out is-over-edge logic to use it in hoverPoints
- use 'mousemove' instead of 'mouseover' in test to trigger hover
- until we make choropleth use fullLayout._hoverlayer for
its hover labels.
- the first legend item is now correct!
@etpinardetpinard added bug something broken feature something new status: reviewable labels Oct 4, 2016
@etpinardetpinard added this to the v1.18.0 milestone Oct 4, 2016

@bpostlethwaitebpostlethwaite left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Looks ok to me but I didn't get right into the details for all these changes. If I didn't understand what the code was doing fairly quickly I made a comment about improving the naming or comments.

ya = pointData.ya,
geo = pointData.subplot;

if(cd[0].placeholder) return;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

this is a little mysterious, at least as someone who doesn't look at Plotly.js code daily. Maybe a comment here?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Here's the comment you're looking for: https://github.com/plotly/plotly.js/pull/1004/files#diff-ad4f76ccd6044ed16514297078e13b84R1672

Putting comment about something where it is set is probably more robust than putting it where it is used.

var lonlat = d.lonlat;

// this handles the not-found location feature case
if(lonlat[0] === null || lonlat[1] === null) return Infinity;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

why return Infinity and not say, null

@etpinardetpinardOct 5, 2016

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

because this function returns a distance.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I would have expected NaN I think.

var di = cd[pointData.index],
lonlat = di.lonlat,
pos = c2p(lonlat),
rad = di.mrc || 1;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

is di.mrc undefined or 0? Or could be both and we want it to be 1 regardless. Also why 1? Maybe some comments here

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

di.mrc is set only when there mode includes 'markers', so we need a fallback for mode 'line' and 'text'

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I wish I could gather that from that line of code ;)


var dx = Math.abs(xPx - pos[0]),
dy = Math.abs(yPx - pos[1]),
rad = Math.max(3, d.mrc || 0);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

what are the constraints on radius here for?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

marker pt radii are taken into consideration in the picking routine.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Do you think it will be obvious to someone who is maintaining this code what the 3 and 0 are doing? I didn't get it right away which is usually a sign that a comment may be helpful

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

but perhaps it is obvious ;/


if(!lonlat) continue; // filter the blank points here
// skip over placeholder traces
if(calcTrace[0].placeholder) s.remove();

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

what are placeholder traces?

xa = pointData.xa,
ya = pointData.ya;

if(cd[0].placeholder) return;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

is there another name we can use beside placeholder, a placeholder for _____? How about emptytrace?.

@etpinardetpinardOct 5, 2016

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

we could.

Not sure emptytrace is better though. traceWithNoVisibleDataPoint would be the most verbose. But I think placeholder does the trick as discussed in https://github.com/plotly/plotly.js/pull/1004/files#diff-ad4f76ccd6044ed16514297078e13b84R1672

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

yep placeholder is ok. Perhaps we can expand a little in that original placeholder comment. I still didn't quite understand when they would be necessary

@bpostlethwaite

Copy link
Copy Markdown
Member

Aighty all the comments are nonblocking! There are nice tests and this PR looks like a huge win

Nice work!

@bpostlethwaite

Copy link
Copy Markdown
Member

💃

@etpinard
etpinard merged commit f058e8b into masterOct 6, 2016
@etpinard
etpinard deleted the geo-line-picking branch October 6, 2016 01:12
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bugsomething brokenfeaturesomething new

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Strange behavior with missing values in scattergeo

2 participants

@etpinard@bpostlethwaite