예제 #1
0
    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
예제 #3
0
파일: showmesh.py 프로젝트: wk1984/gimli
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
예제 #4
0
    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
예제 #5
0
    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'])
예제 #6
0
    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"]
예제 #8
0
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() 
예제 #9
0
    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
예제 #10
0
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()
예제 #11
0
파일: showmesh.py 프로젝트: zhangwise/gimli
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
예제 #12
0
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
예제 #13
0
파일: showmesh.py 프로젝트: gimli-org/gimli
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
예제 #14
0
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()
예제 #15
0
    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
예제 #16
0
파일: showmesh.py 프로젝트: SuperPYH/gimli
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
예제 #17
0
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()
예제 #18
0
              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"