Source code for tecplot.plot.scatter

from builtins import str, super

from ..constant import *
from ..exception import *
from ..tecutil import sv
from .. import legend, session, tecutil, text
from . import labels, symbol


class PieChartsWedge(session.Style):
    """Individual wedge style control for pie charts.

    .. seealso:: `PieCharts`
    """
    def __init__(self, pie_charts, index):
        self.pie_charts = pie_charts
        self.index = tecutil.Index(index)
        self.plot = pie_charts.scatter.plot
        super().__init__(pie_charts._sv, sv.WEDGE, offset1=self.index,
                         **pie_charts._kw)

    @property
    def show(self):
        """`bool`

        .. note::

            At least one fieldmap must have scatter symbol shape set
            to `GeomShape.PieChart` before setting the show property
            of the wedges to `True`::

                from tecplot.constant import GeomShape
                plot.fieldmap(0).scatter.symbol().shape = GeomShape.PieChart
                plot.scatter.pie_charts.wedge(0).show = True
        """
        return self._get_style(bool, sv.INCLUDE)

    @show.setter
    def show(self, value):
        self._set_style(bool(value), sv.INCLUDE)

    @property
    def show_label(self):
        """`bool`"""
        return self._get_style(bool, sv.SHOWLABEL)

    @show_label.setter
    def show_label(self, value):
        self._set_style(bool(value), sv.SHOWLABEL)

    @property
    def label_text(self):
        """`str`"""
        return self._get_style(str, sv.LABELTEXT)

    @label_text.setter
    def label_text(self, value):
        self._set_style(str(value), sv.LABELTEXT)

    @property
    def color(self):
        """`Color`"""
        return self._get_style(Color, sv.COLOR)

    @color.setter
    def color(self, value):
        self._set_style(Color(value), sv.COLOR)

    @property
    def variable_index(self):
        """`Index`"""
        return self._get_style(tecutil.Index, sv.VAR)

    @variable_index.setter
    def variable_index(self, value):
        self._set_style(tecutil.Index(value), sv.VAR)

    @property
    def variable(self):
        """`Variable`"""
        return self.plot.frame.dataset.variable(self.variable_index)

    @variable.setter
    def variable(self, variable):
        self.variable_index = variable.index


class PieCharts(session.Style):
    """Pie charts displayed at each scatter point.

    .. code-block:: python
        :emphasize-lines: 46-59

        import os
        import numpy as np

        import tecplot as tp
        from tecplot.constant import *


        def normalize_variable(dataset, varname, nsigma=2):
            '''
            Normalize a variable such that the specified number of standard deviations
            are within the range [0.5, 1] and the mean is transformed to 0.5. The
            new variable will append " normalized" to the original variable's name.
            '''
            with tp.session.suspend():
                newvarname = varname + ' normalized'
                dataset.add_variable(newvarname)
                data = np.concatenate([z.values(varname).as_numpy_array()
                                       for z in dataset.zones()])
                vmin = data.mean() - nsigma * data.std()
                vmax = data.mean() + nsigma * data.std()
                for z in dataset.zones():
                    arr = z.values(varname).as_numpy_array()
                    z.values(newvarname)[:] = (arr - vmin) / (vmax - vmin)


        examples_dir = tp.session.tecplot_examples_directory()
        infile = os.path.join(examples_dir, 'SimpleData', 'HeatExchanger.plt')
        dataset = tp.data.load_tecplot(infile)

        frame = tp.active_frame()
        plot = frame.plot(PlotType.Cartesian2D)
        plot.show_scatter = True

        plot.axes.x_axis.min = 6
        plot.axes.x_axis.max = 8
        plot.axes.y_axis.min = 1.5
        plot.axes.y_axis.max = 3.0

        # Normalize variables to the range [0, 1]
        normalize_variable(dataset, 'T(K)')
        normalize_variable(dataset, 'P(N)')

        frame.add_text(r'Normalized Temperature in Red', (50, 95), color=Color.Red)
        frame.add_text(r'Normalized Pressure in Blue', (50, 92), color=Color.Blue)

        fmaps = plot.fieldmaps()
        fmaps.scatter.symbol().shape = GeomShape.PieChart
        fmaps.scatter.size = 4.0

        pie_charts = plot.scatter.pie_charts
        pie_charts.wedge(0).show = True
        pie_charts.wedge(0).show_label = False
        pie_charts.wedge(0).variable = dataset.variable('T(K) normalized')
        pie_charts.wedge(0).color = Color.Red

        pie_charts.wedge(1).show = True
        pie_charts.wedge(1).show_label = False
        pie_charts.wedge(1).variable = dataset.variable('P(N) normalized')
        pie_charts.wedge(1).color = Color.Blue

        tp.export.save_png('pie_charts.png')

    .. figure:: /_static/images/pie_charts.png
        :width: 300px
        :figwidth: 300px
    """
    def __init__(self, scatter):
        self.scatter = scatter
        super().__init__(scatter._sv, sv.PIECHARTS, **scatter._kw)

    @property
    def label_offset(self):
        """`float`"""
        return self._get_style(float, sv.LABELOFFSET)

    @label_offset.setter
    def label_offset(self, value):
        self._set_style(float(value), sv.LABELOFFSET)

    @property
    def label_text(self):
        """`str`"""
        return self._get_style(str, sv.LABELTEXT)

    @label_text.setter
    def label_text(self, value):
        self._set_style(str(value), sv.LABELTEXT)

    @property
    def label_color(self):
        """`Color`"""
        return self._get_style(Color, sv.LABELTEXTCOLOR)

    @label_color.setter
    def label_color(self, value):
        self._set_style(Color(value), sv.LABELTEXTCOLOR)

    @property
    def label_font(self):
        """`text.Font`"""
        return text.Font(self, sv.LABELTEXTSHAPE)

    @property
    def show_zero_value_wedge_labels(self):
        """`bool`"""
        return self._get_style(bool, sv.SHOWLABELFORZEROVALUEWEDGES)

    @show_zero_value_wedge_labels.setter
    def show_zero_value_wedge_labels(self, value):
        self._set_style(bool(value), sv.SHOWLABELFORZEROVALUEWEDGES)

    @property
    def start_angle(self):
        """`float`"""
        return self._get_style(float, sv.STARTANGLE)

    @start_angle.setter
    def start_angle(self, value):
        self._set_style(float(value), sv.STARTANGLE)

    def wedge(self, index):
        """`PieChartsWedge`"""
        return PieChartsWedge(self, index)


