Matplotlib / Python'da arka uçlar nasıl değiştirilir


90

Aşağıdaki sorunla mücadele ediyorum. Bir grafik koleksiyonundan oluşan raporlar oluşturmam gerekiyor. Biri hariç tüm bu grafikler, Matplotlib varsayılan arka uç (TkAgg) kullanılarak yapılmıştır. Bir grafiğin Kahire arka ucu kullanılarak yapılması gerekiyor, bunun nedeni bir igraf grafiğini çiziyor olmam ve bu yalnızca Kahire kullanılarak çizilebilir.

Sorun şu ki, arka uçları anında değiştiremiyorum, örneğin aşağıdakiler çalışmıyor:
matplotlib.pyplot.switch_backend('cairo.png') (switch_backend işlevinin deneysel olduğunu biliyorum)

ve ben de denedim matplotlib.use("cairo.png")ama bu, ithalattan matplotlib.use("cairo.png")önce açıklama gelmesi gerektiği için ithalat sorunlarına yol açıyor matplotlib.pyplot. ancak senaryonun ömrü boyunca iki farklı arka uca ihtiyacım var.

Öyleyse sorum şu, birisi Matplotlib'de arka ucu nasıl değiştireceğinizi gösteren bir kod parçacığına sahip mi?

Çok teşekkürler!

GÜNCELLEME: Matplotlib'i yükleyen, varsayılan arka ucu gösteren, matplotlib'i kaldıran, yeniden yükleyen ve arka ucu değiştiren bir snippet yazdım:

import matplotlib
import matplotlib.pyplot as plt
import sys
print matplotlib.pyplot.get_backend()

modules = []
for module in sys.modules:
    if module.startswith('matplotlib'):
        modules.append(module)

for module in modules:
    sys.modules.pop(module)

import matplotlib
matplotlib.use("cairo.png")
import matplotlib.pyplot as plt

print matplotlib.pyplot.get_backend()

ama gerçekten bunu yapmanın yolu bu mu?

GÜNCELLEME 2: Dün ciddi bir beyin donma geçirdim ... Basit ve en bariz çözüm, tüm grafikler için Kahire arka ucunu kullanmak ve arka ucu hiç değiştirmemek :)

GÜNCELLEME 3: Aslında bu hala bir sorun, dolayısıyla matplotlib arka uçlarını dinamik olarak nasıl değiştireceğini bilenler .... lütfen cevabınızı gönderin.


Var pyplot.switch_backends(). Sizin durumunuzda işe yaramayabilir.
jfs

Yanıtlar:


60

Altı yıl sonra, hangisinin backendkullanılabileceğine karar vermeye çalışırken benzer bir sorunla karşılaştım .
Not bkz Uyarılar - aşağıya

Bu kod parçası benim için iyi çalışıyor:

import matplotlib
gui_env = ['TKAgg','GTKAgg','Qt4Agg','WXAgg']
for gui in gui_env:
    try:
        print "testing", gui
        matplotlib.use(gui,warn=False, force=True)
        from matplotlib import pyplot as plt
        break
    except:
        continue
print "Using:",matplotlib.get_backend()

Using: GTKAgg

Çıkarabileceğiniz gibi, yenisini zorladıktan sonra backendyeniden içe aktarmak kadar basittir.matplotlib.pyplotbackend

matplotlib.use('WXAgg',warn=False, force=True)
from matplotlib import pyplot as plt
print "Switched to:",matplotlib.get_backend()

Switched to: WXAgg

Hala sorun yaşayanlar için, bu kod:
Gui dışı arka uçların listesini;
Gui arka uçlarının listesi;
ve sonra her bir Gui arka ucunun var olup olmadığını ve çalışıp çalışmadığını görmek için kullanmayı deneyin.

import matplotlib
gui_env = [i for i in matplotlib.rcsetup.interactive_bk]
non_gui_backends = matplotlib.rcsetup.non_interactive_bk
print ("Non Gui backends are:", non_gui_backends)
print ("Gui backends I will test for", gui_env)
for gui in gui_env:
    print ("testing", gui)
    try:
        matplotlib.use(gui,warn=False, force=True)
        from matplotlib import pyplot as plt
        print ("    ",gui, "Is Available")
        plt.plot([1.5,2.0,2.5])
        fig = plt.gcf()
        fig.suptitle(gui)
        plt.show()
        print ("Using ..... ",matplotlib.get_backend())
    except:
        print ("    ",gui, "Not found")

Uyarılar: 3.3.0 sürümünden bu yana matplotlib'deki değişiklikler

  • Matplotlib.use'nin ilk parametresi arg'den arka uca yeniden adlandırılmıştır (yalnızca anahtar kelimeyle geçerseniz geçerlidir).
  • Matplotlib.use parametresinin warn parametresi kaldırıldı. Arka uçta geçiş yapılamaması, artık kuvvet ayarlanmışsa her zaman bir ImportError oluşturacaktır; gerekirse bu hatayı yakalayın.
  • Birincisi dışındaki tüm matplotlib.use parametreleri artık yalnızca anahtar sözcüklerdir.

Teşekkürler! Bu, bu örnek için uygun arka ucu
James Nelson

Saksonyalı Rolf, LOL çok yardımcı oldu, yaklaşık on yıl öncesinden Ubuntu ve Android gönderilerinde hala yanıtlar alıyorum.
James Nelson

warn=FalseArgüman artık mevcut değil.
not2qubit

@ not2qubit Noted - teşekkürler. Uyarılar eklendi.
Saksonyalı Rolf

37

"Deneysel" bir özellik vardır:

import matplotlib.pyplot as plt
plt.switch_backend('newbackend')

matplotlib doc'tan alınmıştır .

Varsayılan arka ucu yeni arka uca geçirin. Bu özellik deneyseldir ve yalnızca bir görüntü arka ucuna geçerek çalışması beklenmektedir. Örneğin, etkileşimli bir ipython oturumundan çalıştırmak istediğiniz bir dizi PostScript komut dosyanız varsa, bir grup GUI penceresi açılır penceresinden kaçınmak için bunları çalıştırmadan önce PS arka ucuna geçmek isteyebilirsiniz. Bir GUI arka ucundan diğerine etkileşimli olarak geçmeye çalışırsanız, patlayacaksınız. Bu komutu çağırmak tüm açık pencereleri kapatır.


Tanınmayan arka uç dizesi "newbackend". Ne yapmalıyım?
TSR

5
@TSR 'newbackend'i' Qt4Agg 'gibi bir GUI arka uç ile değiştirin
YashTD

14

Neden sadece reloadyerleşik işlevi ( importlib.reloadPython 3'te) kullanmıyorsunuz ?

import matplotlib
matplotlib.use('agg')

matplotlib = reload(matplotlib)
matplotlib.use('cairo.png')

Matplotlib ve matplotlib.pyplot'u yeniden yükleyemiyor musunuz? Yoksa sadece kodumun alınmasının eksik olduğunu mu söylüyorsunuz?
fredbaba

Hmm. Aslında IPython'un bir tuhaflığı olabilir. Normal konsolda iyi çalışıyor gibi görünüyor.
Mad Physicist

1
Bunun işe yaramadığını gösteren bir örnek olduğunu düşünüyorum: python -c "import matplotlib.pyplot as plt; import matplotlib; from importlib import reload; matplotlib = reload(matplotlib); matplotlib.use('Agg')"Doğru mu?
Lukas

6

Bu yüzden aradığınız şeyin bu olup olmadığından tam olarak emin değilim.

Arka ucunuzu, matplotlib'iniz için belirli yapılandırmaları içeren matplotlibrc dosyası aracılığıyla değiştirebilirsiniz.

Komut dosyanıza şunları koyabilirsiniz:

matplotlib.rcParams['backend'] = 'TkAgg' 

veya bunun gibi arka uçlar arasında geçiş yapmak.


2
Aslında, arka ucu rcParams sözlüğünüzde belirtebilirsiniz, ancak bu, bir arka uçtan diğerine geçiş sorununu çözmez.
DrDee

matplotlib tarafından alınan yapılandırma dosyasında varsayılan arka ucu da ayarlayabilirsiniz:~/.config/matplotlib/matplotlibrc
2018

4

Benim durumumda (Windows 10 + python 3.7), @Rolf of Saxony'nin ilk cevabı pek iyi sonuç vermedi. Mevcut tüm ortamları denemek ve bunlardan birini başlangıçta, yani hemen sonra yapılandırmak yerine

    import matplotlib

Çevreyi 'Agg' yerine 'TkAgg' olarak değiştirmek zorunda kaldım

    matplotlib.use('TKAgg',warn=False, force=True)

aslında çizdiğim kodun hemen önünde, yani

    import matplotlib.pyplot as plt
    fig = plt.figure()
    # AND SO ON....

2

Arka ucu kalıcı olarak değiştirmek için şunu kullanabilirsiniz:

  1. Önce matplotlibrcdosyayı bulun :

    import matplotlib
    
    matplotlib.matplotlib_fname()
    # '/Users/serafeim/.matplotlib/matplotlibrc'
    
  2. Terminali açın ve şunları yapın:

    cd /Users/serafeim/.matplotlib/
    ls
    
  3. Dosyayı düzenleyin (yoksa şu komutu kullanın: touch matplotliboluşturmak için):

    vim matplotlibrc
    
  4. Bu satırı ekleyin ve kaydedin:

    backend: TkAgg
    

1

Muhtemelen turşu veya joblib yardımıyla farklı bir Python sürecine de bu arsa yapabilirsiniz .


0

Bir IPython konsolu kullanıyorsanız (Spyder dahil) , arka uçları hızla değiştirmek için yerleşik sihirli komutları kullanabilirsiniz, örneğin:

%matplotlib qt

Komutla kullanmak için mevcut arka uçların bir listesini alın:

%matplotlib --list

Kullanılabilir matplotlib arka uçları: ['tk', 'gtk', 'gtk3', 'wx', 'qt4', 'qt5', 'qt', 'osx', 'nbagg', 'notebook', 'agg', ' svg ',' pdf ',' ps ',' satır içi ',' ipympl ',' widget ']


0

Extra Info

Herkes kendi favori arka ucunu gösterse de, neyi yüklemeniz gerektiğini ve gereksinimlerin neler olduğunu anlamak oldukça karışıktır. En azından genel olarak kafa karıştırıcı ve teknokratik dokümantasyonu anlamaya çalıştığınızda. Bugün birkaç deney yaptım ve Windows'ta matplotlib ile ve Py3.8.5 (yerleşik Qt olmadan) kullanarak her bir arka uç için en basit çözümleri bulduğumu düşünüyorum . İşte bulgularım:

#--------------------------------------
# Installing the matplotlib backends
#--------------------------------------
# https://matplotlib.org/users/installing.html

pip install pycairo                     # [1] Cairo :   GTK3 based backend (replaces: cairocffi)    [1.2 Mb]
#pip install mplcairo                   # [1] Cairo :   Easy & Specific for matplotlib              [1.7 Mb]
#pip install PyQt5                      # [2] Qt5   :   Require: Qt's qmake tool                    []
pip install PySide2                     # [3] Qt5   :   Require: shiboken2 & Clang lib bindings     [136 Mb]
pip install wxPython                    # [4] WxAgg :   ??                                          [18.1 Mb]
pip install tornado                     # [5] WebAgg:   Require: pycurl,twisted,pycares ??          [422 kb]

İşte tüm bu PyPi'lerin veya Repo'ların bağlantıları:

[1] https://pypi.org/project/pycairo/       # Requires GTK3+: https://www.gtk.org/
[1] https://pypi.org/project/mplcairo/      # https://github.com/matplotlib/mplcairo
[2] https://pypi.org/project/PyQt5/         # 
[3] https://pypi.org/project/PySide2/       # 
[4] https://pypi.org/project/wxPython/      # https://github.com/wxWidgets/Phoenix/
[4] https://github.com/wxWidgets/wxWidgets/releases
[5] https://pypi.org/project/tornado/       # https://github.com/tornadoweb/tornado

Bununla birlikte, ve python için kullanım için çok sayıda belge Tcl/Tkve tkinterpaketler göz önüne alındığında, çok şaşırtıcı bir şekilde , onu yükleyemedim ve DLL'leri python'a nasıl aktaracağıma dair herhangi bir yararlı talimat bulamadım. (Linux için bu, sadece işletim sistemi paket yöneticisini kullandığınız için önemsizdir apt-get install <tk-what-not>, ancak bu seçenek pencereler için mevcut değildir ve herhangi bir basit analog da yoktur. İşte alabileceğiniz birçok ve çeşitli ikili dosyaların bir listesi.

[6] http://www.bawt.tcl3d.org/download.html                 # Use Tcl-Pure (no additional packages)
[6] https://www.magicsplat.com/tcl-installer/index.html     # 
[6] https://www.irontcl.com/                                # 
[6] https://www.activestate.com/products/tcl/downloads/     # 
[6] http://tclkits.rkeene.org/fossil/wiki/Downloads         # 
[6] http://kitcreator.rkeene.org/kitcreator                 # 

Belki birisi bunlardan herhangi birinin python'a nasıl aktarılacağı konusunda beni aydınlatabilir?


What backends are available and where?

Aşağıdaki tek satırlıklarla kendimizi aydınlatalım:

python.exe -c "import matplotlib as m; help(m);"
python.exe -c "import matplotlib as m; print('I: {}\nN: {}'.format(m.rcsetup.interactive_bk,m.rcsetup.non_interactive_bk));"

# I: ['GTK3Agg', 'GTK3Cairo', 'MacOSX', 'nbAgg', 'Qt4Agg', 'Qt4Cairo', 'Qt5Agg', 'Qt5Cairo', 'TkAgg', 'TkCairo', 'WebAgg', 'WX', 'WXAgg', 'WXCairo']
# N: ['agg', 'cairo', 'pdf', 'pgf', 'ps', 'svg', 'template']

python.exe -c "import matplotlib as m; p=m.get_backend();print('current backend is:',p);"
# agg

python.exe -c "import matplotlib as m; p=m.matplotlib_fname(); print('The matplotlibrc is located at:\n',p);"
# C:\Python38\lib\site-packages\matplotlib\mpl-data\matplotlibrc

Setting the back-end

Belgelerin dediği gibi: Arka ucunuzu yapılandırmanın 3 yolu vardır:

  1. Matplotlibrc dosyanızdaki rcParams["backend"](varsayılan: 'agg') parametresini ayarlama
  2. Ortam MPLBACKEND(kabuk) değişkenini ayarlama
  3. İşlevi kullanma matplotlib.use()

Using the backend

Son olarak, mevcut arka ucunuzu kullanmak sadece bunu yapmaktan ibarettir:

import matplotlib 
#matplotlib.use('tkagg', force=True)        # Agg rendering to a Tk canvas
#matplotlib.use('wxcairo', force=True)      # Cairo rendering to a wxWidgets canvas
#matplotlib.use('wxagg', force=True)        # Agg rendering to a wxWidgets canvas
matplotlib.use('webagg', force=True)        # On show() will start a tornado server with an interactive figure.

#matplotlib.use('qt5cairo', force=True)     # Cairo rendering to a Qt5 canvas
#matplotlib.use('qt5agg', force=True)       # Agg rendering to a Qt5 canvas

import matplotlib.pyplot as plt
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.