Chr*_*ris 3 python maps plot matplotlib-basemap
我试图绘制一个卫星地面轨道.我有一个度数的纬度和经度列表.经度值均为-180至+180度.我的第一个问题是使用latlon关键字(顺便说一句,我通过PyCall.jl包在Julia中使用它,所以请原谅看起来很奇怪的语法):
map = Basemap.Basemap(projection="mill",lon_0=0)
map[:drawcoastlines]()
map[:drawparallels](-90:30:90,labels=[1,0,0,0])
map[:drawmeridians](map[:lonmin]:60:map[:lonmax]+30,labels=[0,0,0,1])
map[:plot](lon,lat,color="red",latlon=true)
Run Code Online (Sandbox Code Playgroud)
这是......不应该是什么样子.我不确定问题是什么.但是,如果我先转换为地图坐标:
xx,yy = map(lon,lat)
map[:plot](xx,yy,color="red")
Run Code Online (Sandbox Code Playgroud)
这要好得多,除了经度从+180到-180之间的线.有什么建议使这看起来更好?
可以在此处找到用于生成这些图的纬度,经度对(以度为单位).
一开始我觉得这可能与旧的问题有关Basemap.但是,我认为你的问题不是由于Basemap,它实际上正确地处理了经度包装,你可以看到你是否只使用标记来绘制卫星地面轨迹.
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
f = plt.figure(figsize(10,7.5))
m = Basemap(projection="mill", lon_0=0)
m.drawcoastlines()
m.drawparallels(np.arange(-90,91,30),labels=[1,0,0,0])
m.drawmeridians(np.arange(-180,181,60), labels=[0,0,0,1])
x,y = m(lon, lat)
m.plot(x, y, color="red", latlon=False, marker='.', linestyle='None')
Run Code Online (Sandbox Code Playgroud)
明确的解决办法是在多个轨道分割你的地面轨迹,并使用绘制出来LineCollection,因为还解释这里.一种更简单的方法(如果你预计经度会出现一次不连续):
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
latlon_ar = np.array(latlon)
threshold = 90
idx_wrap = np.nonzero(np.abs(np.diff(latlon_ar[:,1])) > threshold)[0]+1
lon_1 = lon[:idx_wrap]
lat_1 = lat[:idx_wrap]
lon_2 = lon[idx_wrap:]
lat_2 = lat[idx_wrap:]
f = plt.figure(figsize(10,7.5))
m = Basemap(projection="mill", lon_0=0)
m.drawcoastlines()
m.drawparallels(np.arange(-90,91,30),labels=[1,0,0,0])
m.drawmeridians(np.arange(-180,181,60), labels=[0,0,0,1])
x1, y1 = m(lon_1, lat_1)
x2, y2 = m(lon_2, lat_2)
m.plot(x1, y1, color="red", latlon=False)
m.plot(x2, y2, color="blue", latlon=False)
Run Code Online (Sandbox Code Playgroud)
编辑这已确认的bug在Basemap负责的问题,其中第一个例子中的行为Basemap.plot直接与纬度和经度值叫,将其具有的latlon标志True.有一种解决方案,即在绘图之前手动移动输入坐标,如下面的代码所示.
lons, lats = m.shiftdata(lon, lat)
m.plot(lons, lats, color="blue", latlon=True, marker='.', linestyle='None')
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1663 次 |
| 最近记录: |