【问题标题】:Matplotlib basemaps draws two parallels on stereographic projectionMatplotlib 底图在立体投影上绘制两条平行线
【发布时间】:2012-10-26 14:05:22
【问题描述】:

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

示例:

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

【问题讨论】:

  • m 的定义似乎丢失了。如果你只调用m.drawparallels(... 然后plt.show(),你会得到双重平行吗?
  • 刚刚添加了定义;看来我的复制粘贴工作做得很差。看来m.drawparallels 需要至少两个参数。
  • 另外,感谢 Squido 先生将我的图添加到问题中!

标签: python matplotlib matplotlib-basemap


【解决方案1】:

似乎是由于尝试修复另一个错误而导致的错误。

我不使用底图,但尝试解决问题的第一步是尽可能减少它们:

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 返回一个dict,我们可以恢复实际的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 有效。其他宽度和高度的组合似乎也可以正常工作。

【讨论】:

  • 效果很好!将我的绘图宽度乘以 1.0485 后,不再是双平行。我当然也会熟悉 python 调试器。谢谢!!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多