Salve apenas a linha sem eixos, rótulos e preenchimento em matplotlib

Sep 24 2020

Gostaria de salvar o gráfico de linhas matplotlib em uma imagem png transparente com proporção de 3: 1 e sem eixos ou rótulos. Preciso que a linha do gráfico comece e termine diretamente na borda da imagem (sem qualquer preenchimento).

Encontrei vários tópicos semelhantes, por exemplo, savefig apertado sem eixos em matplotlib ou Removendo espaço em branco ao redor de uma imagem salva em matplotlib , no entanto, nenhum dos conselhos ajudou.

Aqui está o meu código:

import matplotlib.pyplot as plt

x = np.arange(1, 10)
y = np.arange(51, 60)

plt.gca().set_axis_off()
plt.subplots_adjust(top=1, bottom=0, right=1, left=0, hspace=0, wspace=0)
plt.margins(0, 0)
plt.gca().xaxis.set_major_locator(plt.NullLocator())
plt.gca().yaxis.set_major_locator(plt.NullLocator())

fig = plt.figure(figsize=(9,3))
ax = fig.add_axes([0, 0, 1, 1], frameon=False)
ax.set_axis_off()

ax.plot(x, y)
# plt.savefig("result.png", format="png", transparent=True, `bbox_inches="tight", pad_inches=0)  # Result image is empty.
plt.savefig("result.png", format="png", transparent=True)
plt.show()

Ainda assim, há algum preenchimento na imagem resultante (há um fundo branco para mostrar o preenchimento, mas na verdade a imagem é transparente):

Existe alguma maneira de obter gráfico sem preenchimento?

Respostas

1 Grayrigel Sep 24 2020 at 01:39

Aqui está uma solução com base em uma das perguntas que você adicionou:

import matplotlib.pyplot as plt
import numpy as np
import os

x = np.arange(1, 10)
y = np.arange(51, 60)

plt.figure(figsize=(9,3))
plt.plot(x,y)
plt.gca().set_axis_off()
plt.subplots_adjust(top = 1, bottom = 0, right = 1, left = 0,
            hspace = 0, wspace = 0)
plt.margins(0,0)
plt.savefig("myfig.png")

#os.system('convert myfig.png -trim myfig.png') #<- a quick workaround if you are on mac or Linux.
plt.show()

Produto :