Вызов другой функции при создании подзаговоров в Python - PullRequest
0 голосов
/ 05 октября 2018

ОБНОВЛЕНИЕ: Теперь я получаю вспомогательные участки в правильных положениях и с отображением правильных данных!Однако осталась проблема, заключающаяся в том, что я не могу дать подзаголовкам их собственный заголовок и цветовую панель.На самом деле, я бы предпочел иметь только одну цветную полосу справа от всех графиков, но это тоже не работает.Вот мой новый код вместе с некоторыми примерами данных (с чрезвычайно неприглядным, но только для целей тестирования):

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, чтобы просто создать отдельные графики, и знаю, что она отлично работает для этого, поэтому проблема должна быть в создании подзаговора.В чем здесь может быть проблема, и как мне ее решить?

1 Ответ

0 голосов
/ 05 октября 2018

Вы подозреваете это сами, вы создаете свои подсюжеты вне цикла, но затем создаете новую фигуру каждый раз, когда вызывается ваша функция.

Сначала вы должны создать свою фигуру и оси с необходимой проекцией:

fig, axes = plt.subplots(nrows=6, ncols=2, subplot_kw={'projection': ccrs.PlateCarree()})

Затем вы можете пройтись по осям и передать их в качестве аргумента своей функции (обязательно удаливлюбая фигура или создание осей в самой фигуре):

def DensityPlot(lon, lat, dens, ax):
   Lat, Lon = np.meshgrid(lat, lon)
   density = ax.pcolormesh(Lon, Lat, dens, cmap = 'jet')
   cbar = ax.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 ax in axes.flat:
    density = DensityPlot(lon, lat, dens, ax)

Чтобы добавить заголовок к каждому подзаговору, необходимо использовать ax.set_title() в своей функции:

ax.set_title(plotTitle(yr))

ТамЕсть много других вопросов по добавлению цветовой панели для нескольких участков.Например, Matplotlib 2 субплота, 1 цветная полоса

...