Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Zoom to visible nodes #1373

Draft
wants to merge 6 commits into
base: master
Choose a base branch
from
Draft

Zoom to visible nodes #1373

wants to merge 6 commits into from

Conversation

trvrb
Copy link
Member

@trvrb trvrb commented Jul 11, 2021

preview on ncov/gisaid/global/all-time

Description of proposed changes

This commit re-implements the "zoom to selected" function in the tree panel to emphasize visible nodes by expanding their "yValues" to take up 80% of the vertical span of the panel. Notes on implementation details:

  • I mirrored redux dataflow of distanceMeasure and layout to create a new redux variable of treeZoom. This is defaults to even but is updated to zoom when clicking the "zoom to selected" tab. Further clicks increment the redux variable to zoom-2, zoom-3, etc... and clicking "reset layout" restores it to even.
  • A PhyloTree redraw is triggered when redux treeZoom variable is updated. This allows filters to change, etc... without triggering immediate changes to layout, but then clicking "zoom to selected" will redraw layout to emphasize currently selected nodes.
  • phylotree.layouts contains the actual logic in the calcYValues function. This dynamically sets node.n.yValue based on node.visibility, so that calls to other layout functions like rectangularLayout will have updated node.n.yValue from which to construct node.y.

This is mostly working at this point, though there are a few issues (like initial render with ?z=zoom in URL does not work as it should due to node.visibility not existing in the initial calls to layout). I'm hoping first for user interface feedback (hence the draft PR).

Primary use case is to:

  1. Filter to a trait value of interest (whether monophyletic or not)
  2. Click "zoom to selected" to emphasize nodes with trait.

The biggest wins are being able to zoom to basal tips in the tree. For example, you can zoom to early SARS-CoV-2 samples or to clade 19A where this wasn't previously possible.

Related issue(s)

Fixes #1368

Checklist

  • Disable FOCUS ON SELECTED button when no filters are applied
  • Switch button to say RESET FOCUS when focus is active. To clarify behavior, RESET LAYOUT could be merged with ZOOM TO SELECTED and renamed to RESET ZOOM.
  • Auto re-focus/un-focus when filter is updated/removed

@jameshadfield jameshadfield temporarily deployed to auspice-dynamic-yvalues-mqlvu0 July 11, 2021 22:43 Inactive
@huddlej
Copy link
Contributor

huddlej commented Jul 12, 2021

I haven't had a chance to do a full review yet, but at first glance, this is a really cool feature! It seems pretty helpful for situations like H3N2 where we have recurrent mutations like 186D and we want to focus on these.

@emmahodcroft
Copy link
Member

I haven't tested this out super-extensively yet, but I tried out zooming to 19B (currently can be quite difficult!) and also picking out a few sequences at the 'edges' of clades (which can also be extremely difficult to get a good look at, if they don't cluster but branch sequentially away from the clade). Both worked beautifully and gave super useful views that I don't think you can get with current auspice!

@joverlee521
Copy link
Contributor

It's really cool that the zoom works well with the date filter! 🤩

I noticed that the interaction between zooming via branches and the zoom button can be a little clunky.

  1. Zoom in via a branch:
    Screen Shot 2021-07-13 at 5 13 32 PM

  2. Then clicking on the zoom button brings up previously hidden branches on the bottom, making the x-axis hard to read:
    Screen Shot 2021-07-13 at 5 13 55 PM

  3. Zooming back out via clicking on base branches leaves the tree in a strange configuration:
    Screen Shot 2021-07-13 at 5 15 12 PM

@jameshadfield
Copy link
Member

The general behaviour is fantastic. I’m really happy to see the y-value-zoom functionality resurrected in this (much improved) form! Here’s a longer review of the functionality (I haven’t dug into the code at all yet, but I will).

Zoom to selected

My main issue is the confusing UI due to us mixing the y-zoom behaviour with the “zoom to selected button”.

(Overview of how this button currently works: it zooms into the MRCA of the selected tips - using the terminology of Auspice we change the in-view root node to be the MRCA of the tips which are both visible and in-view. If this node is the same as the current in-view root node, then the button isn’t selectable. Note that this MRCA node may not be visible, and thus you can’t always achieve this behaviour by clicking on the branch to zoom.)

