Перекрывающийся текст при сохранении нескольких изображений Matplotlib с текстом в цикле

#python #loops #matplotlib #text #colormap

#python #циклы #matplotlib #текст #цветовая карта

Вопрос:

Я создал эту шахматную доску со случайным значением / цветом:

шахматная доска

с помощью кода:

 rndm = np.random.rand(8,8)
my_cmap = plt.get_cmap('gray') 

plt.figure(figsize=(5,4))
plt.imshow(rndm, cmap=my_cmap, interpolation = 'none')
plt.axis('off')
plt.show()
  

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

 fig, axs = plt.subplots(2,2, figsize=(10, 10))
axs = axs.ravel()

for i, n in zip(np.arange(4), np.arange(2,6)):
    axs[i].imshow(np.power(rndm, n), cmap=my_cmap, interpolation = 'none')
    axs[i].axis('off')
    axs[i].text(1, 1, str(n), fontsize=14, color = 'y')
  

и результат:

сюжетные линии

Но чего бы мне действительно хотелось, так это перебрать 4 цветовых карты, например:

 cmaps = ['viridis', 'inferno', 'plasma', 'magma']
fig, axs = plt.subplots(2,2, figsize=(10, 10))
axs = axs.ravel()

for i, n in zip(np.arange(4), np.arange(2,6)):
    axs[i].imshow(np.power(rndm, n), cmap=cmaps[i], interpolation = 'none')
    axs[i].axis('off')
    axs[i].text(1, 1, str(n), fontsize=14, color = 'y')
  

цветные сюжетные линии

Хорошо. Но вот где мой код ломается. Я хочу сохранить их как отдельные изображения.
Я написал это, и это прекрасно, за исключением того факта, что текстовые номера в конечном итоге накладываются друг на друга:

 for i, n in zip(np.arange(4), np.arange(2,6)):
    plt.imshow(np.power(rndm, n), cmap=cmaps[i], interpolation = 'none')
    plt.axis('off')
    plt.text(1, 1, str(n), fontsize=14, color = 'y')
    plt.savefig("test_n = "   str(n)  ".png", dpi=300, bbox_inches='tight', pad_inches=0)
  

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

Как мне очищать их каждый раз?

Ответ №1:

Разве вы не должны использовать cmaps[i] вместо cmap=my_cmap ? Создайте фигуру в каждом цикле с помощью plt.figure() , и она будет работать правильно (проверено).

 for i, n in zip(np.arange(4), np.arange(2,6)):
    plt.figure()
    plt.imshow(np.power(rndm, n), cmap=cmaps[i], interpolation = 'none')
    plt.axis('off')
    plt.text(1, 1, str(n), fontsize=14, color = 'y')
    plt.savefig("test_n = "   str(n)  ".png", dpi=300, bbox_inches='tight', pad_inches=0)
  

Результат:

  • Основное изображение (не сохранено) : введите описание изображения здесь

-Сохраненные изображения:

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

Обратите внимание, что метки начинаются с 2 из-за этой строки :

 plt.text(1, 1, str(n), fontsize=14, color = 'y')
  

Если вы хотите, чтобы оно начиналось с 1, измените str(n) на str(i) .

Комментарии:

1. Извините, cmap=my_cmap было просто опечаткой. В моем исходном коде я все сделал правильно. Но plt.figure() исправит это. Спасибо за ваш ответ. Мне нравится str (n), потому что это показатель степени.

2. Теперь я отредактировал вопрос, чтобы удалить ошибку cmap = my_cmap, чтобы это не сбивало с толку будущих читателей. Еще раз спасибо @Yugi