我有两个列表x
和y
,例如,对应于两个参数的可能值
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])
提供了一个标签,其中i
是0
和len(x)-1
之间的整数。假设每个点可以具有3个标签之一:
l=[2,3,3,1,1,2,3,1,2]
在此示例中,点(1.,1.)
具有标签2
,点(1.,2.)
具有标签3
,依此类推。
我需要制作一个相位图x
与y
,其中带有相同标签的点周围的区域将具有精确的颜色。例如,仅包含点(x[j],y[j])
的区域,使得所有l[j]=1
的{{1}}应该是绿色,而j
的应该是红色,l[j]=2
应该是蓝色。
不包含点的那些区域的颜色是任意的,但是不同区域之间的边界应尽可能平滑。
答案 0 :(得分:2)
您需要scipy.spatial.ConvexHull
,matplotlib.patches.Polygon
和matplotlib.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()
输出: