How to add clipboard support to Matplotlib figures?
Building on the solution described in EelkeSpaak's answer, we can write a function to do the work instead of monkey-patching matplotlib's Figure class:
import io
import matplotlib.pyplot as plt
import numpy as np
from PyQt5.QtGui import QImage
from PyQt5.QtWidgets import QApplication
# Example figure.
fig, ax = plt.subplots()
X = np.linspace(0, 2*np.pi)
Y = np.sin(X)
ax.plot(X, Y)
def add_figure_to_clipboard(event):
if event.key == "ctrl+c":
with io.BytesIO() as buffer:
fig.savefig(buffer)
QApplication.clipboard().setImage(QImage.fromData(buffer.getvalue()))
fig.canvas.mpl_connect('key_press_event', add_figure_to_clipboard)
Please note that this variant uses Qt5.
Yes, it can. The idea is to replace the default plt.figure
with a custom one (a technique known as monkey patching) that injects a keyboard handler for copying to the clipboard. The following code will allow you to copy any MPL figure to the clipboard by pressing 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()
Note that if you want to use from matplotlib.pyplot import *
(e.g. in an interactive session), you need to do so after you've executed the above code, otherwise the figure
you import into the default namespace will be the unpatched version.
The last comment is very useful.
Install the package with
pip install addcopyfighandler
Import the module after importing matplotlib, for instance:
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
from matplotlib.cm import get_cmap
import addcopyfighandler
Use
ctr + C
to copy the Figure to the clipboard
And enjoy.
EelkeSpaak's solution was packed in a nice module: addcopyfighandler
Simply install by pip install addcopyfighandler
, and import the module after importing matplotlib or pyplot.