Dibujar un gráfico con NetworkX en un mapa base

Quiero trazar una gráfica en un mapa donde los nodos se definirían por coordenadas (lat, long) y tendrían algún valor asociado.

He podido trazar puntos como un diagtwig de dispersión en un mapa base, pero parece que no puedo encontrar la forma de trazar una gráfica en el mapa.

Gracias.

EDITAR : He agregado un código sobre cómo dibujé los puntos en un mapa base. La mayor parte ha sido adaptado de código en este artículo.

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') 

Me sale esta imagen: Mapa

Aquí hay una forma de hacerlo:

 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() 

introduzca la descripción de la imagen aquí

A partir de hoy hay una buena alternativa al mapa base. Mplleaflet es una biblioteca inspirada en mpld3. Se traza más rápido que el mapa base, es más fácil de usar y permite visualizar datos geográficos en un hermoso mapa interactivo de openstreet. La entrada puede ser de longitud y latitud; la biblioteca proyecta automáticamente los datos correctamente.

El diccionario de entrada pos, donde el nodo (país) es la clave y la latitud larga se guardan como valor.

  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], ..... 

Trazar es tan fácil como:

 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)