Eu sou novo no Python e no Matplotlib, gostaria de simplesmente aplicar o mapa de cores a uma imagem e escrever a imagem resultante, sem usar eixos, rótulos, títulos ou qualquer coisa normalmente adicionada automaticamente pelo matplotlib. Aqui está o que eu fiz:
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)
Ele remove com êxito o eixo da figura, mas a figura salva apresenta um preenchimento branco e uma moldura em torno da imagem real. Como posso removê-los (pelo menos o preenchimento branco)? obrigado
python
matplotlib
sunmat
fonte
fonte
imshow
. Se você tiver um gráfico de dispersão, a seguinte resposta poderá ajudá-lo: stackoverflow.com/a/40727744/4124317Respostas:
Penso que o comando
axis('off')
cuida de um dos problemas de maneira mais sucinta do que mudar cada eixo e a borda separadamente. No entanto, ele ainda deixa o espaço em branco ao redor da borda. A adiçãobbox_inches='tight'
aosavefig
comando quase o leva até lá, você pode ver no exemplo abaixo que o espaço em branco restante é muito menor, mas ainda está presente.Observe que as versões mais recentes do matplotlib podem exigir, em
bbox_inches=0
vez da string'tight'
(via @episodeyang e @kadrach)fonte
fig = plt.figure()
,ax = plt.axes([0,0,1,1])
e, em seguidaplt.imshow(data,interpolation="nearest"
. Combinado complt.axis("off")
, ele deve se livrar de tudo que estiver ao lado da imagem, espero!bbox_inches=0
o truque.Eu aprendi esse truque com matehat, aqui :
rendimentos
fonte
plt.Axes(fig, [0,0,1,1])
. Isso indica ao matplotlib para criar um conjunto de eixos com o canto inferior esquerdo no ponto localizado em (0%, 0%) e com largura e altura (100%, 100%).Possível solução mais simples:
Simplesmente combinei o método descrito na pergunta e o método da resposta de Hooked.
Após esse código, não há espaços em branco nem quadro.
fonte
fig.axes.get_xaxis().set_visible(False)
resolver o problema. Graçasfig.axes[0]
e em geral todos ou eixos selecionados.Ninguém mencionado
imsave
ainda, o que torna isso uma linha:Ele armazena diretamente a imagem como ela é, ou seja, não adiciona nenhum eixo ou borda / preenchimento.
fonte
Você também pode especificar a extensão da figura no
bbox_inches
argumento. Isso eliminaria o preenchimento branco ao redor da figura.fonte
Isso deve remover todos os preenchimentos e bordas:
fonte
ax
) comextent = plt.gca().get_window_extent().transformed(fig.dpi_scale_trans.inverted())
.Eu descobri que tudo está documentado ...
https://matplotlib.org/3.1.1/api/_as_gen/matplotlib.axes.Axes.axis.html#matplotlib.axes.Axes.axis
Meu código "bcK" é uma imagem de 512 x 512
fonte
A resposta votada não funciona mais. Para que funcione, você precisa adicionar manualmente um eixo definido como [0, 0, 1, 1] ou remover o patch da figura.
Como alternativa, você pode apenas remover o patch. Você não precisa adicionar uma subparcela para remover os preenchimentos. Isso é simplificado a partir da resposta de Vlady abaixo
Isso foi testado com a versão
3.0.3
em 2019/06/19. Imagem veja abaixo:Uma coisa muito mais simples de fazer é usar
pyplot.imsave
. Para detalhes, veja a resposta do luator abaixofonte
Gostei da resposta do ubuntu , mas ele não estava mostrando explicitamente como definir o tamanho de imagens não quadradas prontas para uso, então modifiquei-a para facilitar a cópia e colar:
É fácil salvar imagens sem borda, seja qual for o dpi escolhido, se o tamanho de pixel_size / dpi = for mantido.
No entanto, a exibição é assustadora. Se você escolher dpi pequenos, o tamanho da imagem poderá ser maior que a tela e você terá margens durante a exibição. No entanto, isso não afeta a economia.
Então para
A exibição fica delimitada (mas salvar obras):
fonte
Primeiro, para determinados formatos de imagem (por exemplo, TIFF ), você pode realmente salvar o mapa de cores no cabeçalho e a maioria dos visualizadores mostrará seus dados com o mapa de cores.
Para salvar uma
matplotlib
imagem real , que pode ser útil para adicionar anotações ou outros dados às imagens, usei a seguinte solução:fonte
Obrigado pelas respostas impressionantes de todos ... Eu tive exatamente o mesmo problema em querer plotar apenas uma imagem sem preenchimento / espaço extra, etc., então fiquei super feliz em encontrar as idéias de todos aqui.
Além da imagem sem preenchimento, eu também queria poder adicionar anotações facilmente, etc, além de um simples gráfico de imagem.
Então, o que acabei fazendo foi combinar a resposta de David com a csnemes ' para criar um invólucro simples no momento da criação da figura. Quando você usa isso, não precisa de alterações posteriormente com imsave () ou qualquer outra coisa:
fonte