ОБНОВЛЕНИЕ: Теперь я получаю вспомогательные участки в правильных положениях и с отображением правильных данных!Однако осталась проблема, заключающаяся в том, что я не могу дать подзаголовкам их собственный заголовок и цветовую панель.На самом деле, я бы предпочел иметь только одну цветную полосу справа от всех графиков, но это тоже не работает.Вот мой новый код вместе с некоторыми примерами данных (с чрезвычайно неприглядным, но только для целей тестирования):
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors as colors
import cartopy.crs as ccrs
lons = np.arange(-180,180,1)
lats = np.arange(-80,80,1)
dens = np.zeros((12, len(lons), len(lats)))
for i in range(12):
dens[i,:,:] = i
def plotTitle(yr):
letter = chr(yr-2002+97)
return '(' + letter + ') ' + str(yr)
def DensityPlot(yr, lon, lat, dens, ax):
Lat, Lon = np.meshgrid(lat, lon)
density = ax.pcolormesh(Lon, Lat, dens, cmap = 'jet')
#cbar = ax.colorbar(density, orientation='vertical', shrink=0.5, extend='both') # this gives an error: ''GeoAxesSubplot' object has no attribute 'colorbar''
ax.coastlines()
plt.title(plotTitle(yr),fontsize=14,fontweight='bold') # this only works for the last plot. ax.title doesn't work, gives the error ''Text' object is not callable'
fig, axes = plt.subplots(nrows=6, ncols=2, figsize=(35,35), subplot_kw={'projection': ccrs.PlateCarree()}) ## check figsize
i=0
for ax in axes.flat:
densdata = dens[i,:,:]
density = DensityPlot(i+2002, lons, lats, densdata, ax)
i=i+1
#ax.title(plotTitle(i+2002)) # this gives the same error as mentioned before: ''Text' object is not callable'
#cbar = plt.colorbar(density, orientation='vertical', shrink=0.5, extend='both')
# this gives the following RuntimeError: No mappable was found to use for colorbar creation. First define a mappable such as an image (with imshow) or a contour set (with contourf).
fig.subplots_adjust(right=0.5)
Как я могу убедиться, что у каждого подзаголовка есть свой собственный заголовок, а рядом есть цветовая полосако всем субплотам?
У меня проблема с созданием набора субплотов в Python.Я определил функцию, которая создает конкретный график:
def DensityPlot(lon, lat, dens):
Lat, Lon = np.meshgrid(lat, lon)
fig = plt.figure(figsize=(12,12))
ax = plt.axes(projection=ccrs.PlateCarree())
density = plt.pcolormesh(Lon, Lat, dens, cmap = 'jet')
cbar = plt.colorbar(orientation='vertical', shrink=0.5, extend='both')
cbar.set_label("Plastic Density ($10^{-3}$ particles km$^{-2}$)", rotation=90,fontsize=12)
ax.coastlines()
return density
Теперь я хочу использовать эту функцию в цикле for для создания дочерних участков.Для простоты предположим, что я могу использовать одни и те же значения для lat
, lon
и dens
в каждом подзаговоре (поэтому я просто получу один и тот же график несколько раз).Однако затем следующий код не работает:
fig, axes = plt.subplots(nrows=6, ncols=2)
for j in range(0,12):
plt.subplot(6,2,j+1)
density = DensityPlot(lon, lat, dens)
Происходит следующее: сначала отображаются 12 пустых графиков, хотя и в правильном порядке (6x2).После этого 11 пустых графиков появляются друг под другом, и, наконец, самый последний график фактически отображается так, как он должен отображаться.Я проверил код для функции DensityPlot
, чтобы просто создать отдельные графики, и знаю, что она отлично работает для этого, поэтому проблема должна быть в создании подзаговора.В чем здесь может быть проблема, и как мне ее решить?