Importantly, “zoom to selected” isn’t a flag or a state, it’s more like an action which is conditional on other state; this is why it’s so hard to store it as a URL query (see #1321).

With this PR, it’s really easy to get into intermediate states. For instance filter to Oceania, then zoom-to-selected, then inactivate the filter. The y-zoom is still focused on Oceania, but all the tips are visible again. There are plenty of other ones too (e.g. Jover’s screenshots), and it’s not clear when you’re in one of these intermediate states.

An alternative UI approach would be a “Focused zoom” toggle. With this on, any change in visibility (zooming, filtering etc) would trigger a recalculation of y values. This would look really nice when changing filters or animating (if it could be made fast enough). I think this UI would avoid all the intermediate states currently available in this PR, and make it extremely clear what mode we are currently in. It’s somewhat analogous to separating out the horizontal and vertical zooming.

Y value padding

In certain situations, (e.g. South America + 614D) the y-value calculations aren’t right. It looks like we’re setting some padding above selected tips, but not below them, which means the squashed branches are directly behind selected tips.

image

Do we still need the (existing) “zoom-to-selected” behaviour?

Perhaps not. I haven’t fully thought through all the use cases here, but I think we could remove this. We can still zoom into clades by clicking on branches to explore certain parts of the tree, which is essentially what the button does.

Zooming into early samples

The biggest wins are being able to zoom to basal tips in the tree.

This is much improved in this PR, but there are still some cases it doesn’t solve, as the upper bound of the time domain is always the latest date of the in-view tips. For instance, zooming into clade 1B of flu/seasonal/vic/ha/12y could be better:

image

(Perfect is the enemy of good, and I don’t think we need to address this in this PR.)

@trvrb trvrb temporarily deployed to auspice-dynamic-yvalues-jxzjzp July 22, 2021 00:08 Inactive
@victorlin victorlin temporarily deployed to auspice-dynamic-yvalues-n9rt9e September 13, 2024 18:22 Inactive
@victorlin
Copy link
Member

victorlin commented Sep 13, 2024

Not able to build a new review app due to old NPM version. Rebase seems mostly trivial so I'm going to do that and hopefully get a working review app. Original commit is e4b02c5 if we want to revert back.

EDIT: I believe more work needs to be done to account for ca1046b and 00add58
EDIT: done

@nextstrain-bot nextstrain-bot temporarily deployed to auspice-dynamic-yvalues-76vqio September 13, 2024 18:35 Inactive
This commit re-implements the "zoom to selected" function in the tree panel to emphasize visible nodes by expanding their "yValues" to take up 80% of the vertical span of the panel. Notes on implementation details:

- I mirrored redux dataflow of "distanceMeasure" and "layout" to create a new redux variable of "treeZoom". This is defaults to "even" but is updated to "zoom" when clicking the "zoom to selected" tab. Further clicks increment the redux variable to "zoom-2", "zoom-3", etc... and clicking "reset layout" restores it to "even".
- A PhyloTree redraw is triggered when redux treeZoom variable is updated. This allows filters to change, etc... without triggering immediate changes to layout, but then clicking "zoom to selected" will redraw layout to emphasize currently selected nodes.
- phylotree.layouts contains the actual logic in the calcYValues function. This dynamically sets node.n.yValue based on node.visibility, so that calls to other layout functions like rectangularLayout will have updated node.n.yValue from which to construct node.y.
@victorlin victorlin temporarily deployed to auspice-dynamic-yvalues-ax3is5 September 13, 2024 21:03 Inactive
@victorlin victorlin temporarily deployed to auspice-dynamic-yvalues-ax3is5 September 13, 2024 21:16 Inactive
@victorlin victorlin temporarily deployed to auspice-dynamic-yvalues-ax3is5 September 13, 2024 21:27 Inactive
@victorlin victorlin temporarily deployed to auspice-dynamic-yvalues-ax3is5 September 13, 2024 22:05 Inactive
Simply renaming this functionality and separating it from 'zoom' helped
me understand the difference better. The separate buttons may be helpful
too.
@victorlin victorlin temporarily deployed to auspice-dynamic-yvalues-ax3is5 September 13, 2024 22:27 Inactive
@victorlin victorlin self-assigned this Sep 13, 2024
@victorlin
Copy link
Member

PR is working now. I've updated the description with a link to a nextstrain.org preview instance and some remaining tasks. Also added some broader thoughts in the linked issue: #1368 (comment)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
No open projects
Status: Backlog
Development

Successfully merging this pull request may close these issues.

Improve visibility of filtered samples under various conditions
7 participants