Bei der Erforschung der Erd- und Planetenwissenschaften stoße ich häufig auf eine Situation, in der ich mehrere Karten und Daten gleichzeitig auf einer Figur zeichnen möchte. Diesmal mit Pythons Matplotlib,
Das Ziel ist das.
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.basemap import Basemap
xlim = [100, 170] #Umfang der Figur(Richtung der x-Achse: Längengrad)
ylim = [10, 60] #Umfang der Figur(Richtung der y-Achse: Breitengrad)
column = 3 #Anzahl der Spalten
fsizex, fsizey= 16, 18 #Horizontale und vertikale Länge der Figur
line_interval = 15 #Abstand zwischen Breitengrad und Meridianlinien auf der Karte
fontsize = 20 #Schriftgröße
if 12 % column != 0:
raise ValueError('column must be a divisor of 12!')
row = 12 / column #Anzahl der Reihen
months = [ 'Jan', 'Feb', 'Mar', 'Apr',
'May', 'Jun', 'Jul', 'Aug',
'Sep', 'Oct', 'Nov', 'Dec' ]
fig = plt.figure(figsize = (fsizex, fsizey))
plt.rcParams['font.size'] = fontsize
ax = [0] * 12
for i in range(0, 12):
ax[i] = fig.add_subplot(row, column, 1 + i)
m = Basemap(projection = 'cyl', llcrnrlat = ylim[0], urcrnrlat = ylim[1], \
llcrnrlon = xlim[0], urcrnrlon = xlim[1], resolution = 'c', lon_0 = 180)
m.drawcoastlines(linewidth = 0.5)
m.drawmapboundary()
m.fillcontinents(color = '#eeeeee')
if i == 12 - column:
label = [1, 1]
elif i > 12 - column:
label = [1, 0]
elif i % column == 0:
label = [0, 1]
else:
label = [0, 0]
m.drawmeridians(np.arange(0, 360, line_interval), labels = [0, 0, 0, label[0]], linewidth = 0.5)
m.drawparallels(np.arange(-90, 90, line_interval), labels = [label[1], 0, 0, 0], linewidth = 0.5)
ax[i].set_xlim(xlim)
ax[i].set_ylim(ylim)
ax[i].set_title(months[i])
fig.tight_layout()
plt.show()
Wenn die Diagramme für jeden Monat zweidimensionale Daten sind, kombinieren Sie alle Daten für die 12 Monate zu einem dreidimensionalen Array.
xn = 360 #X-Achse der Daten(Längengrad)Anzahl der Gitter in Richtung
yn = 155 #Y-Achse der Daten(Breite)Anzahl der Gitter in Richtung
data = np.zeros((12, yn, xn))
for i in range(0, 12):
data[i, :, :] = ..... # (i+1)Prozess zum Abrufen von Monatsdaten
Zusätzlich wird ein eindimensionales Array erfasst, das der x-Achse (Längsachse) und der y-Achse (Breitengrad) der zweidimensionalen Daten entspricht. Diesmal jeweils
(Beide sind numpy.ndarray
).
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.basemap import Basemap
xlim = [100, 170] #Umfang der Figur(Richtung der x-Achse: Längengrad)
ylim = [10, 60] #Umfang der Figur(Richtung der y-Achse: Breitengrad)
column = 3 #Anzahl der Spalten
fsizex, fsizey= 16, 18 #Horizontale und vertikale Länge der Figur
cb_min, cb_max = -2, 32 #Minimaler / maximaler Farbbalken
cb_div = 17 #Anzahl der in der Farbleiste verwendeten Farben
clabel = 'Sea Surface Temperature(deg)' #Etikett an der Farbleiste angebracht
line_interval = 15 #Abstand zwischen Breitengrad und Meridianlinien auf der Karte
fontsize = 20 #Schriftgröße
if 12 % column != 0:
raise ValueError('column must be a divisor of 12!')
row = 12 / column #Anzahl der Reihen
months = [ 'Jan', 'Feb', 'Mar', 'Apr',
'May', 'Jun', 'Jul', 'Aug',
'Sep', 'Oct', 'Nov', 'Dec' ]
fig = plt.figure(figsize = (fsizex, fsizey))
plt.rcParams['font.size'] = fontsize
delta = (cb_max - cb_min) / cb_div
interval_of_cf = np.arange(cb_min, abs(cb_max) * 2 + delta, delta)[0:int(cb_div) + 1]
ax = [0] * 12
for i in range(0, 12):
ax[i] = fig.add_subplot(row, column, 1 + i)
m = Basemap(projection = 'cyl', llcrnrlat = ylim[0], urcrnrlat = ylim[1], \
llcrnrlon = xlim[0], urcrnrlon = xlim[1], resolution = 'c', lon_0 = 180)
m.drawcoastlines(linewidth = 0.5)
m.drawmapboundary()
m.fillcontinents(color = '#eeeeee')
if i == 12 - column:
label = [1, 1]
elif i > 12 - column:
label = [1, 0]
elif i % column == 0:
label = [0, 1]
else:
label = [0, 0]
m.drawmeridians(np.arange(0, 360, line_interval), labels = [0, 0, 0, label[0]], linewidth = 0.5)
m.drawparallels(np.arange(-90, 90, line_interval), labels = [label[1], 0, 0, 0], linewidth = 0.5)
#Farbkontur zeichnen
x, y = np.meshgrid(xgrid, ygrid)
X, Y = m(x, y)
CF = ax[i].contourf(X, Y, data[i, :, :], interval_of_cf)
ax[i].set_xlim(xlim)
ax[i].set_ylim(ylim)
ax[i].set_title(months[i])
#Zeichnen Sie einen Farbbalken
cax = fig.add_axes([1.00, 0.15, 0.04, 0.7])
cb = fig.colorbar(CF, cax)
cb.set_label(clabel)
fig.tight_layout()
plt.show()
Erfolgreich beim sicheren Erstellen. Die Kombination von vertikal und horizontal kann durch Ändern des Spaltenwerts frei geändert werden.
http://seesaawiki.jp/met-python/d/matplotlib/plot http://bicycle1885.hatenablog.com/entry/2014/02/14/023734 http://nm-player.blogspot.jp/2012/09/matplotlibbasemap-1.html http://qiita.com/AnchorBlues/items/0dd1499196670fdf1c46
Recommended Posts