Python Matplotlib: Заполнение контуров с черными штриховками вместо белых

Вопросы и ответы

Я пытаюсь наложить маску значимости на переменную, используя штрихи в contourf.

Мне не удалось изменить цвет штрихов с белого на черный (то, что нужно). Я пробовал различные комбинации edgecolor, facecolor, color и кода contourf. Любая помощь будет очень ценна!

Вот мой код:

import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
import cartopy.crs as ccrs
from cartopy.feature import NaturalEarthFeature

all_plots = []
plt.rcParams.update({'hatch.color': 'k'})

land = NaturalEarthFeature('physical', 'land', '50m', edgecolor="face", facecolor="white")

# Создание подплота 2x2 (2 строки, 2 столбца) для 4 графиков с проекцией Миллера
fig, axs = plt.subplots(2, 2, figsize=(18, 9), subplot_kw={'projection': ccrs.Miller()})
plt.subplots_adjust(hspace=0.25, wspace=0.1)  # Настройка отступов

# Общие аргументы для цветовой шкалы
cmap = 'RdBu_r'

# Функция для настройки общих сеток и особенностей
def setup_ax(ax, title):
    ax.coastlines(zorder=2)
    ax.add_feature(land, zorder=1)
    ax.set_extent([-180, 180, -1, 90], crs=ccrs.PlateCarree())  # Ограничить ось Y от 0 до 90 градусов
    gl = ax.gridlines(draw_labels=True, linewidth=0.6, zorder=1, color="dimgray", alpha=0.3)
    gl.left_labels = True
    gl.bottom_labels = True
    gl.top_labels = False
    gl.right_labels = False
    gl.xlabel_style = {'size': 10}
    gl.ylabel_style = {'size': 10}
    gl.ylocator = plt.FixedLocator(np.arange(0, 91, 20))  # Добавить линии сетки оси Y на 0°, 20°, 40° и т.д.
    gl.xlocator = plt.FixedLocator(np.arange(-180, 181, 60))  # По желанию: настройка меток оси X
    ax.set_title(title, fontsize=15)

# График 1: Самые сильные месяцы града (май-август)
im = mean_sst_strongest_months_north.plot(ax=axs[0, 0], cmap=cmap, add_colorbar=False, 
vmin=vmin, vmax=vmax, transform=ccrs.PlateCarree())
# Наложение маски значимости для первого графика
cax1 = axs[0, 0].contourf(significant_mask_months_strongest_north.longitude, 
                      significant_mask_months_strongest_north.latitude, 
                      significant_mask_months_strongest_north, levels=[0.5, 1], 
                      colors="none", hatches=['oo'], transform=ccrs.PlateCarree())
setup_ax(axs[0, 0], 'Самые сильные месяцы града (май-авг)')
for ax in axs.flat:
    rect = Rectangle((5.5, 45.3), 5.4, 2.7, linewidth=1.5, edgecolor="limegreen", 
facecolor="none", transform=ccrs.PlateCarree())
    ax.add_patch(rect)

[... другие 3 графика ...]

# Добавление общей цветовой шкалы внизу
cbar = fig.colorbar(im, ax=axs, pad=0.06, orientation="horizontal", shrink=0.7, 
extend="both", aspect=50)
cbar.set_label('Аномалии SST [K]', fontsize=15)

# Добавление основного заголовка для рисунка
fig.suptitle('Средние аномалии SST 10 самых сильных градуевых лет в северной Швейцарии', 
fontsize=18, y=0.97)

# Сохранение графика в указанную директорию
plt.savefig("/sst_strongest_4periods_north_significance_95.jpeg", dpi=350, 
bbox_inches="tight", pad_inches=0.05)

# Закрытие всех открытых графиков
plt.close('all')

Вот как выглядит график сейчас:

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

Ответ

Ваша проблема заключается в том, что вы хотите изменить цвет хачей с белого на черный при использовании функции contourf в Matplotlib. В вашем коде вы пытаетесь это сделать через параметры hatch.color, но это не работает, потому что для contourf аккуратный цвет хачей не задается таким способом.

