这是我关于Stack Overflow的第一个问题,所以如果我忽略了任何事情,我很抱歉。我正在绘制一个巡航位置的情节,我在北纬60度处发生双平行,其中一个是直线(在立体投影上)。
有人知道我在做什么导致这个吗?
我的绘图脚本(引用外部数据):
from mpl_toolkits.basemap import Basemap
import numpy as np
import matplotlib.pyplot as plt
import sys
import csv
dataFile = sys.argv[1]
dataStream = open(dataFile, 'rb')
dataReader = csv.reader(dataStream, delimiter=',')
numRows = sys.argv[2]
dataLat = []
dataLon = []
dataReader.next()
for row in dataReader:
dataLon.append(float(row[5]))
dataLat.append(float(row[6]))
m = Basemap(width=450000,height=150000,
resolution='f',projection='stere',\
lat_ts=65.4,lat_0=60.4,lon_0=1.91)
m.drawcoastlines(linewidth=0.2)
m.fillcontinents(color='white', lake_color='aqua')
x, y = m(dataLat,dataLon)
m.scatter(x,y,.5,marker='.',color='k')
m.drawparallels(np.arange(0.,81,1.), labels=[1,0,0,0], fontsize=10)
m.drawmeridians(np.arange(-180.,181.,5.), labels=[0,0,0,1], fontsize=10)
m.drawmapboundary(fill_color='aqua')
plt.title("Cruise Track")
plt.show()
示例:
另一个小问题:情节宽度/高度的单位是多少?它似乎不在文档中,我在任何教程等上都找不到它。
答案 0 :(得分:2)
似乎是因为尝试修复另一个错误而导致的错误。
我不使用底图,但尝试解决问题的第一步是尽可能减少它们:
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
scale = 1
m = Basemap(width=450000*scale,height=150000,
resolution='i',projection='stere',
lat_ts=65.4,lat_0=60.4,lon_0=1.91)
parallels = [60]
ret = m.drawparallels(parallels)
plt.show()
您可以在docs中看到drawparallels
返回一个字典,我们可以恢复实际的Line2D(并行)及其数据点:
l = ret[60][0][0]
x, y = l.get_data()
如果我们看一下这些点,除非我们链接它们,否则它看起来并不坏,然后我们可以看到烦人的双重并行!
plt.plot(x, y, '+')
plt.show()
plt.plot(x, y)
plt.show()
现在让我们尝试通过调试器(python -m pdb small_example.py
)运行小例子。
如果你进入drawparallels的调用,你很快就会到达this code。它看起来不太好,所以让我们跳过突出显示的行(使用jump
,如果你从未使用过Python调试器,你应该阅读一下它。)
瞧,这就是结果:
考虑到问题出在哪里,很容易猜到改变地图的宽度或高度(顺便说一下,以米为单位)可以解决问题。确实,设置scale>=1.0485
有效。宽度和高度的其他组合似乎也可以正常工作。