From b25e5067b03681719bdbc553574a3991c935857c Mon Sep 17 00:00:00 2001 From: pwuertz Date: Sat, 29 Dec 2012 00:48:06 +0100 Subject: [PATCH 1/2] pgf: add mixed mode rendering --- lib/matplotlib/backends/backend_pgf.py | 27 +++++++++++------- .../test_backend_pgf/pgf_mixedmode.pdf | Bin 0 -> 24408 bytes lib/matplotlib/tests/test_backend_pgf.py | 12 ++++++++ 3 files changed, 28 insertions(+), 11 deletions(-) create mode 100644 lib/matplotlib/tests/baseline_images/test_backend_pgf/pgf_mixedmode.pdf diff --git a/lib/matplotlib/backends/backend_pgf.py b/lib/matplotlib/backends/backend_pgf.py index c9015d3a5237..63c48082a85f 100644 --- a/lib/matplotlib/backends/backend_pgf.py +++ b/lib/matplotlib/backends/backend_pgf.py @@ -13,6 +13,7 @@ import matplotlib as mpl from matplotlib.backend_bases import RendererBase, GraphicsContextBase,\ FigureManagerBase, FigureCanvasBase +from matplotlib.backends.backend_mixed import MixedModeRenderer from matplotlib.figure import Figure from matplotlib.text import Text from matplotlib.path import Path @@ -738,7 +739,7 @@ def __init__(self, *args): def get_default_filetype(self): return 'pdf' - def _print_pgf_to_fh(self, fh): + def _print_pgf_to_fh(self, fh, *args, **kwargs): header_text = r"""%% Creator: Matplotlib, PGF backend %% %% To include the figure in your LaTeX document, write @@ -767,6 +768,7 @@ def _print_pgf_to_fh(self, fh): # get figure size in inch w, h = self.figure.get_figwidth(), self.figure.get_figheight() + dpi = self.figure.get_dpi() # create pgfpicture environment and write the pgf code fh.write(header_text) @@ -777,7 +779,10 @@ def _print_pgf_to_fh(self, fh): writeln(fh, r"\begin{pgfpicture}") writeln(fh, r"\pgfpathrectangle{\pgfpointorigin}{\pgfqpoint{%fin}{%fin}}" % (w, h)) writeln(fh, r"\pgfusepath{use as bounding box}") - renderer = RendererPgf(self.figure, fh) + _bbox_inches_restore = kwargs.pop("bbox_inches_restore", None) + renderer = MixedModeRenderer(self.figure, w, h, dpi, + RendererPgf(self.figure, fh), + bbox_inches_restore=_bbox_inches_restore) self.figure.draw(renderer) # end the pgfpicture environment @@ -796,14 +801,14 @@ def print_pgf(self, fname_or_fh, *args, **kwargs): # figure out where the pgf is to be written to if is_string_like(fname_or_fh): with codecs.open(fname_or_fh, "w", encoding="utf-8") as fh: - self._print_pgf_to_fh(fh) + self._print_pgf_to_fh(fh, *args, **kwargs) elif is_writable_file_like(fname_or_fh): raise ValueError("saving pgf to a stream is not supported, " + "consider using the pdf option of the pgf-backend") else: raise ValueError("filename must be a path") - def _print_pdf_to_fh(self, fh): + def _print_pdf_to_fh(self, fh, *args, **kwargs): w, h = self.figure.get_figwidth(), self.figure.get_figheight() try: @@ -814,7 +819,7 @@ def _print_pdf_to_fh(self, fh): fname_pdf = os.path.join(tmpdir, "figure.pdf") # print figure to pgf and compile it with latex - self.print_pgf(fname_pgf) + self.print_pgf(fname_pgf, *args, **kwargs) latex_preamble = get_preamble() latex_fontspec = get_fontspec() @@ -856,13 +861,13 @@ def print_pdf(self, fname_or_fh, *args, **kwargs): # figure out where the pdf is to be written to if is_string_like(fname_or_fh): with open(fname_or_fh, "wb") as fh: - self._print_pdf_to_fh(fh) + self._print_pdf_to_fh(fh, *args, **kwargs) elif is_writable_file_like(fname_or_fh): - self._print_pdf_to_fh(fname_or_fh) + self._print_pdf_to_fh(fname_or_fh, *args, **kwargs) else: raise ValueError("filename must be a path or a file-like object") - def _print_png_to_fh(self, fh): + def _print_png_to_fh(self, fh, *args, **kwargs): converter = make_pdf_to_png_converter() try: @@ -871,7 +876,7 @@ def _print_png_to_fh(self, fh): fname_pdf = os.path.join(tmpdir, "figure.pdf") fname_png = os.path.join(tmpdir, "figure.png") # create pdf and try to convert it to png - self.print_pdf(fname_pdf) + self.print_pdf(fname_pdf, *args, **kwargs) converter(fname_pdf, fname_png, dpi=self.figure.dpi) # copy file contents to target with open(fname_png, "rb") as fh_src: @@ -888,9 +893,9 @@ def print_png(self, fname_or_fh, *args, **kwargs): """ if is_string_like(fname_or_fh): with open(fname_or_fh, "wb") as fh: - self._print_png_to_fh(fh) + self._print_png_to_fh(fh, *args, **kwargs) elif is_writable_file_like(fname_or_fh): - self._print_png_to_fh(fname_or_fh) + self._print_png_to_fh(fname_or_fh, *args, **kwargs) else: raise ValueError("filename must be a path or a file-like object") diff --git a/lib/matplotlib/tests/baseline_images/test_backend_pgf/pgf_mixedmode.pdf b/lib/matplotlib/tests/baseline_images/test_backend_pgf/pgf_mixedmode.pdf new file mode 100644 index 0000000000000000000000000000000000000000..86dfbbc527cf5cfbc7a7aea95a97586e7c77e94a GIT binary patch literal 24408 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 literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/test_backend_pgf.py b/lib/matplotlib/tests/test_backend_pgf.py index 8f922e7727f0..34c31ce9a604 100644 --- a/lib/matplotlib/tests/test_backend_pgf.py +++ b/lib/matplotlib/tests/test_backend_pgf.py @@ -145,6 +145,18 @@ def test_pathclip(): plt.savefig(os.path.join(result_dir, "pgf_pathclip.pdf")) +# test mixed mode rendering +@switch_backend('pgf') +def test_mixedmode(): + if not check_for('xelatex'): + raise SkipTest('xelatex + pgf is required') + + Y, X = np.ogrid[-1:1:40j, -1:1:40j] + plt.figure() + plt.pcolor(X**2 + Y**2).set_rasterized(True) + compare_figure('pgf_mixedmode.pdf') + + if __name__ == '__main__': import nose nose.runmodule(argv=['-s','--with-doctest'], exit=False) From c811acb37c758c50eef218fbdb80b9a3e1a99273 Mon Sep 17 00:00:00 2001 From: pwuertz Date: Sat, 29 Dec 2012 00:47:11 +0100 Subject: [PATCH 2/2] fixes on MixedModeRenderer for non-72dpi figures --- lib/matplotlib/backends/backend_mixed.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/lib/matplotlib/backends/backend_mixed.py b/lib/matplotlib/backends/backend_mixed.py index 4b1a8b95b08a..511304855514 100644 --- a/lib/matplotlib/backends/backend_mixed.py +++ b/lib/matplotlib/backends/backend_mixed.py @@ -48,6 +48,7 @@ def __init__(self, figure, width, height, dpi, vector_renderer, # the figure dpi before and after the rasterization. Although # this looks ugly, I couldn't find a better solution. -JJL self.figure=figure + self._figdpi = figure.get_dpi() self._bbox_inches_restore = bbox_inches_restore @@ -121,16 +122,19 @@ def stop_rasterizing(self): image.is_grayscale = False image.flipud_out() gc = self._renderer.new_gc() + # TODO: If the mixedmode resolution differs from the figure's + # dpi, the image must be scaled (dpi->_figdpi). Not all + # backends support this. self._renderer.draw_image( gc, - float(l)/self.dpi*72., - (float(height) - b - h)/self.dpi*72., + float(l) / self.dpi * self._figdpi, + (float(height)-b-h) / self.dpi * self._figdpi, image) self._raster_renderer = None self._rasterizing = False - # restore the figure dpi. - self.figure.set_dpi(72) + # restore the figure dpi. + self.figure.set_dpi(self._figdpi) if self._bbox_inches_restore: # when tight bbox is used r = process_figure_for_rasterizing(self.figure,