共享不同标签的点列表中的相图

时间:2019-05-10 12:16:08

标签: python matplotlib

我有两个列表xy,例如,对应于两个参数的可能值

x=[1.,1.,1.,2.,2.,2.,3.,3.,3.]
y=[1.,2.,3.,1.,2.,3.,1.,2.,3.]

我还有一个列表l,为每个点(x[i],y[i])提供了一个标签,其中i0len(x)-1之间的整数。假设每个点可以具有3个标签之一:

l=[2,3,3,1,1,2,3,1,2]

在此示例中,点(1.,1.)具有标签2,点(1.,2.)具有标签3,依此类推。

我需要制作一个相位图xy,其中带有相同标签的点周围的区域将具有精确的颜色。例如,仅包含点(x[j],y[j])的区域,使得所有l[j]=1的{​​{1}}应该是绿色,而j的应该是红色,l[j]=2应该是蓝色。

不包含点的那些区域的颜色是任意的,但是不同区域之间的边界应尽可能平滑。

1 个答案:

答案 0 :(得分:2)

您需要scipy.spatial.ConvexHullmatplotlib.patches.Polygonmatplotlib.collections.PatchCollection

# create data frame for better handling data
df = pd.DataFrame({'x':x, 'y':y, 'l':l})

fig, ax = plt.subplots()

# containing hulls and colors to plot
hulls = []
colors = []
for i in set(l):
    hull = ConvexHull(df.loc[df.l==i, ['x','y']]).points
    hulls.append(Polygon(hull))
    colors.append(i)

# create patches collection and set color
p = PatchCollection(hulls, alpha=0.4)
p.set_array(np.array(colors))

ax.add_collection(p)

ax.scatter(df.x,df.y)

plt.show()

输出:

enter image description here