• 二十八、在 Basemap 中绘制坐标

    二十八、在 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 绘图。