python中的轮廓变形

时间:2017-02-28 09:26:28

标签: python matplotlib contour matplotlib-basemap

我有一个轮廓图,我想要对所有轮廓线进行变形,其中0.5级的轮廓将围绕位于其线上的蓝点变形,然后传递水平轮廓上的蓝点1,等等。

原图:
original map

变形地图:
deformed map

我认为有两个步骤,第一步是删除地图的某些部分,第二步是重绘等高线图。

我想我必须像这样迭代等高线图:

CS = plt.contour(X, Y, Z)
for level in CS.collections:
    for kp, path in list(enumerate(level.get_paths())):

但我不知道如何使用kppath

任何有关这样做的提示都将不胜感激!

1 个答案:

答案 0 :(得分:1)

以下是如何更改等高线图以实现预期变形的示例 它生成一些数据x,y,z,稍后应该对其进行修改。然后它指定一个变形函数,当乘以z时,它会以所需的方式变形数据。此变形函数将xy数据作为输入,以及执行变形的线的角度和变形的宽度(展开)。最后,参数i用于控制变形程度(即i=0表示没有变形)。当然,您可以使用任何其他功能来改变轮廓。

enter image description here

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.animation

#### generate some x,y,z data ####
r = np.linspace(0,6,  num=100)
phi = np.linspace(0, 2*np.pi, num=200)
R, Phi = np.meshgrid(r,phi)
x = R*np.cos(Phi)
y = R*np.sin(Phi)
z = R
##################################

fig, ax=plt.subplots()
ax.set_aspect("equal")

def update(i):
    ax.clear()
    f = lambda x,y, offs, width, i: 1-i*np.exp(-(np.arctan2(x,y)-offs)**2/width)  
    z_deformed = z*f(x,y, np.pi/4, 1./8., i=i)
    ax.contour(x,y,z_deformed, 10, linewidths=4)
    ax.contourf(x,y,z_deformed, 10, alpha=0.3)
    ax.set_xlim([-4,4])
    ax.set_ylim([-4,4])

update(0) #plot the original data
anipath = 0.5*np.sin(np.linspace(0, np.pi, num=20))**2
ani = matplotlib.animation.FuncAnimation(fig, update, frames=anipath, interval = 100)

plt.show()

当然你可以使用其他形状的变形。例如。使用

获得三角形状
f = lambda x, A, a, b: A*(1.-np.abs((x-b)/a))*(np.abs((x-b)) < a )
z_deformed = z - f(np.arctan2(x,y), i, 1./8., np.pi/4 )