def _contour_args(self, args, kwargs): if self.filled: fn = 'contourf' else: fn = 'contour' tri, args, kwargs = Triangulation.get_from_args_and_kwargs( *args, **kwargs) z = np.asarray(args[0]) #identified potential area of code to fix add type check of nans and raise warning here maybe to fix if z.shape != tri.x.shape: raise ValueError('z array must have same length as triangulation x' ' and y arrays') #attempt solution 1 presented by ianthomas23 in issue if len(z[np.isnan(z[:, :])]) != 0: raise ValueError('z array must have contain no nan values') if len(z[np.isinf(z[:, :])]) != 0: raise ValueError('z array must have contain no inf values') self.zmax = z.max() self.zmin = z.min() if self.logscale and self.zmin <= 0: raise ValueError('Cannot %s log of negative values.' % fn) self._contour_level_args(z, args[1:]) return (tri, z)
def _contour_args(self, args, kwargs): if self.filled: fn = 'contourf' else: fn = 'contour' tri, args, kwargs = Triangulation.get_from_args_and_kwargs( *args, **kwargs) z = np.ma.asarray(args[0]) if z.shape != tri.x.shape: raise ValueError('z array must have same length as triangulation x' ' and y arrays') # z values must be finite, only need to check points that are included # in the triangulation. z_check = z[np.unique(tri.get_masked_triangles())] if np.ma.is_masked(z_check): raise ValueError('z must not contain masked points within the ' 'triangulation') if not np.isfinite(z_check).all(): raise ValueError('z array must not contain non-finite values ' 'within the triangulation') z = np.ma.masked_invalid(z, copy=False) self.zmax = float(z_check.max()) self.zmin = float(z_check.min()) if self.logscale and self.zmin <= 0: raise ValueError('Cannot %s log of negative values.' % fn) self._contour_level_args(z, args[1:]) return (tri, z)
def plot_trisurf(self, *args, **kwargs): ''' plot_trisurf(x, y, z, **wrargs) plot_trisurf(x, y, z, triangles = triangle,,,) plot_trisurf(tri, z, **kwargs, cz = cz, cdata = cdata) ''' from art3d_gl import poly_collection_3d_to_gl from matplotlib.tri.triangulation import Triangulation cz = kwargs.pop('cz', False) cdata = kwargs.pop('cdata', None) expanddata = kwargs.pop('expanddata', False) tri, args, kwargs = Triangulation.get_from_args_and_kwargs(*args, **kwargs) if 'Z' in kwargs: z = np.asarray(kwargs.pop('Z')) else: z = np.asarray(args[0]) # We do this so Z doesn't get passed as an arg to PolyCollection args = args[1:] triangles = tri.get_masked_triangles() X3D = tri.x Y3D = tri.y Z3D = z idxset = tri.get_masked_triangles() if expanddata: verts = np.dstack((X3D[idxset], Y3D[idxset], Z3D[idxset])) if cz: if cdata is not None: cdata = cdata[idxset] else: cdata = Z3D[idxset] shade = kwargs.pop('shade', 'linear') if shade != 'linear': cdata = np.mean(cdata, -1) kwargs['facecolordata'] = np.real(cdata) kwargs.pop('facecolor', None) # get rid of this keyword kwargs['cz'] = cz o = self.plot_solid(verts, **kwargs) o._idxset = (None, None, idxset) # this is used for phasor else: verts = np.vstack((X3D, Y3D, Z3D)).transpose() if cz: if cdata is not None: cdata = cdata else: cdata = Z3D kwargs['facecolordata'] = np.real(cdata) kwargs.pop('facecolor', None) # get rid of this keyword kwargs['cz'] = cz o = self.plot_solid(verts, idxset, **kwargs) o._idxset = (None, None, None) # this is used for phasor return o
def plot_trisurf(self, *args, **kwargs): ''' plot_trisurf(x, y, z, **wrargs) plot_trisurf(x, y, z, triangles = triangle,,,) plot_trisurf(tri, z, **kwargs, cz = cz, cdata = cdata) ''' from art3d_gl import poly_collection_3d_to_gl from matplotlib.tri.triangulation import Triangulation cz = kwargs.pop('cz', False) cdata = kwargs.pop('cdata', None) expanddata = kwargs.pop('expanddata', False) tri, args, kwargs = Triangulation.get_from_args_and_kwargs( *args, **kwargs) if 'Z' in kwargs: z = np.asarray(kwargs.pop('Z')) else: z = np.asarray(args[0]) # We do this so Z doesn't get passed as an arg to PolyCollection args = args[1:] triangles = tri.get_masked_triangles() X3D = tri.x Y3D = tri.y Z3D = z idxset = tri.get_masked_triangles() if expanddata: verts = np.dstack((X3D[idxset], Y3D[idxset], Z3D[idxset])) if cz: if cdata is not None: cdata = cdata[idxset] else: cdata = Z3D[idxset] shade = kwargs.pop('shade', 'linear') if shade != 'linear': cdata = np.mean(cdata, -1) kwargs['facecolordata'] = np.real(cdata) kwargs.pop('facecolor', None) # get rid of this keyword kwargs['cz'] = cz o = self.plot_solid(verts, **kwargs) o._idxset = (None, None, idxset) # this is used for phasor else: verts = np.vstack((X3D, Y3D, Z3D)).transpose() if cz: if cdata is not None: cdata = cdata else: cdata = Z3D kwargs['facecolordata'] = np.real(cdata) kwargs.pop('facecolor', None) # get rid of this keyword kwargs['cz'] = cz o = self.plot_solid(verts, idxset, **kwargs) o._idxset = (None, None, None) # this is used for phasor return o
def meshDelaunay(settings, heights): ''' Convert coordinates to mesh using Delaunay triangulation. Also returns colormap for writing the mesh in IDTF format, surface triangles from triangulation (as opposed to tetrahedra), and the top surface area of the mesh. ''' # Get coordinates of all height points (omitting zeros) coordinates = np.where(heights != 0) x_3D = coordinates[0] y_3D = coordinates[1] # Generate 3D mesh from heights using meshgrid and griddata dx = (max(x_3D) - min(x_3D)) / settings['grid_size'] dy = (max(y_3D) - min(y_3D)) / settings['grid_size'] x_grid = np.linspace(min(x_3D), max(x_3D), max(dx, dy)) y_grid = np.linspace(min(y_3D), max(y_3D), max(dx, dy)) X, Y = np.meshgrid(x_grid, y_grid) z = np.array( [heights[x_3D[i], y_3D[i]] for i in range(len(coordinates[0]))]) Z = griddata((x_3D, y_3D), z, (X, Y)) # Convert NaNs to zeros and find non-zero coordinates Z[np.isnan(Z)] = 0 nonZero = np.where(Z > 0) # Indices of non-zero points # Subset X,Y, and Z to contain only non-zero points Z_nz = Z[nonZero[0], nonZero[1]] X_nz = np.array([X[0][xi] for xi in nonZero[0]]) Y_nz = np.array([Y[:, 0][yi] for yi in nonZero[1]]) xyz_points = np.column_stack((X_nz, Y_nz, Z_nz)) triangulation = Delaunay(xyz_points) # Get surface triangles triang, args, kwargs = Triangulation.get_from_args_and_kwargs( X_nz, Y_nz, Z_nz, triangles=triangulation.simplices) triangles = triang.get_masked_triangles( ) # From matplotlib.tri.triangulation # Get color values for mesh triangle faces fig = plt.figure() ax = fig.add_subplot(111, projection='3d') surf = ax.plot_trisurf(X_nz, Y_nz, Z_nz, triangles=triangles, cmap=plt.cm.viridis) m = plt.cm.ScalarMappable(cmap=surf.cmap, norm=surf.norm) colors = m.to_rgba(Z_nz) return z, triangulation, triangles, colors
def _contour_args(self, args, kwargs): if self.filled: fn = 'contourf' else: fn = 'contour' tri, args, kwargs = \ Triangulation.get_from_args_and_kwargs(*args, **kwargs) z = np.asarray(args[0]) if z.shape != tri.x.shape: raise ValueError('z array must have same length as triangulation x' 'and y arrays') self.zmax = z.max() self.zmin = z.min() if self.logscale and self.zmin <= 0: raise ValueError('Cannot %s log of negative values.' % fn) self._contour_level_args(z, args[1:]) return (tri, z)
def _contour_args(self, args, kwargs): if self.filled: fn = 'contourf' else: fn = 'contour' tri, args, kwargs = \ Triangulation.get_from_args_and_kwargs(*args, **kwargs) z = np.asarray(args[0]) if z.shape != tri.x.shape: raise ValueError('z array must have same length as triangulation x' 'and y arrays') self.zmax = z.max() self.zmin = z.min() if self.logscale and self.zmin <= 0: raise ValueError('Cannot %s log of negative values.' % fn) self._contour_level_args(z, args[1:]) return (tri, z)
def meshDelaunay(settings,heights): ''' Convert coordinates to mesh using Delaunay triangulation. Also returns colormap for writing the mesh in IDTF format, surface triangles from triangulation (as opposed to tetrahedra), and the top surface area of the mesh. ''' # Get coordinates of all height points (omitting zeros) coordinates = np.where(heights != 0) x_3D = coordinates[0] y_3D = coordinates[1] # Generate 3D mesh from heights using meshgrid and griddata dx = (max(x_3D) - min(x_3D)) / settings['grid_size'] dy = (max(y_3D) - min(y_3D)) / settings['grid_size'] x_grid = np.linspace(min(x_3D),max(x_3D),max(dx,dy)) y_grid = np.linspace(min(y_3D),max(y_3D),max(dx,dy)) X,Y = np.meshgrid(x_grid,y_grid) z = np.array([heights[x_3D[i],y_3D[i]] for i in range(len(coordinates[0]))]) Z = griddata((x_3D,y_3D),z,(X,Y)) # Convert NaNs to zeros and find non-zero coordinates Z[np.isnan(Z)] = 0 nonZero = np.where(Z > 0) # Indices of non-zero points # Subset X,Y, and Z to contain only non-zero points Z_nz = Z[nonZero[0],nonZero[1]] X_nz= np.array([X[0][xi] for xi in nonZero[0]]) Y_nz = np.array([Y[:,0][yi] for yi in nonZero[1]]) xyz_points = np.column_stack((X_nz,Y_nz,Z_nz)) triangulation = Delaunay(xyz_points) # Get surface triangles triang,args,kwargs = Triangulation.get_from_args_and_kwargs(X_nz,Y_nz,Z_nz,triangles=triangulation.simplices) triangles = triang.get_masked_triangles() # From matplotlib.tri.triangulation # Get color values for mesh triangle faces fig = plt.figure() ax = fig.add_subplot(111, projection='3d') surf = ax.plot_trisurf(X_nz,Y_nz,Z_nz,triangles=triangles,cmap=plt.cm.viridis) m = plt.cm.ScalarMappable(cmap=surf.cmap,norm=surf.norm) colors = m.to_rgba(Z_nz) return z,triangulation,triangles,colors
def triplot(ax, *args, **kwargs): """ Draw a unstructured triangular grid as lines and/or markers to the :class:`~matplotlib.axes.Axes`. The triangulation to plot can be specified in one of two ways; either:: triplot(triangulation, ...) where triangulation is a :class:`~matplotlib.tri.Triangulation` object, or :: triplot(x, y, ...) triplot(x, y, triangles, ...) triplot(x, y, triangles=triangles, ...) triplot(x, y, mask, ...) triplot(x, y, mask=mask, ...) triplot(x, y, triangles, mask, ...) triplot(x, y, triangles, mask=mask, ...) in which case a Triangulation object will be created. See :class:`~matplotlib.tri.Triangulation` for a explanation of these possibilities. The remaining args and kwargs are the same as for :meth:`~matplotlib.axes.Axes.plot`. **Example:** .. plot:: mpl_examples/pylab_examples/triplot_demo.py """ tri, args, kwargs = Triangulation.get_from_args_and_kwargs(*args, **kwargs) x = tri.x y = tri.y edges = tri.edges marker = kwargs.pop('marker', None) kwargs['marker'] = '' ax.plot(x[edges].T, y[edges].T, *args, **kwargs) if marker is None: kwargs.pop('marker') else: kwargs['marker'] = marker kwargs['linestyle'] = '' ax.plot(x, y, *args, **kwargs)
def triplot(ax, *args, **kwargs): """ Draw a unstructured triangular grid as lines and/or markers. The triangulation to plot can be specified in one of two ways; either:: triplot(triangulation, ...) where triangulation is a :class:`matplotlib.tri.Triangulation` object, or :: triplot(x, y, ...) triplot(x, y, triangles, ...) triplot(x, y, triangles=triangles, ...) triplot(x, y, mask=mask, ...) triplot(x, y, triangles, mask=mask, ...) in which case a Triangulation object will be created. See :class:`~matplotlib.tri.Triangulation` for a explanation of these possibilities. The remaining args and kwargs are the same as for :meth:`~matplotlib.axes.Axes.plot`. **Example:** .. plot:: mpl_examples/pylab_examples/triplot_demo.py """ import matplotlib.axes tri, args, kwargs = Triangulation.get_from_args_and_kwargs(*args, **kwargs) x = tri.x y = tri.y edges = tri.edges # If draw both lines and markers at the same time, e.g. # ax.plot(x[edges].T, y[edges].T, *args, **kwargs) # then the markers are drawn more than once which is incorrect if alpha<1. # Hence draw lines and markers separately. # Decode plot format string, e.g., 'ro-' fmt = "" if len(args) > 0: fmt = args[0] linestyle, marker, color = matplotlib.axes._process_plot_format(fmt) # Draw lines without markers, if lines are required. if linestyle is not None and linestyle is not "None": kw = kwargs.copy() kw.pop("marker", None) # Ignore marker if set. kw["linestyle"] = ls_mapper[linestyle] kw["edgecolor"] = color kw["facecolor"] = None vertices = np.column_stack((x[edges].flatten(), y[edges].flatten())) codes = ([Path.MOVETO] + [Path.LINETO]) * len(edges) path = Path(vertices, codes) pathpatch = PathPatch(path, **kw) ax.add_patch(pathpatch) # Draw markers without lines. # Should avoid drawing markers for points that are not in any triangle? kwargs["linestyle"] = "" ax.plot(x, y, *args, **kwargs)
def triplot(ax, *args, **kwargs): """ Draw a unstructured triangular grid as lines and/or markers to the :class:`~matplotlib.axes.Axes`. The triangulation to plot can be specified in one of two ways; either:: triplot(triangulation, ...) where triangulation is a :class:`~matplotlib.tri.Triangulation` object, or :: triplot(x, y, ...) triplot(x, y, triangles, ...) triplot(x, y, triangles=triangles, ...) triplot(x, y, mask=mask, ...) triplot(x, y, triangles, mask=mask, ...) in which case a Triangulation object will be created. See :class:`~matplotlib.tri.Triangulation` for a explanation of these possibilities. The remaining args and kwargs are the same as for :meth:`~matplotlib.axes.Axes.plot`. **Example:** .. plot:: mpl_examples/pylab_examples/triplot_demo.py """ import matplotlib.axes tri, args, kwargs = Triangulation.get_from_args_and_kwargs(*args, **kwargs) x = tri.x y = tri.y edges = tri.edges # If draw both lines and markers at the same time, e.g. # ax.plot(x[edges].T, y[edges].T, *args, **kwargs) # then the markers are drawn more than once which is incorrect if alpha<1. # Hence draw lines and markers separately. # Decode plot format string, e.g. 'ro-' fmt = '' if len(args) > 0: fmt = args[0] # _process_plot_format moves around so I made copy here. # not a best solution...;D # linestyle, marker, color = matplotlib.axes._process_plot_format(fmt) linestyle, marker, color = _process_plot_format(fmt) # Draw lines without markers, if lines are required. a = [] if linestyle is not None and linestyle is not 'None': kw = kwargs.copy() kw.pop('marker', None) # Ignore marker if set. kw['linestyle'] = ls_mapper[linestyle] kw['edgecolor'] = color kw['facecolor'] = None vertices = np.column_stack((x[edges].flatten(), y[edges].flatten())) codes = ([Path.MOVETO] + [Path.LINETO])*len(edges) path = Path(vertices, codes) pathpatch = PathPatch(path, **kw) ax.add_patch(pathpatch) a.append(pathpatch) # Draw markers without lines. # Should avoid drawing markers for points that are not in any triangle? kwargs['linestyle'] = '' # without hiding points explicitly, marker would expose hidden points. idx = np.unique(edges.flatten()) l = ax.plot(x[idx], y[idx], *args, **kwargs) a = l+a return a
def tripcolor_costum( ax, *args, alpha=1.0, override_cmap_alpha=True, norm=None, cmap=None, vmin=None, vmax=None, shading="flat", facecolors=None, **kwargs, ): """ Create a pseudocolor plot of an unstructured triangular grid. The triangulation can be specified in one of two ways; either:: tripcolor(triangulation, ...) where triangulation is a :class:`matplotlib.tri.Triangulation` object, or :: tripcolor(x, y, ...) tripcolor(x, y, triangles, ...) tripcolor(x, y, triangles=triangles, ...) tripcolor(x, y, mask=mask, ...) tripcolor(x, y, triangles, mask=mask, ...) in which case a Triangulation object will be created. See :class:`~matplotlib.tri.Triangulation` for a explanation of these possibilities. The next argument must be *C*, the array of color values, either one per point in the triangulation if color values are defined at points, or one per triangle in the triangulation if color values are defined at triangles. If there are the same number of points and triangles in the triangulation it is assumed that color values are defined at points; to force the use of color values at triangles use the kwarg ``facecolors=C`` instead of just ``C``. *shading* may be 'flat' (the default) or 'gouraud'. If *shading* is 'flat' and C values are defined at points, the color values used for each triangle are from the mean C of the triangle's three points. If *shading* is 'gouraud' then color values must be defined at points. The remaining kwargs are the same as for :meth:`~matplotlib.axes.Axes.pcolor`. """ cbook._check_in_list(["flat", "gouraud"], shading=shading) tri, args, kwargs = Triangulation.get_from_args_and_kwargs(*args, **kwargs) # C is the colors array defined at either points or faces (i.e. triangles). # If facecolors is None, C are defined at points. # If facecolors is not None, C are defined at faces. if facecolors is not None: C = facecolors else: C = np.asarray(args[0]) # If there are a different number of points and triangles in the # triangulation, can omit facecolors kwarg as it is obvious from # length of C whether it refers to points or faces. # Do not do this for gouraud shading. if (facecolors is None and len(C) == len(tri.triangles) and len(C) != len(tri.x) and shading != "gouraud"): facecolors = C # Check length of C is OK. if (facecolors is None and len(C) != len(tri.x)) or (facecolors is not None and len(C) != len(tri.triangles)): raise ValueError("Length of color values array must be the same " "as either the number of triangulation points " "or triangles") # Handling of linewidths, shading, edgecolors and antialiased as # in Axes.pcolor linewidths = (0.25, ) if "linewidth" in kwargs: kwargs["linewidths"] = kwargs.pop("linewidth") kwargs.setdefault("linewidths", linewidths) edgecolors = "none" if "edgecolor" in kwargs: kwargs["edgecolors"] = kwargs.pop("edgecolor") ec = kwargs.setdefault("edgecolors", edgecolors) if "antialiased" in kwargs: kwargs["antialiaseds"] = kwargs.pop("antialiased") if "antialiaseds" not in kwargs and ec.lower() == "none": kwargs["antialiaseds"] = False if shading == "gouraud": if facecolors is not None: raise ValueError("Gouraud shading does not support the use " "of facecolors kwarg") if len(C) != len(tri.x): raise ValueError("For gouraud shading, the length of color " "values array must be the same as the " "number of triangulation points") collection = CustomTriMesh(tri, **kwargs) else: # Vertices of triangles. maskedTris = tri.get_masked_triangles() verts = np.stack((tri.x[maskedTris], tri.y[maskedTris]), axis=-1) # Color values. if facecolors is None: # One color per triangle, the mean of the 3 vertex color values. C = C[maskedTris].mean(axis=1) elif tri.mask is not None: # Remove color values of masked triangles. C = C[~tri.mask] collection = CustomPolyCollection(verts, **kwargs) collection.set_alpha(alpha) collection.set_override_cmap_alpha(override_cmap_alpha) collection.set_array(C) if norm is not None and not isinstance(norm, Normalize): raise ValueError("'norm' must be an instance of 'Normalize'") collection.set_cmap(cmap) collection.set_norm(norm) if vmin is not None or vmax is not None: collection.set_clim(vmin, vmax) else: collection.autoscale_None() ax.grid(False) minx = tri.x.min() maxx = tri.x.max() miny = tri.y.min() maxy = tri.y.max() corners = (minx, miny), (maxx, maxy) ax.update_datalim(corners) ax.autoscale_view() ax.add_collection(collection) return ax, collection
def tripcolor(ax, *args, **kwargs): """ Create a pseudocolor plot of an unstructured triangular grid to the :class:`~matplotlib.axes.Axes`. The triangulation can be specified in one of two ways; either:: tripcolor(triangulation, ...) where triangulation is a :class:`~matplotlib.tri.Triangulation` object, or :: tripcolor(x, y, ...) tripcolor(x, y, triangles, ...) tripcolor(x, y, triangles=triangles, ...) tripcolor(x, y, mask=mask, ...) tripcolor(x, y, triangles, mask=mask, ...) in which case a Triangulation object will be created. See :class:`~matplotlib.tri.Triangulation` for a explanation of these possibilities. The next argument must be *C*, the array of color values, one per point in the triangulation. *shading* may be 'flat', 'faceted' or 'gouraud'. If *shading* is 'flat' or 'faceted', the colors used for each triangle are from the mean C of the triangle's three points. The remaining kwargs are the same as for :meth:`~matplotlib.axes.Axes.pcolor`. **Example:** .. plot:: mpl_examples/pylab_examples/tripcolor_demo.py """ if not ax._hold: ax.cla() alpha = kwargs.pop('alpha', 1.0) norm = kwargs.pop('norm', None) cmap = kwargs.pop('cmap', None) vmin = kwargs.pop('vmin', None) vmax = kwargs.pop('vmax', None) shading = kwargs.pop('shading', 'flat') tri, args, kwargs = Triangulation.get_from_args_and_kwargs(*args, **kwargs) x = tri.x y = tri.y triangles = tri.get_masked_triangles() C = np.asarray(args[0]) if C.shape != x.shape: raise ValueError('C array must have same length as triangulation x and' ' y arrays') if shading == 'gouraud': collection = TriMesh(tri, **kwargs) else: if shading == 'faceted': edgecolors = (0,0,0,1), linewidths = (0.25,) else: edgecolors = 'face' linewidths = (1.0,) kwargs.setdefault('edgecolors', edgecolors) kwargs.setdefault('antialiaseds', (0,)) kwargs.setdefault('linewidths', linewidths) # Vertices of triangles. verts = np.concatenate((x[triangles][...,np.newaxis], y[triangles][...,np.newaxis]), axis=2) # Color values, one per triangle, mean of the 3 vertex color values. C = C[triangles].mean(axis=1) collection = PolyCollection(verts, **kwargs) collection.set_alpha(alpha) collection.set_array(C) if norm is not None: assert(isinstance(norm, Normalize)) collection.set_cmap(cmap) collection.set_norm(norm) if vmin is not None or vmax is not None: collection.set_clim(vmin, vmax) else: collection.autoscale_None() ax.grid(False) minx = tri.x.min() maxx = tri.x.max() miny = tri.y.min() maxy = tri.y.max() corners = (minx, miny), (maxx, maxy) ax.update_datalim( corners) ax.autoscale_view() ax.add_collection(collection) return collection
def triplot(ax, *args, **kwargs): """ Draw a unstructured triangular grid as lines and/or markers. The triangulation to plot can be specified in one of two ways; either:: triplot(triangulation, ...) where triangulation is a :class:`~matplotlib.tri.Triangulation` object, or :: triplot(x, y, ...) triplot(x, y, triangles, ...) triplot(x, y, triangles=triangles, ...) triplot(x, y, mask=mask, ...) triplot(x, y, triangles, mask=mask, ...) in which case a Triangulation object will be created. See :class:`~matplotlib.tri.Triangulation` for a explanation of these possibilities. The remaining args and kwargs are the same as for :meth:`~matplotlib.axes.Axes.plot`. **Example:** .. plot:: mpl_examples/pylab_examples/triplot_demo.py """ import matplotlib.axes tri, args, kwargs = Triangulation.get_from_args_and_kwargs(*args, **kwargs) x = tri.x y = tri.y edges = tri.edges # If draw both lines and markers at the same time, e.g. # ax.plot(x[edges].T, y[edges].T, *args, **kwargs) # then the markers are drawn more than once which is incorrect if alpha<1. # Hence draw lines and markers separately. # Decode plot format string, e.g. 'ro-' fmt = '' if len(args) > 0: fmt = args[0] linestyle, marker, color = matplotlib.axes._process_plot_format(fmt) # Draw lines without markers, if lines are required. if linestyle is not None and linestyle is not 'None': kw = kwargs.copy() kw.pop('marker', None) # Ignore marker if set. kw['linestyle'] = ls_mapper[linestyle] kw['edgecolor'] = color kw['facecolor'] = None vertices = np.column_stack((x[edges].flatten(), y[edges].flatten())) codes = ([Path.MOVETO] + [Path.LINETO]) * len(edges) path = Path(vertices, codes) pathpatch = PathPatch(path, **kw) ax.add_patch(pathpatch) # Draw markers without lines. # Should avoid drawing markers for points that are not in any triangle? kwargs['linestyle'] = '' ax.plot(x, y, *args, **kwargs)
def tripcolor(ax, *args, **kwargs): """ Create a pseudocolor plot of an unstructured triangular grid. The triangulation can be specified in one of two ways; either:: tripcolor(triangulation, ...) where triangulation is a :class:`matplotlib.tri.Triangulation` object, or :: tripcolor(x, y, ...) tripcolor(x, y, triangles, ...) tripcolor(x, y, triangles=triangles, ...) tripcolor(x, y, mask=mask, ...) tripcolor(x, y, triangles, mask=mask, ...) in which case a Triangulation object will be created. See :class:`~matplotlib.tri.Triangulation` for a explanation of these possibilities. The next argument must be *C*, the array of color values, either one per point in the triangulation if color values are defined at points, or one per triangle in the triangulation if color values are defined at triangles. If there are the same number of points and triangles in the triangulation it is assumed that color values are defined at points; to force the use of color values at triangles use the kwarg *facecolors*=C instead of just *C*. *shading* may be 'flat' (the default) or 'gouraud'. If *shading* is 'flat' and C values are defined at points, the color values used for each triangle are from the mean C of the triangle's three points. If *shading* is 'gouraud' then color values must be defined at points. The remaining kwargs are the same as for :meth:`~matplotlib.axes.Axes.pcolor`. **Example:** .. plot:: mpl_examples/pylab_examples/tripcolor_demo.py """ if not ax._hold: ax.cla() alpha = kwargs.pop('alpha', 1.0) norm = kwargs.pop('norm', None) cmap = kwargs.pop('cmap', None) vmin = kwargs.pop('vmin', None) vmax = kwargs.pop('vmax', None) shading = kwargs.pop('shading', 'flat') facecolors = kwargs.pop('facecolors', None) if shading not in ['flat', 'gouraud']: raise ValueError("shading must be one of ['flat', 'gouraud'] " "not {0}".format(shading)) tri, args, kwargs = Triangulation.get_from_args_and_kwargs(*args, **kwargs) # C is the colors array defined at either points or faces (i.e. triangles). # If facecolors is None, C are defined at points. # If facecolors is not None, C are defined at faces. if facecolors is not None: C = facecolors else: C = np.asarray(args[0]) # If there are a different number of points and triangles in the # triangulation, can omit facecolors kwarg as it is obvious from # length of C whether it refers to points or faces. # Do not do this for gouraud shading. if (facecolors is None and len(C) == len(tri.triangles) and len(C) != len(tri.x) and shading != 'gouraud'): facecolors = C # Check length of C is OK. if ((facecolors is None and len(C) != len(tri.x)) or (facecolors is not None and len(C) != len(tri.triangles))): raise ValueError('Length of color values array must be the same ' 'as either the number of triangulation points ' 'or triangles') # Handling of linewidths, shading, edgecolors and antialiased as # in Axes.pcolor linewidths = (0.25,) if 'linewidth' in kwargs: kwargs['linewidths'] = kwargs.pop('linewidth') kwargs.setdefault('linewidths', linewidths) edgecolors = 'none' if 'edgecolor' in kwargs: kwargs['edgecolors'] = kwargs.pop('edgecolor') ec = kwargs.setdefault('edgecolors', edgecolors) if 'antialiased' in kwargs: kwargs['antialiaseds'] = kwargs.pop('antialiased') if 'antialiaseds' not in kwargs and ec.lower() == "none": kwargs['antialiaseds'] = False if shading == 'gouraud': if facecolors is not None: raise ValueError('Gouraud shading does not support the use ' 'of facecolors kwarg') if len(C) != len(tri.x): raise ValueError('For gouraud shading, the length of color ' 'values array must be the same as the ' 'number of triangulation points') collection = TriMesh(tri, **kwargs) else: # Vertices of triangles. maskedTris = tri.get_masked_triangles() verts = np.concatenate((tri.x[maskedTris][..., np.newaxis], tri.y[maskedTris][..., np.newaxis]), axis=2) # Color values. if facecolors is None: # One color per triangle, the mean of the 3 vertex color values. C = C[maskedTris].mean(axis=1) elif tri.mask is not None: # Remove color values of masked triangles. C = C.compress(1-tri.mask) collection = PolyCollection(verts, **kwargs) collection.set_alpha(alpha) collection.set_array(C) if norm is not None: if not isinstance(norm, Normalize): msg = "'norm' must be an instance of 'Normalize'" raise ValueError(msg) collection.set_cmap(cmap) collection.set_norm(norm) if vmin is not None or vmax is not None: collection.set_clim(vmin, vmax) else: collection.autoscale_None() ax.grid(False) minx = tri.x.min() maxx = tri.x.max() miny = tri.y.min() maxy = tri.y.max() corners = (minx, miny), (maxx, maxy) ax.update_datalim(corners) ax.autoscale_view() ax.add_collection(collection) return collection
def triplot(ax, *args, **kwargs): """ Draw a unstructured triangular grid as lines and/or markers. The triangulation to plot can be specified in one of two ways; either:: triplot(triangulation, ...) where triangulation is a `.Triangulation` object, or :: triplot(x, y, ...) triplot(x, y, triangles, ...) triplot(x, y, triangles=triangles, ...) triplot(x, y, mask=mask, ...) triplot(x, y, triangles, mask=mask, ...) in which case a Triangulation object will be created. See `.Triangulation` for a explanation of these possibilities. The remaining args and kwargs are the same as for `~.Axes.plot`. Returns ------- lines : `~matplotlib.lines.Line2D` The drawn triangles edges. markers : `~matplotlib.lines.Line2D` The drawn marker nodes. """ import matplotlib.axes tri, args, kwargs = Triangulation.get_from_args_and_kwargs(*args, **kwargs) x, y, edges = (tri.x, tri.y, tri.edges) # Decode plot format string, e.g., 'ro-' fmt = args[0] if args else "" linestyle, marker, color = matplotlib.axes._base._process_plot_format(fmt) # Insert plot format string into a copy of kwargs (kwargs values prevail). kw = cbook.normalize_kwargs(kwargs, mlines.Line2D) for key, val in zip(('linestyle', 'marker', 'color'), (linestyle, marker, color)): if val is not None: kw.setdefault(key, val) # Draw lines without markers. # Note 1: If we drew markers here, most markers would be drawn more than # once as they belong to several edges. # Note 2: We insert nan values in the flattened edges arrays rather than # plotting directly (triang.x[edges].T, triang.y[edges].T) # as it considerably speeds-up code execution. linestyle = kw['linestyle'] kw_lines = { **kw, 'marker': 'None', # No marker to draw. 'zorder': kw.get('zorder', 1), # Path default zorder is used. } if linestyle not in [None, 'None', '', ' ']: tri_lines_x = np.insert(x[edges], 2, np.nan, axis=1) tri_lines_y = np.insert(y[edges], 2, np.nan, axis=1) tri_lines = ax.plot(tri_lines_x.ravel(), tri_lines_y.ravel(), **kw_lines) else: tri_lines = ax.plot([], [], **kw_lines) # Draw markers separately. marker = kw['marker'] kw_markers = { **kw, 'linestyle': 'None', # No line to draw. } if marker not in [None, 'None', '', ' ']: tri_markers = ax.plot(x, y, **kw_markers) else: tri_markers = ax.plot([], [], **kw_markers) return tri_lines + tri_markers
def triplot(ax, *args, **kwargs): """ Draw a unstructured triangular grid as lines and/or markers. The triangulation to plot can be specified in one of two ways; either:: triplot(triangulation, ...) where triangulation is a :class:`matplotlib.tri.Triangulation` object, or :: triplot(x, y, ...) triplot(x, y, triangles, ...) triplot(x, y, triangles=triangles, ...) triplot(x, y, mask=mask, ...) triplot(x, y, triangles, mask=mask, ...) in which case a Triangulation object will be created. See :class:`~matplotlib.tri.Triangulation` for a explanation of these possibilities. The remaining args and kwargs are the same as for :meth:`~matplotlib.axes.Axes.plot`. Return a list of 2 :class:`~matplotlib.lines.Line2D` containing respectively: - the lines plotted for triangles edges - the markers plotted for triangles nodes **Example:** .. plot:: mpl_examples/pylab_examples/triplot_demo.py """ import matplotlib.axes tri, args, kwargs = Triangulation.get_from_args_and_kwargs(*args, **kwargs) x, y, edges = (tri.x, tri.y, tri.edges) # Decode plot format string, e.g., 'ro-' fmt = "" if len(args) > 0: fmt = args[0] linestyle, marker, color = matplotlib.axes._base._process_plot_format(fmt) # Insert plot format string into a copy of kwargs (kwargs values prevail). kw = kwargs.copy() for key, val in zip(('linestyle', 'marker', 'color'), (linestyle, marker, color)): if val is not None: kw[key] = kwargs.get(key, val) # Draw lines without markers. # Note 1: If we drew markers here, most markers would be drawn more than # once as they belong to several edges. # Note 2: We insert nan values in the flattened edges arrays rather than # plotting directly (triang.x[edges].T, triang.y[edges].T) # as it considerably speeds-up code execution. linestyle = kw['linestyle'] kw_lines = kw.copy() kw_lines['marker'] = 'None' # No marker to draw. kw_lines['zorder'] = kw.get('zorder', 1) # Path default zorder is used. if (linestyle is not None) and (linestyle not in ['None', '', ' ']): tri_lines_x = np.insert(x[edges], 2, np.nan, axis=1) tri_lines_y = np.insert(y[edges], 2, np.nan, axis=1) tri_lines = ax.plot(tri_lines_x.ravel(), tri_lines_y.ravel(), **kw_lines) else: tri_lines = ax.plot([], [], **kw_lines) # Draw markers separately. marker = kw['marker'] kw_markers = kw.copy() kw_markers['linestyle'] = 'None' # No line to draw. if (marker is not None) and (marker not in ['None', '', ' ']): tri_markers = ax.plot(x, y, **kw_markers) else: tri_markers = ax.plot([], [], **kw_markers) return tri_lines + tri_markers
def tripcolor(ax, *args, **kwargs): """ Create a pseudocolor plot of an unstructured triangular grid to the :class:`~matplotlib.axes.Axes`. The triangulation can be specified in one of two ways; either:: tripcolor(triangulation, ...) where triangulation is a :class:`~matplotlib.tri.Triangulation` object, or :: tripcolor(x, y, ...) tripcolor(x, y, triangles, ...) tripcolor(x, y, triangles=triangles, ...) tripcolor(x, y, mask, ...) tripcolor(x, y, mask=mask, ...) tripcolor(x, y, triangles, mask, ...) tripcolor(x, y, triangles, mask=mask, ...) in which case a Triangulation object will be created. See :class:`~matplotlib.tri.Triangulation` for a explanation of these possibilities. The next argument must be *C*, the array of color values, one per point in the triangulation. The colors used for each triangle are from the mean C of the triangle's three points. The remaining kwargs are the same as for :meth:`~matplotlib.axes.Axes.pcolor`. **Example:** .. plot:: mpl_examples/pylab_examples/tripcolor_demo.py """ if not ax._hold: ax.cla() alpha = kwargs.pop('alpha', 1.0) norm = kwargs.pop('norm', None) cmap = kwargs.pop('cmap', None) vmin = kwargs.pop('vmin', None) vmax = kwargs.pop('vmax', None) shading = kwargs.pop('shading', 'flat') tri, args, kwargs = Triangulation.get_from_args_and_kwargs(*args, **kwargs) x = tri.x y = tri.y triangles = tri.get_masked_triangles() # Vertices of triangles. verts = np.concatenate( (x[triangles][..., np.newaxis], y[triangles][..., np.newaxis]), axis=2) C = np.asarray(args[0]) if C.shape != x.shape: raise ValueError('C array must have same length as triangulation x and' ' y arrays') # Color values, one per triangle, mean of the 3 vertex color values. C = C[triangles].mean(axis=1) if shading == 'faceted': edgecolors = (0, 0, 0, 1), linewidths = (0.25, ) else: edgecolors = 'face' linewidths = (1.0, ) kwargs.setdefault('edgecolors', edgecolors) kwargs.setdefault('antialiaseds', (0, )) kwargs.setdefault('linewidths', linewidths) collection = PolyCollection(verts, **kwargs) collection.set_alpha(alpha) collection.set_array(C) if norm is not None: assert (isinstance(norm, Normalize)) collection.set_cmap(cmap) collection.set_norm(norm) if vmin is not None or vmax is not None: collection.set_clim(vmin, vmax) else: collection.autoscale_None() ax.grid(False) minx = tri.x.min() maxx = tri.x.max() miny = tri.y.min() maxy = tri.y.max() corners = (minx, miny), (maxx, maxy) ax.update_datalim(corners) ax.autoscale_view() ax.add_collection(collection) return collection
def show_scalar_in_matplotlib_3d(self, field, **kwargs): import matplotlib.pyplot as plt # This import also registers the 3D projection. import mpl_toolkits.mplot3d.art3d as art3d do_show = kwargs.pop("do_show", True) vmin = kwargs.pop("vmin", None) vmax = kwargs.pop("vmax", None) norm = kwargs.pop("norm", None) nodes = self._vis_nodes_numpy() field = resample_to_numpy(self.connection, field) assert nodes.shape[0] == self.vis_discr.ambient_dim vis_connectivity, = self._vtk_connectivity.groups fig = plt.gcf() ax = fig.gca(projection="3d") had_data = ax.has_data() if self.vis_discr.dim == 2: nodes = list(nodes) # pad to 3D with zeros while len(nodes) < 3: nodes.append(0*nodes[0]) from matplotlib.tri.triangulation import Triangulation tri, _, kwargs = \ Triangulation.get_from_args_and_kwargs( *nodes, triangles=vis_connectivity.vis_connectivity.reshape(-1, 3)) triangles = tri.get_masked_triangles() xt = nodes[0][triangles] yt = nodes[1][triangles] zt = nodes[2][triangles] verts = np.stack((xt, yt, zt), axis=-1) fieldt = field[triangles] polyc = art3d.Poly3DCollection(verts, **kwargs) # average over the three points of each triangle avg_field = fieldt.mean(axis=1) polyc.set_array(avg_field) if vmin is not None or vmax is not None: polyc.set_clim(vmin, vmax) if norm is not None: polyc.set_norm(norm) ax.add_collection(polyc) ax.auto_scale_xyz(xt, yt, zt, had_data) else: raise RuntimeError("meshes of bulk dimension %d are currently " "unsupported" % self.vis_discr.dim) if do_show: plt.show()
def tripcolor(ax, *args, alpha=1.0, norm=None, cmap=None, vmin=None, vmax=None, shading='flat', facecolors=None, **kwargs): """ Create a pseudocolor plot of an unstructured triangular grid. Call signatures:: tripcolor(triangulation, C, *, ...) tripcolor(x, y, C, *, [triangles=triangles], [mask=mask], ...) The triangular grid can be specified either by passing a `.Triangulation` object as the first parameter, or by passing the points *x*, *y* and optionally the *triangles* and a *mask*. See `.Triangulation` for an explanation of these parameters. If neither of *triangulation* or *triangles* are given, the triangulation is calculated on the fly. In this case, it does not make sense to provide colors at the triangle faces via *C* or *facecolors* because there are multiple possible triangulations for a group of points and you don't know which triangles will be constructed. Parameters ---------- triangulation : `.Triangulation` An already created triangular grid. x, y, triangles, mask Parameters defining the triangular grid. See `.Triangulation`. This is mutually exclusive with specifying *triangulation*. C : array-like The color values, either for the points or for the triangles. Which one is automatically inferred from the length of *C*, i.e. does it match the number of points or the number of triangles. If there are the same number of points and triangles in the triangulation it is assumed that color values are defined at points; to force the use of color values at triangles use the keyword argument ``facecolors=C`` instead of just ``C``. This parameter is position-only. facecolors : array-like, optional Can be used alternatively to *C* to specify colors at the triangle faces. This parameter takes precedence over *C*. shading : {'flat', 'gouraud'}, default: 'flat' If 'flat' and the color values *C* are defined at points, the color values used for each triangle are from the mean C of the triangle's three points. If *shading* is 'gouraud' then color values must be defined at points. other_parameters All other parameters are the same as for `~.Axes.pcolor`. Notes ----- It is possible to pass the triangles positionally, i.e. ``tripcolor(x, y, triangles, C, ...)``. However, this is discouraged. For more clarity, pass *triangles* via keyword argument. """ _api.check_in_list(['flat', 'gouraud'], shading=shading) tri, args, kwargs = Triangulation.get_from_args_and_kwargs(*args, **kwargs) # Parse the color to be in one of (the other variable will be None): # - facecolors: if specified at the triangle faces # - point_colors: if specified at the points if facecolors is not None: if args: _api.warn_external( "Positional parameter C has no effect when the keyword " "facecolors is given") point_colors = None if len(facecolors) != len(tri.triangles): raise ValueError("The length of facecolors must match the number " "of triangles") else: # Color from positional parameter C if not args: raise ValueError( "Missing color parameter. Please pass C positionally or " "facecolors via keyword") elif len(args) > 1: _api.warn_external( "Additional positional parameters {args[1:]!r} are ignored") C = np.asarray(args[0]) if len(C) == len(tri.x): # having this before the len(tri.triangles) comparison gives # precedence to nodes if there are as many nodes as triangles point_colors = C facecolors = None elif len(C) == len(tri.triangles): point_colors = None facecolors = C else: raise ValueError('The length of C must match either the number ' 'of points or the number of triangles') # Handling of linewidths, shading, edgecolors and antialiased as # in Axes.pcolor linewidths = (0.25, ) if 'linewidth' in kwargs: kwargs['linewidths'] = kwargs.pop('linewidth') kwargs.setdefault('linewidths', linewidths) edgecolors = 'none' if 'edgecolor' in kwargs: kwargs['edgecolors'] = kwargs.pop('edgecolor') ec = kwargs.setdefault('edgecolors', edgecolors) if 'antialiased' in kwargs: kwargs['antialiaseds'] = kwargs.pop('antialiased') if 'antialiaseds' not in kwargs and ec.lower() == "none": kwargs['antialiaseds'] = False _api.check_isinstance((Normalize, None), norm=norm) if shading == 'gouraud': if facecolors is not None: raise ValueError( "shading='gouraud' can only be used when the colors " "are specified at the points, not at the faces.") collection = TriMesh(tri, alpha=alpha, array=point_colors, cmap=cmap, norm=norm, **kwargs) else: # Vertices of triangles. maskedTris = tri.get_masked_triangles() verts = np.stack((tri.x[maskedTris], tri.y[maskedTris]), axis=-1) # Color values. if facecolors is None: # One color per triangle, the mean of the 3 vertex color values. colors = point_colors[maskedTris].mean(axis=1) elif tri.mask is not None: # Remove color values of masked triangles. colors = facecolors[~tri.mask] else: colors = facecolors collection = PolyCollection(verts, alpha=alpha, array=colors, cmap=cmap, norm=norm, **kwargs) collection._scale_norm(norm, vmin, vmax) ax.grid(False) minx = tri.x.min() maxx = tri.x.max() miny = tri.y.min() maxy = tri.y.max() corners = (minx, miny), (maxx, maxy) ax.update_datalim(corners) ax.autoscale_view() ax.add_collection(collection) return collection
def tripcolor(ax, *args, **kwargs): """ Create a pseudocolor plot of an unstructured triangular grid. The triangulation can be specified in one of two ways; either:: tripcolor(triangulation, ...) where triangulation is a :class:`matplotlib.tri.Triangulation` object, or :: tripcolor(x, y, ...) tripcolor(x, y, triangles, ...) tripcolor(x, y, triangles=triangles, ...) tripcolor(x, y, mask=mask, ...) tripcolor(x, y, triangles, mask=mask, ...) in which case a Triangulation object will be created. See :class:`~matplotlib.tri.Triangulation` for a explanation of these possibilities. The next argument must be *C*, the array of color values, either one per point in the triangulation if color values are defined at points, or one per triangle in the triangulation if color values are defined at triangles. If there are the same number of points and triangles in the triangulation it is assumed that color values are defined at points; to force the use of color values at triangles use the kwarg *facecolors*=C instead of just *C*. *shading* may be 'flat' (the default) or 'gouraud'. If *shading* is 'flat' and C values are defined at points, the color values used for each triangle are from the mean C of the triangle's three points. If *shading* is 'gouraud' then color values must be defined at points. The remaining kwargs are the same as for :meth:`~matplotlib.axes.Axes.pcolor`. **Example:** .. plot:: mpl_examples/pylab_examples/tripcolor_demo.py """ if not ax._hold: ax.cla() alpha = kwargs.pop('alpha', 1.0) norm = kwargs.pop('norm', None) cmap = kwargs.pop('cmap', None) vmin = kwargs.pop('vmin', None) vmax = kwargs.pop('vmax', None) shading = kwargs.pop('shading', 'flat') facecolors = kwargs.pop('facecolors', None) if shading not in ['flat', 'gouraud']: raise ValueError("shading must be one of ['flat', 'gouraud'] " "not {0}".format(shading)) tri, args, kwargs = Triangulation.get_from_args_and_kwargs(*args, **kwargs) # C is the colors array defined at either points or faces (i.e. triangles). # If facecolors is None, C are defined at points. # If facecolors is not None, C are defined at faces. if facecolors is not None: C = facecolors else: C = np.asarray(args[0]) # If there are a different number of points and triangles in the # triangulation, can omit facecolors kwarg as it is obvious from # length of C whether it refers to points or faces. # Do not do this for gouraud shading. if (facecolors is None and len(C) == len(tri.triangles) and len(C) != len(tri.x) and shading != 'gouraud'): facecolors = C # Check length of C is OK. if ((facecolors is None and len(C) != len(tri.x)) or (facecolors is not None and len(C) != len(tri.triangles))): raise ValueError('Length of color values array must be the same ' 'as either the number of triangulation points ' 'or triangles') # Handling of linewidths, shading, edgecolors and antialiased as # in Axes.pcolor linewidths = (0.25,) if 'linewidth' in kwargs: kwargs['linewidths'] = kwargs.pop('linewidth') kwargs.setdefault('linewidths', linewidths) edgecolors = 'none' if 'edgecolor' in kwargs: kwargs['edgecolors'] = kwargs.pop('edgecolor') ec = kwargs.setdefault('edgecolors', edgecolors) if 'antialiased' in kwargs: kwargs['antialiaseds'] = kwargs.pop('antialiased') if 'antialiaseds' not in kwargs and ec.lower() == "none": kwargs['antialiaseds'] = False if shading == 'gouraud': if facecolors is not None: raise ValueError('Gouraud shading does not support the use ' 'of facecolors kwarg') if len(C) != len(tri.x): raise ValueError('For gouraud shading, the length of color ' 'values array must be the same as the ' 'number of triangulation points') collection = TriMesh(tri, **kwargs) else: # Vertices of triangles. maskedTris = tri.get_masked_triangles() verts = np.concatenate((tri.x[maskedTris][..., np.newaxis], tri.y[maskedTris][..., np.newaxis]), axis=2) # Color values. if facecolors is None: # One color per triangle, the mean of the 3 vertex color values. C = C[maskedTris].mean(axis=1) elif tri.mask is not None: # Remove color values of masked triangles. C = C.compress(1-tri.mask) collection = PolyCollection(verts, **kwargs) collection.set_alpha(alpha) collection.set_array(C) if norm is not None: if not isinstance(norm, Normalize): msg = "'norm' must be an instance of 'Normalize'" raise ValueError(msg) collection.set_cmap(cmap) collection.set_norm(norm) if vmin is not None or vmax is not None: collection.set_clim(vmin, vmax) else: collection.autoscale_None() ax.grid(False) minx = tri.x.min() maxx = tri.x.max() miny = tri.y.min() maxy = tri.y.max() corners = (minx, miny), (maxx, maxy) ax.update_datalim(corners) ax.autoscale_view() ax.add_collection(collection) return collection
def tripcolor(ax, *args, alpha=1.0, norm=None, cmap=None, vmin=None, vmax=None, shading='flat', facecolors=None, **kwargs): """ Create a pseudocolor plot of an unstructured triangular grid. The triangulation can be specified in one of two ways; either:: tripcolor(triangulation, ...) where triangulation is a `.Triangulation` object, or :: tripcolor(x, y, ...) tripcolor(x, y, triangles, ...) tripcolor(x, y, triangles=triangles, ...) tripcolor(x, y, mask=mask, ...) tripcolor(x, y, triangles, mask=mask, ...) in which case a Triangulation object will be created. See `.Triangulation` for a explanation of these possibilities. The next argument must be *C*, the array of color values, either one per point in the triangulation if color values are defined at points, or one per triangle in the triangulation if color values are defined at triangles. If there are the same number of points and triangles in the triangulation it is assumed that color values are defined at points; to force the use of color values at triangles use the kwarg ``facecolors=C`` instead of just ``C``. *shading* may be 'flat' (the default) or 'gouraud'. If *shading* is 'flat' and C values are defined at points, the color values used for each triangle are from the mean C of the triangle's three points. If *shading* is 'gouraud' then color values must be defined at points. The remaining kwargs are the same as for `~.Axes.pcolor`. """ _api.check_in_list(['flat', 'gouraud'], shading=shading) tri, args, kwargs = Triangulation.get_from_args_and_kwargs(*args, **kwargs) # C is the colors array defined at either points or faces (i.e. triangles). # If facecolors is None, C are defined at points. # If facecolors is not None, C are defined at faces. if facecolors is not None: C = facecolors else: C = np.asarray(args[0]) # If there are a different number of points and triangles in the # triangulation, can omit facecolors kwarg as it is obvious from # length of C whether it refers to points or faces. # Do not do this for gouraud shading. if (facecolors is None and len(C) == len(tri.triangles) and len(C) != len(tri.x) and shading != 'gouraud'): facecolors = C # Check length of C is OK. if ((facecolors is None and len(C) != len(tri.x)) or (facecolors is not None and len(C) != len(tri.triangles))): raise ValueError('Length of color values array must be the same ' 'as either the number of triangulation points ' 'or triangles') # Handling of linewidths, shading, edgecolors and antialiased as # in Axes.pcolor linewidths = (0.25, ) if 'linewidth' in kwargs: kwargs['linewidths'] = kwargs.pop('linewidth') kwargs.setdefault('linewidths', linewidths) edgecolors = 'none' if 'edgecolor' in kwargs: kwargs['edgecolors'] = kwargs.pop('edgecolor') ec = kwargs.setdefault('edgecolors', edgecolors) if 'antialiased' in kwargs: kwargs['antialiaseds'] = kwargs.pop('antialiased') if 'antialiaseds' not in kwargs and ec.lower() == "none": kwargs['antialiaseds'] = False if shading == 'gouraud': if facecolors is not None: raise ValueError('Gouraud shading does not support the use ' 'of facecolors kwarg') if len(C) != len(tri.x): raise ValueError('For gouraud shading, the length of color ' 'values array must be the same as the ' 'number of triangulation points') collection = TriMesh(tri, **kwargs) else: # Vertices of triangles. maskedTris = tri.get_masked_triangles() verts = np.stack((tri.x[maskedTris], tri.y[maskedTris]), axis=-1) # Color values. if facecolors is None: # One color per triangle, the mean of the 3 vertex color values. C = C[maskedTris].mean(axis=1) elif tri.mask is not None: # Remove color values of masked triangles. C = C[~tri.mask] collection = PolyCollection(verts, **kwargs) collection.set_alpha(alpha) collection.set_array(C) _api.check_isinstance((Normalize, None), norm=norm) collection.set_cmap(cmap) collection.set_norm(norm) collection._scale_norm(norm, vmin, vmax) ax.grid(False) minx = tri.x.min() maxx = tri.x.max() miny = tri.y.min() maxy = tri.y.max() corners = (minx, miny), (maxx, maxy) ax.update_datalim(corners) ax.autoscale_view() ax.add_collection(collection) return collection
def triplot(ax, *args, **kwargs): """ Draw a unstructured triangular grid as lines and/or markers. The triangulation to plot can be specified in one of two ways; either:: triplot(triangulation, ...) where triangulation is a :class:`matplotlib.tri.Triangulation` object, or :: triplot(x, y, ...) triplot(x, y, triangles, ...) triplot(x, y, triangles=triangles, ...) triplot(x, y, mask=mask, ...) triplot(x, y, triangles, mask=mask, ...) in which case a Triangulation object will be created. See :class:`~matplotlib.tri.Triangulation` for a explanation of these possibilities. The remaining args and kwargs are the same as for :meth:`~matplotlib.axes.Axes.plot`. Return a list of 2 :class:`~matplotlib.lines.Line2D` containing respectively: - the lines plotted for triangles edges - the markers plotted for triangles nodes """ import matplotlib.axes tri, args, kwargs = Triangulation.get_from_args_and_kwargs(*args, **kwargs) x, y, edges = (tri.x, tri.y, tri.edges) # Decode plot format string, e.g., 'ro-' fmt = "" if len(args) > 0: fmt = args[0] linestyle, marker, color = matplotlib.axes._base._process_plot_format(fmt) # Insert plot format string into a copy of kwargs (kwargs values prevail). kw = kwargs.copy() for key, val in zip(('linestyle', 'marker', 'color'), (linestyle, marker, color)): if val is not None: kw[key] = kwargs.get(key, val) # Draw lines without markers. # Note 1: If we drew markers here, most markers would be drawn more than # once as they belong to several edges. # Note 2: We insert nan values in the flattened edges arrays rather than # plotting directly (triang.x[edges].T, triang.y[edges].T) # as it considerably speeds-up code execution. linestyle = kw['linestyle'] kw_lines = kw.copy() kw_lines['marker'] = 'None' # No marker to draw. kw_lines['zorder'] = kw.get('zorder', 1) # Path default zorder is used. if (linestyle is not None) and (linestyle not in ['None', '', ' ']): tri_lines_x = np.insert(x[edges], 2, np.nan, axis=1) tri_lines_y = np.insert(y[edges], 2, np.nan, axis=1) tri_lines = ax.plot(tri_lines_x.ravel(), tri_lines_y.ravel(), **kw_lines) else: tri_lines = ax.plot([], [], **kw_lines) # Draw markers separately. marker = kw['marker'] kw_markers = kw.copy() kw_markers['linestyle'] = 'None' # No line to draw. if (marker is not None) and (marker not in ['None', '', ' ']): tri_markers = ax.plot(x, y, **kw_markers) else: tri_markers = ax.plot([], [], **kw_markers) return tri_lines + tri_markers
def triplot(ax, *args, **kwargs): """ Draw an unstructured triangular grid as lines and/or markers. Call signatures:: triplot(triangulation, ...) triplot(x, y, [triangles], *, [mask=mask], ...) The triangular grid can be specified either by passing a `.Triangulation` object as the first parameter, or by passing the points *x*, *y* and optionally the *triangles* and a *mask*. If neither of *triangulation* or *triangles* are given, the triangulation is calculated on the fly. Parameters ---------- triangulation : `.Triangulation` An already created triangular grid. x, y, triangles, mask Parameters defining the triangular grid. See `.Triangulation`. This is mutually exclusive with specifying *triangulation*. other_parameters All other args and kwargs are forwarded to `~.Axes.plot`. Returns ------- lines : `~matplotlib.lines.Line2D` The drawn triangles edges. markers : `~matplotlib.lines.Line2D` The drawn marker nodes. """ import matplotlib.axes tri, args, kwargs = Triangulation.get_from_args_and_kwargs(*args, **kwargs) x, y, edges = (tri.x, tri.y, tri.edges) # Decode plot format string, e.g., 'ro-' fmt = args[0] if args else "" linestyle, marker, color = matplotlib.axes._base._process_plot_format(fmt) # Insert plot format string into a copy of kwargs (kwargs values prevail). kw = cbook.normalize_kwargs(kwargs, mlines.Line2D) for key, val in zip(('linestyle', 'marker', 'color'), (linestyle, marker, color)): if val is not None: kw.setdefault(key, val) # Draw lines without markers. # Note 1: If we drew markers here, most markers would be drawn more than # once as they belong to several edges. # Note 2: We insert nan values in the flattened edges arrays rather than # plotting directly (triang.x[edges].T, triang.y[edges].T) # as it considerably speeds-up code execution. linestyle = kw['linestyle'] kw_lines = { **kw, 'marker': 'None', # No marker to draw. 'zorder': kw.get('zorder', 1), # Path default zorder is used. } if linestyle not in [None, 'None', '', ' ']: tri_lines_x = np.insert(x[edges], 2, np.nan, axis=1) tri_lines_y = np.insert(y[edges], 2, np.nan, axis=1) tri_lines = ax.plot(tri_lines_x.ravel(), tri_lines_y.ravel(), **kw_lines) else: tri_lines = ax.plot([], [], **kw_lines) # Draw markers separately. marker = kw['marker'] kw_markers = { **kw, 'linestyle': 'None', # No line to draw. } if marker not in [None, 'None', '', ' ']: tri_markers = ax.plot(x, y, **kw_markers) else: tri_markers = ax.plot([], [], **kw_markers) return tri_lines + tri_markers