25
$\begingroup$

When I use Export to export Plot3D to PDF format, I get different behaviour in Mathematica 10.1 compared to 10.0. In particular, version 10.1 Rasterizes the graphics by default:

myFigure = Plot3D[x y, {x, 0, 1}, {y, 0, 1}]
Export["Figure.pdf", myFigure]

How can I turn off this rasterization? Can I set the default back to vector images?

$\endgroup$
  • $\begingroup$ Specify the file format: Export["\\Figure.pdf", myFigure, "PDF"] $\endgroup$ – David G. Stork Jul 7 '15 at 18:37
  • $\begingroup$ @DavidG.Stork That doesn't seem to help: the PDF format is implicit from the extension in the file name. If you don't specify it and try to export a 2D plot to PDF, it will be exported as a vector graphic. On the other hand, even if you do specify it, and export a 3D plot, it will be rasterized, at least on my system (v.10.1 Win764bit). $\endgroup$ – MarcoB Jul 7 '15 at 18:48
  • $\begingroup$ I am actually surprised to hear that v.10 was exporting the 3D plots as vector graphics though. I don't have v.10 to test with, but I don't recall that being the case: I thought that 3D plots were rasterized upon export no matter what. I'd love to be corrected on this one, as it would be great to have a way to export infinitely resizable 3D graphics. $\endgroup$ – MarcoB Jul 7 '15 at 18:49
  • $\begingroup$ I get a rasterized image in both 10.0 and 10.1. Do you get vector in 10.0? The doc page on the PDF format mentions the "AllowRasterization" option. Take a look. Unfortunately in v10.0 and v10.1 it has no effect when I try it. In v9 it works as described. Bug maybe? I would ask WRI support about this. $\endgroup$ – Szabolcs Jul 7 '15 at 19:39
  • 1
    $\begingroup$ I believe that PDF export functionality was rewritten for v10, so they might tell you that this is intentional and the bug is that "AllowRasterization" is still in the docs ... let us know what they say, I'm curious! $\endgroup$ – Szabolcs Jul 7 '15 at 19:39
23
$\begingroup$

Indeed, 3D plots like this were exported as vector graphics with generally huge numbers of polygons in version 8. But even then, the export was automatically rasterized whenever there were VertexColors present in the plot. I described this as a trick for getting smaller PDF files here, and also used it e.g. here.

So in general, I think it's actually a good thing that PDFs generated from 3D graphics are rasterized, provided it's done at a resolution appropriate for the desired device. However, despite this change in version 10, the developers haven't gotten this automatic rasterization quite right yet. For example, here is an issue that didn't get fixed, but which still can be repaired by artificially inserting a texture with VertexColors in the plot (that's what I do in my answer to the linked question).

So now we apparently have mandatory rasterization. While this makes exported files smaller, it can also backfire when you just have a Graphics3D with simple objects such as lines and a few polygons. Then there may not be any disk space savings at all from rasterization, but you pay the price of lower quality without reaping any rewards.

As a workaround for this lack of choice in Export, you could manually Print a selected Graphics3D as I do in this screen shot:

screen shot

I right-clicked on the graphic and selected Print Graphic... from the context menu. Then I used the print dialog to save as PDF instead of printing. The result is a PDF file that maintains everything in vector graphics form (at least under Mac OS X). I think the printing route works because it assumes that the proper rasterization is going to be done by the printer driver, so Mathematica doesn't have to worry about it (since it's not meant to be a stored file). Of course, they may just have overlooked this loophole (let's hope they keep it open, then one could even consider making a palette for it).

Rasterization can also be avoided by exporting to EPS, but that format is outdated and can't handle opacity.

Edit

Another way to get the exported file as vector graphics is this:

Export["myFig2.pdf", 
 Graphics[Inset[myFigure, Automatic, Automatic, Scaled[1]]]]

Here, I actually export a 2D graphic into which the 3D figure has been placed as an inset.

$\endgroup$
  • $\begingroup$ If it can be done by menu command, wouldn't you think it could be done by code? But it may be so well hidden that it's hard to discover how. $\endgroup$ – Michael E2 Jul 8 '15 at 4:18
  • $\begingroup$ @MichaelE2 This question was the first time I became aware of the change, since I was (and am) using version 8 a lot more than 10. So I haven't been able to find any other programmatic solution... I hope you're right, though. Couldn't find anything in the Advanced Options... $\endgroup$ – Jens Jul 8 '15 at 4:29
  • $\begingroup$ didn't work for Mathematica10.0.2 on win7 $\endgroup$ – Harry Jul 11 '16 at 4:27
  • $\begingroup$ @Harry Sorry to hear that. Still works fine for me on Mac. Did you try both methods? $\endgroup$ – Jens Jul 11 '16 at 4:43
  • $\begingroup$ @Jens I now know the problem. I used a .png file for texture in one Sphere[] which may trig rasterize. When I removed png texture it works fine. $\endgroup$ – Harry Jul 11 '16 at 14:27
7
$\begingroup$

Unfortunately, on version 10.3 the solutions proposed by Jens do not seem to work in at least some situations (see edit on this other question).

A workaround that I found to work well in my case is simply using GraphicsRow, which seems to automatically correctly tweak the options of Inset in a way that produces the expected result. If the 3D graphics to export is plot, just use

Export["out.pdf", GraphicsRow[{plot}, ImageSize -> 1000]]

Another workaround proposed by Alexey Popkov in a comment is using

Export["out.pdf",Graphics[Inset[plot], ImageSize -> 1000]]

These are of course simply slight variations of the solution with Inset given by Jens, but they're probably good to know for someone (like me) not knowing how to properly handle the options of Inset.

$\endgroup$
  • $\begingroup$ The key improvement as compared to original Jens' workaround is explicit ImageSize specification moved from Graphics3D into enclosing Graphics. More generally it can be written as Graphics[Inset[plot], Options[plot, ImageSize]] and as GraphicsRow[{plot}, First@Options[plot, ImageSize]]. $\endgroup$ – Alexey Popkov Nov 24 '15 at 12:25
  • $\begingroup$ didn't work for Mathematica10.0.2 on win7 $\endgroup$ – Harry Jul 11 '16 at 4:29

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.