我有一个轮廓图,我想对所有轮廓线进行变形,其中级别0.5的轮廓将围绕位于其线中的蓝点变形,然后传递级别1的轮廓上的蓝点,然后以此类推。
原始地图:
变形的地图:
我认为有两个步骤,第一步是删除地图的某些部分,第二步是重绘轮廓图。
我想我必须像这样遍历轮廓图:
CS = plt.contour(X, Y, Z)
for level in CS.collections:
for kp, path in list(enumerate(level.get_paths())):
但是我不知道如何使用
kp
和path
任何提示,这样做将不胜感激!
最佳答案
这是一个有关如何更改轮廓图以实现预期变形的示例。
它生成一些数据x,y,z
,以后应进行修改。然后,它指定一个变形函数,当与z
相乘时,它将以所需的方式变形数据。此变形函数将x
和y
数据以及执行变形所沿的线的角度以及变形的宽度(展开)作为输入。最后,使用参数i
填充变形程度(即i=0
表示无变形)。当然,您可以使用任何其他功能来变形轮廓。
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/