如何平滑多边形点之间的线?
How to smooth line between polygon points?
我想通过我的散点画一条平滑的线。椭圆不合适,所以我画了一个多边形,但我不能用多边形得到平滑的线条。我也试过 PathPatch,但那样的话这条线就不会通过这些点。有什么办法强制PathPatch过点吗?
我添加了一个示例,希望能说明我正在尝试做的事情。我不要黑线的硬边。
from matplotlib import pyplot as plt
from matplotlib.patches import Ellipse, Polygon
ax = plt.subplot()
ax.set_aspect("equal")
ax.add_artist(Ellipse((0, 0), 10, 5, fill=False, color='green'))
plt.scatter([5, -6, 0, 0], [0, 0, 2.5, -4], marker='X')
ax.add_artist(Polygon([[5, 0], [0, 2.5], [-6, 0], [0, -4]], closed=True, fill=False))
plt.xlim((-6, 6))
plt.ylim((-6, 6))
plt.show()
如 , you can use a closed spline to interpolate your data points, for this purpose you can use scipy.interpolate.splprep
and scipy.interpolate.splev
中所述。
您首先需要将 x
和 y
的第一个元素附加到末尾以关闭样条曲线。
import matplotlib.pyplot as plt
from scipy.interpolate import splprep, splev
import numpy as np
x = [0, 5, 0, -6]
y = [-4, 0, 2, 0]
x.append(x[0])
y.append(y[0])
tck, _ = splprep([x, y], s = 0, per = True)
xx, yy = splev(np.linspace(0, 1, 100), tck, der = 0)
fig, ax = plt.subplots()
ax.scatter(x, y, marker = 'X')
ax.plot(xx, yy, 'green')
plt.show()
我想通过我的散点画一条平滑的线。椭圆不合适,所以我画了一个多边形,但我不能用多边形得到平滑的线条。我也试过 PathPatch,但那样的话这条线就不会通过这些点。有什么办法强制PathPatch过点吗?
我添加了一个示例,希望能说明我正在尝试做的事情。我不要黑线的硬边。
from matplotlib import pyplot as plt
from matplotlib.patches import Ellipse, Polygon
ax = plt.subplot()
ax.set_aspect("equal")
ax.add_artist(Ellipse((0, 0), 10, 5, fill=False, color='green'))
plt.scatter([5, -6, 0, 0], [0, 0, 2.5, -4], marker='X')
ax.add_artist(Polygon([[5, 0], [0, 2.5], [-6, 0], [0, -4]], closed=True, fill=False))
plt.xlim((-6, 6))
plt.ylim((-6, 6))
plt.show()
如 scipy.interpolate.splprep
and scipy.interpolate.splev
中所述。
您首先需要将 x
和 y
的第一个元素附加到末尾以关闭样条曲线。
import matplotlib.pyplot as plt
from scipy.interpolate import splprep, splev
import numpy as np
x = [0, 5, 0, -6]
y = [-4, 0, 2, 0]
x.append(x[0])
y.append(y[0])
tck, _ = splprep([x, y], s = 0, per = True)
xx, yy = splev(np.linspace(0, 1, 100), tck, der = 0)
fig, ax = plt.subplots()
ax.scatter(x, y, marker = 'X')
ax.plot(xx, yy, 'green')
plt.show()