Matplotlib не отображает данные точно в квадратном виде

#python #matplotlib #imshow

#python #matplotlib #imshow

Вопрос:

Я использую matplotlib.imshow для отображения 2D numpy-массива целых значений в виде тепловой карты. Проблема в том, что пиксели в конечном изображении не совсем квадратные. Иногда они немного прямоугольные. Для меня это большая проблема, поскольку я использую эту «тепловую карту» в качестве наложения на карте, и такое поведение создает странный визуальный сбой.

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

Я делаю это так:

 fig = plt.imshow(data2d, cmap=cmap, norm=norm, aspect='equal', interpolation='none')
plt.axis('off')
fig.axes.get_xaxis().set_visible(False)
fig.axes.get_yaxis().set_visible(False)
fig.axes.set_adjustable('box-forced')
plt.savefig("output.png", bbox_inches='tight', pad_inches=0, dpi=72)
  

Я думал, что установка атрибута «аспект» на «равный» позаботится о том, чтобы пиксели были точно квадратными. Я заметил, что если я увеличу DPI, эффект будет менее заметным, поскольку для работы требуется больше пикселей, но время рендеринга становится проблемой.

Я был бы рад, если бы кто-нибудь мог указать мне правильное направление.

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

1. matplotlib должен выполнить повторную выборку ваших данных в пикселях на холсте. По умолчанию это делается с помощью интерполяции ближайшего соседа. Если вы хотите, чтобы это было точно, убедитесь, что размер осей таков, что он является целым числом, кратным или делителем количества точек данных, которые у вас есть в каждом направлении.

2. Пиксели холста имеют одинаковый размер (если у вас нет монитора с растянутым соотношением сторон или чего-то еще). Ваши пиксели данных просто не разделяются на них равномерно. Рассмотрим одно измерение длиной 2 дюйма. При 72 dpi у вас есть 144 пикселя. Если вы сопоставите 10 пикселей данных с этими 144 пикселями canvas, некоторые из них будут равны 14 пикселям, но четыре из них будут равны 15 пикселям.

3. Если вы не укажете размер холста, используется размер по умолчанию в зависимости от того, что находится в вашем matplotlibrc.

4. Конечно, это можно сделать, но не тривиально. Я думаю, что PIL и т.д. Лучше справляются с прямыми манипуляциями с изображениями, чем matplotlib. Matplotlib предназначен для отображения данных, и обычно предполагается, что dpi рисунка пересчитывает изображения достаточно хорошо, чтобы смещения пикселей не были заметны.

5. Вы можете установить свой размер фигуры = (npixels / dpi * увеличение выборки, mpixels / dpi * увеличение выборки), а затем расположить оси в (0, 0, 1, 1).

Ответ №1:

В итоге я заменил matplotlib на rasterio и сам обработал цветовую карту. Это определенно не простое решение…