该脚本的目的是使用pylab在Mollweide投影中绘制一些数据的等高线图。 contourf
有一种奇怪的行为。这是代码
import numpy as np
import pylab as plt
ra = np.linspace(-np.pi, np.pi, 40)
dec= np.linspace(-np.pi/2, np.pi/2, 20)
X,Y = np.meshgrid(ra,dec)
Z = np.sin(X) * np.cos(X) * np.sin(Y) * np.cos(Y)
plt.figure()
ax = plt.subplot(111, projection = 'mollweide')
ax.contourf(X,Y,Z,100)
ax.contour(X,Y,Z,10,colors='k')
plt.show()
有些观点似乎错误绘制(见下图)。
使用没有投影的相同代码输出完全正常的地图:
您可能已经注意到轮廓线在两个图像中都能完美地工作。人工制品似乎总是在同一个地方。
有没有办法纠正这些人工制品?
答案 0 :(得分:2)
由于Mollweide projection具有+/- 90°纬度的奇点,似乎存在一些潜在的问题。 @pelson在github上建议的解决方案是使用Basemap:
from mpl_toolkits.basemap import Basemap
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm
ra = np.linspace(-np.pi, np.pi, 40)
dec= np.linspace(-np.pi/2, np.pi/2, 20)
X,Y = np.meshgrid(ra,dec)
Z = np.sin(X) * np.cos(X) * np.sin(Y) * np.cos(Y)
RAD = 180/np.pi
m = Basemap(projection='moll',lon_0=0,resolution='c')
m.contour(X*RAD, Y*RAD, Z, 10, colors='k',latlon=True)
m.contourf(X*RAD, Y*RAD, Z, 100, cmap=plt.cm.jet,latlon=True)
plt.show()
此代码的工作原理如下: