Source code for fury.convert
import numpy as np
import os
from fury.io import load_image
from tempfile import TemporaryDirectory
[docs]def matplotlib_figure_to_numpy(fig, dpi=100, fname=None, flip_up_down=True,
transparent=False):
"""Convert a Matplotlib figure to a 3D numpy array with RGBA channels.
Parameters
----------
fig : obj
A matplotlib figure object
dpi : int, optional
Dots per inch
fname : str, optional
If ``fname`` is given then the array will be saved as a png to this
position.
flip_up_down : bool, optional
The origin is different from matlplotlib default and VTK's default
behaviour (default True).
transparent : bool, optional
Make background transparent (default False).
Returns
-------
arr : ndarray
a numpy 3D array of RGBA values
Notes
-----
The safest way to read the pixel values from the figure was to save them
using savefig as a png and then read again the png. There is a cleaner
way found here http://www.icare.univ-lille1.fr/drupal/node/1141 where
you can actually use fig.canvas.tostring_argb() to get the values directly
without saving to the disk. However, this was not stable across different
machines and needed more investigation from what time permited.
"""
if fname is None:
with TemporaryDirectory() as tmpdir:
fname = os.path.join(tmpdir, 'tmp.png')
fig.savefig(fname, dpi=dpi, transparent=transparent,
bbox_inches='tight', pad_inches=0)
arr = load_image(fname)
else:
fig.savefig(fname, dpi=dpi, transparent=transparent,
bbox_inches='tight', pad_inches=0)
arr = load_image(fname)
if flip_up_down:
arr = np.flipud(arr)
return arr