加入散点图中的点

时间:2017-12-14 06:12:06

标签: matplotlib

我有一个几乎看起来像圆圈的散点图。我想用一条线加入外部点,以显示几乎像形状一样的圆形。有没有办法在matplotlib中做到这一点?

1 个答案:

答案 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()

结果如下:

result of the given code

修改

实际上,您可以跳过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中有一个与我的相似的例子。