python-package/lets_plot/export/ggsave_.py (36 lines of code) (raw):

# Copyright (c) 2020. JetBrains s.r.o. # Use of this source code is governed by the MIT license that can be found in the LICENSE file. import os from os.path import join from typing import Union, Optional from ..plot.core import PlotSpec from ..plot.core import _to_svg, _to_html, _to_mvg, _export_as_raster from ..plot.plot import GGBunch from ..plot.subplots import SupPlotsSpec __all__ = ['ggsave'] _DEF_EXPORT_DIR = "lets-plot-images" def ggsave(plot: Union[PlotSpec, SupPlotsSpec, GGBunch], filename: str, *, path: str = None, iframe: bool = True, scale: float = None, w: Optional[float] = None, h: Optional[float] = None, unit: Optional[str] = None, dpi: Optional[int] = None) -> str: """ Export plot to a file. Supported formats: PNG, SVG, PDF, HTML. The exported file is created in the directory ${user.dir}/lets-plot-images if not specified otherwise (see the ``path`` parameter). Parameters ---------- plot : ``PlotSpec`` Plot specification to export. filename : str Name of the file. It must end with a file extension corresponding to one of the supported formats: SVG, HTML (or HTM), PNG, PDF (requires the pillow library). path : str Path to a directory to save image files in. By default, it is ${user.dir}/lets-plot-images. iframe : bool, default=True Whether to wrap the HTML page into an iFrame. Only applicable when exporting to HTML. Some browsers may not display some UTF-8 characters correctly when setting iframe=True scale : float, default=2.0 Scaling factor for raster output. Only applicable when exporting to PNG or PDF. w : float, default=None Width of the output image in units. Only applicable when exporting to SVG, PNG, or PDF. h : float, default=None Height of the output image in units. Only applicable when exporting to SVG, PNG, or PDF. unit : {'in', 'cm', 'mm', 'px'}, default='in' Unit of the output image. One of: 'in', 'cm', 'mm' or 'px'. Only applicable when exporting to SVG, PNG, or PDF. dpi : int, default=300 Resolution in dots per inch. Only applicable when exporting to PNG or PDF. The default value depends on the unit: - for 'px' it is 96 (output image will have the same pixel size as ``w``, and ``h`` values) - for physical units ('in', 'cm', 'mm') it is 300. Returns ------- str Absolute pathname of the created file. Notes ----- Large plot dimensions without units require explicit unit specification. When ``w`` or ``h`` value exceeds 20 without specifying units (e.g., ``ggsave(p, 300, 400)``), we ask to specify units explicitly: ``ggsave(p, 300, 400, unit='px')`` or ``ggsave(p, 3, 4, unit='in')``. ---- The output format is inferred from the filename extension. For PNG, and PDF formats: - If ``w``, ``h``, ``unit``, and ``dpi`` are all specified: - The plot's pixel size (default or set by `ggsize() <https://lets-plot.org/python/pages/api/lets_plot.ggsize.html>`__) is ignored. - The output size is calculated using the specified ``w``, ``h``, ``unit`` and ``dpi``. - The plot is resized to fit the specified ``w`` x ``h`` area, which may affect the layout, tick labels, and other elements. - If only ``dpi`` is specified: - The plot's pixel size (default or set by `ggsize() <https://lets-plot.org/python/pages/api/lets_plot.ggsize.html>`__) is converted to inches using the standard display PPI of 96. - The output size is then calculated based on the specified DPI. - The plot maintains its aspect ratio, preserving layout, tick labels, and other visual elements. - Useful for printing - the plot will appear nearly the same size as on screen. - If ``w``, ``h`` are not specified: - The ``scale`` parameter is used to determine the output size. - The plot maintains its aspect ratio, preserving layout, tick labels, and other visual elements. - Useful for generating high-resolution images suitable for publication. For SVG format: - If ``w``, ``h``, and ``unit`` are specified: - The plot's pixel size (default or set by `ggsize() <https://lets-plot.org/python/pages/api/lets_plot.ggsize.html>`__) is ignored. - The output size is calculated using the specified ``w``, ``h``, and ``unit``. ---- Plots with ``geom_livemap()`` can be saved to HTML only. Examples -------- .. jupyter-execute:: :linenos: :emphasize-lines: 6 from IPython.display import Image from lets_plot import * LetsPlot.setup_html() filename = 'plot.png' plot = ggplot() + geom_point(x=0, y=0) + ggtitle(filename) fullpath = ggsave(plot, filename, w=4, h=3) Image(filename=fullpath, width=600, height=450) | .. jupyter-execute:: :linenos: :emphasize-lines: 6 from IPython.display import HTML from lets_plot import * LetsPlot.setup_html() filename = 'plot.html' plot = ggplot() + geom_point(x=0, y=0) + ggtitle(filename) fullpath = ggsave(plot, filename, iframe=False) HTML(filename=fullpath) """ if not (isinstance(plot, PlotSpec) or isinstance(plot, SupPlotsSpec) or isinstance(plot, GGBunch)): raise ValueError("PlotSpec, SupPlotsSpec or GGBunch expected but was: {}".format(type(plot))) filename = filename.strip() name, ext = os.path.splitext(filename) if not name: raise ValueError("Malformed filename: '{}'.".format(filename)) if not ext: raise ValueError("Missing file extension: '{}'.".format(filename)) if not path: path = join(os.getcwd(), _DEF_EXPORT_DIR) pathname = join(path, filename) ext = ext[1:].lower() if ext == 'svg': return _to_svg(plot, pathname, w=w, h=h, unit=unit) elif ext in ['html', 'htm']: return _to_html(plot, pathname, iframe=iframe) elif ext in ['png', 'pdf']: return _export_as_raster(plot, pathname, scale, export_format=ext, w=w, h=h, unit=unit, dpi=dpi) elif ext == 'mvg': return _to_mvg(plot, pathname, scale, w=w, h=h, unit=unit, dpi=dpi) else: raise ValueError( "Unsupported file extension: '{}'\nPlease use one of: 'png', 'svg', 'pdf', 'html', 'htm'".format(ext) )