我有一个轮廓图,我想对所有轮廓线进行变形,其中级别0.5的轮廓将围绕位于其线中的蓝点变形,然后传递级别1的轮廓上的蓝点,然后以此类推。

原始地图:
 

变形的地图:


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

我想我必须像这样遍历轮廓图:

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


但是我不知道如何使用kppath

任何提示,这样做将不胜感激!

最佳答案

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

python - python中的轮廓变形-LMLPHP

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 )

关于python - python中的轮廓变形,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42504825/

10-12 18:45