def showResult(self, val=None, ax=None, cMin=None, cMax=None, logScale=False, name='result', **kwargs): """show resulting velocity vector""" mesh = self.paraDomain() if val is None: val = self.velocity if cMin is None or cMax is None: cMin, cMax = interperc(val, 3) if ax is None: fig, ax = plt.subplots() self.figs[name] = fig ax, cbar = pg.show(mesh, val, logScale=logScale, axes=ax, colorBar=True, cMin=cMin, cMax=cMax, coverage=self.standardizedCoverage(), **kwargs) self.figs[name] = plt.gcf() else: gci = drawModel(ax, mesh, val, logScale=logScale, colorBar=True, cMin=cMin, cMax=cMax, coverage=self.standardizedCoverage(), **kwargs) labels = ['cMin', 'cMax', 'nLevs', 'orientation', 'label'] subkwargs = {key: kwargs[key] for key in labels if key in kwargs} cbar = createColorbar(gci, **subkwargs) browser = CellBrowser(self.mesh, val, ax) browser.connect() self.axs[name] = ax if 'lines' in kwargs: plotLines(ax, kwargs['lines']) return ax, cbar
def draw(ax, mesh, model, **kwargs): model = np.array(model) tol = 1e-3 # do not hide values that are very close (but below) zero if not np.isclose(model.min(), 0.0, atol=tol) and (model < 0).any(): model = np.ma.masked_where(model < -tol, model) if "coverage" in kwargs: model = np.ma.masked_where(kwargs["coverage"] == 0, model) gci = drawModel(ax, mesh, model, rasterized=True, nLevs=2, **kwargs) return gci
def showMesh(mesh, data=None, showLater=False, colorBar=False, axes=None, *args, **kwargs): """ Syntactic sugar, short-cut to create axes and plot node or cell values return axes, cbar Parameters ---------- """ ret = [] ax = axes if ax == None: fig = plt.figure() ax = fig.add_subplot(1,1,1) gci = None cbar = None validData = False if data is None: drawMesh(ax, mesh) else: #print(data[0], type(data[0])) if hasattr(data[0], '__len__') and type(data) != np.ma.core.MaskedArray: if sum(data[:,0]) != sum(data[:,1]): drawStreamLines2(ax, mesh, data, *args, **kwargs) else: print("No valid stream data:", data) drawMesh(ax, mesh) elif min(data) == max(data): print(("No valid data", min(data), max(data))) drawMesh(ax, mesh) else: validData = True if len(data) == mesh.cellCount(): gci = drawModel(ax, mesh, data, *args, **kwargs) elif len(data) == mesh.nodeCount(): gci = drawField(ax, mesh, data, *args, **kwargs) ax.set_aspect('equal') if colorBar and validData: cbar = createColorbar(gci, *args, **kwargs) if not showLater: plt.show() #fig.show() #fig.canvas.draw() return ax, cbar
def showResult(self, val=None, ax=None, cMin=None, cMax=None, logScale=False, name='result', **kwargs): """show resulting velocity vector""" mesh = self.paraDomain() if val is None: val = self.velocity if cMin is None or cMax is None: cMin, cMax = interperc(val, 3) if ax is None: fig, ax = plt.subplots() self.figs[name] = fig ax, cbar = pg.show(mesh, val, logScale=logScale, ax=ax, colorBar=True, cMin=cMin, cMax=cMax, coverage=self.standardizedCoverage(), **kwargs) self.figs[name] = plt.gcf() else: gci = drawModel(ax, mesh, val, logScale=logScale, colorBar=True, cMin=cMin, cMax=cMax, coverage=self.standardizedCoverage(), **kwargs) labels = ['cMin', 'cMax', 'nLevs', 'orientation', 'label'] subkwargs = {key: kwargs[key] for key in labels if key in kwargs} cbar = createColorbar(gci, **subkwargs) browser = CellBrowser(self.mesh, val, ax) browser.connect() self.axs[name] = ax if 'lines' in kwargs: plotLines(ax, kwargs['lines']) return ax, cbar
def showResult(self, ax=None, cMin=None, cMax=None, logScale=False, **kwargs): """show resulting velocity vector""" if cMin is None or cMax is None: cMin, cMax = interperc(self.velocity, 3) if ax is None: ax, cbar = pg.show(self.mesh, self.velocity, logScale=logScale, colorBar=True, cMin=cMin, cMax=cMax, **kwargs) self.figs['result'] = plt.gcf() else: gci = drawModel(ax, self.mesh, self.velocity, logScale=logScale, colorBar=True, cMin=cMin, cMax=cMax, **kwargs) createColorbar(gci, **kwargs) browser = CellBrowser(self.mesh, self.velocity, ax) browser.connect() self.axs['result'] = ax if 'lines' in kwargs: plotLines(ax, kwargs['lines'])
def showResult(self, ax=None, cMin=None, cMax=None, logScale=False, **kwargs): """show resulting velocity vector""" if cMin is None or cMax is None: cMin, cMax = interperc(self.velocity, 3) if ax is None: ax, cbar = pg.show( self.mesh, self.velocity, logScale=logScale, colorBar=True, cMin=cMin, cMax=cMax, **kwargs ) fig, ax = plt.subplots() self.figs["result"] = fig else: gci = drawModel( ax, self.mesh, self.velocity, logScale=logScale, colorBar=True, cMin=cMin, cMax=cMax, **kwargs ) cbar = createColorbar(gci, **kwargs) browser = CellBrowser(self.mesh, self.velocity, ax) browser.connect() plt.show() # block=False) self.axs["result"] = ax if "lines" in kwargs: plotLines(ax, kwargs["lines"])
destPos=outmesh.cellCenters(), outVec=outdata) return outdata ############################################################################### # Visualization # ------------- meshes = [coarse, fine] datasets = [coarse_data, fine_data] ints = [nearest_neighbor_interpolation, linear_interpolation] fig, axes = plt.subplots(2, 2, figsize=(5, 5)) # Coarse data to fine mesh drawModel(axes[0, 0], fine, ints[0](coarse, coarse_data, fine), showCbar=False) drawMesh(axes[0, 0], fine) drawModel(axes[0, 1], fine, ints[1](coarse, coarse_data, fine), showCbar=False) drawMesh(axes[0, 1], fine) # Fine data to coarse mesh drawModel(axes[1, 0], coarse, ints[0](fine, fine_data, coarse), showCbar=False) drawMesh(axes[1, 0], coarse) drawModel(axes[1, 1], coarse, ints[1](fine, fine_data, coarse), showCbar=False) drawMesh(axes[1, 1], coarse) titles = ["Coarse to fine\nwith nearest neighbors", "Coarse to fine\nwith linear interpolation", "Fine to coarse\nwith nearest neighbors", "Fine to coarse\nwith linear interpolation"]
def main( argv ): import argparse parser = argparse.ArgumentParser( description = "Create GIMLi parameter mesh for a given datafile" ) parser.add_argument("-v", "--verbose", dest = "verbose", action = "store_true" , help = "Be verbose.", default = False ) parser.add_argument("-o", "--output", dest = "outFileName" , help = "File name for the resulting mesh. Default is [datafile.bms]" , metavar = "File" ) parser.add_argument("-d", "--dimension", dest = "dimension" , help = "Dimension of the mesh to be created" , type = int , default = "2" ) parser.add_argument("--paraDX", dest = "paraDX" , help = "Horizontal distance between sensors, relative regarding sensor distance" , type = float , default = "1" ) parser.add_argument("--paraDepth", dest = "paraDepth" , help = "Maximum depth (absolute meter) for parametric domain, 0[default] means 0.4 * max sensor range" , type = float , default = "0" ) parser.add_argument("--grid", dest = "grid" , help = "Use a regular grid for parameter domain" , action = "store_true" , default = False ) parser.add_argument("--paraDZ", dest = "paraDZ" , help = "Vertical distance to the first depth layer, relative regarding sensor distance. For --grid only" , type = float , default = "1" ) parser.add_argument("--nLayers", dest = "nLayers" , help = "Number of depth layers [default = 11] For --grid only" , type = int , default = "11" ) parser.add_argument("--paraBoundary", dest = "paraBoundary" , help = "Boundary offset for parameter domain in absolute sensor distance 2[default]" , type = float , default = "2" ) parser.add_argument( "--show", dest = "show" , help = "Open a viewer window and show the mesh" , action = "store_true" , default = False ) parser.add_argument( 'dataFileName' ) options = parser.parse_args() # create default output filename if options.outFileName == None: options.outFileName = options.dataFileName.replace('.dat','') if options.verbose: print( options ) sensorPositions = pg.DataContainer( options.dataFileName ).sensorPositions() if options.verbose: print(( "Sensorcount = ", len( sensorPositions ) )) if options.dimension == 3: raise Exception swatch = pg.Stopwatch( True ) if options.dimension == 2: mesh = createParaMesh2dGrid( sensors = sensorPositions, paraDX = options.paraDX, paraDZ = options.paraDZ, paraDepth = options.paraDepth, nLayers = options.nLayers, boundary = -1, paraBoundary = options.paraBoundary, verbose = options.verbose, quality = 30.0, smooth = True) if options.verbose: print(( "generation takes ", swatch.duration(), " s" )) print( mesh ) print(( "writing " + options.outFileName + '.bms' )) mesh.save( options.outFileName ) if options.show: ax = showMesh( mesh, showLater = True ) drawModel( ax, mesh, mesh.cellMarker(), alpha = 0.2 ) xl = ax.get_xlim() yl = ax.get_ylim() dx = ( xl[1] - xl[0] ) * 0.01 dy = ( yl[1] - yl[0] ) * 0.01 ax.set_xlim( xl[ 0 ] - dx, xl[ 1 ] + dx ) ax.set_ylim( yl[ 0 ] - dy, yl[ 1 ] + dy ) drawSensors( ax, sensorPositions ) plt.show()
def showResult(self, val=None, ax=None, cMin=None, cMax=None, logScale=False, rays=False, name='result', **kwargs): """Show resulting velocity vector. Parameters ---------- val : result array [self.velocity] field to show, usually the velocity vector ax : matplotlib.axes axes to plot into, if not give a new one-axis figure is created cMin/cMax : float minimum and maximum values for ranging colorbar logScale : bool [False] use logarithmic scale rays : bool [False] Show ray paths as well. Other parameters ---------------- useCoverage : bool [True] use standardized (0 or 1) ray coverage as alpha-shading label : str label to write on colorbar orientaton : str color bar orientation nLevs : int [7] number of level values for color bar **kwargs : keyword arguments passed to the show function Returns ------- ax : maxplotlib axes cb : matplotlib color bar object """ mesh = self.paraDomain() if val is None: val = self.velocity if cMin is None or cMax is None: cMin, cMax = interperc(val, 3) coverage = 1 if kwargs.pop('useCoverage', True): coverage = self.standardizedCoverage() label = kwargs.pop("label", "Velocity (m/s)") if ax is None: fig, ax = plt.subplots() self.figs[name] = fig ax, cbar = pg.show(mesh, val, logScale=logScale, ax=ax, colorBar=True, cMin=cMin, cMax=cMax, coverage=coverage, label=label, hold=True, **kwargs) self.figs[name] = plt.gcf() else: gci = drawModel(ax, mesh, val, logScale=logScale, colorBar=True, cMin=cMin, cMax=cMax, coverage=coverage, **kwargs) labels = ['cMin', 'cMax', 'nLevs', 'orientation'] subkwargs = {key: kwargs[key] for key in labels if key in kwargs} cbar = createColorBar(gci, label=label, **subkwargs) if rays: self.showRayPaths(ax=ax, alpha=0.5, color="w", linewidths=.8) browser = CellBrowser(self.mesh, val, ax) browser.connect() self.axs[name] = ax if 'lines' in kwargs: plotLines(ax, kwargs['lines']) return ax, cbar
def test2d(): mesh = g.Mesh( 'mesh/world2d.bms' ) print mesh xMin = mesh.boundingBox( ).min()[0] yMax = mesh.boundingBox( ).max()[0] x = P.arange( xMin, yMax, 1. ); mesh.createNeighbourInfos() rho = g.RVector( len( mesh.cellAttributes() ), 1. ) * 2000.0 rho.setVal( 0.0, g.find( mesh.cellAttributes() == 1.0 ) ) swatch = g.Stopwatch( True ) pnts = [] spnts = g.stdVectorRVector3() for i in x: pnts.append( g.RVector3( i, 0.0001 ) ) spnts.append( g.RVector3( i, 0.0001 ) ) #gzC, GC = calcGCells( pnts, mesh, rho, 1 ) gzC = g.calcGCells( spnts , mesh, rho, 1 ) print "calcGCells", swatch.duration( True ) #gzB, GB = calcGBounds( pnts, mesh, rho ) gzB = g.calcGBounds( spnts , mesh, rho ) print "calcGBounds", swatch.duration( True ) gZ_Mesh = gzC ax1, ax2 = getaxes() # sphere analytical solution gAna = analyticalCircle2D( spnts, radius = 2.0, pos = g.RVector3( 0.0, -5.0 ), dDensity = 2000 ) gAna2 = analyticalCircle2D( spnts, radius = 2.0, pos = g.RVector3( 5.0, -5.0 ), dDensity = 2000 ) gAna = gAna + gAna2 ax1.plot( x, gAna, '-x', label= 'Analytisch' ) ax1.plot( x, gZ_Mesh, label= 'WonBevis1987-mesh' ) print gAna / gZ_Mesh #rho=GB[0]/mesh.cellSizes() gci = drawModel( ax2, mesh, rho ) drawSelectedMeshBoundaries( ax2, mesh.findBoundaryByMarker( 0 ) , color = ( 1.0, 1.0, 1.0, 1.0 ) , linewidth = 0.3 ) drawSelectedMeshBoundaries( ax2, mesh.findBoundaryByMarker( 1 ) , color = ( 1.0, 1.0, 1.0, 1.0 ) , linewidth = 0.3 ) # sphere polygone radius = 2. depth = 5. poly1 = g.stdVectorRVector3() poly2 = g.stdVectorRVector3() nSegment=124 for i in range( nSegment ): xp = np.sin( (i+1) * ( 2. * np.pi ) / nSegment ) yp = np.cos( (i+1) * ( 2. * np.pi ) / nSegment ) poly1.append( g.RVector3( xp * radius, yp * radius - depth ) ) poly2.append( g.RVector3( xp * radius + 5., yp * radius - depth ) ) gZ_Poly = calcPolydgdz( spnts, poly1, 2000 ) gZ_Poly += calcPolydgdz( spnts, poly2, 2000 ) ax1.plot( x, gZ_Poly, label= 'WonBevis1987-Poly' ) ax2.plot( g.x( poly1 ), g.y( poly1 ), color = 'red' ) ax2.plot( g.x( poly2 ), g.y( poly2 ), color = 'red' ) ax2.plot( g.x( spnts ), g.y( spnts ), marker = 'x', color = 'black' ) # test some special case for i, p in enumerate( poly1 ): poly1[i] = g.RVector3( poly1[i] - g.RVector3( 5.0, -6. ) ) ax2.plot( g.x( poly1 ), g.y( poly1 ), color = 'green' ) gz = calcPolydgdz( spnts, poly1, 2000 ) ax1.plot( x, gz, label= 'Special Case', color = 'green' ) ax1.set_ylabel( 'dg/dz [mGal]' ) ax2.set_ylabel( 'Tiefe [m]' ) ax1.legend() ax2.set_xlim( [ x[0], x[-1] ] ) ax2.grid()
def showMesh(mesh, data=None, hold=False, block=False, colorBar=False, coverage=None, axes=None, savefig=None, **kwargs): """ 2D Mesh visualization. Create an axes and plot node or cell values for the given 2d mesh. Returns the axes and the color bar. Parameters ---------- mesh : :gimliapi:`GIMLI::Mesh` 2D or 3D GIMLi mesh data : iterable [None] Optionally data to visualize. . None (draw mesh only) forward to :py:mod:`pygimli.mplviewer.meshview.drawMesh` . float per cell -- model, patch forward to :py:mod:`pygimli.mplviewer.meshview.drawModel` . float per node -- scalar field forward to :py:mod:`pygimli.mplviewer.meshview.drawField` . iterable of type [float, float] -- vector field forward to :py:mod:`pygimli.mplviewer.meshview.drawStreams` . pg.stdVectorRVector3 -- sensor positions forward to :py:mod:`pygimli.mplviewer.meshview.drawSensors` hold : bool [false] Set interactive plot mode for matplotlib. If this is set to false [default] your script will open a window with the figure and draw your content. If set to true nothing happens until you either force another show with hold=False, you call plt.show() or pg.wait(). If you want show with stopping your script set block = True. block : bool [false] Force show drawing your content and block the script until you close the current figure. colorBar : bool [false] Create and show a colorbar. coverage : iterable [None] Weight data by the given coverage array and fadeout the color. axes : matplotlib.Axes [None] Instead of create a new and empty axes, just draw into the a given. Useful to combine draws. savefig: string Filename for a direct save to disc. The matplotlib pdf-output is a little bit big so we try an epstopdf if the .eps suffix is found in savefig **kwargs : Will be forwarded to the draw functions and matplotlib methods, respectively. Returns ------- axes : matplotlib.axes colobar : matplotlib.colobar """ ax = axes if block: hold = 1 if hold: lastHoldStatus = pg.mplviewer.holdAxes_ pg.mplviewer.holdAxes_ = 1 if ax is None: fig, ax = plt.subplots() gci = None cbar = None validData = False if data is None: drawMesh(ax, mesh) elif isinstance(data, pg.stdVectorRVector3): drawSensors(ax, data) else: if hasattr(data[0], '__len__') and not isinstance(data, np.ma.core.MaskedArray): if len(data) == 2: # [u,v] data = np.array(data).T if sum(data[:, 0]) != sum(data[:, 1]): drawStreams(ax, mesh, data, **kwargs) else: print("No valid stream data:", data) drawMesh(ax, mesh) elif (min(data) == max(data)): # or pg.haveInfNaN(data): print("No valid data: ", min(data), max(data), pg.haveInfNaN(data)) drawMesh(ax, mesh) else: validData = True try: if len(data) == mesh.cellCount(): gci = drawModel(ax, mesh, data, **kwargs) elif len(data) == mesh.nodeCount(): gci = drawField(ax, mesh, data, **kwargs) except Exception as e: print("Exception occured: " + e) print("Data: ", min(data), max(data), pg.haveInfNaN(data)) print("Mesh: ", mesh) drawMesh(ax, mesh) ax.set_aspect('equal') label = kwargs.pop('label', None) if colorBar and validData: # , *args, **kwargs) # causes problems! cbar = createColorbar(gci, label=label, **kwargs) plt.tight_layout() if coverage is not None: if len(data) == mesh.cellCount(): addCoverageAlpha(gci, coverage) else: raise('toImplement') addCoverageAlpha(gci, pg.cellDataToPointData(mesh, coverage)) if showLater in kwargs: hold = showLater print("showLater will be removed in the future. use hold instead") if not hold or block is not False: plt.show(block=block) try: plt.pause(0.01) except: pass if hold: pg.mplviewer.holdAxes_ = lastHoldStatus if savefig: print('saving: ' + savefig + ' ...') ax.figure.savefig(savefig, bbox_inches='tight') if '.eps' in savefig: try: print("trying eps2pdf ... ") os.system('epstopdf ' + savefig) except: pass print('..done') return ax, cbar
def showMesh(mesh, data=None, hold=False, block=False, colorBar=None, label=None, coverage=None, ax=None, savefig=None, **kwargs): """2D Mesh visualization. Create an axis object and plot a 2D mesh with given node or cell data. Returns the axis and the color bar. The type of data determine the appropriate draw method. Parameters ---------- mesh : :gimliapi:`GIMLI::Mesh` 2D or 3D GIMLi mesh data : iterable [None] Optionally data to visualize. . None (draw mesh only) forward to :py:mod:`pygimli.mplviewer.drawMesh` or if no cells are given: forward to :py:mod:`pygimli.mplviewer.drawPLC` . float per cell -- model, patch forward to :py:mod:`pygimli.mplviewer.drawModel` . float per node -- scalar field forward to :py:mod:`pygimli.mplviewer.drawField` . iterable of type [float, float] -- vector field forward to :py:mod:`pygimli.mplviewer.drawStreams` . pg.stdVectorRVector3 -- sensor positions forward to :py:mod:`pygimli.mplviewer.drawSensors` hold : bool [false] Set interactive plot mode for matplotlib. If this is set to false [default] your script will open a window with the figure and draw your content. If set to true nothing happens until you either force another show with hold=False, you call plt.show() or pg.wait(). If you want show with stopping your script set block = True. block : bool [false] Force show drawing your content and block the script until you close the current figure. colorBar : bool [None], Colorbar Create and show a colorbar. If colorBar is a valid colorbar then only his values will be updated. label : str Set colorbar label. If set colorbar is toggled to True. [None] coverage : iterable [None] Weight data by the given coverage array and fadeout the color. ax : matplotlib.Axes [None] Instead of create a new and empty ax, just draw into the a given. Useful to combine draws. savefig: string Filename for a direct save to disc. The matplotlib pdf-output is a little bit big so we try an epstopdf if the .eps suffix is found in savefig **kwargs : * xlabel : str [None] Add label to the x axis * ylabel : str [None] Add label to the y axis * all remaining Will be forwarded to the draw functions and matplotlib methods, respectively. Returns ------- ax : matplotlib.ax colobar : matplotlib.colobar """ ax = ax if block: hold = 1 if hold: lastHoldStatus = pg.mplviewer.utils.holdAxes__ pg.mplviewer.hold(val=1) # print('1*'*50) # print(locale.localeconv()) if ax is None: ax = plt.subplots()[1] # plt.subplots() resets locale setting to system default .. this went # horrible wrong for german 'decimal_point': ',' pg.checkAndFixLocaleDecimal_point(verbose=False) # print('2*'*50) # print(locale.localeconv()) gci = None validData = False if data is None: drawMesh(ax, mesh, **kwargs) elif isinstance(data, pg.stdVectorRVector3): drawSensors(ax, data, **kwargs) else: # print(data, type(data)) if (hasattr(data[0], '__len__') and not isinstance(data, np.ma.core.MaskedArray)): if len(data) == 2: # [u,v] data = np.array(data).T if sum(data[:, 0]) != sum(data[:, 1]): drawStreams(ax, mesh, data, **kwargs) else: print("No valid stream data:", data) drawMesh(ax, mesh, **kwargs) elif min(data) == max(data): # or pg.haveInfNaN(data): print("No valid data: ", min(data), max(data), pg.haveInfNaN(data)) drawMesh(ax, mesh, **kwargs) else: validData = True try: if len(data) == mesh.cellCount(): gci = drawModel(ax, mesh, data, **kwargs) elif len(data) == mesh.nodeCount(): gci = drawField(ax, mesh, data, **kwargs) cmap = kwargs.pop('cmap', None) cMap = kwargs.pop('cMap', None) if cMap is not None: cmap = cMap if cmap is not None: gci.set_cmap(cmapFromName(cmap)) except BaseException as e: print("Exception occured: " + e) print("Data: ", min(data), max(data), pg.haveInfNaN(data)) print("Mesh: ", mesh) drawMesh(ax, mesh, **kwargs) ax.set_aspect('equal') cbar = None if label is not None and colorBar is None: colorBar = True if colorBar and validData: # , **kwargs) # causes problems! labels = ['cMin', 'cMax', 'nLevs', 'orientation', 'pad'] subkwargs = {key: kwargs[key] for key in labels if key in kwargs} if colorBar is True or colorBar is 1: cbar = createColorBar(gci, label=label, **subkwargs) elif colorBar is not False: cbar = updateColorBar(colorBar, gci, label=label, **subkwargs) if coverage is not None: if len(data) == mesh.cellCount(): addCoverageAlpha(gci, coverage) else: raise BaseException('toImplement') # addCoverageAlpha(gci, pg.cellDataToPointData(mesh, coverage)) if not hold or block is not False: if data is not None: if len(data) == mesh.cellCount(): cb = CellBrowser(mesh, data, ax=ax) cb.connect() plt.show(block=block) try: plt.pause(0.01) except BaseException as _: pass if hold: pg.mplviewer.hold(val=lastHoldStatus) if savefig: print('saving: ' + savefig + ' ...') if '.' not in savefig: savefig += '.pdf' ax.figure.savefig(savefig, bbox_inches='tight') # rc params savefig.format=pdf if '.eps' in savefig: try: print("trying eps2pdf ... ") os.system('epstopdf ' + savefig) except BaseException as _: pass print('..done') return ax, cbar
def showMesh(mesh, data=None, hold=False, block=False, colorBar=None, label=None, coverage=None, ax=None, savefig=None, showMesh=False, showBoundary=None, markers=False, **kwargs): """2D Mesh visualization. Create an axis object and plot a 2D mesh with given node or cell data. Returns the axis and the color bar. The type of data determines the appropriate draw method. Parameters ---------- mesh : :gimliapi:`GIMLI::Mesh` 2D or 3D GIMLi mesh data : iterable [None] Optionally data to visualize. . None (draw mesh only) forward to :py:mod:`pygimli.mplviewer.drawMesh` or if no cells are given: forward to :py:mod:`pygimli.mplviewer.drawPLC` . [[marker, value], ...] List of Cellvalues per cell marker forward to :py:mod:`pygimli.mplviewer.drawModel` . float per cell -- model, patch forward to :py:mod:`pygimli.mplviewer.drawModel` . float per node -- scalar field forward to :py:mod:`pygimli.mplviewer.drawField` . iterable of type [float, float] -- vector field forward to :py:mod:`pygimli.mplviewer.drawStreams` . pg.R3Vector -- vector field forward to :py:mod:`pygimli.mplviewer.drawStreams` . pg.stdVectorRVector3 -- sensor positions forward to :py:mod:`pygimli.mplviewer.drawSensors` hold : bool [false] Set interactive plot mode for matplotlib. If this is set to false [default] your script will open a window with the figure and draw your content. If set to true nothing happens until you either force another show with hold=False, you call plt.show() or pg.wait(). If you want show with stopping your script set block = True. block : bool [false] Force show drawing your content and block the script until you close the current figure. colorBar : bool [None], Colorbar Create and show a colorbar. If colorBar is a valid colorbar then only its values will be updated. label : str Set colorbar label. If set colorbar is toggled to True. [None] coverage : iterable [None] Weight data by the given coverage array and fadeout the color. ax : matplotlib.Axes [None] Instead of creating a new and empty ax, just draw into the given one. Useful to combine multiple plots into one figure. savefig: string Filename for a direct save to disc. The matplotlib pdf-output is a little bit big so we try an epstopdf if the .eps suffix is found in savefig showMesh : bool [False] Shows the mesh itself aditional. showBoundary : bool [None] Shows all boundary with marker != 0. A value None means automatic True for cell data and False for node data. marker : bool [False] Show mesh and boundary marker. **kwargs : * xlabel : str [None] Add label to the x axis * ylabel : str [None] Add label to the y axis * all remaining Will be forwarded to the draw functions and matplotlib methods, respectively. Examples -------- >>> import pygimli as pg >>> import pygimli.meshtools as mt >>> world = mt.createWorld(start=[-10, 0], end=[10, -10], ... layers=[-3, -7], worldMarker=False) >>> mesh = mt.createMesh(world, quality=32, area=0.2, smooth=[1, 10]) >>> _ = pg.viewer.showMesh(mesh, markers=True) Returns ------- ax : matplotlib.axes colobar : matplotlib.colorbar """ pg.renameKwarg('cmap', 'cMap', kwargs) if ax is None: ax = plt.subplots()[1] # print('1*'*50) # print(locale.localeconv()) # plt.subplots() resets locale setting to system default .. this went # horrible wrong for german 'decimal_point': ',' pg.checkAndFixLocaleDecimal_point(verbose=False) # print('2*'*50) # print(locale.localeconv()) if block: hold = True lastHoldStatus = pg.mplviewer.utils.holdAxes__ if not lastHoldStatus or hold: pg.mplviewer.hold(val=1) hold = True gci = None validData = False if markers: kwargs["boundaryMarker"] = True if mesh.cellCount() > 0: uniquemarkers, uniqueidx = np.unique( np.array(mesh.cellMarkers()), return_inverse=True) label = "Cell markers" kwargs["cMap"] = plt.cm.get_cmap("Set3", len(uniquemarkers)) kwargs["logScale"] = False kwargs["cMin"] = -0.5 kwargs["cMax"] = len(uniquemarkers) - 0.5 data = np.arange(len(uniquemarkers))[uniqueidx] if data is None: showMesh = True if showBoundary is None: showBoundary = True elif isinstance(data, pg.stdVectorRVector3): drawSensors(ax, data, **kwargs) elif isinstance(data, pg.R3Vector): drawStreams(ax, mesh, data, **kwargs) else: ### data=[[marker, val], ....] if isinstance(data, list) and \ isinstance(data[0], list) and isinstance(data[0][0], int): data = pg.solver.parseMapToCellArray(data, mesh) if hasattr(data[0], '__len__') and not \ isinstance(data, np.ma.core.MaskedArray): if len(data) == 2: # [u,v] x N data = np.array(data).T if data.shape[1] == 2: drawStreams(ax, mesh, data, **kwargs) elif data.shape[1] == 3: # probably N x [u,v,w] # if sum(data[:, 0]) != sum(data[:, 1]): # drawStreams(ax, mesh, data, **kwargs) drawStreams(ax, mesh, data[:, 0:2], **kwargs) else: pg.warn("No valid stream data:", data.shape, data.ndim) showMesh = True elif min(data) == max(data): # or pg.haveInfNaN(data): pg.warn("No valid data: ", min(data), max(data), pg.haveInfNaN(data)) showMesh = True else: validData = True try: cMap = kwargs.pop('cMap', None) if len(data) == mesh.cellCount(): gci = drawModel(ax, mesh, data, **kwargs) if showBoundary is None: showBoundary = True elif len(data) == mesh.nodeCount(): gci = drawField(ax, mesh, data, **kwargs) if cMap is not None: gci.set_cmap(cmapFromName(cMap)) #gci.cmap.set_under('k') except BaseException as e: print("Exception occured: ", e) print("Data: ", min(data), max(data), pg.haveInfNaN(data)) print("Mesh: ", mesh) drawMesh(ax, mesh, **kwargs) if mesh.cellCount() == 0: showMesh = False if mesh.boundaryCount() == 0: pg.mplviewer.drawPLC(ax, mesh, showNodes=True, fillRegion=False, showBoundary=False, **kwargs) showBoundary = False #ax.plot(pg.x(mesh), pg.y(mesh), '.', color='black') else: pg.mplviewer.drawPLC(ax, mesh, **kwargs) if showMesh: if gci is not None and hasattr(gci, 'set_antialiased'): gci.set_antialiased(True) gci.set_linewidth(0.3) gci.set_edgecolor("0.1") else: pg.mplviewer.drawSelectedMeshBoundaries(ax, mesh.boundaries(), color="0.1", linewidth=0.3) #drawMesh(ax, mesh, **kwargs) if showBoundary is True or showBoundary is 1: b = mesh.boundaries(mesh.boundaryMarkers() != 0) pg.mplviewer.drawSelectedMeshBoundaries(ax, b, color=(0.0, 0.0, 0.0, 1.0), linewidth=1.4) fitView = kwargs.pop('fitView', True) if fitView: ax.set_xlim(mesh.xmin(), mesh.xmax()) ax.set_ylim(mesh.ymin(), mesh.ymax()) ax.set_aspect('equal') cbar = None if label is not None and colorBar is None: colorBar = True if colorBar and validData: # , **kwargs) # causes problems! labels = ['cMin', 'cMax', 'nLevs', 'cMap', 'logScale'] subkwargs = {key: kwargs[key] for key in labels if key in kwargs} subkwargs['label'] = label if colorBar is True or colorBar is 1: cbar = createColorBar(gci, orientation=kwargs.pop('orientation', 'horizontal'), size=kwargs.pop('size', 0.2), pad=kwargs.pop('pad', None) ) updateColorBar(cbar, **subkwargs) elif colorBar is not False: cbar = updateColorBar(colorBar, **subkwargs) if markers: ticks = np.arange(len(uniquemarkers)) cbar.set_ticks(ticks) labels = [] for marker in uniquemarkers: labels.append(str((marker))) cbar.set_ticklabels(labels) if coverage is not None: if len(data) == mesh.cellCount(): addCoverageAlpha(gci, coverage) else: raise BaseException('toImplement') # addCoverageAlpha(gci, pg.cellDataToPointData(mesh, coverage)) if not hold or block is not False and plt.get_backend() is not "Agg": if data is not None: if len(data) == mesh.cellCount(): cb = CellBrowser(mesh, data, ax=ax) plt.show(block=block) try: plt.pause(0.01) except BaseException as _: pass if hold: pg.mplviewer.hold(val=lastHoldStatus) if savefig: print('saving: ' + savefig + ' ...') if '.' not in savefig: savefig += '.pdf' ax.figure.savefig(savefig, bbox_inches='tight') # rc params savefig.format=pdf if '.eps' in savefig: try: print("trying eps2pdf ... ") os.system('epstopdf ' + savefig) except BaseException: pass print('..done') return ax, cbar
def test2d(): mesh = pg.Mesh('mesh/world2d.bms') print(mesh) xMin = mesh.boundingBox().min()[0] yMax = mesh.boundingBox().max()[0] x = np.arange(xMin, yMax, 1.) mesh.createNeighbourInfos() rho = pg.RVector(len(mesh.cellAttributes()), 1.) * 2000.0 rho.setVal(0.0, pg.find(mesh.cellAttributes() == 1.0)) swatch = pg.Stopwatch(True) pnts = [] spnts = pg.stdVectorRVector3() for i in x: pnts.append(pg.RVector3(i, 0.0001)) spnts.append(pg.RVector3(i, 0.0001)) # gzC, GC = calcGCells(pnts, mesh, rho, 1) gzC = pg.calcGCells(spnts, mesh, rho, 1) print("calcGCells", swatch.duration(True)) # gzB, GB = calcGBounds(pnts, mesh, rho) # gzB = pg.calcGBounds(spnts, mesh, rho) # print("calcGBounds", swatch.duration(True)) gZ_Mesh = gzC ax1, ax2 = getaxes() # sphere analytical solution gAna = analyticalCircle2D(spnts, radius=2.0, pos=pg.RVector3(0.0, -5.0), dDensity=2000) gAna2 = analyticalCircle2D(spnts, radius=2.0, pos=pg.RVector3(5.0, -5.0), dDensity=2000) gAna = gAna + gAna2 ax1.plot(x, gAna, '-x', label='analytical') ax1.plot(x, gZ_Mesh, label='WonBevis1987-mesh') print(gAna / gZ_Mesh) # rho=GB[0]/mesh.cellSizes() drawModel(ax2, mesh, rho) for i in (0, 1): drawSelectedMeshBoundaries(ax2, mesh.findBoundaryByMarker(i), color=(1.0, 1.0, 1.0, 1.0), linewidth=0.3) # sphere polygone radius = 2. depth = 5. poly1 = pg.stdVectorRVector3() poly2 = pg.stdVectorRVector3() nSegment = 124 for i in range(nSegment): xp = np.sin((i + 1) * (2. * np.pi) / nSegment) yp = np.cos((i + 1) * (2. * np.pi) / nSegment) poly1.append(pg.RVector3(xp * radius, yp * radius - depth)) poly2.append(pg.RVector3(xp * radius + 5., yp * radius - depth)) gZ_Poly = calcPolydgdz(spnts, poly1, 2000) gZ_Poly += calcPolydgdz(spnts, poly2, 2000) ax1.plot(x, gZ_Poly, label='WonBevis1987-Poly') ax2.plot(pg.x(poly1), pg.y(poly1), color='red') ax2.plot(pg.x(poly2), pg.y(poly2), color='red') ax2.plot(pg.x(spnts), pg.y(spnts), marker='x', color='black') # test some special case for i, p in enumerate(poly1): poly1[i] = pg.RVector3(poly1[i] - pg.RVector3(5.0, -6.)) ax2.plot(pg.x(poly1), pg.y(poly1), color='green') gz = calcPolydgdz(spnts, poly1, 2000) ax1.plot(x, gz, label='Special Case', color='green') ax1.set_ylabel('dg/dz [mGal]') ax2.set_ylabel('Tiefe [m]') ax1.legend() ax2.set_xlim([x[0], x[-1]]) ax2.grid()
def showMesh(mesh, data=None, hold=False, block=False, colorBar=None, label=None, coverage=None, ax=None, savefig=None, showMesh=False, showBoundary=None, markers=False, **kwargs): """2D Mesh visualization. Create an axis object and plot a 2D mesh with given node or cell data. Returns the axis and the color bar. The type of data determine the appropriate draw method. Parameters ---------- mesh : :gimliapi:`GIMLI::Mesh` 2D or 3D GIMLi mesh data : iterable [None] Optionally data to visualize. . None (draw mesh only) forward to :py:mod:`pygimli.mplviewer.drawMesh` or if no cells are given: forward to :py:mod:`pygimli.mplviewer.drawPLC` . [[marker, value], ...] List of Cellvalues per cell marker forward to :py:mod:`pygimli.mplviewer.drawModel` . float per cell -- model, patch forward to :py:mod:`pygimli.mplviewer.drawModel` . float per node -- scalar field forward to :py:mod:`pygimli.mplviewer.drawField` . iterable of type [float, float] -- vector field forward to :py:mod:`pygimli.mplviewer.drawStreams` . pg.R3Vector -- vector field forward to :py:mod:`pygimli.mplviewer.drawStreams` . pg.stdVectorRVector3 -- sensor positions forward to :py:mod:`pygimli.mplviewer.drawSensors` hold : bool [false] Set interactive plot mode for matplotlib. If this is set to false [default] your script will open a window with the figure and draw your content. If set to true nothing happens until you either force another show with hold=False, you call plt.show() or pg.wait(). If you want show with stopping your script set block = True. block : bool [false] Force show drawing your content and block the script until you close the current figure. colorBar : bool [None], Colorbar Create and show a colorbar. If colorBar is a valid colorbar then only its values will be updated. label : str Set colorbar label. If set colorbar is toggled to True. [None] coverage : iterable [None] Weight data by the given coverage array and fadeout the color. ax : matplotlib.Axes [None] Instead of create a new and empty ax, just draw into the a given. Useful to combine draws. savefig: string Filename for a direct save to disc. The matplotlib pdf-output is a little bit big so we try an epstopdf if the .eps suffix is found in savefig showMesh : bool [False] Shows the mesh itself aditional. showBoundary : bool [None] Shows all boundary with marker != 0. A value None means automatic True for cell data and False for node data. marker : bool [False] Show mesh and boundary marker. **kwargs : * xlabel : str [None] Add label to the x axis * ylabel : str [None] Add label to the y axis * all remaining Will be forwarded to the draw functions and matplotlib methods, respectively. Examples -------- >>> import pygimli as pg >>> import pygimli.meshtools as mt >>> world = mt.createWorld(start=[-10, 0], end=[10, -10], ... layers=[-3, -7], worldMarker=False) >>> mesh = mt.createMesh(world, quality=32, area=0.2, smooth=[1, 10]) >>> _ = pg.viewer.showMesh(mesh, markers=True) Returns ------- ax : matplotlib.axes colobar : matplotlib.colorbar """ pg.renameKwarg('cmap', 'cMap', kwargs) if ax is None: ax = plt.subplots()[1] # print('1*'*50) # print(locale.localeconv()) # plt.subplots() resets locale setting to system default .. this went # horrible wrong for german 'decimal_point': ',' pg.checkAndFixLocaleDecimal_point(verbose=False) # print('2*'*50) # print(locale.localeconv()) if block: hold = True if hold: lastHoldStatus = pg.mplviewer.utils.holdAxes__ pg.mplviewer.hold(val=1) gci = None validData = False if markers: kwargs["boundaryMarker"] = True if mesh.cellCount() > 0: uniquemarkers, uniqueidx = np.unique(np.array(mesh.cellMarkers()), return_inverse=True) label = "Cell markers" kwargs["cMap"] = plt.cm.get_cmap("Set3", len(uniquemarkers)) kwargs["logScale"] = False kwargs["cMin"] = -0.5 kwargs["cMax"] = len(uniquemarkers) - 0.5 data = np.arange(len(uniquemarkers))[uniqueidx] if data is None: showMesh = True if showBoundary is None: showBoundary = True elif isinstance(data, pg.stdVectorRVector3): drawSensors(ax, data, **kwargs) elif isinstance(data, pg.R3Vector): drawStreams(ax, mesh, data, **kwargs) else: #print('-----------------------------') #print(data, type(data)) #print('-----------------------------') ### data=[[marker, val], ....] if isinstance(data, list) and \ isinstance(data[0], list) and isinstance(data[0][0], int): data = pg.solver.parseMapToCellArray(data, mesh) if hasattr(data[0], '__len__') and not \ isinstance(data, np.ma.core.MaskedArray): if len(data) == 2: # [u,v] x N data = np.array(data).T if data.shape[1] == 2: drawStreams(ax, mesh, data, **kwargs) elif data.shape[1] == 3: # probably N x [u,v,w] # if sum(data[:, 0]) != sum(data[:, 1]): # drawStreams(ax, mesh, data, **kwargs) drawStreams(ax, mesh, data[:, 0:2], **kwargs) else: pg.warn("No valid stream data:", data.shape, data.ndim) showMesh = True elif min(data) == max(data): # or pg.haveInfNaN(data): pg.warn("No valid data: ", min(data), max(data), pg.haveInfNaN(data)) showMesh = True else: validData = True try: if len(data) == mesh.cellCount(): gci = drawModel(ax, mesh, data, **kwargs) if showBoundary is None: showBoundary = True elif len(data) == mesh.nodeCount(): gci = drawField(ax, mesh, data, **kwargs) cMap = kwargs.pop('cMap', None) if cMap is not None: gci.set_cmap(cmapFromName(cMap)) except BaseException as e: print("Exception occured: ", e) print("Data: ", min(data), max(data), pg.haveInfNaN(data)) print("Mesh: ", mesh) drawMesh(ax, mesh, **kwargs) if mesh.cellCount() == 0: showMesh = False if mesh.boundaryCount() == 0: pg.mplviewer.drawPLC(ax, mesh, showNodes=True, fillRegion=False, showBoundary=False, **kwargs) showBoundary = False #ax.plot(pg.x(mesh), pg.y(mesh), '.', color='black') else: pg.mplviewer.drawPLC(ax, mesh, **kwargs) if showMesh: if gci is not None and hasattr(gci, 'set_antialiased'): gci.set_antialiased(True) gci.set_linewidth(0.3) gci.set_edgecolor("0.1") else: pg.mplviewer.drawSelectedMeshBoundaries(ax, mesh.boundaries(), color="0.1", linewidth=0.3) #drawMesh(ax, mesh, **kwargs) if showBoundary is True or showBoundary is 1: b = mesh.boundaries(mesh.boundaryMarkers() != 0) pg.mplviewer.drawSelectedMeshBoundaries(ax, b, color=(0.0, 0.0, 0.0, 1.0), linewidth=1.4) fitView = kwargs.pop('fitView', True) if fitView: ax.set_xlim(mesh.xmin(), mesh.xmax()) ax.set_ylim(mesh.ymin(), mesh.ymax()) ax.set_aspect('equal') cbar = None if label is not None and colorBar is None: colorBar = True if colorBar and validData: # , **kwargs) # causes problems! labels = ['cMin', 'cMax', 'nLevs', 'cMap', 'logScale'] subkwargs = {key: kwargs[key] for key in labels if key in kwargs} subkwargs['label'] = label if colorBar is True or colorBar is 1: cbar = createColorBar(gci, orientation=kwargs.pop( 'orientation', 'horizontal'), size=kwargs.pop('size', 0.2), pad=kwargs.pop('pad', None)) updateColorBar(cbar, **subkwargs) elif colorBar is not False: cbar = updateColorBar(colorBar, **subkwargs) if markers: ticks = np.arange(len(uniquemarkers)) cbar.set_ticks(ticks) labels = [] for marker in uniquemarkers: labels.append(str((marker))) cbar.set_ticklabels(labels) if coverage is not None: if len(data) == mesh.cellCount(): addCoverageAlpha(gci, coverage) else: raise BaseException('toImplement') # addCoverageAlpha(gci, pg.cellDataToPointData(mesh, coverage)) if not hold or block is not False and plt.get_backend() is not "Agg": if data is not None: if len(data) == mesh.cellCount(): cb = CellBrowser(mesh, data, ax=ax) plt.show(block=block) try: plt.pause(0.01) except BaseException as _: pass if hold: pg.mplviewer.hold(val=lastHoldStatus) if savefig: print('saving: ' + savefig + ' ...') if '.' not in savefig: savefig += '.pdf' ax.figure.savefig(savefig, bbox_inches='tight') # rc params savefig.format=pdf if '.eps' in savefig: try: print("trying eps2pdf ... ") os.system('epstopdf ' + savefig) except BaseException: pass print('..done') return ax, cbar
def test2d(): mesh = pg.Mesh("mesh/world2d.bms") print (mesh) xMin = mesh.boundingBox().min()[0] yMax = mesh.boundingBox().max()[0] x = np.arange(xMin, yMax, 1.0) mesh.createNeighbourInfos() rho = pg.RVector(len(mesh.cellAttributes()), 1.0) * 2000.0 rho.setVal(0.0, pg.find(mesh.cellAttributes() == 1.0)) swatch = pg.Stopwatch(True) pnts = [] spnts = pg.stdVectorRVector3() for i in x: pnts.append(pg.RVector3(i, 0.0001)) spnts.append(pg.RVector3(i, 0.0001)) # gzC, GC = calcGCells(pnts, mesh, rho, 1) gzC = pg.calcGCells(spnts, mesh, rho, 1) print ("calcGCells", swatch.duration(True)) # gzB, GB = calcGBounds(pnts, mesh, rho) # gzB = pg.calcGBounds(spnts, mesh, rho) # print("calcGBounds", swatch.duration(True)) gZ_Mesh = gzC ax1, ax2 = getaxes() # sphere analytical solution gAna = analyticalCircle2D(spnts, radius=2.0, pos=pg.RVector3(0.0, -5.0), dDensity=2000) gAna2 = analyticalCircle2D(spnts, radius=2.0, pos=pg.RVector3(5.0, -5.0), dDensity=2000) gAna = gAna + gAna2 ax1.plot(x, gAna, "-x", label="analytical") ax1.plot(x, gZ_Mesh, label="WonBevis1987-mesh") print (gAna / gZ_Mesh) # rho=GB[0]/mesh.cellSizes() drawModel(ax2, mesh, rho) for i in (0, 1): drawSelectedMeshBoundaries(ax2, mesh.findBoundaryByMarker(i), color=(1.0, 1.0, 1.0, 1.0), linewidth=0.3) # sphere polygone radius = 2.0 depth = 5.0 poly1 = pg.stdVectorRVector3() poly2 = pg.stdVectorRVector3() nSegment = 124 for i in range(nSegment): xp = np.sin((i + 1) * (2.0 * np.pi) / nSegment) yp = np.cos((i + 1) * (2.0 * np.pi) / nSegment) poly1.append(pg.RVector3(xp * radius, yp * radius - depth)) poly2.append(pg.RVector3(xp * radius + 5.0, yp * radius - depth)) gZ_Poly = calcPolydgdz(spnts, poly1, 2000) gZ_Poly += calcPolydgdz(spnts, poly2, 2000) ax1.plot(x, gZ_Poly, label="WonBevis1987-Poly") ax2.plot(pg.x(poly1), pg.y(poly1), color="red") ax2.plot(pg.x(poly2), pg.y(poly2), color="red") ax2.plot(pg.x(spnts), pg.y(spnts), marker="x", color="black") # test some special case for i, p in enumerate(poly1): poly1[i] = pg.RVector3(poly1[i] - pg.RVector3(5.0, -6.0)) ax2.plot(pg.x(poly1), pg.y(poly1), color="green") gz = calcPolydgdz(spnts, poly1, 2000) ax1.plot(x, gz, label="Special Case", color="green") ax1.set_ylabel("dg/dz [mGal]") ax2.set_ylabel("Tiefe [m]") ax1.legend() ax2.set_xlim([x[0], x[-1]]) ax2.grid()
pg.cellDataToPointData(inmesh, indata) return outdata ############################################################################### # Visualization # ------------- meshes = [coarse, fine] datasets = [coarse_data, fine_data] ints = [nearest_neighbor_interpolation, linear_interpolation] fig, ax = plt.subplots(2, 2, figsize=(5, 5)) # Coarse data to fine mesh drawModel(ax[0, 0], fine, ints[0](coarse, coarse_data, fine), showCbar=False) drawMesh(ax[0, 0], fine) drawModel(ax[0, 1], fine, ints[1](coarse, coarse_data, fine), showCbar=False) drawMesh(ax[0, 1], fine) # Fine data to coarse mesh drawModel(ax[1, 0], coarse, ints[0](fine, fine_data, coarse), showCbar=False) drawMesh(ax[1, 0], coarse) drawModel(ax[1, 1], coarse, ints[1](fine, fine_data, coarse), showCbar=False) drawMesh(ax[1, 1], coarse) titles = [ "Coarse to fine\nwith nearest neighbors", "Coarse to fine\nwith linear interpolation", "Fine to coarse\nwith nearest neighbors", "Fine to coarse\nwith linear interpolation"