Skip to content

Add Axes method for drawing infinite lines #9321

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

Closed
wants to merge 2 commits into from

Conversation

dstansby
Copy link
Member

@dstansby dstansby commented Oct 8, 2017

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
Copy link
Contributor

anntzer commented Oct 8, 2017

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

@dstansby
Copy link
Member Author

dstansby commented Dec 9, 2017

Hmm, I can't reproduce the test failure

@QuLogic
Copy link
Member

QuLogic commented Dec 9, 2017

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
Copy link

syrte commented Jan 19, 2018

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

@dstansby
Copy link
Member Author

🎉 it works!

@tacaswell
Copy link
Member

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

@QuLogic
Copy link
Member

QuLogic commented Jan 11, 2019

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

@NelleV
Copy link
Member

NelleV commented Jan 18, 2019

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

@NelleV
Copy link
Member

NelleV commented Jan 18, 2019

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
Copy link
Member

NelleV commented Jan 18, 2019

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
Member Author

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

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

Copy link
Member

@timhoffm timhoffm left a comment

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.

@anntzer
Copy link
Contributor

anntzer commented Feb 24, 2019

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
Copy link
Member Author

dstansby commented Mar 7, 2019

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
Copy link
Contributor

anntzer commented Mar 7, 2019

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
Copy link
Member

QuLogic commented Nov 22, 2019

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