<p>要绘制跨越日期线的多段线,需要正确清理经度。例如,值359到2应调整为359到362。在下面的演示代码中,<code>sanitize_lonlist()</code>用于在绘制红色之字形线之前对经度值列表进行清理</p>
<pre><code>import cartopy.crs as ccrs
import matplotlib.pyplot as plt
def sanitize_lonlist(lons):
new_list = []
oldval = 0
treshold = 10 # used to compare adjacent longitudes
for ix,ea in enumerate(lons):
diff = oldval - ea
if (ix>0):
if (diff>treshold):
ea = ea+360
oldval = ea
new_list.append(ea)
return new_list
ax = plt.axes(projection=ccrs.Robinson())
ax.set_global()
ax.coastlines(alpha=0.3)
# sample long/lat data for demo purposes
# xdateline: list of longitudes that cross dateline several times
xdateline = [347,349,352,358,4,7,8,3,359,358,360,3,5,359,1,357,0,8,12,6,357,349]
# ydateline: list of accompanying latitudes
ydateline = range(len(xdateline))
# plot the line crossing dateline using `sanitized` values of longitudes
plt.plot(sanitize_lonlist(xdateline), ydateline, transform=ccrs.PlateCarree(), color='red')
plt.show()
</code></pre>
<p><a href="https://i.stack.imgur.com/xU5Mj.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/xU5Mj.png" alt="datelinexing"/></a></p>
<p>使用<code>xdateline</code>的原始值绘制代码行:-</p>
<pre><code>plt.plot(xdateline, ydateline, transform=ccrs.PlateCarree(), color='red')
</code></pre>
<p>该地块将为:-</p>
<p><a href="https://i.stack.imgur.com/wrwqp.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/wrwqp.png" alt="bad-plot"/></a></p>