Drawing a graph using NetworkX on a basemap

I want to build a graph on a map where the nodes will be determined by the coordinates (lat, long) and have a specific value.

I managed to display the points as a scatter chart on the base map, but it seems I can't find how to plot the chart on the map.

Thanks.

EDIT : I added code on how I built the points on the base map. Most of them have been adapted from the code in this article.

from mpl_toolkits.basemap import Basemap from shapely.geometry import Point, MultiPoint import pandas as pd import matplotlib.pyplot as plt m = Basemap( projection='merc', ellps = 'WGS84', llcrnrlon=-130, llcrnrlat=25, urcrnrlon=-60, urcrnrlat=50, lat_ts=0, resolution='i', suppress_ticks=True) # Create Point objects in map coordinates from dataframe lon # and lat values # I have a dataframe of coordinates map_points = pd.Series( [Point(m(mapped_x, mapped_y)) for mapped_x, mapped_y in zip(df['lon'], df['lat'])]) amre_points = MultiPoint(list(map_points.values)) plt.clf() fig = plt.figure() ax = fig.add_subplot(111, axisbg='w', frame_on=False) fig.set_size_inches(18.5, 10.5) # Create a scatterplot on the map dev = m.scatter( [geom.x for geom in map_points], [geom.y for geom in map_points], 20, marker='o', lw=.25, facecolor='#33ccff', edgecolor='w', alpha=0.9,antialiased=True, zorder=3) m.fillcontinents(color='#555555') 

I get this image: Map

+7
python networkx matplotlib-basemap
source share
2 answers

Here is one way to do this:

 import networkx as nx import matplotlib.pyplot as plt from mpl_toolkits.basemap import Basemap as Basemap m = Basemap( projection='merc', llcrnrlon=-130, llcrnrlat=25, urcrnrlon=-60, urcrnrlat=50, lat_ts=0, resolution='i', suppress_ticks=True) # position in decimal lat/lon lats=[37.96,42.82] lons=[-121.29,-73.95] # convert lat and lon to map projection mx,my=m(lons,lats) # The NetworkX part # put map projection coordinates in pos dictionary G=nx.Graph() G.add_edge('a','b') pos={} pos['a']=(mx[0],my[0]) pos['b']=(mx[1],my[1]) # draw nx.draw_networkx(G,pos,node_size=200,node_color='blue') # Now draw the map m.drawcountries() m.drawstates() m.bluemarble() plt.title('How to get from point a to point b') plt.show() 

enter image description here

+12
source share

Today there is a good alternative to the base map. Mplleaflet is a library inspired by mpld3. It works faster than the base map, is easier to use and allows you to visualize geographic data on a beautiful interactive openstreetmap. The input can be longitude and latitude, the library automatically designs data correctly.

The pos input dictionary, where node (country) is the key, and long armor is stored as a value.

  pos = {u'Afghanistan': [66.00473365578554, 33.83523072784668], u'Aland': [19.944009818523348, 60.23133494165451], u'Albania': [20.04983396108883, 41.14244989474517], u'Algeria': [2.617323009197829, 28.158938494487625], ..... 

Setting up is as simple as:

 import mplleaflet fig, ax = plt.subplots() nx.draw_networkx_nodes(GG,pos=pos,node_size=10,node_color='red',edge_color='k',alpha=.5, with_labels=True) nx.draw_networkx_edges(GG,pos=pos,edge_color='gray', alpha=.1) nx.draw_networkx_labels(GG,pos, label_pos =10.3) mplleaflet.display(fig=ax.figure) 
+2
source share

All Articles