Давайте я помогу вам изменить ваш код, чтобы хачи были черными.

Вот обновленный фрагмент вашего кода, который решит вашу проблему:

import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
import cartopy.crs as ccrs
from cartopy.feature import NaturalEarthFeature
from matplotlib.patches import Rectangle

all_plots = []
plt.rcParams.update({'hatch.color': 'k'})  # Установить цвет хачей на черный

land = NaturalEarthFeature('physical', 'land', '50m', edgecolor="face", facecolor="white")

# Создаем 2x2 подграфик (2 строки, 2 столбца) для 4 графиков, с проекцией Миллера
fig, axs = plt.subplots(2, 2, figsize=(18, 9), subplot_kw={'projection': ccrs.Miller()})
plt.subplots_adjust(hspace=0.25, wspace=0.1)  # Регулировка расстояния

# Общие аргументы для цветной шкалы
cmap = 'RdBu_r'

# Функция для настройки общих линий сетки и особенностей
def setup_ax(ax, title):
    ax.coastlines(zorder=2)
    ax.add_feature(land, zorder=1)
    ax.set_extent([-180, 180, -1, 90], crs=ccrs.PlateCarree())  # Ограничьте ось Y от 0 до 90 градусов
    gl = ax.gridlines(draw_labels=True, linewidth=0.6, zorder=1, color="dimgray", alpha=0.3)
    gl.left_labels = True
    gl.bottom_labels = True
    gl.top_labels = False
    gl.right_labels = False
    gl.xlabel_style = {'size': 10}
    gl.ylabel_style = {'size': 10}
    gl.ylocator = plt.FixedLocator(np.arange(0, 91, 20))  # Добавьте линии сетки по оси Y на 0°, 20°, 40° и т.д.
    gl.xlocator = plt.FixedLocator(np.arange(-180, 181, 60))  # Опционально: настройка меток оси X
    ax.set_title(title, fontsize=15)

# Пример построения: самые сильные месяцы сезонов града (май-август)
im = mean_sst_strongest_months_north.plot(ax=axs[0, 0], cmap=cmap, add_colorbar=False, 
vmin=vmin, vmax=vmax, transform=ccrs.PlateCarree())

# Наложение маски значимости для первого графика
cax1 = axs[0, 0].contourf(significant_mask_months_strongest_north.longitude, 
                      significant_mask_months_strongest_north.latitude, 
                      significant_mask_months_strongest_north, levels=[0.5, 1], 
                      colors="none", hatches=['//'], transform=ccrs.PlateCarree())  # Используйте черные хачи

setup_ax(axs[0, 0], 'Сильнейшие месяцы сезона града (май-авг)')
for ax in axs.flat:
    rect = Rectangle((5.5, 45.3), 5.4, 2.7, linewidth=1.5, edgecolor="limegreen", 
facecolor="none", transform=ccrs.PlateCarree())
    ax.add_patch(rect)

# [... другие 3 графика ...]

# Добавление общей цветовой шкалы внизу
cbar = fig.colorbar(im, ax=axs, pad=0.06, orientation="horizontal", shrink=0.7, 
extend="both", aspect=50)
cbar.set_label('Аномалии SST [K]', fontsize=15)

# Добавление заголовка к фигуре
fig.suptitle('Средние аномалии SST 10 сильнейших лет града в северной Швейцарии', 
fontsize=18, y=0.97)

# Сохранение графика в указанной директории
plt.savefig("/sst_strongest_4periods_north_significance_95.jpeg", dpi=350, 
bbox_inches="tight", pad_inches=0.05)

# Закрыть все открытые графики
plt.close('all')

Примечания:

  1. Для изменения цвета хачей, убедитесь, что вы используете небелые хачи — например, такие как ['//'] для диагональных линий.

  2. Обновите параметры hatch.color в plt.rcParams на нужный вам цвет, если вы предпочитаете другой.

Теперь хачи должны отображаться в черном цвете на вашем графике. Если у вас есть дополнительные вопросы или проблемы, не стесняйтесь спрашивать!

Оцените материал
Добавить комментарий

Капча загружается...