对于较大的 x/y 值,有没有办法在两点之间实现平滑曲线?
Is there a way to achieve a smooth curve between two points for larger x/y values?
我一直在尝试使用 Python 和 Matplotlib 在两点之间创建一条轻微的曲线。我在这里找到了一种方法,它确实将曲线应用于两点之间的直线,但不是我 expected/was 希望的方式。下面是我目前用来绘制曲线的代码。
当前图表:
Currently what line looks like
所需图表:
Desired curved line
目前几乎是90度。角度,但我正在努力获得更均匀的曲线。对于较小的值,此解决方案似乎确实达到了预期的结果,但是当对 x/y 坐标使用较大的值时,这就是我所看到的。
p1 = [125, -203]
p2 = [49, -75]
plt.plot(p1[0], p1[1], marker="o", markersize=10, color="black", label="P1")
plt.plot(p2[0], p2[1], marker="o", markersize=10, color="red", label="P1")
plt.plot((p1[0], p2[0]),
(p1[1], p2[1]),
linewidth=5,
label="Straight line")
x, y = draw_curve(p1, p2)
plt.plot(x, y, linewidth=5, label="Curved line", color="orange")
plt.show()
def draw_curve(p1, p2):
a = (p2[1] - p1[1]) / (np.cosh(p2[0]) - np.cosh(p1[0]))
b = p1[1] - a * np.cosh(p1[0])
x = np.linspace(p1[0], p2[0], 100)
y = a * np.cosh(x) + b
return x, y
有无数种方法可以得出曲线。想出一条可以手动调整的曲线(“角度”)的一种方法是在您希望曲线通过的位置添加第三个点:
p1 = [125, -203]
p2 = [49, -75]
p3 = [90, -100] # the third point
plt.plot(p1[0], p1[1], marker="o", markersize=10, color="black", label="P1")
plt.plot(p2[0], p2[1], marker="o", markersize=10, color="red", label="P1")
plt.plot((p1[0], p2[0]),
(p1[1], p2[1]),
linewidth=5,
label="Straight line")
def draw_curve(p1, p2, p3):
f = np.poly1d(np.polyfit((p1[0], p2[0], p3[0]), (p1[1], p2[1], p3[1]), 2))
x = np.linspace(p1[0], p2[0], 100)
return x, f(x)
x, y = draw_curve(p1, p2, p3)
plt.plot(x, y, linewidth=5, label="Curved line", color="orange")
plt.show()
我一直在尝试使用 Python 和 Matplotlib 在两点之间创建一条轻微的曲线。我在这里找到了一种方法,它确实将曲线应用于两点之间的直线,但不是我 expected/was 希望的方式。下面是我目前用来绘制曲线的代码。
当前图表: Currently what line looks like
所需图表: Desired curved line
目前几乎是90度。角度,但我正在努力获得更均匀的曲线。对于较小的值,此解决方案似乎确实达到了预期的结果,但是当对 x/y 坐标使用较大的值时,这就是我所看到的。
p1 = [125, -203]
p2 = [49, -75]
plt.plot(p1[0], p1[1], marker="o", markersize=10, color="black", label="P1")
plt.plot(p2[0], p2[1], marker="o", markersize=10, color="red", label="P1")
plt.plot((p1[0], p2[0]),
(p1[1], p2[1]),
linewidth=5,
label="Straight line")
x, y = draw_curve(p1, p2)
plt.plot(x, y, linewidth=5, label="Curved line", color="orange")
plt.show()
def draw_curve(p1, p2):
a = (p2[1] - p1[1]) / (np.cosh(p2[0]) - np.cosh(p1[0]))
b = p1[1] - a * np.cosh(p1[0])
x = np.linspace(p1[0], p2[0], 100)
y = a * np.cosh(x) + b
return x, y
有无数种方法可以得出曲线。想出一条可以手动调整的曲线(“角度”)的一种方法是在您希望曲线通过的位置添加第三个点:
p1 = [125, -203]
p2 = [49, -75]
p3 = [90, -100] # the third point
plt.plot(p1[0], p1[1], marker="o", markersize=10, color="black", label="P1")
plt.plot(p2[0], p2[1], marker="o", markersize=10, color="red", label="P1")
plt.plot((p1[0], p2[0]),
(p1[1], p2[1]),
linewidth=5,
label="Straight line")
def draw_curve(p1, p2, p3):
f = np.poly1d(np.polyfit((p1[0], p2[0], p3[0]), (p1[1], p2[1], p3[1]), 2))
x = np.linspace(p1[0], p2[0], 100)
return x, f(x)
x, y = draw_curve(p1, p2, p3)
plt.plot(x, y, linewidth=5, label="Curved line", color="orange")
plt.show()