2

这是我关于 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()

例子: 示例图

另一个小问题:绘图的宽度/高度的单位是什么?它似乎不在文档中,我在任何教程等中都找不到它。

4

1 回答 1

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()

您可以在返回 dict 的文档中看到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 的调用,您很快就会看到此代码。它看起来不太好,所以让我们跳过突出显示的行(使用jump,如果你从未使用过 Python 调试器,你应该阅读一下它)。

瞧,这就是结果:

已解决的问题

考虑到问题出在哪里,很容易猜到改变地图的宽度或高度(顺便说一下,以米为单位)可以解决问题。确实,设置scale>=1.0485有效。其他宽度和高度的组合似乎也可以正常工作。

于 2012-10-26T18:43:10.313 回答