сочетание обычных и картографических сюжетов на одной фигуре

Мне нужен сюжет с двумя подзаголовками, один побольше с картой, а второй поменьше с точечной диаграммой. Я использую cartopy для построения карты. Я определяю долю высоты с помощью gridspec_kw. Однако из-за ограничений проекции это также влияет на ширину.Вот что я получаю.

Это то, что я получаю.

import matplotlib.pyplot as plt
import cartopy as ccrs
fig, ax = plt.subplots(2,1,subplot_kw=dict(projection=ccrs.crs.PlateCarree()),gridspec_kw={'height_ratios': [4, 1]})

Одним из возможных решений было бы использовать subplot_kw=dict(projection=ccrs.crs.PlateCarree() только для верхней панели. Но я не могу понять, как это сделать. Есть способы, которые рекомендуют add_subplot, но это очень ручной и мне это не нравится Возможно ли это сделать с помощью plt.subplots()?

Это то, что я хочу Это то, что я хочу.


person Vinod Kumar    schedule 25.04.2020    source источник
comment
Нет, вы не можете сделать это с подзаговорами.   -  person Jody Klymak    schedule 26.04.2020
comment
Вы пробовали фигурку в форме (2,3)? с позицией (0,0) и colspan=3 для топора картопии и позицией (1,1) для точечной диаграммы. matplotlib grispec и другие менеджеры размещения   -  person david    schedule 26.04.2020


Ответы (1)


мое предложение состояло бы в том, чтобы использовать gridspec для управления размером подзаговоров и fig.add_subplot вместо plt.subplots. Таким образом, вы можете указать проекцию Cartopy только для первого сюжета.

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
import cartopy.crs as ccrs
import cartopy.feature as cfeature

fig = plt.figure()
gs = fig.add_gridspec(3, 3)

ax1 = fig.add_subplot(gs[0:2, :], projection=ccrs.PlateCarree())
ax1.set_extent([-180, 180, -90, 90], crs=ccrs.PlateCarree())
ax1.coastlines(resolution='auto', color='k')
ax1.gridlines(color='lightgrey', linestyle='-', draw_labels=True)

ax2 = fig.add_subplot(gs[2, :])
ax2.plot([1, 2], [3, 4])

введите здесь описание изображения

person Marcelo Andrioni    schedule 29.05.2020
comment
Спасибо за ответы. Это сработает, но это не то, что я искал. fig.add_subplot немного сложно работать с циклами. Я хотел получить ответ, используя plt.subplots. Но это невозможно, я думаю, как уже указывалось в комментарии ранее. - person Vinod Kumar; 29.05.2020
comment
Ты прав, @duff18, должно быть ax1.set_extent([-180, 180, -90, 90], crs=ccrs.PlateCarree()), а не ax.set_extent([-180, 180, -90, 90], crs=ccrs.PlateCarree()). Исправлено сейчас. - person Marcelo Andrioni; 23.07.2021