在matplotlib轴限制范围内添加x=y(45度)直线

11

我有一个图表,其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])])

enter image description here

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

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

2
使用你的“第一次,天真尝试”,我得到了想要的结果。我无法再x轴下方重现以下行。你使用的是哪个Matplotlib版本和后端?你是否尝试使用 ax.plot(ax.get_ylim(), ax.get_ylim()) - Matthew Rankin
这个可以运行:ax.plot(ax.get_ylim(), ax.get_ylim())。我的 mpl 版本存在某种奇怪的问题吗? - LondonRob
这是我正在使用的相同的Matplotlib版本和后端,所以我不确定发生了什么。您使用的IPython版本是多少? - Matthew Rankin
我已经更新了我的IPython版本并重新提交了问题。 - LondonRob
1
@LondonRob - 如果坐标轴的“可调整”样式设置为“datalim”,则您的第一个方法应该有效,否则不会。 为了使其在一般情况下工作,请尝试执行ax.plot(ax.get_xlim(),ax.get_ylim(),clip_on = True,scalex = False,scaley = False) - Joe Kington
显示剩余2条评论
3个回答

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])

这将产生与我的天真尝试相同的结果。请注意,我已更新了问题,并附上了我的matplotlib版本和后端详细信息。 - LondonRob
3
我认为matplotlib甚至不应该能够绘制超出轴范围的内容,你应该提交一个错误报告。 - MaxNoe
@MaxNoe - clip_on关键字参数控制这个。不知何故,他的设置中使用了clip_on=False作为默认值。 - Joe Kington
ax.axline([0, 0], [1, 1]) 没有起作用。请检查一下。 - Physkid

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)

您当然可以调整限制。

3

另一种方法。

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

Source


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接