[docs]class Scatter(session.Style): """Plot-local scatter style settings. This class controls the style of drawn scatter points on a specific plot. .. code-block:: python :emphasize-lines: 15 from os import path import tecplot as tp from tecplot.constant import * examples_dir = tp.session.tecplot_examples_directory() infile = path.join(examples_dir, 'SimpleData', 'HeatExchanger.plt') dataset = tp.data.load_tecplot(infile) frame = tp.active_frame() frame.plot_type = PlotType.Cartesian2D plot = frame.plot() plot.contour(0).variable = dataset.variable('T(K)') plot.show_scatter = True plot.scatter.variable = dataset.variable('P(N)') for z in dataset.zones(): scatter = plot.fieldmap(z).scatter scatter.symbol_type = SymbolType.Geometry scatter.symbol().shape = GeomShape.Circle scatter.fill_mode = FillMode.UseSpecificColor scatter.fill_color = plot.contour(0) scatter.color = plot.contour(0) scatter.size_by_variable = True frame.add_text('Size of dots indicate relative pressure', (20, 80)) # ensure consistent output between interactive (connected) and batch plot.contour(0).levels.reset_to_nice() tp.export.save_png('scatter.png') .. figure:: /_static/images/scatter.png :width: 300px :figwidth: 300px """ def __init__(self, plot): self.plot = plot super().__init__(sv.GLOBALSCATTER, uniqueid=self.plot.frame.uid) @property def base_font(self): """`BaseFont`: Default typeface to use for text scatter symbols. Example usage:: >>> plot.scatter.base_font.typeface = 'Times' """ return text.BaseFont(*self._sv, **self._kw) @property def legend(self): """`ScatterLegend`: Scatter symbol legend. Example usage:: >>> plot.scatter.legend.show = True """ return legend.ScatterLegend(self) @property def pie_charts(self): return PieCharts(self) @property def reference_symbol(self): """`ScatterReferenceSymbol`: Reference symbol for scatter plots. The reference scatter symbol is only shown when the scatter symbols are sized by a `Variable` in the `Dataset <data.Dataset>`. Example:: >>> plot.fieldmap(0).scatter.size_by_variable = True >>> plot.scatter.variable = dataset.variable('s') >>> plot.scatter.reference_symbol.show = True """ return symbol.ScatterReferenceSymbol(self) @property def relative_size(self): """`float`: Relative size of the reference symbol. Relative size will be in ``cm`` when units are set to `RelativeSizeUnits.Page`. Example usage:: >>> plot.scatter.relative_size = 20 """ return self._get_style(float, sv.RELATIVESIZE) @relative_size.setter def relative_size(self, value): self._set_style(float(value), sv.RELATIVESIZE) @property def relative_size_units(self): """`RelativeSizeUnits`: Use grid or page units for relative size. Relative size will be in ``cm`` when units are set to `RelativeSizeUnits.Page`. Example usage:: >>> from tecplot.constant import RelativeSizeUnits >>> plot.scatter.relative_size_units = RelativeSizeUnits.Grid >>> plot.scatter.relative_size = 2.0 """ if self._get_style(bool, sv.RELATIVESIZEINGRIDUNITS): return RelativeSizeUnits.Grid else: return RelativeSizeUnits.Page @relative_size_units.setter def relative_size_units(self, value): value = RelativeSizeUnits(value) == RelativeSizeUnits.Grid self._set_style(value, sv.RELATIVESIZEINGRIDUNITS) @property def sphere_render_quality(self): """`SphereScatterRenderQuality`: render quality of spheres Example usage:: >>> from tecplot.constant import * >>> plot.fieldmap(0).scatter.symbol().shape = GeomShape.Sphere >>> scatter = plot.scatter >>> scatter.sphere_render_quality = SphereScatterRenderQuality.Low """ return self._get_style(SphereScatterRenderQuality, sv.SPHERESCATTERRENDERQUALITY) @sphere_render_quality.setter def sphere_render_quality(self, value): self._set_style(SphereScatterRenderQuality(value), sv.SPHERESCATTERRENDERQUALITY) @property def variable_index(self): """Zero-based index of the `Variable` used for size of scatter symbols. .. code-block:: python >>> plot.scatter.variable_index = dataset.variable('P').index >>> plot.fieldmap(0).scatter.size_by_variable = True The `Dataset <data.Dataset>` attached to this contour group's `Frame <layout.Frame>` is used, and the variable itself can be obtained through it:: >>> scatter = plot.scatter >>> scatter_var = dataset.variable(scatter.variable_index) >>> scatter_var.index == scatter.variable_index True """ return self._get_style(tecutil.Index, sv.VAR) @variable_index.setter def variable_index(self, index): self._set_style(tecutil.Index(index), sv.VAR) @property def variable(self): """The `Variable` to be used when sizing scatter symbols. The variable must belong to the `Dataset <data.Dataset>` attached to the `Frame <layout.Frame>` that holds this `ContourGroup`. Example usage:: >>> plot.scatter.variable = dataset.variable('P') >>> plot.fieldmap(0).scatter.size_by_variable = True """ return self.plot.frame.dataset.variable(self.variable_index) @variable.setter def variable(self, variable): self.variable_index = variable.index