2015-06-21 18 views
7

Bir Basemap üzerinde bir yörünge çizmek ve ülke etiketleri (adları) bindirme olarak gösterilmek istiyorum.Basemap üzerindeki ülke etiketleri

Geçerli kod İşte ve harita ürettiği:

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


path = "path\\to\\data" 

animal_data = pd.DataFrame.from_csv(path, header=None) 
animal_data.columns = ["date", "time", "gps_lat", "gps_long"] 

# data cleaning omitted for clarity 

params = { 
     'projection':'merc', 
     'lat_0':animal_data.gps_lat.mean(), 
     'lon_0':animal_data.gps_long.mean(), 
     'resolution':'h', 
     'area_thresh':0.1, 
     'llcrnrlon':animal_data.gps_long.min()-10, 
     'llcrnrlat':animal_data.gps_lat.min()-10, 
     'urcrnrlon':animal_data.gps_long.max()+10, 
     'urcrnrlat':animal_data.gps_lat.max()+10 
} 
map = Basemap(**params) 

map.drawcoastlines() 
map.drawcountries() 
map.fillcontinents(color = 'coral') 
map.drawmapboundary()   

x, y = map(animal_data.gps_long.values, animal_data.gps_lat.values) 

map.plot(x, y, 'b-', linewidth=1)  
plt.show() 

Bu harita ile sonuçlanır: Migration

Bu göç kuşun yörünge bir haritasıdır. Bu çok güzel bir harita olsa da (!) Ülke adı etiketlerine ihtiyacım var, bu sayede kuşun uçtuğu ülkeleri belirlemek kolaydır.

Ülke adlarını eklemenin bir yolu var mı?

+2

Vay, bu kuş oldukça uzak bir mesafe kat ediyor! Ülke adlarına ve koordinatlarına ihtiyacınız varsa, [bu soruya] bir göz atın (http://stackoverflow.com/questions/2702309/need-a-list-of-all-countries-in-the-world-with-a -longitude-ve-enlem COORDIN). Bir haritadaki metni çizdirmek için, [bu sayfa] 'da (http://matplotlib.org/basemap/users/examples.html) çizim grafiği örneğine bir göz atın, sadece plt.text yapabileceğiniz anlaşılıyor. (x, y, metin). –

+0

Teşekkürler! Bu çok yardımcı oldu. Yakında tüm çözümü aşağıda göndereceğim. –

cevap

6

Çözümüm, gelecekte bulunabilecek veya bulunmayabilecek harici bir veri dosyasına dayanmaktadır. Ancak, benzer veriler başka bir yerde bulunabilir, bu yüzden çok fazla sorun olmamalıdır.

Birincisi, ülke adı etiket baskı için kod:

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

class MyBasemap(Basemap):  
    def printcountries(self, d=3, max_len=12): 
     data = pd.io.parsers.read_csv("http://opengeocode.org/cude/download.php?file=/home/fashions/public_html/opengeocode.org/download/cow.txt", 
             sep=";", skiprows=28) 
     data = data[(data.latitude > self.llcrnrlat+d) & (data.latitude < self.urcrnrlat-d) & (data.longitude > self.llcrnrlon+d) & (data.longitude < self.urcrnrlon-d)] 
     for ix, country in data.iterrows():        
       plt.text(*self(country.longitude, country.latitude), s=country.BGN_name[:max_len]) 

Bütün bunlar daha sonra, here bir ülke konumu veritabanını indirmek Haritada mevcut olan ülkeleri seçmek ve bunları etiketlemek için olduğunu mu .

tam kodu:

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

class MyBasemap(Basemap):  
    def printcountries(self, d=3, max_len=12): 
     data = pd.io.parsers.read_csv("http://opengeocode.org/cude/download.php?file=/home/fashions/public_html/opengeocode.org/download/cow.txt", 
             sep=";", skiprows=28) 
     data = data[(data.latitude > self.llcrnrlat+d) & (data.latitude < self.urcrnrlat-d) & (data.longitude > self.llcrnrlon+d) & (data.longitude < self.urcrnrlon-d)] 
     for ix, country in data.iterrows():        
       plt.text(*self(country.longitude, country.latitude), s=country.BGN_name[:max_len]) 


path = "path\\to\\data" 

animal_data = pd.DataFrame.from_csv(path, header=None) 
animal_data.columns = ["date", "time", "gps_lat", "gps_long"] 

params = { 
     'projection':'merc', 
     'lat_0':animal_data.gps_lat.mean(), 
     'lon_0':animal_data.gps_long.mean(), 
     'resolution':'h', 
     'area_thresh':0.1, 
     'llcrnrlon':animal_data.gps_long.min()-10, 
     'llcrnrlat':animal_data.gps_lat.min()-10, 
     'urcrnrlon':animal_data.gps_long.max()+10, 
     'urcrnrlat':animal_data.gps_lat.max()+10 
} 

plt.figure() 
map = MyBasemap(**params) 

map.drawcoastlines() 
map.fillcontinents(color = 'coral') 
map.drawmapboundary()   
map.drawcountries() 
map.printcountries() 

x, y = map(animal_data.gps_long.values, animal_data.gps_lat.values) 

map.plot(x, y, 'b-', linewidth=1)  
plt.show() 

ve son olarak, sonuç: ülke boyutuna ilişkin

labeld-map

Açıkçası bu kadar dikkatle biri umut edebileceğiniz gibi etiketlenmemişse ve bazı buluşsal yöntemler, Bu mükemmel yapmak için isim uzunluğu ve harita boyutu uygulanmalıdır, ancak bu iyi bir başlangıç ​​noktasıdır.