我有一个几乎看起来像圆圈的散点图。我想用一条线加入外部点,以显示几乎像形状一样的圆形。有没有办法在matplotlib中做到这一点?
答案 0 :(得分:4)
您可以使用scipy.spatial
中的ConvexHull查找散点图的外部点,然后使用matplotlib.collections
中的PolyCollection连接这些点:
from matplotlib import pyplot as plt
import numpy as np
from scipy.spatial import ConvexHull
from matplotlib.collections import PolyCollection
fig, ax = plt.subplots()
length = 1000
#using some normally distributed data as example:
x = np.random.normal(0, 1, length)
y = np.random.normal(0, 1, length)
points = np.concatenate([x,y]).reshape((2,length)).T
hull = ConvexHull(points)
ax.scatter(x,y)
ax.add_collection(PolyCollection(
[points[hull.vertices,:]],
edgecolors='r',
facecolors='w',
linewidths=2,
zorder=-1,
))
plt.show()
结果如下:
修改强>
实际上,您可以跳过PolyCollection并使用船体顶点做一个简单的线图。您只需要通过将第一个顶点附加到顶点列表(使该列表中的一个元素更长)来使线变圆:
circular_hull_verts = np.append(hull.vertices,hull.vertices[0])
ax.plot(
x[circular_hull_verts], y[circular_hull_verts], 'r-', lw=2, zorder=-1,
)
编辑2 :
我注意到scipy documentation中有一个与我的相似的例子。