2017-07-03 4 views
0

Ich versuche, die Wärme-/Intensitätsabbildung mithilfe von Basemap zu erstellen. Meine Eingaben sind eine Menge von Lats, Lons und Intensität an diesem Punkt. Der Datensatz sieht so aus:Eingabeformat für pcolormesh

lat[0], lon[0] = intensity[0] 
lat[1], lon[1] = intensity[1] 
... 
lat[n], lon[n] = intensity[n] 

Bei jedem Index entsprechen Lat und Lon dem korrekten Sensorwert. Mein Code sieht ungefähr so ​​aus:

fig = plt.figure(figsize=(10, 8)) 


# Set title 
fig.suptitle("Intensities {} {}".format(start_time, stop_time)) 


# US Centered Map 
map_axis = fig.add_subplot(111) 
map = Basemap(
    ax = map_axis, 
    lat_0 = 40, lon_0 = -95, 
    width = 6500e3, height = 6500e3, 
    projection = 'stere', 
    resolution = 'l' 
) 
map.drawcoastlines() 


lats = ... 
lons = ... 
intn = ... 


# Convert coordinates 
lons, lats = map(lons, lats) 


LONS, LATS = np.meshgrid(lons, lats) 
map.pcolormesh(
    LONS, LATS, 
    intn, 
    vmin = 0, vmax = 100 
) 


fig.savefig(file_name) 
plt.close(fig) 

Dieser Code wird nie abgeschlossen. Ich habe die Grundkarte selbst erstellt. Das pcolormesh ist was fehlschlägt. Das Programm stürzt mit diesem Fehler ab.

$ ./plot_intensities.py 
    Running 2013-04-10 00:02:30 2013-04-10 00:02:45 
    Traceback (most recent call last): 
     File "./plot_intensities.py", line 151, in <module> 
     make_maps(samples) 
     File "./plot_intensities.py", line 144, in make_maps 
     make_map(bin_samples, start, walk) 
     File "./plot_intensities.py", line 117, in make_map 
     vmin = 0, vmax = 100 
     File "/usr/lib/python3/dist-packages/mpl_toolkits/basemap/__init__.py", line 521, in with_transform 
     return plotfunc(self,x,y,data,*args,**kwargs) 
     File "/usr/lib/python3/dist-packages/mpl_toolkits/basemap/__init__.py", line 3418, in pcolormesh 
     ret = ax.pcolormesh(x,y,data,**kwargs) 
     File "/usr/lib/python3/dist-packages/matplotlib/__init__.py", line 1814, in inner 
     return func(ax, *args, **kwargs) 
     File "/usr/lib/python3/dist-packages/matplotlib/axes/_axes.py", line 5395, in pcolormesh 
     X, Y, C = self._pcolorargs('pcolormesh', *args, allmatch=allmatch) 
     File "/usr/lib/python3/dist-packages/matplotlib/axes/_axes.py", line 4995, in _pcolorargs 
     numRows, numCols = C.shape 
    ValueError: not enough values to unpack (expected 2, got 1) 

Ich verstehe, dass meine Daten, das dritte Argument intn nicht korrekt formatiert ist. Ich kann keine Dokumentation darüber finden, wie ich diese Liste gestalten soll. Wie formatiere ich es in die richtige Form?

Danke.

Antwort

2

Wie Sie wissen, wird pcolormesh verwendet, um ein vierseitiges Netz zu plotten, indem ein Pseudocolor-Plot eines 2-D-Arrays erstellt wird. Die Fehlerdetails deuteten tatsächlich darauf hin, dass sie in Zeile numRows, numCols = C.shapeC als 2-D-Array erwarten, während das von Ihnen bereitgestellte C nach Einschätzung von ValueError: not enough values to unpack (expected 2, got 1) ein 1-D-Array zu sein scheint. Der Datensatz, den Sie eingeführt haben, scheint mir nur Intensitätswerte auf der Diagonalen zu haben (lat == lon). Um ein Farbmuster zu erhalten, müssen Sie zumindest die Intensitätsdaten in das 2D-Array erweitern und fehlende Werte irgendwie ergänzen. Zum Beispiel:

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

fig = plt.figure(figsize=(10, 8)) 
# Set title 
fig.suptitle("Intensities {} {}".format('start_time', 'stop_time')) 
# US Centered Map 
map_axis = fig.add_subplot(111) 
map = Basemap(
    ax = map_axis, 
    lat_0 = 40, lon_0 = -95, 
    width = 6500e3, height = 6500e3, 
    projection = 'stere', 
    resolution = 'l' 
) 
map.drawcoastlines() 

# Tried my best to simulate your data example. Don't be surprise if the result is ugly ... 
nstep = 1 
lats = np.arange(map.latmin, map.latmax, nstep) 
lons = np.arange(map.lonmin, map.lonmax, nstep) 
l = min(len(lats), len(lons)) 
lats = lats[:l] 
lons = lons[:l] 
intn = np.random.randint(0, 100, size=l) 

# Convert coordinates 
lons, lats = map(lons, lats) 
LONS, LATS = np.meshgrid(lons, lats) 

# The following 3 lines are just an example of the minimum you got to do before it works. 
intn_array = np.zeros(LONS.shape) 
for i in range(l): 
    intn_array[i, i] = intn[i] 
intn = intn_array 

map.pcolormesh(
    LONS, LATS, 
    intn_array, 
    vmin = 0, vmax = 100 
) 

plt.show() 

enter image description here

Verwandte Themen