2017-04-05 6 views
2

Grundsätzlich habe ich eine csv gefüllt mit Breiten- und Längengrad Daten, die ich zu zwei separaten Spalten im Datenrahmen hinzufügen. Dann verwenden Sie das, um einen Globus mit allen geplotteten Daten zu erstellen. Außer die Daten sind nicht korrekt gezeichnet und ich habe keine Ahnung warum.Grundkarte Scatter nicht korrekt plotten

Einlesen der Datendatei und Hinzufügen zu csv.

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

Unter der Co-Ords Säule und an zwei verschiedenen Spalten

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

Umsetzung der Daten zu basemap Spaltung;

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

Und es sieht wie folgt aus: Globe

die Hilfe zu schätzen wissen.

Edit: Die Daten, die lese ich von

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

Könnten Sie arbeitet gemeinsam nutzen Schnipsel, 5-10 Zeilen Ihrer Daten, wo kommentieren Sie, in welchem ​​Land die Datenpunkte erscheinen sollen? –

+0

[Ja, es sieht folgendermaßen aus] (http://i.imgur.com/9Cv0PYE.png) –

+0

Danke, könnten Sie diese Ausgabe als Text an die Frage anhängen, so dass es einfach zu kopieren ist? Sie können 'print (data.head())' tun und es einfach hier kopieren. Haben Sie diese Teilmenge auch geplottet, um zu bestätigen, dass diese Punkte auch auf der Karte falsch platziert sind? –

Antwort

0

Sie müssen convert your longitude and latitude to map coordinates über x, y = m1(x, y). Im folgenden Code ersetzt ich diese Zeile und Ihre Matrixumwandlung mit dieser Linie, die ich denke, ist klarer:

Dieser Code für mich

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

Perfekt, reparierte es. Ich habe etwas ähnliches versucht, aber ich vermute, dass der .values ​​() -Teil korrigiert hat, wie die Werte gelesen werden sollten? –

+0

@ A.Timmins Ja, ich habe auch bemerkt, dass es nicht funktionierte, die Spalte aus dem Datenrahmen direkt als eine Reihe zu übergeben, '.values ​​()' wandelt es in ein numpy Array um. –