如何通过散点图在n上画直线

2024-10-07 16:25:49 发布

您现在位置:Python中文网/ 问答频道 /正文

因此,我目前正在绘制一个散点图,在matplotlib中有许多xy

plt.scatter(x, y)

我想在这个散点图上画一条横穿整个图的线(即碰到两个“边界”),我知道梯度和截距-m和方程c中的y = mx +c。在

我曾考虑过获取绘图的4个点(计算最小和最大散射x和{})并从中计算出直线的最小和最大坐标,然后绘制,但这似乎非常复杂。有没有更好的方法来做到这一点,牢记线可能甚至不'在'内'的'情节'?在


散点图示例: enter image description here

如图中所示,四个边界坐标如下:

  • 左下:-1,-2
  • 左上:-1,2
  • 右下:6,-2
  • 右上6,2

我现在有一条线,我需要绘制,不能超过这些边界,但如果它进入绘图必须触及两个边界点。在

所以我可以检查x=-1时y等于什么,然后检查这个值是否在-1和6之间,如果是,这条线必须穿过左边的边界,所以画出来,以此类推,以此类推。在


理想情况下,我会创建一条从-无限到无穷大的直线,然后裁剪它以适合情节。在


Tags: 方法绘图示例matplotlib绘制plt直线边界
2条回答

这里的想法是在图中画一条y=m*x+y0的线。这可以通过将最初以轴坐标表示的水平线转换为数据坐标,根据直线方程应用仿射2d变换并转换回屏幕坐标来实现。

这里的优点是你根本不需要知道轴的极限。您也可以自由缩放或平移绘图;直线将始终保持在轴边界内。因此,它有效地实现了从-infinity到+infinity的行。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.transforms as mtransforms

def axaline(m,y0, ax=None, **kwargs):
    if not ax:
        ax = plt.gca()
    tr = mtransforms.BboxTransformTo(
            mtransforms.TransformedBbox(ax.viewLim, ax.transScale))  + \
         ax.transScale.inverted()
    aff = mtransforms.Affine2D.from_values(1,m,0,0,0,y0)
    trinv = ax.transData
    line = plt.Line2D([0,1],[0,0],transform=tr+aff+trinv, **kwargs)
    ax.add_line(line)

x = np.random.rand(20)*6-0.7
y = (np.random.rand(20)-.5)*4
c = (x > 3).astype(int)

fig, ax = plt.subplots()
ax.scatter(x,y, c=c, cmap="bwr")

# draw y=m*x+y0 into the plot
m = 0.4; y0 = -1
axaline(m,y0, ax=ax, color="limegreen", linewidth=5)

plt.show()

enter image description here

虽然这个解决方案乍一看有点复杂,但不需要完全理解它。只需将axaline函数复制到代码中并按原样使用它。


为了在不需要转换的情况下进行自动更新,可以添加回调,这样每次绘图中发生变化时都会重置转换。 ^{pr2}$

您可以尝试:

import matplotlib.pyplot as plt
import numpy as np

m=3
c=-2
x1Data= np.random.normal(scale=2, loc=.4, size=25)
y1Data= np.random.normal(scale=3, loc=1.2, size=25)
x2Data= np.random.normal(scale=1, loc=3.4, size=25)
y2Data= np.random.normal(scale=.65, loc=-.2, size=25)

fig = plt.figure()
ax = fig.add_subplot( 1, 1, 1 )
ax.scatter(x1Data, y1Data)
ax.scatter(x2Data, y2Data)
ylim = ax.get_ylim()
xlim = ax.get_xlim()
ax.plot( xlim, [ m * x + c for x in xlim ], 'r:' )
ax.set_ylim( ylim )
ax.set_xlim( xlim )
plt.show()

它给出了:

enter image description here

相关问题 更多 >