İpython'da görüntülenmeden pylab.savefig'i çağırma


111

IPython not defterinde görüntülemeden bir dosyada şekil oluşturmam gerekiyor. Bu bakımdan IPythonve matplotlib.pylabarasındaki etkileşim konusunda net değilim . Ancak, pylab.savefig("test.png")mevcut rakam aradığımda kaydedilmenin yanı sıra görüntülenir test.png. Büyük bir dizi çizim dosyası oluşturmayı otomatikleştirirken, bu genellikle istenmeyen bir durumdur. Veya başka bir uygulama tarafından harici işleme için bir ara dosyanın istendiği durumda.

Bu bir olup olmadığından emin değil matplotlibveya IPythondizüstü bir soru.


@Staticfloat'ın cevabı, bir not defterinde değilken ve JuliaLang aracılığıyla matplotlib kullanırken bile benim için çalıştı; kullanmaioff
Vass

Yanıtlar:


173

Bu bir matplotlib sorusudur ve kullanıcıya görüntülenmeyen bir arka uç kullanarak bunun üstesinden gelebilirsiniz, örneğin 'Agg':

import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt

plt.plot([1,2,3])
plt.savefig('/tmp/test.png')

DÜZENLEME: Grafikleri görüntüleme yeteneğini kaybetmek istemiyorsanız, Etkileşimli Modu kapatın ve yalnızca plt.show()grafikleri görüntülemeye hazır olduğunuzda arayın :

import matplotlib.pyplot as plt

# Turn interactive plotting off
plt.ioff()

# Create a new figure, plot into it, then close it so it never gets displayed
fig = plt.figure()
plt.plot([1,2,3])
plt.savefig('/tmp/test0.png')
plt.close(fig)

# Create a new figure, plot into it, then don't close it so it does get displayed
plt.figure()
plt.plot([1,3,2])
plt.savefig('/tmp/test1.png')

# Display all "open" (non-closed) figures
plt.show()

2
Tamam - ancak, genel olarak iPython içinde satır içi çizimi korumak istiyorum. Arka uçta tam bir geçiş yaparsanız, önerdiğiniz şey iyi çalışır. Soru, istisnai rakamları kaydetme durumuyla (satır içi göstermeden) satır içi çizimin genel durumuna nasıl izin verirsiniz. Sizin önerinizle, modülleri yeniden yüklemeyi ve arka ucu geçici olarak değiştirmeyi denedim, ancak başarılı olamadım. Bir iPython dizüstü bilgisayar oturumunda arka ucu geçici olarak nasıl değiştireceğinize dair herhangi bir fikriniz var mı?
tnt

1
Probleminizi çözmesi gereken etkileşimli çizim ve close()ve show()komutları hakkında konuşmak için soruyu güncelledim . Anında arka uçların değiştirilmesi, keşfettiğiniz gibi desteklenmiyor.
staticfloat

3
Mükemmel geri bildiriminiz için teşekkür ederiz. Plt.close (fig), ihtiyacım için anahtar komut gibi görünüyor. İşlemi etkilemediği için ioff konusunda hala net değilim; ama muhtemelen bir şeyi kaçırıyorum. Tekrar teşekkürler.
tnt

1
Verdiğim tarif genel bir tarif; ipython not defterinde çalışmıyorsanız, plt.ioff (), komut satırında olduğu gibi plt.plot(), etkileşimli mod açıksa , aradığınız anda ipython figürleri çizildiği gibi, figürlerin ekranda yanıp sönmesini durdurmak için önemlidir . Etkileşimli modun kapatılması tüm grafiklerin görüntülenmesini şu tarihe kadar geciktirir plt.show(). İpython dizüstü bilgisayarı kullandığınız için, etkileşimli mod farklı şekilde ele alınır.
staticfloat

Benim için matplotlib.use('Agg')tek başına hile yaptı. Ben herhangi gerek yoktu plt.show()ya plt.ioff()hepsi benim kodda.
Zhanwen Chen

67

Gerek yok plt.ioff()ya da plt.show()(eğer kullanırsak %matplotlib inline). Yukarıdaki kodu olmadan test edebilirsiniz plt.ioff(). plt.close()önemli bir role sahiptir. Bunu dene:

%matplotlib inline
import pylab as plt

# It doesn't matter you add line below. You can even replace it by 'plt.ion()', but you will see no changes.
## plt.ioff()

# Create a new figure, plot into it, then close it so it never gets displayed
fig = plt.figure()
plt.plot([1,2,3])
plt.savefig('test0.png')
plt.close(fig)

# Create a new figure, plot into it, then don't close it so it does get displayed
fig2 = plt.figure()
plt.plot([1,3,2])
plt.savefig('test1.png')

Bu kodu iPython'da çalıştırırsanız, ikinci bir arsa görüntüler plt.close(fig2)ve sonuna eklerseniz hiçbir şey görmezsiniz.

Sonuç olarak, şekli kapatırsanız plt.close(fig)görüntülenmeyecektir.


5
Gerçekten daha iyi çözüm! Bir döngüde birçok grafik oluşturuyor ve kaydediyorum. İle plt.ioffI get RuntimeWarning: More than 20 figures have been opened.... plt.closeçözüldü.
Nagasaki45
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.