prosource

매트플롯립으로 선을 긋는 방법은?

probook 2023. 5. 28. 20:53
반응형

매트플롯립으로 선을 긋는 방법은?

로 임의의 선을 긋는 방법을 찾을 수 없습니다.matplotlibPython 라이브러리.가로선과 세로선을 그릴 수 있습니다.matplotlib.pyplot.axhline그리고.matplotlib.pyplot.axvline예를 들어), 하지만 나는 두 개의 주어진 점을 통해 선을 긋는 방법을 보지 못합니다.(x1, y1)그리고.(x2, y2)방법이 있습니까?간단한 방법이 있습니까?

이렇게 하면 점(-1, 1)과 (12, 4)을 통과하는 선이 그려지고, 점(1, 3)과 (10, 2)을 통과하는 다른 선이 그려집니다.

x1은 첫 번째 선에 대한 점의 x 좌표이고, y1은 동일한 점에 대한 점 좌표입니다. x1과 y1의 요소는 순서대로 있어야 합니다.

x2와 y2는 다른 선에서 동일합니다.

import matplotlib.pyplot as plt
x1, y1 = [-1, 12], [1, 4]
x2, y2 = [1, 10], [3, 2]
plt.plot(x1, y1, x2, y2, marker = 'o')
plt.show()

여기에 이미지 설명 입력

도서관에 익숙해지려면 아주 풍부한 matplotlib 웹사이트에서 찾을 수 있는 기본적인 튜토리얼을 읽고 공부하는 데 시간을 할애할 것을 제안합니다.

라인 세그먼트를 원하지 않으면 어떻게 합니까?


[편집]:

@thomaskeeef가 보여준 것처럼 matplotlib 3.3부터 시작하여 이제 편의성을 위해 내장되었습니다.plt.axline((x1, y1), (x2, y2))다음 항목을 더 이상 사용하지 않습니다.


선을 무한대로 확장하는 직접적인 방법은 없습니다... matplotlib은 가장 먼 점이 경계와 다른 점 내부에 있도록 플롯의 크기를 조정/크기 조정하여 선 세그먼트를 효과적으로 그리거나, 표시할 지표면의 경계 밖에 있는 점을 선택하고 x 및 y 축에 대한 한계를 설정해야 합니다.

다음과 같습니다.

import matplotlib.pyplot as plt
x1, y1 = [-1, 12], [1, 10]
x2, y2 = [-1, 10], [3, -1]
plt.xlim(0, 8), plt.ylim(-2, 8)
plt.plot(x1, y1, x2, y2, marker = 'o')
plt.show()

여기에 이미지 설명 입력

matplotlib 3.3부터는 로 이 작업을 수행할 수 있습니다.

저는 ax.axvline이 어떻게 작동하는지 확인하고 있었고, 아이디어의 일부와 유사한 작은 함수를 작성했습니다.

import matplotlib.pyplot as plt
import matplotlib.lines as mlines

def newline(p1, p2):
    ax = plt.gca()
    xmin, xmax = ax.get_xbound()

    if(p2[0] == p1[0]):
        xmin = xmax = p1[0]
        ymin, ymax = ax.get_ybound()
    else:
        ymax = p1[1]+(p2[1]-p1[1])/(p2[0]-p1[0])*(xmax-p1[0])
        ymin = p1[1]+(p2[1]-p1[1])/(p2[0]-p1[0])*(xmin-p1[0])

    l = mlines.Line2D([xmin,xmax], [ymin,ymax])
    ax.add_line(l)
    return l

따라서 다음 코드를 실행하면 어떻게 작동하는지 알 수 있습니다.선은 그림의 전체 범위에 걸쳐 있으며(그 크기에 관계없이) 선의 생성은 축 내의 데이터 점에 의존하지 않고 지정해야 하는 두 개의 고정 점에만 의존합니다.

import numpy as np
x = np.linspace(0,10)
y = x**2

p1 = [1,20]
p2 = [6,70]

plt.plot(x, y)
newline(p1,p2)
plt.show()

여기에 이미지 설명 입력

여기서 다른 옵션을 언급하고 싶습니다.

