Matplotlib Axes have the functions axhline
and axvline
for drawing horizontal or vertical lines at a given y or x coordinate (respectively) indepen
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()