#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