2013-11-11 4 views
7

Я хочу построить график на карте, где узлы будут определяться координатами (lat, long) и иметь определенное значение.Рисование графика с NetworkX на базовой карте

Я смог нарисовать точки как диаграмму рассеяния на базовой карте, но не может найти, как построить график на карте.

Спасибо.

EDIT: Я добавил код о том, как я построил точки на базовой карте. Большая часть из них была адаптирована из кода в статье this.

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

Я получаю это изображение: Map

+0

Не могли бы вы показать нам, что вы пробовали? – Aric

+1

@Aric Добавлен код о том, как я нарисовал точки на карте. – Nitin

ответ

12

Вот один из способов сделать это:

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

+0

Это нормально, когда вам нужно адаптировать граф к карте. Но что, если у вас есть график с определенными координатами, и вы хотите построить 'imshow' под графиком? Обычно 'imshow' будет использовать количество строк/столбцов в качестве индекса, но что, если вам нужно, чтобы эти числа были координатами? – FaCoffee

2

На сегодняшний день существует хорошая альтернатива базовой картой. Mplleaflet - это библиотека, вдохновленная mpld3. Он работает быстрее, чем базовая карта, более прост в использовании и позволяет визуализировать географические данные на красивой интерактивной openstreetmap. Входной сигнал может быть долготой и широтой, поэтому библиотека автоматически проектирует данные должным образом.

Входной словарь pos, где узел (страна) является ключевым и длинным латом, сохраняется как значение.

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

Plotting так же легко, как:

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) 
Смежные вопросы