Python Matplotlib Basemap overlay small image on map plot

前端 未结 2 1357
青春惊慌失措
青春惊慌失措 2020-12-05 02:32

I am plotting data from an aircraft on a map and I would like to insert this 75px by 29px PNG image of an airplane at the coordinates of the latest data point on the plot.

2条回答
  •  旧时难觅i
    2020-12-05 03:22

    With basemap, you can generally just use normal pyplot style commands if you translate your coordinates using the map instance first. In this case, you can just transform the extent into uv coordinates with:

    x0, y0 = m(x[-1], y[-1])
    x1, y1 = m(x[-1] + 0.5, y[-1] + 0.5)
    

    And then subsequently you will be able to do:

    im = plt.imshow(img, extent=(x0, x1, y0, y1))
    

    My full solution to this looks like:

    import matplotlib.pyplot as plt
    from mpl_toolkits.basemap import Basemap
    import numpy as np
    
    
    lats = np.arange(26, 29, 0.5)
    lons = np.arange(-90, -87, 0.5)
    
    m = Basemap(projection='cyl', llcrnrlon=min(lons)-2, llcrnrlat=min(lats)-2,
                urcrnrlon=max(lons)+2, urcrnrlat=max(lats)+2, resolution='h')
    
    x, y = m(lons,lats)
    u, v = np.arange(0, 51, 10), np.arange(0, 51, 10)
    barbs = m.barbs(x, y, u, v)
    
    m.drawcoastlines()
    m.fillcontinents()
    
    x_size, y_size = 0.8, 0.4
    x0, y0 = m(x[-1] - x_size/2., y[-1] - y_size/2.)
    x1, y1 = m(x[-1] + x_size/2., y[-1] + y_size/2.)
    im = plt.imshow(plt.imread('mslr86.png'), extent=(x0, x1, y0, y1))
    
    plt.show()
    

    Which produces an image that looks likeenter image description here

    Update: if you want the image to remain a fixed size, independent of the zoom, see Joe's answer.

提交回复
热议问题