2015-07-24 28 views
5

W programie MATLAB istnieje bardzo wygodna opcja kopiowania bieżącej figury do schowka. Chociaż Python/numpy/scipy/matplotlib jest świetną alternatywą dla MATLAB-a, taka opcja niestety nie istnieje.Jak dodać obsługę schowka do figur Matplotlib?

Czy tę opcję łatwo można dodać do figur Matplotlib? Najlepiej, jeśli wszystkie liczby MPL powinny automatycznie skorzystać z tej funkcjonalności.

Używam backendu MPL Qt4Agg, z PySide.

Odpowiedz

8

Tak, może. Pomysł polega na zastąpieniu domyślnego plt.figure niestandardowym (technika znana jako monkey patching), które wstrzykuje obsługę klawiatury do kopiowania do schowka. Poniższy kod pozwala skopiować dowolny MPL rysunek do schowka, wciskając Ctrl + C:

import io 
import matplotlib.pyplot as plt 
from PySide.QtGui import QApplication, QImage 

def add_clipboard_to_figures(): 
    # use monkey-patching to replace the original plt.figure() function with 
    # our own, which supports clipboard-copying 
    oldfig = plt.figure 

    def newfig(*args, **kwargs): 
     fig = oldfig(*args, **kwargs) 
     def clipboard_handler(event): 
      if event.key == 'ctrl+c': 
       # store the image in a buffer using savefig(), this has the 
       # advantage of applying all the default savefig parameters 
       # such as background color; those would be ignored if you simply 
       # grab the canvas using Qt 
       buf = io.BytesIO() 
       fig.savefig(buf) 
       QApplication.clipboard().setImage(QImage.fromData(buf.getvalue())) 
       buf.close() 

     fig.canvas.mpl_connect('key_press_event', clipboard_handler) 
     return fig 

    plt.figure = newfig 

add_clipboard_to_figures() 

pamiętać, że jeśli chcesz używać from matplotlib.pyplot import * (m.in. w sesji interaktywnej), trzeba zrobić po Wykonałeś powyższy kod, w przeciwnym razie importowany do domyślnej przestrzeni nazw będzie wersją nieprzylepioną.