python 等值面多边形平滑_在散点图的matplotlib中围绕数据点绘制平滑多边形

该博客介绍了如何在Python中计算等值面多边形的平滑过程,并利用matplotlib库在散点图上绘制平滑的多边形边界。通过提供一个示例代码,展示了从计算凸包到使用插值方法平滑多边形边界的完整流程。
摘要由CSDN通过智能技术生成

这里,你有一个例子。我写了主要的想法,但显然,你可以做得更好。

简短的解释:

2)使用外壳,您可以缩放它以将所有数据保存在内部。

3)必须对生成的曲线进行插值。

我希望它能帮助你。。。#Taken from http://wiki.scipy.org/Cookbook/Finding_Convex_Hull

import numpy as n, pylab as p, time

def _angle_to_point(point, centre):

'''calculate angle in 2-D between points and x axis'''

delta = point - centre

res = n.arctan(delta[1] / delta[0])

if delta[0] < 0:

res += n.pi

return res

def _draw_triangle(p1, p2, p3, **kwargs):

tmp = n.vstack((p1,p2,p3))

x,y = [x[0] for x in zip(tmp.transpose())]

p.fill(x,y, **kwargs)

def area_of_triangle(p1, p2, p3):

'''calculate area of any triangle given co-ordinates of the corners'''

return n.linalg.norm(n.cross((p2 - p1), (p3 - p1)))/2.

def convex_hull(points, graphic=False, smidgen=0.0075):

'''

Calculate subset of points that make a convex hull around points

Recursively eliminates points that lie inside two neighbouring points until only convex hull is remaining.

:Parameters:

points : ndarray (2 x m)

array of points for which to find hull

graphic : bool

use pylab to show progress?

smidgen : float

offset for graphic number labels - useful values depend on your data range

:Returns:

hull_points : ndarray (2 x n)

convex hull surrounding points

'''

if graphic:

p.clf()

p.plot(points[0], points[1], 'ro')

n_pts = points.shape[1]

assert(n_pts > 5)

centre = points.mean(1)

if graphic: p.plot((centre[0],),(centre[1],),'bo')

angles = n.apply_along_axis(_angle_to_point, 0, points, centre)

pts_ord = points[:,angles.argsort()]

if graphic:

for i in xrange(n_pts):

p.text(pts_ord[0,i] + smidgen, pts_ord[1,i] + smidgen, \

'%d' % i)

pts = [x[0] for x in zip(pts_ord.transpose())]

prev_pts = len(pts) + 1

k = 0

while prev_pts > n_pts:

prev_pts = n_pts

n_pts = len(pts)

if graphic: p.gca().patches = []

i = -2

while i < (n_pts - 2):

Aij = area_of_triangle(centre, pts[i], pts[(i + 1) % n_pts])

Ajk = area_of_triangle(centre, pts[(i + 1) % n_pts], \

pts[(i + 2) % n_pts])

Aik = area_of_triangle(centre, pts[i], pts[(i + 2) % n_pts])

if graphic:

_draw_triangle(centre, pts[i], pts[(i + 1) % n_pts], \

facecolor='blue', alpha = 0.2)

_draw_triangle(centre, pts[(i + 1) % n_pts], \

pts[(i + 2) % n_pts], \

facecolor='green', alpha = 0.2)

_draw_triangle(centre, pts[i], pts[(i + 2) % n_pts], \

facecolor='red', alpha = 0.2)

if Aij + Ajk < Aik:

if graphic: p.plot((pts[i + 1][0],),(pts[i + 1][1],),'go')

del pts[i+1]

i += 1

n_pts = len(pts)

k += 1

return n.asarray(pts)

if __name__ == "__main__":

import scipy.interpolate as interpolate

# fig = p.figure(figsize=(10,10))

theta = 2*n.pi*n.random.rand(1000)

r = n.random.rand(1000)**0.5

x,y = r*p.cos(theta),r*p.sin(theta)

points = n.ndarray((2,len(x)))

points[0,:],points[1,:] = x,y

scale = 1.03

hull_pts = scale*convex_hull(points)

p.plot(x,y,'ko')

x,y = [],[]

convex = scale*hull_pts

for point in convex:

x.append(point[0])

y.append(point[1])

x.append(convex[0][0])

y.append(convex[0][1])

x,y = n.array(x),n.array(y)

#Taken from https://stackoverflow.com/questions/14344099/numpy-scipy-smooth-spline-representation-of-an-arbitrary-contour-flength

nt = n.linspace(0, 1, 100)

t = n.zeros(x.shape)

t[1:] = n.sqrt((x[1:] - x[:-1])**2 + (y[1:] - y[:-1])**2)

t = n.cumsum(t)

t /= t[-1]

x2 = interpolate.spline(t, x, nt)

y2 = interpolate.spline(t, y, nt)

p.plot(x2, y2,'r--',linewidth=2)

p.show()

950ff9499af16bcb208bff338a390165.png

有一些有用的论文,例如:

我对阿吉斯一无所知,但看起来不错。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值