매트플롯립으로 선을 긋는 방법은?
로 임의의 선을 긋는 방법을 찾을 수 없습니다.matplotlib
Python 라이브러리.가로선과 세로선을 그릴 수 있습니다.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()
![](https://i.stack.imgur.com/D2m6M.png)
솔루션 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
'prosource' 카테고리의 다른 글
wpf ComboBox DisplayMemberPath, SelectedValue 및 SelectedValuePath와 혼동됨 (0) | 2023.05.28 |
---|---|
판다 날짜를 주 번호로 변환 (0) | 2023.05.28 |
App.settings - Angular way? (0) | 2023.05.28 |
마이크로소프트.Windows Azure.스토리지 대 마이크로소프트.Windows Azure.스토리지 클라이언트 (0) | 2023.05.28 |
python.logging 모듈을 사용하여 기존의 모든 로거를 나열하는 방법 (0) | 2023.05.28 |