2015-07-24 9 views
5

In MATLAB, c'è un'opzione molto comoda per copiare la figura corrente negli appunti. Sebbene Python/numpy/scipy/matplotlib sia un'ottima alternativa a MATLAB, purtroppo manca una simile opzione.Come aggiungere il supporto per gli appunti alle figure di Matplotlib?

Questa opzione può essere facilmente aggiunta alle cifre Matplotlib? Preferibilmente, tutte le figure MPL dovrebbero beneficiare automaticamente di questa funzionalità.

Utilizzo il backend Qt4Agg di MPL con PySide.

risposta

8

Sì, è possibile. L'idea è di sostituire il valore predefinito plt.figure con uno personalizzato (una tecnica nota come monkey patching) che inietta un gestore di tastiera per la copia negli Appunti. Il seguente codice vi permetterà di copiare qualsiasi figura MPL negli appunti premendo 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() 

Si noti che se si desidera utilizzare from matplotlib.pyplot import * (ad esempio, in una sessione interattiva), è necessario fare in modo dopo hai eseguito il codice sopra, altrimenti lo figure che importi nello spazio dei nomi predefinito sarà la versione senza patch.