我正在运行以下代码,它应该是基本的底图:
from mpl_toolkits.basemap import Basemap
import numpy as np
import matplotlib.pyplot as plt
#basic stuff from the examples
plt.close('all')
m = Basemap(projection='merc',llcrnrlat=-80,urcrnrlat=80,\
llcrnrlon=-180,urcrnrlon=180,lat_ts=20,resolution='l')
m.drawcoastlines()
m.fillcontinents(color='white',lake_color='aqua')
# draw parallels and meridians.
m.drawparallels(np.arange(-90.,91.,30.))
m.drawmeridians(np.arange(-180.,181.,60.))
m.drawmapboundary(fill_color='aqua')
lon=[
-44.897539694478894,
-79.56264363246461,
-108.31264586027467,
-129.5832433799378,
-149.11755440233293,
173.04624586158417,
57.26114485166647,
26.06650557322952,
6.8910540489469785,
-15.059586144625898]
lat=[
-23.30021206811055,
-22.174848810053106,
-6.169632450760373,
18.199421172044598,
45.95724594253466,
72.89364342463014,
69.39230460744983,
41.88542137864501,
14.50656439517308,
-8.974170076274387]
m.plot(lon,lat,latlon=True,c='orange')
m.plot(lon[0:5],lat[0:5],latlon=True,c='green')
m.plot(lon[5:-1],lat[5:-1],latlon=True,c='blue')
plt.show()
正如你所看到的,我正在绘制一张基本地图,然后用纬度和经度绘制其中的东西。整个点集以橙色绘制,然后这些相同点的子集以绿色和蓝色绘制。因此我希望橙色情节基本上与蓝色和绿色情节重合。相反,这是我得到的:
根据我的理解,正确的情节是蓝色和绿色。不同点的选择不会发生同样的事情。在某种意义上,当要绘制的线环绕地图边界时,似乎plot()
会感到困惑。
我做错了什么,或者这是basemap
错误?
答案 0 :(得分:2)
这很有趣。举例说明问题:
from mpl_toolkits.basemap import Basemap
import numpy as np
import matplotlib.pyplot as plt
m = Basemap(projection='merc',llcrnrlat=-80,urcrnrlat=80,\
llcrnrlon=-180,urcrnrlon=180,lat_ts=20,resolution='l')
m.drawparallels(np.arange(-90.,91.,30.))
m.drawmeridians(np.arange(-180.,181.,60.))
lon=[
-44.897539694478894,
-79.56264363246461,
-108.31264586027467,
-129.5832433799378,
-149.11755440233293,
173.04624586158417,
57.26114485166647,
26.06650557322952,
6.8910540489469785,
-15.059586144625898]
lat=[
-23.30021206811055,
-22.174848810053106,
-6.169632450760373,
18.199421172044598,
45.95724594253466,
72.89364342463014,
69.39230460744983,
41.88542137864501,
14.50656439517308,
-8.974170076274387]
m.plot(lon, lat, 'ro', markersize=14, mec='none', latlon=True)
m.plot(lon[:-1], lat[:-1], 'bo', markersize=10, mec='none', latlon=True)
m.plot(lon[1:], lat[1:], 'go', markersize=6, mec='none', latlon=True)
数据是相同的,但只是从某个点省略一个样本将抵消这些点:
红色,绿色和蓝色图表应该重合。它看起来很奇怪,但似乎X和Y坐标在一些系列中相对于彼此偏移。
即使红点似乎也不应该存在。要么这是一个错误,要么文档中有一些奇怪的东西。 (我有matplotlib
1.3.1和basemap
1.0.6。)
然而,投影转换本身似乎完美无缺:
c = m(lon, lat)
cp = m(lon[:-1], lat[:-1])
plt.plot(c[0], c[1], 'kx')
plt.plot(cp[0], cp[1], 'o', mfc='none', mec='k')
这会创建:
现在点位于正确的位置(环和十字),并且选择要绘制的点不会改变点的位置。
可以看出,X坐标(纬度)在所有图片中都是正确的,但由于某种原因,经度看起来几乎是随机的。奇怪。 (无论如何,解决方法在上面。)
更新:我想我发现了这个错误。 plot
Basemap
方法首先移动数据,使其从图的边缘开始。例如:
In [27]: m.shiftdata(lon)
Out[27]:
array([ 173.04624586, 57.26114485, 26.06650557, 6.89105405,
-15.05958614, -44.89753969, -79.56264363, -108.31264586,
-129.58324338, -149.1175544 ])
这很好,因为现在的线条是连续的。不幸的是,纬度数据没有移位,结果正好如上所示。
如果您通过以下方式改变纬度和经度:
lons, lats = m.shiftdata(lon, lat)
并使用移位版本绘制数据,一切都很好。
在我看来,_transform1d
和plot
方法使用的装饰器scatter
似乎有些麻烦。通过将装饰器更改为__init.py__
来修补此问题(今天的git中的_transform
,第3239行和第3277行)应该有所帮助,但它可能会破坏plot
和scatter
中的其他功能
我认为最好的解决方案是在绘图之前使用shiftdata
进行排序,如上所述。 (当然要提交错误报告。)