Search code examples
pythonmatplotlibmapsgeographymatplotlib-basemap

world map without rivers with matplotlib / Basemap?


Would there be a way to plot the borders of the continents with Basemap (or without Basemap, if there is some other way), without those annoying rivers coming along? Especially that piece of Kongo River, not even reaching the ocean, is disturbing.

EDIT: I intend to further plot data over the map, like in the Basemap gallery (and still have the borderlines of the continents drawn as black lines over the data, to give structure for the worldmap) so while the solution by Hooked below is nice, masterful even, it's not applicable for this purpose.

world map

Image produced by:

from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt

fig = plt.figure(figsize=(8, 4.5))
plt.subplots_adjust(left=0.02, right=0.98, top=0.98, bottom=0.00)
m = Basemap(projection='robin',lon_0=0,resolution='c')
m.fillcontinents(color='gray',lake_color='white')
m.drawcoastlines()
plt.savefig('world.png',dpi=75)

Solution

  • Following user1868739's example, I am able to select only the paths (for some lakes) that I want: world2

    from mpl_toolkits.basemap import Basemap
    import matplotlib.pyplot as plt
    
    fig = plt.figure(figsize=(8, 4.5))
    plt.subplots_adjust(left=0.02, right=0.98, top=0.98, bottom=0.00)
    m = Basemap(resolution='c',projection='robin',lon_0=0)
    m.fillcontinents(color='white',lake_color='white',zorder=2)
    coasts = m.drawcoastlines(zorder=1,color='white',linewidth=0)
    coasts_paths = coasts.get_paths()
    
    ipolygons = range(83) + [84] # want Baikal, but not Tanganyika
    # 80 = Superior+Michigan+Huron, 81 = Victoria, 82 = Aral, 83 = Tanganyika,
    # 84 = Baikal, 85 = Great Bear, 86 = Great Slave, 87 = Nyasa, 88 = Erie
    # 89 = Winnipeg, 90 = Ontario
    for ipoly in ipolygons:
        r = coasts_paths[ipoly]
        # Convert into lon/lat vertices
        polygon_vertices = [(vertex[0],vertex[1]) for (vertex,code) in
                            r.iter_segments(simplify=False)]
        px = [polygon_vertices[i][0] for i in xrange(len(polygon_vertices))]
        py = [polygon_vertices[i][2] for i in xrange(len(polygon_vertices))]
        m.plot(px,py,linewidth=0.5,zorder=3,color='black')
    
    plt.savefig('world2.png',dpi=100)
    

    But this only works when using white background for the continents. If I change color to 'gray' in the following line, we see that other rivers and lakes are not filled with the same color as the continents are. (Also playing with area_thresh will not remove those rivers that are connected to ocean.)

    m.fillcontinents(color='gray',lake_color='white',zorder=2)
    

    world3

    The version with white background is adequate for further color-plotting all kind of land information over the continents, but a more elaborate solution would be needed, if one wants to retain the gray background for continents.