Does matplotlib have a function for drawing diagonal lines in axis coordinates?

后端 未结 4 2086
生来不讨喜
生来不讨喜 2020-12-28 12:55

Matplotlib Axes have the functions axhline and axvline for drawing horizontal or vertical lines at a given y or x coordinate (respectively) indepen

4条回答
  •  情话喂你
    2020-12-28 13:23

    Drawing a diagonal from the lower left to the upper right corners of your plot would be accomplished by the following

    ax.plot([0, 1], [0, 1], transform=ax.transAxes)

    Using transform=ax.transAxes, the supplied x and y coordinates are interpreted as axes coordinates instead of data coordinates.

    This, as @fqq pointed out, is only the identity line when your x and y limits are equal. To draw the line y=x such that it always extends to the limits of your plot, an approach similar to the one given by @Ffisegydd would work, and can be written as the following function.

    def add_identity(axes, *line_args, **line_kwargs):
        identity, = axes.plot([], [], *line_args, **line_kwargs)
        def callback(axes):
            low_x, high_x = axes.get_xlim()
            low_y, high_y = axes.get_ylim()
            low = max(low_x, low_y)
            high = min(high_x, high_y)
            identity.set_data([low, high], [low, high])
        callback(axes)
        axes.callbacks.connect('xlim_changed', callback)
        axes.callbacks.connect('ylim_changed', callback)
        return axes
    

    Example usage:

    import numpy as np
    import matplotlib.pyplot as plt
    
    mean, cov = [0, 0], [(1, .6), (.6, 1)]
    x, y = np.random.multivariate_normal(mean, cov, 100).T
    y += x + 1
    
    f, ax = plt.subplots(figsize=(6, 6))
    ax.scatter(x, y, c=".3")
    add_identity(ax, color='r', ls='--')
    
    plt.show()
    

提交回复
热议问题