二十八、在 Basemap 中绘制坐标

欢迎阅读另一个 Matplotlib Basemap 教程。 在本教程中,我们将介绍如何绘制单个坐标,以及如何在地理区域中连接这些坐标。

首先,我们将从一些基本的起始数据开始:

  1. from mpl_toolkits.basemap import Basemap
  2. import matplotlib.pyplot as plt
  3. m = Basemap(projection='mill',
  4. llcrnrlat = 25,
  5. llcrnrlon = -130,
  6. urcrnrlat = 50,
  7. urcrnrlon = -60,
  8. resolution='l')
  9. m.drawcoastlines()
  10. m.drawcountries(linewidth=2)
  11. m.drawstates(color='b')

接下来,我们可以绘制坐标,从获得它们的实际坐标开始。 记住,南纬和西经坐标需要转换为负值。 例如,纽约市是北纬40.7127西经74.0059。 我们可以在我们的程序中定义这些坐标,如:

  1. NYClat, NYClon = 40.7127, -74.0059

之后我们将这些转换为要绘制的xy坐标。

  1. xpt, ypt = m(NYClon, NYClat)

注意这里,我们现在已经将坐标顺序翻转为lon, lat(纬度,经度)。 坐标通常以lat, lon顺序给出。 然而,在图形中,lat, long转换为y, x,我们显然不需要。 在某些时候,你必须翻转它们。 不要忘记这部分!

最后,我们可以绘制如下的坐标:

  1. m.plot(xpt, ypt, 'c*', markersize=15)

这个图表上有一个青色的星,大小为 15。更多标记类型请参阅:Matplotlib 标记文档

接下来,让我们再画一个位置,洛杉矶,加利福尼亚:

  1. LAlat, LAlon = 34.05, -118.25
  2. xpt, ypt = m(LAlon, LAlat)
  3. m.plot(xpt, ypt, 'g^', markersize=15)

这次我们画出一个绿色三角,执行代码会生成:

二十八、在 Basemap 中绘制坐标 - 图1

如果我们想连接这些图块怎么办?原来,我们可以像其它 Matplotlib 图表那样实现它。

首先,我们将那些xptypt坐标保存到列表,类似这样的东西:

  1. xs = []
  2. ys = []
  3. NYClat, NYClon = 40.7127, -74.0059
  4. xpt, ypt = m(NYClon, NYClat)
  5. xs.append(xpt)
  6. ys.append(ypt)
  7. m.plot(xpt, ypt, 'c*', markersize=15)
  8. LAlat, LAlon = 34.05, -118.25
  9. xpt, ypt = m(LAlon, LAlat)
  10. xs.append(xpt)
  11. ys.append(ypt)
  12. m.plot(xpt, ypt, 'g^', markersize=15)
  13. m.plot(xs, ys, color='r', linewidth=3, label='Flight 98')

会生成:

二十八、在 Basemap 中绘制坐标 - 图2

太棒了。有时我们需要以圆弧连接图上的两个坐标。如何实现呢?

  1. m.drawgreatcircle(NYClon, NYClat, LAlon, LAlat, color='c', linewidth=3, label='Arc')

我们的完整代码为:

  1. from mpl_toolkits.basemap import Basemap
  2. import matplotlib.pyplot as plt
  3. m = Basemap(projection='mill',
  4. llcrnrlat = 25,
  5. llcrnrlon = -130,
  6. urcrnrlat = 50,
  7. urcrnrlon = -60,
  8. resolution='l')
  9. m.drawcoastlines()
  10. m.drawcountries(linewidth=2)
  11. m.drawstates(color='b')
  12. #m.drawcounties(color='darkred')
  13. #m.fillcontinents()
  14. #m.etopo()
  15. #m.bluemarble()
  16. xs = []
  17. ys = []
  18. NYClat, NYClon = 40.7127, -74.0059
  19. xpt, ypt = m(NYClon, NYClat)
  20. xs.append(xpt)
  21. ys.append(ypt)
  22. m.plot(xpt, ypt, 'c*', markersize=15)
  23. LAlat, LAlon = 34.05, -118.25
  24. xpt, ypt = m(LAlon, LAlat)
  25. xs.append(xpt)
  26. ys.append(ypt)
  27. m.plot(xpt, ypt, 'g^', markersize=15)
  28. m.plot(xs, ys, color='r', linewidth=3, label='Flight 98')
  29. m.drawgreatcircle(NYClon, NYClat, LAlon, LAlat, color='c', linewidth=3, label='Arc')
  30. plt.legend(loc=4)
  31. plt.title('Basemap Tutorial')
  32. plt.show()

结果为:

二十八、在 Basemap 中绘制坐标 - 图3

这就是Basemap的全部了,下一章关于 Matplotlib 的 3D 绘图。