Muszę wziąć obraz i zapisać go po pewnym procesie. Rysunek wygląda dobrze, gdy go wyświetłem, ale po zapisaniu figury, mam białą przestrzeń wokół zapisanego obrazu. Próbowałem opcji 'tight' dla metody savefig, nie działała. Kod:

  import matplotlib.image as mpimg
  import matplotlib.pyplot as plt

  fig = plt.figure(1)
  img = mpimg.imread(path)
  plt.imshow(img)
  ax=fig.add_subplot(1,1,1)

  extent = ax.get_window_extent().transformed(fig.dpi_scale_trans.inverted())
  plt.savefig('1.png', bbox_inches=extent)

  plt.axis('off') 
  plt.show()

Próbuję narysować podstawowy wykres za pomocą NetworkX na rysunku i zapisz go. Zdałem sobie sprawę, że bez wykresu działa, ale po dodaniu wykresu dostaję białą przestrzeń wokół zapisanego obrazu;

import matplotlib.image as mpimg
import matplotlib.pyplot as plt
import networkx as nx

G = nx.Graph()
G.add_node(1)
G.add_node(2)
G.add_node(3)
G.add_edge(1,3)
G.add_edge(1,2)
pos = {1:[100,120], 2:[200,300], 3:[50,75]}

fig = plt.figure(1)
img = mpimg.imread("C:\\images\\1.jpg")
plt.imshow(img)
ax=fig.add_subplot(1,1,1)

nx.draw(G, pos=pos)

extent = ax.get_window_extent().transformed(fig.dpi_scale_trans.inverted())
plt.savefig('1.png', bbox_inches = extent)

plt.axis('off') 
plt.show()
196
Ahmet Tuğrul Bayrak 7 sierpień 2012, 05:02

11 odpowiedzi

Najlepsza odpowiedź

Nie mogę twierdzić, że wiem dokładnie dlaczego lub jak działa moje "rozwiązanie", ale to właśnie musiałem zrobić, kiedy chciałem wykreślić kontur kilku sekcji lotniczych - bez białych marginesów - do pliku PDF. (Należy pamiętać, że używałem Matplotlib wewnątrz notebooka IPython, z flagą -Pylab.)

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())
plt.savefig("filename.pdf", bbox_inches = 'tight',
    pad_inches = 0)

Próbowałem dezaktywować różne części, ale zawsze prowadzi do bielskiej marginesu. Możesz nawet zmodyfikować to, aby utrzymać linie tłuszczowe w pobliżu granic liczby ogolonych przez brak marż.

213
duhaime 7 styczeń 2020, 18:42

Możesz usunąć wyściółkę białego miejsca, ustawienie bbox_inches="tight" w savefig:

plt.savefig("test.png",bbox_inches='tight')

Musisz umieścić argument do bbox_inches jako łańcucha, być może dlatego nie działa wcześniej.


Możliwe duplikaty:

MatplOTLIB Putrots: Oś usuwanie, legendy i białe przestrzenie

Jak ustawić marginesy na postać matplotlib?

Zmniejsz lewy i prawy marginesy na działce MatplOTLIB

226
Community 23 maj 2017, 12:26

Po wypróbowaniu powyższych odpowiedzi bez sukcesu (i sali innych postów), co w końcu dla mnie zadziałało

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.pdf")

Co ważne, nie obejmuje argumentów BBOX lub wyściółki.

26
SuaveSouris 8 listopad 2019, 16:37

Znalazłem coś od Arvind Pereira (http://robotics.usc.edu/~ampereir / WordPress /? p = 626) i wydawał się pracować dla mnie:

plt.savefig(filename, transparent = True, bbox_inches = 'tight', pad_inches = 0)
23
mkl 11 wrzesień 2017, 15:25

Poniższa funkcja zawiera odpowiedź Johannes-S powyżej. Przetestowałem go z plt.figure i plt.subplots() z wieloma osiami i działa ładnie.

def save(filepath, fig=None):
    '''Save the current image with no whitespace
    Example filepath: "myfig.png" or r"C:\myfig.pdf" 
    '''
    import matplotlib.pyplot as plt
    if not fig:
        fig = plt.gcf()

    plt.subplots_adjust(0,0,1,1,0,0)
    for ax in fig.axes:
        ax.axis('off')
        ax.margins(0,0)
        ax.xaxis.set_major_locator(plt.NullLocator())
        ax.yaxis.set_major_locator(plt.NullLocator())
    fig.savefig(filepath, pad_inches = 0, bbox_inches='tight')
16
TomNorway 28 listopad 2018, 09:23

Znalazłem następujące kody działają idealnie do pracy.

fig = plt.figure(figsize=[6,6])
ax = fig.add_subplot(111)
ax.imshow(data)
ax.axes.get_xaxis().set_visible(False)
ax.axes.get_yaxis().set_visible(False)
ax.set_frame_on(False)
plt.savefig('data.png', dpi=400, bbox_inches='tight',pad_inches=0)
11
Richard Yu Liu 24 maj 2018, 15:16

Podążyłem za tę sekwencją i działała jak urok.

plt.axis("off")
fig=plt.imshow(image array,interpolation='nearest')
fig.axes.get_xaxis().set_visible(False)
fig.axes.get_yaxis().set_visible(False)
plt.savefig('destination_path.pdf',
    bbox_inches='tight', pad_inches=0, format='pdf', dpi=1200)
7
Evan 1 październik 2019, 18:11

Znacznie prostsze podejście, które znalazłem, jest użycie plt.imsave:

    import matplotlib.pyplot as plt
    arr = plt.imread(path)
    plt.imsave('test.png', arr)
3
Parth92 28 czerwiec 2019, 09:18

Dla każdego, kto chce pracować w pikselach, a nie w cale, to będzie działać.

Plus zwykły będziesz potrzebował

from matplotlib.transforms import Bbox

Następnie możesz użyć następujących:

my_dpi = 100 # Good default - doesn't really matter

# Size of output in pixels
h = 224
w = 224

fig, ax = plt.subplots(1, figsize=(w/my_dpi, h/my_dpi), dpi=my_dpi)

ax.set_position([0, 0, 1, 1]) # Critical!

# Do some stuff
ax.imshow(img)
ax.imshow(heatmap) # 4-channel RGBA
ax.plot([50, 100, 150], [50, 100, 150], color="red")

ax.axis("off")

fig.savefig("saved_img.png",
            bbox_inches=Bbox([[0, 0], [w/my_dpi, h/my_dpi]]),
            dpi=my_dpi)

enter image description here

3
Simon Thomas 20 wrzesień 2019, 02:05

Jeśli chcesz wyświetlić, co ma być zapisane, zalecam użycie transformacji plt.tight_layout, która jest rzeczywiście bardziej korzystna, ponieważ nie robi niepotrzebne przycinanie przy użyciu plt.savefig

import matplotlib as plt    
plt.plot([1,2,3], [1,2,3])
plt.tight_layout(pad=0)
plt.savefig('plot.png')

Niestety, to rozwiązanie wciąż pozostawia mały margines po prawej i topie.

3
Keto 15 grudzień 2020, 20:38

Działa to dla mnie oszczędzanie numpy array wykreślone przez Imshow do pliku

import matplotlib.pyplot as plt

fig = plt.figure(figsize=(10,10))
plt.imshow(img) # your image here
plt.axis("off")
plt.subplots_adjust(top = 1, bottom = 0, right = 1, left = 0, 
        hspace = 0, wspace = 0)
plt.savefig("example2.png", box_inches='tight', dpi=100)
plt.show()
-4
Alejandro Sazo 2 maj 2018, 01:52