Skip to content

Add Axes method for drawing infinite lines#9321

Closed
dstansby wants to merge 2 commits into
matplotlib:masterfrom
dstansby:abline
Closed

Add Axes method for drawing infinite lines#9321
dstansby wants to merge 2 commits into
matplotlib:masterfrom
dstansby:abline

Conversation

@dstansby

@dstansby dstansby commented Oct 8, 2017

Copy link
Copy Markdown
Member

Supersedes #7506 - cleans up docstring and adds a test. Fixes #5253.

@dstansby dstansby added this to the 2.2 (next feature release) milestone Oct 8, 2017
@anntzer

anntzer commented Oct 8, 2017

Copy link
Copy Markdown
Contributor

Can you document how this interacts with semilog and loglog plots? (Even if it is "it doesn't work with them".)

@dstansby

dstansby commented Dec 9, 2017

Copy link
Copy Markdown
Member Author

Hmm, I can't reproduce the test failure

@QuLogic

QuLogic commented Dec 9, 2017

Copy link
Copy Markdown
Member

You can download the results from AppVeyor:
axline-failed-diff
Wrong version of FreeType used for test?

@dstansby dstansby modified the milestones: v2.2, v3.0 Jan 10, 2018
@syrte

syrte commented Jan 19, 2018

Copy link
Copy Markdown

@anntzer I've tried this code, it seems not support any type of log scale yet.

@dstansby

Copy link
Copy Markdown
Member Author

🎉 it works!

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/tests/test_axes.py Outdated
Comment thread lib/matplotlib/axes/_axes.py Outdated
Comment thread lib/matplotlib/axes/_axes.py Outdated
@tacaswell

Copy link
Copy Markdown
Member

what happens if we make it non-linear scale after calling axline?

@QuLogic

QuLogic commented Jan 11, 2019

Copy link
Copy Markdown
Member

Then you end up with a line that's incorrect in the same way as if it were set beforehand.

@NelleV

NelleV commented Jan 18, 2019

Copy link
Copy Markdown
Member

Can we refactor axhline and axvline as special cases of this function?

@NelleV

NelleV commented Jan 18, 2019

Copy link
Copy Markdown
Member

I also think we should add a what's new entry, and update the following example with this new function: https://matplotlib.org/devdocs/gallery/subplots_axes_and_figures/axhspan_demo.html#sphx-glr-gallery-subplots-axes-and-figures-axhspan-demo-py

thanks!

@NelleV

NelleV commented Jan 18, 2019

Copy link
Copy Markdown
Member

Reading axhline's and axvline's code, I see that it's not trivial (I do have to say that it's a bit annoying to have such closely related functions with slightly different APIs)

@dstansby

Copy link
Copy Markdown
Member Author

Okay I've done a big 'ol rebase and squash, and this now uses xy1 and xy2.

Comment thread lib/matplotlib/axes/_axes.py Outdated
Comment thread lib/matplotlib/axes/_axes.py Outdated
Comment thread lib/matplotlib/axes/_axes.py
Clean up axline

Add axline image test

Fix test image

Add what's new

Add note about log axes

Error if trying to draw line on non-linear axes

Fix scale checking

Fix docstring interpolation

Chnage to using xy1, xy2

Fix docs and closeness checking

Raise error if points are the same

Swap axline test to image comparison
@dstansby

Copy link
Copy Markdown
Member Author

I think that's all the comments taken care of, so feel free to review again. I've squashed everything into one commit, so there's no extra test image files hanging around any more.

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

Please add axline to the section „Span“ in axes_api.rst.

Comment thread doc/users/next_whats_new/2017-12-08-axline.rst Outdated
Comment thread lib/matplotlib/axes/_axes.py Outdated
Comment thread lib/matplotlib/axes/_axes.py
@anntzer

anntzer commented Feb 24, 2019

Copy link
Copy Markdown
Contributor

I just noticed another point: Currently, axline() does not trigger an update of the autolimits in use (for example a call to axline() when the view limits are x=0..1, y=0..1 leaves them unchanged); however, adding more plots after a call to axline() shows that the internal data limits have been changed by axline to include x=0..1, y=(whatever y range corresponds to x=0..1 in the axline). For example, after plt.gca().axline((3, 7), (5, 6)); plt.plot([0, 1]), one gets
test

I think reasonable approaches would be to use the two points passed to axline() as "autoscaling limits", or to just not update the autoscale limits at all (the relevant code appears to be in Axes._update_line_limits, which is called by Axes.add_line).

@dstansby

dstansby commented Mar 7, 2019

Copy link
Copy Markdown
Member Author

I agree that not setting auto-limits is a good idea, but after a bit of a play around I'm not sure what the right way to do that is. Is there an easy way to exclude an Artist from autoscale calculations?

@anntzer

anntzer commented Mar 7, 2019

Copy link
Copy Markdown
Contributor

This was discussed a while ago and there isn't really a smart way to do it; what I personally do is

@contextmanager
def ignore_in_autoscale(ax):
    """
    When autoscaling, ignore the extents of artists created in the context.
    """
    dl = ax.dataLim.frozen()
    try:
        yield
    finally:
        ax.dataLim = dl
        ax.autoscale_view(scalex=ax.get_autoscalex_on(),
                          scaley=ax.get_autoscaley_on())

(basically, save the datalimits first, add the artist, then restore the datalimits), which is a bit of a hack.

@QuLogic

QuLogic commented Nov 22, 2019

Copy link
Copy Markdown
Member

Replaced by #15330.

@QuLogic QuLogic closed this Nov 22, 2019
@dstansby dstansby deleted the abline branch November 26, 2019 15:41
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.

abline() - for drawing arbitrary lines on a plot, given specifications.

8 participants