Изменить цвет фона спроецированной оси Matplotlib

Я пытаюсь создать фигуру с помощью Cartopy, которая требует, чтобы спроецированная ось была нарисована поверх непроецируемой оси.

Вот максимально простая версия кода, который заменяет содержимое на осях цветом фона:

import matplotlib.pyplot as plt
import cartopy.crs as ccrs

#Setup figure
fig = plt.figure()

#Unprojected axis
ax1 = fig.add_subplot(111, axisbg='b')

#Projected axis
ax2 = fig.add_subplot(111, axisbg='None', projection=ccrs.Mercator())

plt.show()

Что вместо того, чтобы оставить видимой синюю ось, дает следующее: введите здесь описание изображения Удаление аргумента projection=ccrs.Mercator() из приведенного выше кода приводит к следующему ожидаемому результату: введите здесь описание изображения

Как сделать фон спроецированной оси прозрачным?

Спасибо!

Изменить: я пробовал эти другие методы установки прозрачного фона без везения:

ax2 = fig.add_subplot(111, axisbg='None', alpha=0, projection=ccrs.Mercator())
ax2.patch.set_facecolor('none')
ax2.patch.set_alpha(0)

person Siyh    schedule 25.08.2015    source источник
comment
Вы пытались добавить alpha=0.5 в параметры подзаголовка? который должен определять уровни прозрачности. Кажется, я не могу настроить cartopy с помощью pip, но я думаю, что это должно сработать.   -  person Francisco Vargas    schedule 25.08.2015
comment
@FranciscoVargas Спасибо за предложение - к сожалению, я пробовал экспериментировать с другими методами прозрачности (см. правки), но безуспешно.   -  person Siyh    schedule 25.08.2015


Ответы (2)


Cartopy по-прежнему не очень хорош с точки зрения управления некоторыми вещами, и я боюсь, что вам нужно копаться в коде, чтобы узнать некоторые вещи.

Я думаю, что основная настройка, которая вам нужна, заключается в следующем:

ax2.background_patch.set_fill(False)

Мой взломанный пример:

import matplotlib.pyplot as plt
import cartopy.crs as ccrs

fig = plt.figure()
ax1 = fig.add_subplot(111, axisbg='b')
ax2 = fig.add_subplot(111, axisbg='None', projection=ccrs.Mercator())
ax2.background_patch.set_fill(False)
ax2.add_feature(cartopy.feature.LAND)
ax2.coastlines(color='red', linewidth=0.75)
plt.show()

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

Изменить: устранена ошибка копирования/вставки

HTH
Патрик

person pp-mo    schedule 25.08.2015
comment
Я также обнаружил, что мне нужно сохранить аргумент axisbg='None', чтобы сохранить предполагаемый порядок рисования содержимого осей (по какой-то причине его удаление не помешало ему быть прозрачным...) - person Siyh; 27.08.2015

Вы можете использовать imshow() для проецирования изображения на фон вашей карты. Для этой цели Cartopy использует метод stock_img().

Вы также можете получить сплошной цвет фона, создав изображение размером 2x2 пикселя с помощью NumPy и спроецировав его на всю карту:

import numpy as np
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
from cartopy.feature import LAND
    
ax = plt.axes(projection=ccrs.PlateCarree())

# Set RGB value to ocean colour
ax.imshow(np.tile(np.array([[[200, 200, 255]]], 
          dtype=np.uint8), [2, 2, 1]),
      origin='upper',
      transform=ccrs.PlateCarree(),
      extent=[-180, 180, -90, 90])

ax.add_feature(LAND)
ax.coastlines()

plt.show()

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

person onewhaleid    schedule 25.07.2016