我有一个轮廓图,我想要对所有轮廓线进行变形,其中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
任何有关这样做的提示都将不胜感激!
答案 0 :(得分:1)
以下是如何更改等高线图以实现预期变形的示例
它生成一些数据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 )