From: <lee...@us...> - 2009-10-03 18:11:19
|
Revision: 7842 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=7842&view=rev Author: leejjoon Date: 2009-10-03 18:11:09 +0000 (Sat, 03 Oct 2009) Log Message: ----------- add PathPatch3d in mplot3d.art3d Modified Paths: -------------- trunk/matplotlib/lib/mpl_toolkits/mplot3d/art3d.py Added Paths: ----------- trunk/matplotlib/examples/mplot3d/pathpatch3d_demo.py Added: trunk/matplotlib/examples/mplot3d/pathpatch3d_demo.py =================================================================== --- trunk/matplotlib/examples/mplot3d/pathpatch3d_demo.py (rev 0) +++ trunk/matplotlib/examples/mplot3d/pathpatch3d_demo.py 2009-10-03 18:11:09 UTC (rev 7842) @@ -0,0 +1,52 @@ +import matplotlib.pyplot as plt +from matplotlib.patches import Circle, PathPatch +from mpl_toolkits.mplot3d import Axes3D +import mpl_toolkits.mplot3d.art3d as art3d +from matplotlib.text import TextPath +from matplotlib.transforms import Affine2D + + +def text3d(ax, (x, y, z), s, zdir="z", size=None, angle=0, usetex=False, + **kwargs): + + if zdir == "y": + xy1, z1 = (x, z), y + elif zdir == "y": + xy1, z1 = (y, z), x + else: + xy1, z1 = (x, y), z + + text_path = TextPath((0, 0), s, size=size, usetex=usetex) + trans = Affine2D().rotate(angle).translate(xy1[0], xy1[1]) + + p1 = PathPatch(trans.transform_path(text_path), **kwargs) + ax.add_patch(p1) + art3d.pathpatch_2d_to_3d(p1, z=z1, zdir=zdir) + + +fig = plt.figure() +ax = Axes3D(fig) + +p = Circle((5, 5), 3) +ax.add_patch(p) +art3d.pathpatch_2d_to_3d(p, z=0, zdir="x") + + +text3d(ax, (4, -2, 0), "X-axis", zdir="z", size=.5, usetex=False, + ec="none", fc="k") +text3d(ax, (12, 4, 0), "Y-axis", zdir="z", size=.5, usetex=False, angle=.5*3.14159, + ec="none", fc="k") +text3d(ax, (12, 10, 4), "Z-axis", zdir="y", size=.5, usetex=False, angle=.5*3.14159, + ec="none", fc="k") + +text3d(ax, (1, 5, 0), + r"$\displaystyle G_{\mu\nu} + \Lambda g_{\mu\nu} = \frac{8\pi G}{c^4} T_{\mu\nu} $", + zdir="z", size=1, usetex=True, + ec="none", fc="k") + +ax.set_xlim3d(0, 10) +ax.set_ylim3d(0, 10) +ax.set_zlim3d(0, 10) + +plt.show() + Modified: trunk/matplotlib/lib/mpl_toolkits/mplot3d/art3d.py =================================================================== --- trunk/matplotlib/lib/mpl_toolkits/mplot3d/art3d.py 2009-10-02 18:58:20 UTC (rev 7841) +++ trunk/matplotlib/lib/mpl_toolkits/mplot3d/art3d.py 2009-10-03 18:11:09 UTC (rev 7842) @@ -217,6 +217,31 @@ def draw(self, renderer): Patch.draw(self, renderer) + +class PathPatch3D(Patch3D): + ''' + 3D PathPatch object. + ''' + + def __init__(self, path, **kwargs): + zs = kwargs.pop('zs', []) + zdir = kwargs.pop('zdir', 'z') + Patch.__init__(self, **kwargs) + self.set_3d_properties(path, zs, zdir) + + def set_3d_properties(self, path, zs=0, zdir='z'): + Patch3D.set_3d_properties(self, path.vertices, zs=zs, zdir=zdir) + self._code3d = path.codes + + def do_3d_projection(self, renderer): + s = self._segment3d + xs, ys, zs = zip(*s) + vxs, vys,vzs, vis = proj3d.proj_transform_clip(xs, ys, zs, renderer.M) + self._path2d = mpath.Path(zip(vxs, vys), self._code3d) + # FIXME: coloring + self._facecolor2d = self._facecolor3d + return min(vzs) + def get_patch_verts(patch): """Return a list of vertices for the path of a patch.""" trans = patch.get_patch_transform() @@ -233,6 +258,15 @@ patch.__class__ = Patch3D patch.set_3d_properties(verts, z, zdir) +def pathpatch_2d_to_3d(pathpatch, z=0, zdir='z'): + """Convert a PathPatch to a PathPatch3D object.""" + path = pathpatch.get_path() + trans = pathpatch.get_patch_transform() + + mpath = trans.transform_path(path) + pathpatch.__class__ = PathPatch3D + pathpatch.set_3d_properties(mpath, z, zdir) + class Patch3DCollection(PatchCollection): ''' A collection of 3D patches. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |