def add_collection3d(self, col, zs=0, zdir='z'): ''' Add a 3D collection object to the plot. 2D collection types are converted to a 3D version by modifying the object and adding z coordinate information. Supported are: - PolyCollection - LineCollection - PatchCollection ''' zvals = np.atleast_1d(zs) if len(zvals) > 0: zsortval = min(zvals) else: zsortval = 0 # FIXME: Fairly arbitrary. Is there a better value? # FIXME: use issubclass() (although, then a 3D collection # object would also pass.) Maybe have a collection3d # abstract class to test for and exclude? if type(col) is mcoll.PolyCollection: art3d.poly_collection_2d_to_3d(col, zs=zs, zdir=zdir) col.set_sort_zpos(zsortval) elif type(col) is mcoll.LineCollection: art3d.line_collection_2d_to_3d(col, zs=zs, zdir=zdir) col.set_sort_zpos(zsortval) elif type(col) is mcoll.PatchCollection: art3d.patch_collection_2d_to_3d(col, zs=zs, zdir=zdir) col.set_sort_zpos(zsortval) return super().add_collection(col)
def add_objs(xyzss, liness, rectss, obj_type, netname, color, alpha, linewidth): for z, (xs, ys, zs) in enumerate(xyzss): if len(xs) > 0: obj = ax.scatter(xs, ys, zs, color=get_color(color, z), alpha=alpha, linewidth=linewidth) add_obj(obj, z, k, netname) for z, lines in enumerate(liness): if len(lines) > 0: obj = ax.add_collection( Line3DCollection(lines, colors=get_color(color, z), alpha=alpha, linewidth=linewidth)) add_obj(obj, z, k, netname) for z, rects in enumerate(rectss): if len(rects) > 0: coll = PatchCollection(rects, color=get_color(color, z), alpha=alpha) art3d.poly_collection_2d_to_3d(coll, z) obj = ax.add_collection(coll) add_obj(obj, z, k, netname)
def test_poly_collection_2d_to_3d_empty(): poly = PolyCollection([]) art3d.poly_collection_2d_to_3d(poly) assert isinstance(poly, art3d.Poly3DCollection) assert poly.get_paths() == [] fig, ax = plt.subplots(subplot_kw=dict(projection='3d')) ax.add_artist(poly) minz = poly.do_3d_projection() assert np.isnan(minz) # Ensure drawing actually works. fig.canvas.draw()
def convert_to_gl(obj, zs=0, zdir='z'): from art3d_gl import polygon_2d_to_gl from art3d_gl import line_3d_to_gl from art3d_gl import poly_collection_3d_to_gl from art3d_gl import line_collection_3d_to_gl from matplotlib.patches import Polygon from mpl_toolkits.mplot3d.art3d import Poly3DCollection, Line3D, \ poly_collection_2d_to_3d, Line3DCollection if isinstance(obj, Line3D): line3d_to_gl(obj) elif isinstance(obj, Polygon): polygon_2d_to_gl(obj, zs, zdir) elif isinstance(obj, Poly3DCollection): poly_collection_3d_to_gl(obj) elif isinstance(obj, Line3DCollection): line_collection_3d_to_gl(obj) elif isinstance(obj, PolyCollection): poly_collection_2d_to_3d(obj, zs=zs, zdir=zdir) poly_collection_3d_to_gl(obj)
def convert_to_gl(obj, zs = 0, zdir = 'z'): from art3d_gl import polygon_2d_to_gl from art3d_gl import line_3d_to_gl from art3d_gl import poly_collection_3d_to_gl from art3d_gl import line_collection_3d_to_gl from matplotlib.patches import Polygon from mpl_toolkits.mplot3d.art3d import Poly3DCollection, Line3D, \ poly_collection_2d_to_3d, Line3DCollection if isinstance(obj, Line3D): line3d_to_gl(obj) elif isinstance(obj, Polygon): polygon_2d_to_gl(obj, zs, zdir) elif isinstance(obj, Poly3DCollection): poly_collection_3d_to_gl(obj) elif isinstance(obj, Line3DCollection): line_collection_3d_to_gl(obj) elif isinstance(obj, PolyCollection): poly_collection_2d_to_3d(obj, zs=zs, zdir=zdir) poly_collection_3d_to_gl(obj)
def test_poly_collection_2d_to_3d_empty(): poly = PolyCollection([]) art3d.poly_collection_2d_to_3d(poly) assert isinstance(poly, art3d.Poly3DCollection) assert poly.get_paths() == []
def test_poly_collection_2d_to_3d_empty(): poly = PolyCollection([]) art3d.poly_collection_2d_to_3d(poly) assert isinstance(poly, art3d.Poly3DCollection) assert poly.get_paths() == []