numpy를 사용하여 계수를 계산할 수 있습니다.polyfit(다중 적합)을 선택하고 계수를 numpy에 공급합니다.폴리1d().이 함수는 계수를 사용하여 다항식을 구성할 수 있습니다. 여기에서 더 많은 예제를 찾을 수 있습니다.

https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.poly1d.html

두 개의 데이터 점(-0.3, -0.5)과 (0.8, 0.8)이 주어졌다고 가정해 보겠습니다.

import numpy as np
import matplotlib.pyplot as plt

# compute coefficients
coefficients = np.polyfit([-0.3, 0.8], [-0.5, 0.8], 1) 

# create a polynomial object with the coefficients
polynomial = np.poly1d(coefficients)

# for the line to extend beyond the two points, 
# create the linespace using the min and max of the x_lim
# I'm using -1 and 1 here
x_axis = np.linspace(-1, 1)

# compute the y for each x using the polynomial
y_axis = polynomial(x_axis)

fig = plt.figure()
axes = fig.add_axes([0.1, 0.1, 1, 1])
axes.set_xlim(-1, 1)
axes.set_ylim(-1, 1)
axes.plot(x_axis, y_axis)
axes.plot(-0.3, -0.5, 0.8, 0.8, marker='o', color='red')

여기에 이미지 설명 입력

도움이 되길 바랍니다.

만약 누군가가 한 번에 많은 부분을 계획하려고 여기에 도착한다면, 여기에 방법이 있습니다.세그먼트가 길이가 같은 두 개의 2-D 배열로 정의된다고 가정합니다.a그리고.b각 세그먼트 사이에 세그먼트를 표시합니다.a[i]그리고.b[i] 경우이:

솔루션 1

ab_pairs = np.c_[a, b]
plt_args = ab_pairs.reshape(-1, 2, 2).swapaxes(1, 2).reshape(-1, 2)
ax.plot(*plt_args, ...)

예:

np.random.seed(0)
n = 32
a = np.random.uniform(0, 1, (n, 2))
b = np.random.uniform(0, 1, (n, 2))

fig, ax = plt.subplots(figsize=(3, 3))
ab_pairs = np.c_[a, b]
ab_args = ab_pairs.reshape(-1, 2, 2).swapaxes(1, 2).reshape(-1, 2)

# segments
ax.plot(*ab_args, c='k')

# identify points: a in blue, b in red
ax.plot(*a.T, 'bo')
ax.plot(*b.T, 'ro')
plt.show()

솔루션 2

위의 것들은 많은 것들을 만듭니다.matplotlib.lines.Line2D단 한 줄이라도 원하시면 인터리빙으로 가능합니다.NaN:쌍 사이:쌍 사이:

ax.plot(*np.c_[a, b, a*np.nan].reshape(-1, 2).T, ...)

예:

# same init as example above, then

fig, ax = plt.subplots(figsize=(3, 3))

# segments (all at once)
ax.plot(*np.c_[a, b, a*np.nan].reshape(-1, 2).T, 'k')

# identify points: a in blue, b in red
ax.plot(*a.T, 'bo')
ax.plot(*b.T, 'ro')
plt.show()

(위 그림과 동일).

@Alejandro의 대답을 기반으로 합니다.

  • 의 기에라추가에 ,Axes (변수: 산및) 예
  • 원하는 선의 기울기와 절편(예: 회귀선)만 알고 있습니다.
  • 전체 가시적인 X 범위(이미 계산됨)를 포함하려고 합니다.
  • 객체 지향 인터페이스를 사용하려는 경우(사용하지 않음)pyplot).

그러면 이 작업을 수행할 수 있습니다(기존 Axes in).ax):

# e.g. slope, intercept, r_value, p_value, std_err = scipy.stats.linregress(xs, ys)
xmin, xmax = ax.get_xbound()
ymin = (xmin * slope) + intercept
ymax = (xmax * slope) + intercept
l = matplotlib.lines.Line2D([xmin, xmax], [ymin, ymax])
ax.add_line(l)

언급URL : https://stackoverflow.com/questions/36470343/how-to-draw-a-line-with-matplotlib

반응형