Python matplotlib是否具有在轴坐标中绘制对角线的功能?

Python matplotlib是否具有在轴坐标中绘制对角线的功能?,python,numpy,matplotlib,Python,Numpy,Matplotlib,Matplotlib轴具有功能axhline和axvline,用于在给定的y或x坐标(分别)处绘制水平线或垂直线,与轴上的数据比例无关 是否有类似的函数用于绘制常数对角线?例如,如果我有一个具有类似域的变量散点图,了解它们是落在y=x行的上方还是下方通常很有用: mean, cov = [0, 0], [(1, .6), (.6, 1)] x, y = np.random.multivariate_normal(mean, cov, 100).T y += x + 1 f, ax = plt.s

Matplotlib轴具有功能
axhline
axvline
,用于在给定的y或x坐标(分别)处绘制水平线或垂直线,与轴上的数据比例无关

是否有类似的函数用于绘制常数对角线?例如,如果我有一个具有类似域的变量散点图,了解它们是落在
y=x
行的上方还是下方通常很有用:

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")
ax.plot([-3, 3], [-3, 3], ls="--", c=".3")
ax.set(xlim=(-3, 3), ylim=(-3, 3))

当然,可以通过编程方式获取轴限制(
ax.get_xlim()
等),但a)需要额外的步骤,b)在更多数据可能出现在绘图上并改变限制的情况下很脆弱。(实际上,在某些情况下,只需添加常量线本身即可拉伸轴)


最好只是这样做,例如,
ax.axdline(ls=“--”,c=“.3”)
,但不清楚matplotlib代码库中是否存在类似的内容。我认为,您需要做的就是修改
axhline
代码,以便在
x
y
的轴坐标中从
[0,1]
绘制
x和
y

绘制屏幕左下到右上的对角线非常简单,您只需使用
ax.plot(ax.get\xlu im()、ax.get\ylim()、ls=“-”,c=“.3”)
。方法
ax.get_xlim()
将只返回x轴的当前值(与y轴类似)

但是,如果希望能够使用图形进行缩放,则会变得稍微复杂一些,因为绘制的对角线不会更改以匹配新的XLIM和YLIM

在这种情况下,您可以使用回调来检查XLIM(或YLIM)是否已更改,并相应地更改对角线中的数据(如下所示)。我在中找到了回调的方法。还可以找到更多信息


请注意,如果您不希望对角线随着缩放而改变,则只需删除对角线下方的所有内容,=ax.plot(…

从绘图的左下角到右上角绘制对角线将通过以下步骤完成

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

使用
transform=ax.transAxes
,将提供的
x
y
坐标解释为轴坐标,而不是数据坐标

正如@fqq所指出的,只有当
x
y
限制相等时,这才是标识线。要绘制线
y=x
,使其始终延伸到绘图的限制,与@Ffisegydd给出的方法类似的方法可以工作,并且可以编写为以下函数

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
用法示例:

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

如果轴在范围
[0,1]
内,可通过以下方式解决:

ident = [0.0, 1.0]
plt.plot(ident,ident)

从matplotlib 3.3.0开始,它将:

axis.axline(self、xy1、xy2=None、*、slope=None、**kwargs)添加一个 无限长的直线

直线可以由两点xy1和xy2定义,也可以由一个点定义 点xy1和坡度

这将在“屏幕上”绘制一条直线,而不考虑x和y 缩放,因此也适用于绘制中的指数衰减 半对数图、对数图中的幂律等。但是,斜率应 只能与线性刻度一起使用;它对所有其他刻度没有明确的意义 缩放,因此行为未定义。请指定行 将点xy1、xy2用于非线性比例


抱歉,我了解如何通过编程实现这一点,我只是想知道matplotlib中是否有什么东西可以省去获取限制等的麻烦,这些限制很脆弱,因为它们可能会改变。我不太担心交互式缩放,只是一般来说,数据限制会随着数据添加到绘图中而改变,或者如果您想添加对角线独立于您将要绘制的任何其他数据。我将编辑我的问题以使其更清楚。请注意,对角线不仅会在交互式缩放时改变,而且会在您将数据添加到绘图并通过(例如,
ax.set\u xlim(a,b)
进行更改时改变。我不明白您的意思。”我的答案是,每当他们改变对角线时,都会将其考虑在内。明白了。回调提示很有用。我的意思是只使用
get\u xlim()
get\u ylim()
在初始绘制时间。这并没有绘制OP要求的y=x线。这是正确的,正如我在回答中所述,它从绘图的左下角到右上角绘制了一条线。我正在讨论是否要包括一条警告,即您仍然必须确保绘图的x和y限制相等。我认为这是错误的如果正在绘制标识线,请使用良好的实践设置相等的x和y限制。请参阅。我认为这可能是您想要的。Matplotlib在3.3.0中可能会有此功能:
ax.axline((1,1),slope=1)
我应该这样做,但这不起作用。我得到一个attributeError:“AxeSubPlot”对象没有属性“axline”。如果我在稍微不同的设置中尝试,我会得到:attributeError:moule“matplotlib.pyplot”没有属性“axline”。我在这两种设置中使用hline和vline都没有问题。
ident = [0.0, 1.0]
plt.plot(ident,ident)