# Increase 3D Graph thickness for 3D printing in Mathematica?

My code:

Plot3D[{(2*x*y)/(x^2 + y^2)}, {x, -2, 2}, {y, -2, 2}]


Output:

And now I can export this to STL by using the export STL command, however, when I try to print this on the MakerBot 3D printer there is a problem because the width of the graph is too thin. I need to increase the thickness of the width of the graph, can I do this in Mathematica?

• Try with RegionPlot3D[] Commented Nov 24, 2013 at 1:49
• I'm confused by your terminology. What do mean by "width" and "thickness"? I have no idea what dimension "width" refers to, and as for "thickness", a surface it infinitesimally thin by definition. Commented Nov 24, 2013 at 3:49
• Here's an article about 3D printing from Mathematica... there are some tricks to take note of. segerman.org/3d_printing_notes.html Commented Nov 24, 2013 at 4:20

Try this:

Plot3D[{(2*x*y)/(x^2 + y^2)}, {x, -2, 2}, {y, -2, 2},
PlotStyle -> Thickness[1]]


And remember to watch your units - if you print in millimetres, 1 is a bit small...

# For Version 10

The above no longer works in Mathematica version 10. Instead of Plot3D, use ParametricPlot3D:

ParametricPlot3D[{x, y, (2 x y)/(x^2 + y^2)}, {x, -2, 2}, {y, -2, 2},
PlotStyle -> Thickness[1]]


• This may be version 9 and later, not sure... Commented Nov 24, 2013 at 8:31
• What about AbsoluteThickness? edit: it seems it's not supported.
– shrx
Commented Nov 24, 2013 at 11:54
• @shrx AbsoluteThickness doesn't appear to work for this application... Commented Nov 24, 2013 at 12:01
• @MichaelE2 :) our answers reflect our contrasting math skills... Commented Nov 24, 2013 at 12:55
• This seems to be a special-case plot style for Plot3D, ParametricPlot3D and perhaps others, which does just what I tried to do in my answer (expand along the normals), but with proper VertexNormals along the edges. Undocumented (as far as I can see). Commented Nov 24, 2013 at 14:39

In version 10.0.0 the PlotStyle -> Thickness method shown by cormullion does not appear to work. Instead we can use the undocumented Extrusion option:

ContourPlot3D[x y z == 0.05, {x, -1, 1}, {y, -1, 1}, {z, -1, 1}, Extrusion -> 0.1]


• Aaaaaaagh. They're supposed to add new features for new releases, not remove ones.. Commented Jul 16, 2014 at 16:36
• Which works in ContourPlot3D even though it's Red so unrecognized as an option but doesn't work and is rejected by ListContourPlot3D!!! Echoing Aaaaaaaagh. V. 10.1. Commented Apr 3, 2015 at 18:23
• @Ymareth Seems Extrusion (still undocumented) works now also in ListContourPlot3D since v10.2. See this post Commented Oct 29, 2015 at 10:49
• @Ymareth To avoid Red , Method -> {"Extrusion" -> .1} Commented Sep 7, 2023 at 8:49

You can take advantage of the VertexNormals that Plot computes to translate the surface a little to each side. I'm not sure just what is required for good STL output. I put a polygonal side all around the two surfaces. The VertexNormals are wrong for the sides, so I commented them out for the image presented.

The thickness is controlled by the parameter thickness.

With[{plot = Plot3D[{(2*x*y)/(x^2 + y^2)}, {x, -2, 2}, {y, -2, 2}, Mesh -> None]},
With[{n0 = VertexNormals /. Cases[plot, HoldPattern[VertexNormals -> _], Infinity],
thickness = 0.1},
With[{pts = First @
Cases[plot,
GraphicsComplex[p_, e__] :> Flatten[{p - thickness n0, p + thickness n0}, 1],
Infinity],
vn = First @ Cases[plot, HoldPattern[VertexNormals -> v_] :> Join[v, v], Infinity]},
Graphics3D[
GraphicsComplex[
pts,
{EdgeForm[],
Cases[plot, Polygon[p_] :> Polygon@Join[p, p + Length[pts]/2], Infinity],
Cases[plot,
Line[p_] :> Polygon[Join[#, Reverse@# + Length[pts]/2] & /@ Partition[p, 2, 1]],
Infinity]}
(*, VertexNormals -> vn *)
],
PlotRange -> All,
Options[plot]
]
]]]


• This was a very detailed answer, and I appreciate you taking the time to write it. I chose the other only out of simplicity but I am sure your answer may have future benefits, thanks. Commented Nov 24, 2013 at 23:22
• Hey, no problem. The other way is definitely superior based on simplicity. Also, the other answer does what this one does and more. Commented Nov 24, 2013 at 23:26

As of Version 11 there are the PlotThemes "ThickSurface" and "FilledSurface".

Plot3D[{(2*x*y)/(x^2 + y^2)}, {x, -2, 2}, {y, -2, 2}, PlotTheme -> "ThickSurface"]


Plot3D[{(2*x*y)/(x^2 + y^2)}, {x, -2, 2}, {y, -2, 2}, PlotTheme -> "FilledSurface"]


• Can Mathematica 11 vary the value of "ThickSurface"? If yes how? Could you share a line of code? I have this: PlotTheme -> "ThickSurface" but the thickness is to big. thank you Commented Oct 23, 2017 at 10:29
• @M.Joe I think you'll adapt Simon Wood's answer by using the undocumented option Extrusion. Commented Oct 23, 2017 at 17:49