2017-04-05 1 views
2

Fondamentalement, j'ai un csv rempli de données de latitude et de longitude que j'ajoute à deux colonnes distinctes dans le cadre de données. Puis en utilisant cela pour créer un globe avec toutes les données tracées. Sauf que les données ne sont pas correctes et je ne sais pas pourquoi. Lire dans le fichier de données et l'ajouter à csv.Fond de carte Scatter ne pas tracer correctement

data_col = ['IP', 'Reliability', 'Risk', 'Type', 'Country', 'Locale', 'Co-Ords', '?'] 
data = pd.read_csv('reputation.data', sep='#', names=data_col) 

Prenant la colonne Co-Ords et le fractionnement à deux colonnes différentes

data['Co-Ords'] = data['Co-Ords'].str.replace('ut: ','') 
data['lat'] = data['Co-Ords'].apply(lambda x: x.split(',')[0]) 
data['lon'] = data['Co-Ords'].apply(lambda x: x.split(',')[1]) 

d'application des données de carte de base;

m1 = Basemap(projection='ortho', lon_0=4,lat_0=46, resolution='l') 

fig=plt.figure(figsize=(12, 6)) 

m1.drawmapboundary(fill_color='black') 
m1.fillcontinents(color='white',lake_color='black') 
m1.drawcoastlines() 
m1.drawcountries() 

x=(data['lat']).as_matrix() 
y=(data['lon']).as_matrix() 

m1.scatter(x,y,cmap=cm.cool,marker="*", color='r', alpha=0.7, 
latlon=True, zorder=10) 
plt.title("IP Addresses on the Globe") 
plt.show() 

Et il se présente comme suit: Globe

apprécie l'aide.

Edit: Les données que je lis

IP Reliability Risk Type Country Locale Co-Ords ? lat lon 
46.4.123.15 4 2 Malicious DE NaN 51.0,9.0 3 51 9 
116.117.253.243 3 2 Scanning CN Baotou 40.6521987915,109.82219696 11 40.6521987915 109.82219696 
123.59.59.89 4 2 Malicious CN Beijing 39.9289016724,116.388298035 3 39.9289016724 116.388298035 
123.59.71.2 4 2 Malicious CN Beijing 39.9289016724,116.388298035 3 39.9289016724 116.388298035 
123.59.149.74 4 2 Malicious CN Beijing 39.9289016724,116.388298035 3 39.9289016724 116.388298035 
+0

Pouvez-vous partager un extrait, 5-10 lignes de vos données, où vous annotez dans quel pays les points de données sont censés apparaître? –

+0

[Oui, il ressemble à ce qui suit] (http://i.imgur.com/9Cv0PYE.png) –

+0

Merci, pourriez-vous ajouter cette sortie en tant que texte à la question, de sorte qu'il est facile à copier? Vous pouvez faire 'print (data.head())', et il suffit de le copier ici. En outre, avez-vous tracé ce sous-ensemble pour confirmer que ces points sont également égarés sur la carte? –

Répondre

0

Vous devez convert your longitude and latitude to map coordinates via x, y = m1(x, y). Dans le code ci-dessous, je l'ai remplacé cette ligne et la conversion de votre matrice avec cette seule ligne, ce qui je pense est plus claire:

Ce code fonctionne pour moi

m1 = Basemap(projection='ortho', lon_0=4,lat_0=46, resolution='l') 
fig=plt.figure(figsize=(12, 6)) 

m1.drawmapboundary(fill_color='black') 
m1.fillcontinents(color='white',lake_color='black') 
m1.drawcoastlines() 
m1.drawcountries() 

x,y = m1(data['lon'].values, data['lat'].values) 
m1.scatter(x,y, marker="*", color='r', alpha=0.7, zorder=10) 

plt.title("IP Addresses on the Globe") 
plt.show() 

enter image description here

+0

Parfait, réparé. J'ai essayé quelque chose de similaire mais je suppose que la partie .values ​​() a corrigé comment les valeurs devaient être lues? –

+0

@ A.Timmins Oui, j'ai également noté qu'il ne fonctionnait pas en passant la colonne de la trame de données directement comme une série, '.values ​​()' le convertit en un tableau numpy. –