我正在运行以下代码,这些代码应该是基本的底图内容:

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错误?

最佳答案

这是有趣的。进一步说明问题的示例:

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坐标(纬度)都是正确的,但是由于某些原因,经度似乎几乎是随机的。奇怪。 (无论如何,以上是解决方法。)



更新:我认为我发现了该错误。 plotBasemap方法首先移动数据,使其从绘图的边缘开始。例如:

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)


并使用转换后的版本来绘制数据,一切都很好。

在我看来,在_transform1dplot方法周围使用装饰器scatter似乎有些麻烦。通过将装饰器更改为__init.py__来猴子修补此(_transform,即今天的git中的3239和3277行)应该会有所帮助,但可能会破坏plotscatter中的其他功能。

我认为最好的解决方案是使用上述shiftdata在绘图之前对数据进行排序。 (当然要提交一个错误报告。)

关于python - 在BaseMap上绘图-意外结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25471723/

10-12 18:58