Сохранить неквадратный массив данных на рисунке без пробелов, используя matplotlib - PullRequest
0 голосов
/ 19 марта 2019

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

В случае, когда данные имеют одинаковую ширину и высоту, мне удалосьчтобы достичь этого, следуя этому ответу :

import numpy as np
import matplotlib.pyplot as plt
def borderless_imshow_save(data, outputname, size=(1, 1), dpi=80):
    fig = plt.figure()
    fig.set_size_inches(size)
    ax = plt.Axes(fig, [0, 0, 1, 1])
    ax.set_axis_off()
    fig.add_axes(ax)

    ax.imshow(data);
    plt.savefig(outputname, dpi=dpi)

data = np.random.randn(40, 40)
borderless_imshow_save(data, 'test.png', dpi=100)

Это прекрасно работает.Тем не менее, мне действительно нужно сделать это для данных, которые являются прямоугольными, то есть что-то вроде np.random.randn(40, 100).

. В этом случае приведенный выше код не работает, так как снова пробелы создаются в конечном изображении.Я попытался поиграть с параметром size и аргументами plt.Axes, но безуспешно.

Какой лучший способ добиться этого?

Обратите внимание, что imsave на самом деле работает здесь с чем-токак

plt.imsave('test.png', np.random.randn(40, 100))

проблема в том, что с imsave у меня нет доступа к тому же количеству опций, которые у меня есть с imshow.

Ответы [ 2 ]

1 голос
/ 20 марта 2019

Простой вариант - не заботиться о реальном размере фигуры и просто обрезать изображение автоматически при сохранении.

import numpy as np
import matplotlib.pyplot as plt

data = np.random.randn(40, 100)
fig, ax = plt.subplots()
ax.imshow(data)
ax.set_axis_off()
fig.savefig("data.png", bbox_inches="tight", pad_inches=0)
1 голос
/ 19 марта 2019

Проблема в том, что вы задаете размер квадратной фигуры с помощью size=(1,1) и затем строите прямоугольное изображение. Я изменил ваш код, чтобы устранить пробелы вокруг фигуры, автоматически установив размер фигуры в соответствии с размерами входных данных. Параметр size теперь определяет ширину изображения, а высота масштабируется от этого:

import numpy as np
import matplotlib.pyplot as plt

def borderless_imshow_save(data, outputname, size = 1, dpi=80):
    width = 1*size
    height = data.shape[0] / data.shape[1] * size
    size=(width, height)
    fig = plt.figure(figsize=size, dpi=dpi)
    ax = fig.add_axes([0, 0, 1, 1])
    ax.set_axis_off()

    ax.imshow(data);
    fig.savefig(outputname, dpi=dpi)

data = np.random.randn(40, 100)
borderless_imshow_save(data, 'test.png', size=5, dpi=100)

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

Image with no borders

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...