2017-08-09 5 views
1

Je suis en train de tracer des lignes et des marqueurs à partir d'un fichier CSV sur une carte en utilisant matplotlib.Lines/Pistes Non Traçage avec Matplotlib

données:

AL99,2017080912,SHIP,0,17.1,-55.6,25,0 
AL99,2017080912,SHIP,12,18.1,-57.6,27,0 
AL99,2017080912,SHIP,24,19.0,-59.2,29,0 
AL99,2017080912,SHIP,36,20.1,-60.2,34,0 
AL99,2017080912,SHIP,48,21.5,-61.6,39,0 
AL99,2017080912,SHIP,60,23.3,-63.0,47,0 
AL99,2017080912,SHIP,72,25.4,-65.2,54,0 
AL99,2017080912,SHIP,84,27.9,-68.1,61,0 
AL99,2017080912,TABD,0,17.1,-55.7,0,0 
AL99,2017080912,TABD,6,17.5,-56.7,0,0 
AL99,2017080912,TABD,12,17.8,-57.3,0,0 
AL99,2017080912,TABD,18,18.1,-57.9,0,0 
AL99,2017080912,TABD,24,18.5,-58.3,0,0 
AL99,2017080912,TABD,30,19.0,-58.6,0,0 
AL99,2017080912,TABD,36,19.6,-58.8,0,0 

code Python:

tc = np.recfromcsv(csv_file, unpack=True, names=['stormid', 'initdate', 'mems', 'times', 'tclat', 'tclon', 'tcwind', 'tcpres'], dtype=None) 
for j in range(len(tc.times)): 
lon, lat = tc.tclon[j], tc.tclat[j] 
xpt, ypt = m(lon, lat) 
lonpt, latpt = m(xpt, ypt, inverse=True) 

if tc.mems[j] == 'TABD': 
    tccolor = '--bo' 
elif tc.mems[j] == 'AEMN': 
    tccolor = '-ro' 
else: 
    tccolor = '-k' 

m.plot(xpt, ypt, tccolor) 

Résultat:

enter image description here

Je reçois les marqueurs pour tracer correctement la couleur, mais les lignes ne sont pas là.

+2

Juste un rappel, votre code est incomplet (ce qui est 'm'?) Et mal formaté (pas de retrait après la boucle' for'). En outre, vos données ne semblent pas correspondre à votre intrigue (par exemple, votre lat dans les données est seulement entre 15 et 20, mais votre intrigue ressemble à l'Atlantique avec lat au moins jusqu'à 40). Votre question pourrait donc être difficile à résoudre et à aider pour d'autres. –

+0

Ne vous attendez pas à recevoir une réponse lorsque vous ne fournissez pas de code complet. Sauf si vous êtes très chanceux. Habituellement, il faudra beaucoup plus d'efforts que nécessaire de la part des personnes qui se soucient de répondre. – swatchai

Répondre

1

Pour activer le tracé linéaire, la fonction plot() doit être fournie avec des tableaux de points multiples (x, y) et non des valeurs uniques comme vous l'avez fait. Voici un code fonctionnel et un graphique de sortie résultant (basé sur les données fournies).

from matplotlib import pyplot as plt 
from mpl_toolkits.basemap import Basemap 
import numpy as np 

fig = plt.gcf() 
fig.set_size_inches([8,8]) 

m = Basemap(projection='cyl', \ 
     llcrnrlat= 10, urcrnrlat= 30, \ 
     llcrnrlon= -70, urcrnrlon= -50, \ 
     resolution='l') 

csv_file = "storm_data.csv" 
tc = np.recfromcsv(csv_file, unpack=True, names=['stormid', 'initdate', 'mems', 'times', 'tclat', 'tclon', 'tcwind', 'tcpres'], dtype=None) 

# for each line segment, (xs, ys) is initialized here 
# two of them are done here for demo purposes 
xs1 = [] 
ys1 = [] 
xs2 = [] 
ys2 = [] 

for j in range(len(tc.times)): 
    lon, lat = tc.tclon[j], tc.tclat[j] 
    xpt, ypt = m(lon, lat) 
    lonpt, latpt = m(xpt, ypt, inverse=True) 

    if tc.mems[j] == 'TABD': 
     xs1.append(lon) 
     ys1.append(lat) 

    elif tc.mems[j] == 'SHIP': 
     xs2.append(lon) 
     ys2.append(lat) 

    # *** elif for other line segmems *** 

    else: 
     pass 


# plot the collected line segments 
m.plot(xs1, ys1, '--bo', xs2, ys2, '--ro') 

# draw coastline 
m.drawcoastlines() 

plt.show() 

parcelle Résultant:

enter image description here