[python] Matplotlib 플롯 : 축, 범례 및 공백 제거

저는 Python과 Matplotlib을 처음 사용합니다. 축, 레이블, 제목 또는 일반적으로 matplotlib에 의해 자동으로 추가되는 것을 사용하지 않고 이미지에 컬러 맵을 적용하고 결과 이미지를 작성하고 싶습니다. 여기 내가 한 일이 있습니다.

def make_image(inputname,outputname):
    data = mpimg.imread(inputname)[:,:,0]
    fig = plt.imshow(data)
    fig.set_cmap('hot')
    fig.axes.get_xaxis().set_visible(False)
    fig.axes.get_yaxis().set_visible(False)
    plt.savefig(outputname)

그림의 축을 성공적으로 제거하지만 저장된 그림은 실제 이미지 주위에 흰색 패딩과 프레임을 나타냅니다. 어떻게 제거 할 수 있습니까 (적어도 흰색 패딩)? 감사



답변

이 명령 axis('off')은 각 축과 경계를 개별적으로 변경하는 것보다 간결하게 문제 중 하나를 처리 한다고 생각합니다 . 그러나 여전히 테두리 주위에 공백이 남습니다. 추가 bbox_inches='tight'받는 savefig공백 왼쪽이 훨씬 작은,하지만 여전히 존재 그 아래 명령하는 것은 거의 당신을 얻을, 당신은 예를 볼 수 있습니다.

matplotlib의 최신 버전은 @episodeyang 및 @kadrach를 통해 bbox_inches=0문자열 대신 필요할 수 있습니다.'tight'

from numpy import random
import matplotlib.pyplot as plt

data = random.random((5,5))
img = plt.imshow(data, interpolation='nearest')
img.set_cmap('hot')
plt.axis('off')
plt.savefig("test.png", bbox_inches='tight')

여기에 이미지 설명을 입력하십시오


답변

나는 matehat 에서이 트릭을 배웠습니다 .

import matplotlib.pyplot as plt
import numpy as np

def make_image(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)
    plt.set_cmap('hot')
    ax.imshow(data, aspect='equal')
    plt.savefig(outputname, dpi=dpi)

# data = mpimg.imread(inputname)[:,:,0]
data = np.arange(1,10).reshape((3, 3))

make_image(data, '/tmp/out.png')

수확량

여기에 이미지 설명을 입력하십시오


답변

가능한 가장 간단한 해결책 :

나는 단순히 질문에 설명 된 방법과 Hooked의 답변에서 나온 방법을 결합했습니다.

fig = plt.imshow(my_data)
plt.axis('off')
fig.axes.get_xaxis().set_visible(False)
fig.axes.get_yaxis().set_visible(False)
plt.savefig('pict.png', bbox_inches='tight', pad_inches = 0)

이 코드 다음에는 공백과 프레임이 없습니다.

공백, 축 또는 프레임이 없음


답변

imsave아직 언급 된 사람이 없어서 이것을 하나의 라이너로 만듭니다.

import matplotlib.pyplot as plt
import numpy as np

data = np.arange(10000).reshape((100, 100))
plt.imsave("/tmp/foo.png", data, format="png", cmap="hot")

이미지를 그대로 저장합니다. 즉, 축이나 테두리 / 패딩을 추가하지 않습니다.

여기에 이미지 설명을 입력하십시오


답변

또한 그림의 범위를 bbox_inches인수로 지정할 수도 있습니다 . 이것은 그림 주위의 흰색 패딩을 제거합니다.

def make_image(inputname,outputname):
    data = mpimg.imread(inputname)[:,:,0]
    fig = plt.imshow(data)
    fig.set_cmap('hot')
    ax = fig.gca()
    ax.set_axis_off()
    ax.autoscale(False)
    extent = ax.get_window_extent().transformed(plt.gcf().dpi_scale_trans.inverted())
    plt.savefig(outputname, bbox_inches=extent)


답변

패딩과 테두리를 모두 제거해야합니다.

from matplotlib import pyplot as plt

fig = plt.figure()
fig.patch.set_visible(False)

ax = fig.add_subplot(111)

plt.axis('off')
plt.imshow(data)

extent = ax.get_window_extent().transformed(fig.dpi_scale_trans.inverted())
plt.savefig("../images/test.png", bbox_inches=extent)


답변

나는 그것이 모두 문서화되어 있음을 발견했다 …

https://matplotlib.org/3.1.1/api/_as_gen/matplotlib.axes.Axes.axis.html#matplotlib.axes.Axes.axis

내 코드…. “bcK”는 512×512 이미지입니다

plt.figure()
plt.imshow(bck)
plt.axis("off")   # turns off axes
plt.axis("tight")  # gets rid of white border
plt.axis("image")  # square up the image instead of filling the "figure" space
plt.show()