Refactor hexbin(). by anntzer · Pull Request #21352 · matplotlib/matplotlib · GitHub
Skip to content

Refactor hexbin(). - #21352

Merged
jklymak merged 1 commit into
matplotlib:mainfrom
anntzer:hexbin
Feb 1, 2022
Merged

jklymak merged 1 commit into
matplotlib:mainfrom
anntzer:hexbin

Conversation

@anntzer

@anntzer anntzer commented Oct 14, 2021

Copy link
Copy Markdown
Contributor
  • Avoid having to copy() x and y, by not overwriting the original
    x and y variables but instead storing the transformed values in
    trfx/trfy.
  • Directly construct lattice1 and lattice2 as flat arrays (they are
    flattened at the end anyways), which allows using flat indices:
    the C is None case, becomes a simple bincount, the C is not None
    case can use a list-of-lists instead of an object array.
  • Factor out the x/y marginals handling into a for-loop, which
    additionally allows inlining coarse_bin.
  • Make the factor of 2 between nx and ny clearer (in the for zname...
    loop setup). (See also [Bug]: Hexbin gridsize interpreted differently for x and y #21349 (comment).)
  • Construct marginals verts in a vectorized fashion.

Even if we decide to ultimately deprecate marginals, this should help with converting them to a reusable examples entry.

PR Summary

PR Checklist

  • Has pytest style unit tests (and pytest passes).
  • Is Flake 8 compliant (run flake8 on changed files to check).
  • New features are documented, with examples if plot related.
  • Documentation is sphinx and numpydoc compliant (the docs should build without error).
  • Conforms to Matplotlib style conventions (install flake8-docstrings and run flake8 --docstring-convention=all).
  • New features have an entry in doc/users/next_whats_new/ (follow instructions in README.rst there).
  • API changes documented in doc/api/next_api_changes/ (follow instructions in README.rst there).

@jklymak

jklymak commented Oct 14, 2021

Copy link
Copy Markdown
Member

@anntzer

anntzer commented Oct 14, 2021

Copy link
Copy Markdown
Contributor Author

I'm not claiming it is expected (my quick guess is that it isn't), I'm just saying that the current implementation has nbins = nx in one place and nbins = 2 * ny in another, and this refactor shows that more clearly.

@anntzer
anntzer force-pushed the hexbin branch 2 times, most recently from 5441bf6 to 50d6db0 Compare October 14, 2021 10:17
@timhoffm

timhoffm commented Oct 14, 2021

Copy link
Copy Markdown
Member

Avoid having to copy() x and y, by not overwriting the original
x and y variables but instead storing the transformed values in
trfx/trfy.

I find the names trfx/trfy not quite helpful. They are longish compared to x/y but still don't read well. Alternatives:

  • Use tx / ty or x_/y_ as minimal extensions to clarify that it's not x/y itself.
  • Do the copy on demand if you need to log the values.

@anntzer

anntzer commented Oct 14, 2021

Copy link
Copy Markdown
Contributor Author

@timhoffm timhoffm 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.

This only a partial review. There's possibly more, but I didn't have the time to dig into the algorithm yet.

Comment thread lib/matplotlib/axes/_axes.py
Comment thread lib/matplotlib/axes/_axes.py Outdated
Comment thread lib/matplotlib/axes/_axes.py
Comment thread lib/matplotlib/axes/_axes.py Outdated
Comment thread lib/matplotlib/axes/_axes.py Outdated
Comment thread lib/matplotlib/axes/_axes.py Outdated
Comment thread lib/matplotlib/axes/_axes.py Outdated
Comment thread lib/matplotlib/axes/_axes.py Outdated
- Avoid having to copy() `x` and `y`, by not overwriting the original
  `x` and `y` variables but instead storing the transformed values in
  `trfx`/`trfy`.
- Directly construct lattice1 and lattice2 as flat arrays (they are
  flattened at the end anyways), which allows using flat indices:
  the `C is None` case, becomes a simple `bincount`, the `C is not None`
  case can use a list-of-lists instead of an object array.
- Factor out the x/y marginals handling into a for-loop, which
  additionally allows inlining coarse_bin.
- Make the factor of 2 between nx and ny clearer (in the `for zname...`
  loop setup).
- Construct marginals `verts` in a vectorized fashion.

@jklymak jklymak 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.

I'm not sure we needed this refactor - I'd have preferred something that made the whole thing clearer, but...

@jklymak
jklymak merged commit 3331777 into matplotlib:main Feb 1, 2022
@anntzer
anntzer deleted the hexbin branch February 1, 2022 12:03
@QuLogic QuLogic added this to the v3.6.0 milestone Feb 2, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants