Cách thay đổi phụ trợ trong matplotlib / Python


87

Tôi đang đấu tranh với vấn đề sau đây. Tôi cần tạo báo cáo bao gồm một bộ sưu tập các biểu đồ. Tất cả các biểu đồ này, ngoại trừ một biểu đồ, được tạo bằng phụ trợ mặc định Matplotlib (TkAgg). Một biểu đồ cần được tạo bằng cách sử dụng chương trình phụ trợ Cairo, lý do là tôi đang vẽ một biểu đồ igraph và chỉ có thể được vẽ bằng Cairo.

Vấn đề là tôi không thể thay đổi chương trình phụ trợ một cách nhanh chóng, ví dụ như sau không hoạt động:
matplotlib.pyplot.switch_backend('cairo.png') (Tôi biết rằng chức năng switch_backend là thử nghiệm)

và tôi cũng đã thử matplotlib.use("cairo.png")nhưng điều này dẫn đến vấn đề nhập vì matplotlib.use("cairo.png")câu lệnh phải xuất hiện trước khi nhập matplotlib.pyplot. nhưng tôi cần hai phụ trợ khác nhau trong suốt vòng đời của tập lệnh.

Vì vậy, câu hỏi của tôi là ai đó có một đoạn mã chỉ ra cách chuyển đổi phần phụ trợ trong Matplotlib không?

Cám ơn rất nhiều!

CẬP NHẬT: Tôi đã viết một đoạn mã tải matplotlib, hiển thị phần phụ trợ mặc định, tải xuống matplotlib, tải lại nó và thay đổi phần phụ trợ:

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()

nhưng đây có thực sự là cách để làm điều đó?

CẬP NHẬT 2: Tôi đã bị đóng băng não nghiêm trọng ngày hôm qua ... Giải pháp đơn giản và rõ ràng nhất là sử dụng phụ trợ Cairo cho tất cả các biểu đồ và không chuyển đổi phụ trợ nào cả :)

CẬP NHẬT 3: Trên thực tế, nó vẫn còn là một vấn đề nên bất kỳ ai biết cách chuyển động phụ trợ matplotlib .... vui lòng đăng câu trả lời của bạn.


Có đấy pyplot.switch_backends(). Nó có thể không hoạt động trong trường hợp của bạn.
jfs

Câu trả lời:


59

Sáu năm sau và tôi gặp một vấn đề tương tự, khi cố gắng quyết định cái nào backendcó sẵn để sử dụng.
Đoạn mã này hoạt động tốt đối với tôi:

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

Như bạn có thể suy luận, việc hoán đổi cái backendcũng đơn giản như nhập lại matplotlib.pyplotsau khi buộc cái mớibackend

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

Switched to: WXAgg

Đối với những người vẫn gặp sự cố, mã này sẽ in ra:
danh sách các phụ trợ Non Gui;
danh sách các phụ trợ Gui;
và sau đó cố gắng sử dụng từng chương trình phụ trợ Gui để xem nó có hiện diện và hoạt động hay không.

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

Cảm ơn! Điều này làm việc tuyệt vời giúp tôi tìm ra thích hợp back-end cho ví dụ này: stackoverflow.com/questions/11874767/...
James Nelson

Rolf of Saxony, LOL rất hữu ích, tôi vẫn nhận được phản hồi trên Ubuntu và bài đăng Android từ gần một thập kỷ trước.
James Nelson

37

Có một tính năng "thử nghiệm":

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

lấy từ doc matplotlib .

Chuyển chương trình phụ trợ mặc định sang chương trình phụ trợ mới. Tính năng này là thử nghiệm và chỉ dự kiến ​​hoạt động khi chuyển sang phần phụ trợ hình ảnh. Ví dụ: nếu bạn có một loạt các tập lệnh PostScript mà bạn muốn chạy từ một phiên ipython tương tác, bạn có thể muốn chuyển sang phần phụ trợ PS trước khi chạy chúng để tránh có nhiều cửa sổ GUI bật lên. Nếu bạn cố gắng chuyển đổi tương tác từ phần phụ trợ GUI này sang phần phụ trợ GUI khác, bạn sẽ bùng nổ. Gọi lệnh này sẽ đóng tất cả các cửa sổ đang mở.


Chuỗi phụ trợ không được công nhận "newbackend". Tôi nên làm gì?
TSR

4
@TSR Thay thế 'newbackend' bằng phụ trợ GUI chẳng hạn như 'Qt4Agg'
YashTD

14

Tại sao không chỉ sử dụng hàm tích reloadhợp sẵn ( importlib.reloadtrong Python 3)?

import matplotlib
matplotlib.use('agg')

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

Như trong bạn không thể tải lại matplotlib và matplotlib.pyplot? Hay bạn chỉ nói rằng đoạn mã của tôi bị cắt là chưa hoàn chỉnh?
fredbaba

Hừ! Có thể đã thực sự là một điều khó hiểu của IPython. Có vẻ hoạt động tốt trong bảng điều khiển thông thường.
Mad Physicist,

1
Tôi nghĩ rằng đây là một ví dụ, cho thấy rằng nó không hoạt động: python -c "import matplotlib.pyplot as plt; import matplotlib; from importlib import reload; matplotlib = reload(matplotlib); matplotlib.use('Agg')"Có đúng không?
Lukas

6

Vì vậy, tôi không hoàn toàn chắc chắn nếu đây là những gì bạn đang tìm kiếm.

Bạn có thể thay đổi chương trình phụ trợ của mình thông qua tệp matplotlibrc có chứa các cấu hình nhất định cho matplotlib của bạn.

Trong tập lệnh của bạn, bạn có thể đặt:

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

hoặc tương tự như vậy để chuyển đổi giữa các phụ trợ.


2
Thật vậy, bạn có thể chỉ định phần phụ trợ trong từ điển rcParams của mình nhưng điều đó không giải quyết được vấn đề chuyển từ phần phụ trợ này sang phần phụ trợ khác.
DrDee

bạn cũng có thể thiết lập các backend mặc định trong tập tin cấu hình được chọn của matplotlib:~/.config/matplotlib/matplotlibrc
scrutari

4

Trong trường hợp của tôi (Windows 10 + python 3.7), câu trả lời đầu tiên của @Rolf of Saxony không hoạt động tốt. Thay vì thử tất cả các môi trường có sẵn và định cấu hình một trong số chúng ngay từ đầu, tức là chỉ sau

    import matplotlib

Tôi đã phải thay đổi môi trường từ 'Agg' thành 'TkAgg' bằng cách sử dụng

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

ngay trước mã nơi tôi thực sự vẽ, tức là

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

2

Để thay đổi vĩnh viễn chương trình phụ trợ, bạn có thể sử dụng điều này:

  1. Đầu tiên định vị matplotlibrctệp:

    import matplotlib
    
    matplotlib.matplotlib_fname()
    # '/Users/serafeim/.matplotlib/matplotlibrc'
    
  2. Mở thiết bị đầu cuối và thực hiện:

    cd /Users/serafeim/.matplotlib/
    ls
    
  3. Chỉnh sửa tệp (nếu nó không tồn tại, hãy sử dụng lệnh này: touch matplotlibđể tạo nó):

    vim matplotlibrc
    
  4. Thêm dòng này và lưu:

    backend: TkAgg
    

1

Bạn cũng có thể có một quy trình Python khác để thực hiện âm mưu đó, có thể với sự trợ giúp của pickle hoặc joblib .


0

Nếu bạn đang sử dụng bảng điều khiển IPython (bao gồm cả trong Spyder), bạn có thể sử dụng các lệnh ma thuật tích hợp để nhanh chóng chuyển đổi các phần phụ trợ, ví dụ:

%matplotlib qt

Nhận danh sách các phần mềm phụ trợ có sẵn để sử dụng với lệnh:

%matplotlib --list

Các phần phụ trợ matplotlib có sẵn: ['tk', 'gtk', 'gtk3', 'wx', 'qt4', 'qt5', 'qt', 'osx', 'nbagg', 'notebook', 'agg', ' svg ',' pdf ',' ps ',' inline ',' ipympl ',' widget ']

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.