GJP*_*GJP 11 python numpy matplotlib contour
我有一个坐标变换的二维地图.每个点的数据是原始坐标系中的轴上角,从0到360.我正在尝试使用pyplot.contour绘制恒定角度的线,例如45度.轮廓沿着两极之间的45度线出现,但是沿着0/360不连续性连接两个极的轮廓还有一个附加部分.这是一个非常锯齿状的丑陋线,因为它基本上只跟踪像素,一边接近0,另一边接近360.
示例:这是使用全彩色地图的图像:

您可以在左侧看到蓝色/红色曲线的不连续性.一侧是360度,另一侧是0度.在绘制轮廓时,我得到:

请注意,所有轮廓都连接两个极点,但即使我没有绘制0度轮廓,所有其他轮廓都遵循0度不连续性(因为pyplot认为一边是0而另一边是360,必须有所有其他角度之间).
生成此数据的代码:
import numpy as np
import matplotlib.pyplot as plt
jgal = np.array( [[-0.054875539726,-0.873437108010,-0.483834985808],\
[0.494109453312,-0.444829589425, 0.746982251810],\
[-0.867666135858,-0.198076386122, 0.455983795705]])
def s2v3(rra, rdec, r):
pos0 = r * np.cos(rra) * np.cos(rdec)
pos1 = r * np.sin(rra) * np.cos(rdec)
pos2 = r * np.sin(rdec)
return np.array([pos0, pos1, pos2])
def v2s3(pos):
x = pos[0]
y = pos[1]
z = pos[2]
if np.isscalar(x): x, y, z = np.array([x]), np.array([y]), np.array([z])
rra = np.arctan2(y, x)
low = np.where(rra < 0.0)
high = np.where(rra > 2.0 * np.pi)
if len(low[0]): rra[low] = rra[low] + (2.0*np.pi)
if len(high[0]): rra[high] = rra[high] - (2.0*np.pi)
rxy = np.sqrt(x**2 + y**2)
rdec = np.arctan2(z, rxy)
r = np.sqrt(x**2 + y**2 + z**2)
if x.size == 1:
rra = rra[0]
rdec = rdec[0]
r = r[0]
return rra, rdec, r
def gal2fk5(gl, gb):
dgl = np.array(gl)
dgb = np.array(gb)
rgl = np.deg2rad(gl)
rgb = np.deg2rad(gb)
r = 1.0
pos = s2v3(rgl, rgb, r)
pos1 = np.dot(pos.transpose(), jgal).transpose()
rra, rdec, r = v2s3(pos1)
dra = np.rad2deg(rra)
ddec = np.rad2deg(rdec)
return dra, ddec
def make_coords(resolution=50):
width=9
height=6
px = width*resolution
py = height*resolution
coords = np.zeros((px,py,4))
for ix in range(0,px):
for iy in range(0,py):
l = 360.0/px*ix - 180.0
b = 180.0/py*iy - 90.0
dra, ddec = gal2fk5(l,b)
coords[ix,iy,0] = dra
coords[ix,iy,1] = ddec
coords[ix,iy,2] = l
coords[ix,iy,3] = b
return coords
coords = make_coords()
# now do one of these
#plt.imshow(coords[:,:,0],origin='lower') # color plot
#plt.contour(coords[:,:,0],levels=[45,90,135,180,225,270,315]) # contour plot with jagged ugliness
Run Code Online (Sandbox Code Playgroud)
我怎么能:
停止pyplot.contour沿着不连续点绘制轮廓
使pyplot.contour认识到角度的0/360不连续性根本不是真正的不连续性.
我可以增加基础数据的分辨率,但在我得到一个很好的平滑线之前,它开始需要很长时间和大量内存来绘制.
我还想绘制一个沿0度的轮廓,但如果我能弄清楚如何隐藏不连续性,我可以将它移到其他不靠近轮廓的地方.或者,如果我能让#2发生,那就不是问题了.
这绝对仍然是一个黑客,但你可以通过两种方法获得漂亮的平滑轮廓:
\n\n以下是附加到示例的完整代码:
\n\nZ = np.exp(1j*np.pi*coords[:,:,0]/180.0)\nZ *= np.exp(0.25j*np.pi/2.0) # Shift to get same contours as in your example\nX = np.arange(300)\nY = np.arange(450)\n\nN = 2\nlevels = 90*(0.5 + (np.arange(N) + 0.5)/N)\nc1 = plt.contour(X, Y, abs(np.angle(Z)*180/np.pi), levels=levels)\nc2 = plt.contour(X, Y, abs(np.angle(Z*np.exp(0.5j*np.pi))*180/np.pi), levels=levels)\nRun Code Online (Sandbox Code Playgroud)\n\n
人们可以推广此代码以获得任何“周期性”函数的平滑轮廓。剩下要做的就是生成一组具有正确值的新轮廓,以便正确应用颜色图、正确应用标签等。但是,似乎没有一种简单的方法可以使用 matplotlib 执行此操作:QuadContourSet类做了所有的事情,我没有看到从等高线c1和构造适当的轮廓对象的简单方法c2。
| 归档时间: |
|
| 查看次数: |
1351 次 |
| 最近记录: |