在matplotlib坐标轴范围内添加x=y(45度)线

11 投票
3 回答
35568 浏览
提问于 2025-04-18 15:54

我有一个图表,x轴和y轴的范围不一样:

fig, ax = subplots(ncols=1)
ax.set_xlim([0, 10])
ax.set_ylim([5, 10])

我想在这个图表上加一条 x=y 的线,但希望这条线能保持在坐标轴的范围内。

我第一次尝试的方法很简单,就是这样:

ax.plot(ax.get_xlim(), ax.get_xlim())

第一次简单尝试

虽然我改进后的尝试可以实现,但代码看起来非常糟糕:

ax.plot([max(ax.get_xlim()[0], ax.get_ylim()[0]), 
         min(ax.get_xlim()[1], ax.get_ylim()[1])],
        [max(ax.get_xlim()[0], ax.get_ylim()[0]), 
         min(ax.get_xlim()[1], ax.get_ylim()[1])])

改进后的尝试

有没有更好的方法呢? 我在 Spyder 2.2.5 中使用 IPython 版本 1.2.1,并且使用的 Matplotlib 版本是 1.3.1,运行 mpl.get_backend() 返回:

'module://IPython.kernel.zmq.pylab.backend_inline'

3 个回答

3

另一种方法。

xpoints = ypoints = plt.xlim()
plt.plot(xpoints, ypoints, linestyle='--', color='k', lw=3, scalex=False, scaley=False)

来源

7

如果 0 <= X <= 10 <= Y <= 1,那么这个方法对我有效:

import matplotlib.pyplot as plt

plt.scatter(X, Y)
plt.plot([0, 1], [0, 1], color = 'black', linewidth = 2)
plt.xlim(-0.05, 1.05)
plt.ylim(-0.05, 1.05)

当然,你可以根据需要调整这些限制。

33

在 matplotlib 版本小于等于 3.2 时

x = np.linspace(*ax.get_xlim())
ax.plot(x, x)

在 matplotlib 版本大于等于 3.3 时

matplotlib 3.3 新增了一个叫 ax.axline 的功能,这个功能可以更好地完成这个任务,并且在你改变坐标轴的范围时仍然可以正常工作:

ax.axline([0, 0], [1, 1])

撰写回答