Source code for fury.convert
import os
from tempfile import TemporaryDirectory
import numpy as np
from fury.decorators import warn_on_args_to_kwargs
from fury.io import load_image
[docs]
@warn_on_args_to_kwargs()
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 permitted.
"""
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