Matplotlib底图在立体投影上绘制了两个相似之处

时间:2012-10-26 14:05:22

标签: python matplotlib matplotlib-basemap

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

示例: Example plot

另一个小问题:情节宽度/高度的单位是多少?它似乎不在文档中,我在任何教程等上都找不到它。

1 个答案:

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

+ points

plt.plot(x, y)
plt.show()

Linked points

现在让我们尝试通过调试器(python -m pdb small_example.py)运行小例子。

如果你进入drawparallels的调用,你很快就会到达this code。它看起来不太好,所以让我们跳过突出显示的行(使用jump,如果你从未使用过Python调试器,你应该阅读一下它。)

瞧,这就是结果:

Solved issue

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