salvar imagens em python em alta qualidade

109

Como posso salvar plotagens python em alta qualidade?

Ou seja, quando continuo ampliando o objeto salvo em um arquivo pdf, não há desfoque?

Além disso, qual seria o melhor modo para salvá-lo?

png, eps? Ou algum outro? Eu não posso fazer pdfporque há um número oculto que acontece que bagunça com a Latexmkcompilação.

poeira
fonte

Respostas:

153

Se você estiver usando matplotlibe tentando obter bons números em um documento de látex, salve como um eps. Especificamente, tente algo assim depois de executar os comandos para plotar a imagem:

plt.savefig('destination_path.eps', format='eps')

Descobri que os arquivos eps funcionam melhor e o dpiparâmetro é o que realmente os faz parecer bem em um documento.

ATUALIZAR:

Para especificar a orientação da figura antes de salvar, basta chamar o seguinte antes da plt.savefigchamada, mas depois de criar o gráfico (presumindo que você tenha plotado usando eixos com o nome ax):

ax.view_init(elev=elevation_angle, azim=azimuthal_angle)

Onde elevation_angleé um número (em graus) especificando o ângulo polar (abaixo do eixo vertical z) e azimuthal_angleespecifica o ângulo azimutal (em torno do eixo z).

Acho que é mais fácil determinar esses valores primeiro traçando a imagem e depois girando-a e observando os valores atuais dos ângulos aparecerem na parte inferior da janela, logo abaixo do gráfico real. Lembre-se de que as posições x, y, z aparecem por padrão, mas são substituídas pelos dois ângulos quando você começa a clicar, arrastar e girar a imagem.

spencerlyon2
fonte
@ spencerlon2 e se eu quiser alterar a orientação da figura antes de salvar?
poeira em
13
Por que precisamos do parâmetro DPI? O eps não é um formato vetorial?
mkvoya
1
Boa observação - DPI não é necessário para formatos de vetor como svg, pdf, eps
spencerlyon2
Você pode omitir format='eps'se quiser. Nesse caso, o formato é inferido do nome do arquivo.
timgeb
72

Só para adicionar meus resultados, também usando matplotlib.

.eps deixou todo o meu texto em negrito e removeu a transparência. .svg me deu imagens de alta resolução que realmente se pareciam com o meu gráfico.

import matplotlib.pyplot as plt
fig, ax = plt.subplots()
# Do the plot code
fig.savefig('myimage.svg', format='svg', dpi=1200)

Usei 1200 dpi porque muitas revistas científicas exigem imagens em 1200/600/300 dpi dependendo do que a imagem é. Converta para o dpi desejado e formate em GiMP ou Inkscape.

EDIT: Obviamente, o dpi não importa, pois .svg são gráficos vetoriais e têm "resolução infinita".

grofte
fonte
2
O DPI importa muito quando usamos imshow(..)em algum lugar da figura. Esses bitmaps são rasterizados à medida que são incorporados ao SVG. Com o DPI padrão, os resultados são ainda piores do que vemos na tela, definitivamente inadequados para publicações.
Evgeni Sergeev
Também recomendo fortemente o Scour ( github.com/scour-project/scour ) para reduzir o tamanho do arquivo do seu svg. Na configuração mais agressiva, posso reduzir o tamanho do arquivo para 50% do original - 5% se usar o formato compactado .svgz.
grofte
8

Ok, achei a resposta de spencerlyon2 funcionando, no entanto, caso alguém se descobrisse sem saber o que fazer com aquela linha, eu tinha que fazer desta forma:

beingsaved = plt.figure()

# some scatters
plt.scatter(X_1_x, X_1_y)
plt.scatter(X_2_x, X_2_y)

beingsaved.savefig('destination_path.eps', format='eps', dpi=1000)
Jonatán Iván
fonte
6

Caso você esteja trabalhando com plotagens do mar , em vez de matplotlib, você pode salvar uma imagem .png como esta:

Suponhamos que você tenha um matrixobjeto (pandas ou entorpecidos) e queira obter um mapa de calor:

import seaborn as sb

image = sb.heatmap(matrix)   # this gets you the heatmap
image.figure.savefig("C:/Your/Path/ ... /your_image.png")   # this saves it

Este código é compatível com a versão mais recente do seaborn. Outros códigos em torno de stackoverflow funcionaram apenas para versões anteriores.

Outra forma de que gosto é esta. Eu defino o tamanho da próxima imagem da seguinte maneira:

plt.subplots(figsize=(15,15))

E, mais tarde, ploto a saída no console, de onde posso copiar e colar onde quiser. (Uma vez que o mar é construído sobre matplotlib, não haverá problema.)

Leevo
fonte
5

Você pode salvar para um número 1920x1080 (ou 1080p) usando:

fig = plt.figure(figsize=(19.20,10.80))

Você também pode subir ou descer muito. As soluções acima funcionam bem para impressão, mas atualmente você quer que a imagem criada vá para um formato PNG / JPG ou apareça em um formato de tela ampla.

Eamonn Kenny
fonte