diff --git a/meteoinfo-lab/milconfig.xml b/meteoinfo-lab/milconfig.xml index aa850b0e..899de5c1 100644 --- a/meteoinfo-lab/milconfig.xml +++ b/meteoinfo-lab/milconfig.xml @@ -1,21 +1,21 @@ - - - + - - + + + + @@ -24,6 +24,8 @@ + + @@ -31,6 +33,8 @@ + + diff --git a/meteoinfo-lab/pylib/mipylib/numeric/core/numeric$py.class b/meteoinfo-lab/pylib/mipylib/numeric/core/numeric$py.class index 8e9bea17..2206520e 100644 Binary files a/meteoinfo-lab/pylib/mipylib/numeric/core/numeric$py.class and b/meteoinfo-lab/pylib/mipylib/numeric/core/numeric$py.class differ diff --git a/meteoinfo-lab/pylib/mipylib/numeric/core/numeric.py b/meteoinfo-lab/pylib/mipylib/numeric/core/numeric.py index 89054307..98b3ad4d 100644 --- a/meteoinfo-lab/pylib/mipylib/numeric/core/numeric.py +++ b/meteoinfo-lab/pylib/mipylib/numeric/core/numeric.py @@ -3073,7 +3073,10 @@ def peaks(*args, **kwargs): :return: (*array*) Peaks function result array. """ n = len(args) - if n == 1: + if n == 0: + x = linspace(-3, 3, 49) + x, y = meshgrid(x, x) + elif n == 1: x = args[0] if isinstance(x, int): x = linspace(-3, 3, x) diff --git a/meteoinfo-lab/pylib/mipylib/plotlib/_axes3d$py.class b/meteoinfo-lab/pylib/mipylib/plotlib/_axes3d$py.class index f6df27f9..42162f28 100644 Binary files a/meteoinfo-lab/pylib/mipylib/plotlib/_axes3d$py.class and b/meteoinfo-lab/pylib/mipylib/plotlib/_axes3d$py.class differ diff --git a/meteoinfo-lab/pylib/mipylib/plotlib/_axes3d.py b/meteoinfo-lab/pylib/mipylib/plotlib/_axes3d.py index 7b0361e5..54d34e90 100644 --- a/meteoinfo-lab/pylib/mipylib/plotlib/_axes3d.py +++ b/meteoinfo-lab/pylib/mipylib/plotlib/_axes3d.py @@ -1413,7 +1413,7 @@ class Axes3D(Axes): :param x: (*array_like*) Optional. X coordinate array. :param y: (*array_like*) Optional. Y coordinate array. :param z: (*array_like*) 2-D or 3-D (RGB) z value array. - :param levs: (*array_like*) Optional. A list of floating point numbers indicating the level curves + :param levels: (*array_like*) Optional. A list of floating point numbers indicating the level curves to draw, in increasing order. :param cmap: (*string*) Color map string. :param colors: (*list*) If None (default), the colormap specified by cmap will be used. If a diff --git a/meteoinfo-lab/pylib/mipylib/plotlib/_axes3dgl$py.class b/meteoinfo-lab/pylib/mipylib/plotlib/_axes3dgl$py.class index deb9579f..ffc2eb52 100644 Binary files a/meteoinfo-lab/pylib/mipylib/plotlib/_axes3dgl$py.class and b/meteoinfo-lab/pylib/mipylib/plotlib/_axes3dgl$py.class differ diff --git a/meteoinfo-lab/pylib/mipylib/plotlib/_axes3dgl.py b/meteoinfo-lab/pylib/mipylib/plotlib/_axes3dgl.py index 68d96074..0014c78d 100644 --- a/meteoinfo-lab/pylib/mipylib/plotlib/_axes3dgl.py +++ b/meteoinfo-lab/pylib/mipylib/plotlib/_axes3dgl.py @@ -165,6 +165,40 @@ class Axes3DGL(Axes3D): """ self._axes.setAngleX(elevation) + def view(self, *args): + """ + Set camera line of sight. + + view(az, el) + + view(dim) + + :param az: (*float*) Azimuth angle. + :param el: (*float*) Elevation angle. + :param dim: (*int*) Uses the default line of sight for 2-D or 3-D plots. Specify dim as 2 + for the default 2-D view or 3 for the default 3-D view. + + :return: Current azimuth and elevation angle. + """ + if len(args) == 1: + dim = args[0] + if dim == 2: + self.set_rotation(0) + self.set_elevation(0) + elif dim == 3: + self.set_rotation(45) + self.set_elevation(-45) + elif len(args) == 2: + az = args[0] + el = args[1] + self.set_rotation(-az) + self.set_elevation(el - 90) + + az = -self.get_rotation() + el = self.get_elevation() + 90 + + return az, el + def get_head(self): """ Get head angle. @@ -527,10 +561,13 @@ class Axes3DGL(Axes3D): if len(args) < 4: u = args[0] v = args[1] - u = np.asarray(u) - nz, ny, nx = u.shape - x = np.arange(nx) - y = np.arange(ny) + if isinstance(u, DimArray): + y = u.dimvalue(0) + x = u.dimvalue(1) + else: + ny, nx = u.shape + x = np.arange(nx) + y = np.arange(ny) args = args[2:] else: x = args[0] @@ -542,6 +579,12 @@ class Axes3DGL(Axes3D): cdata = args[0] iscolor = True args = args[1:] + + if x.ndim == 2: + x = x[0] + if y.ndim == 2: + y = y[:,0] + x = plotutil.getplotdata(x) y = plotutil.getplotdata(y) u = plotutil.getplotdata(u) @@ -765,9 +808,11 @@ class Axes3DGL(Axes3D): if iscolor: if len(args) > 0: cn = args[0] + if isinstance(cn, NDArray): + cn = cn.aslist() ls = LegendManage.createLegendScheme(cdata.min(), cdata.max(), cn, cmap) else: - levs = kwargs.pop('levs', None) + levs = kwargs.pop('levels', None) if levs is None: ls = LegendManage.createLegendScheme(cdata.min(), cdata.max(), cmap) else: @@ -1822,7 +1867,7 @@ class Axes3DGL(Axes3D): self.add_graphic(graphics) return graphics - def view(self): + def view_form(self): """ Open GLForm """ diff --git a/meteoinfo-lab/pylib/mipylib/plotlib/miplot$py.class b/meteoinfo-lab/pylib/mipylib/plotlib/miplot$py.class index 12565cb9..2c443c08 100644 Binary files a/meteoinfo-lab/pylib/mipylib/plotlib/miplot$py.class and b/meteoinfo-lab/pylib/mipylib/plotlib/miplot$py.class differ diff --git a/meteoinfo-lab/pylib/mipylib/plotlib/miplot.py b/meteoinfo-lab/pylib/mipylib/plotlib/miplot.py index 2ae0164d..0c44404e 100644 --- a/meteoinfo-lab/pylib/mipylib/plotlib/miplot.py +++ b/meteoinfo-lab/pylib/mipylib/plotlib/miplot.py @@ -52,7 +52,7 @@ __all__ = [ 'right_title', 'refresh', 'savefig', 'savefig_jpeg', 'scatter', 'scatter3', 'scatterm', 'semilogx', 'semilogy', 'show', 'slice3', 'stationmodel', 'stem', 'stem3', 'step', 'streamplot', 'streamplot3', 'streamplotm', 'streamslice', 'subplot', 'subplots', 'suptitle', 'supxlabel', 'supylabel', 'surf', - 'surfc', 'taylor_diagram', 'text', 'text3', 'title', 'trisurf', 'twinx', 'twiny', 'violinplot', + 'surfc', 'taylor_diagram', 'text', 'text3', 'title', 'trisurf', 'twinx', 'twiny', 'view', 'violinplot', 'volumeplot', 'weatherspec', 'xaxis', 'xlabel', 'xlim', 'xreverse', 'xticks', 'yaxis', 'ylabel', 'ylim', 'yreverse', 'yticks', 'zaxis', 'zlabel', 'zlim', 'zticks', 'isinteractive' ] @@ -1981,6 +1981,20 @@ def material(mvalues): draw_if_interactive() +@_copy_docstring_and_deprecators(Axes3DGL.view) +def view(*args): + global g_axes + if g_axes is None: + g_axes = axes3d() + else: + if not isinstance(g_axes, Axes3DGL): + g_axes = axes3dgl() + + r = g_axes.view(*args) + draw_if_interactive() + return r + + @_copy_docstring_and_deprecators(Axes3D.mesh) def mesh(*args, **kwargs): global g_axes