Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
chaco / examples / demo / cursor_tool_demo.py
Size: Mime:
"""
Cursor tool

A cursor tool lets you drag vertical and horizontal lines whose intersection
defines one point on the plot.

Left-button drag to move the cursors round.

Right-drag to pan the plots. 'z'-key to Zoom

"""
# Major library imports
import numpy

# Enthought library imports
from chaco.api import (
    create_line_plot,
    OverlayPlotContainer,
    HPlotContainer,
    Plot,
    ArrayPlotData,
    viridis,
)
from chaco.tools.api import PanTool, ZoomTool
from chaco.tools.cursor_tool import CursorTool, BaseCursorTool
from enable.api import ComponentEditor
from traits.api import HasTraits, Instance, DelegatesTo
from traitsui.api import View, Item, HGroup, VGroup


class CursorTest(HasTraits):
    plot = Instance(HPlotContainer)
    cursor1 = Instance(BaseCursorTool)
    cursor2 = Instance(BaseCursorTool)

    cursor1pos = DelegatesTo("cursor1", prefix="current_position")
    cursor2pos = DelegatesTo("cursor2", prefix="current_position")

    def __init__(self):
        # The delegates views don't work unless we caller the superclass __init__
        super(CursorTest, self).__init__()

        container = HPlotContainer(padding=0, spacing=20)
        self.plot = container
        # a subcontainer for the first plot.
        # I'm not sure why this is required. Without it, the layout doesn't work right.
        subcontainer = OverlayPlotContainer(padding=40)
        container.add(subcontainer)

        # make some data
        index = numpy.linspace(-10, 10, 512)
        value = numpy.sin(index)

        # create a LinePlot instance and add it to the subcontainer
        line = create_line_plot(
            [index, value],
            add_grid=True,
            add_axis=True,
            index_sort="ascending",
            orientation="h",
        )
        subcontainer.add(line)

        # here's our first cursor.
        csr = CursorTool(line, drag_button="left", color="blue")
        self.cursor1 = csr
        # and set it's initial position (in data-space units)
        csr.current_position = 0.0, 0.0

        # this is a rendered component so it goes in the overlays list
        line.overlays.append(csr)

        # some other standard tools
        line.tools.append(PanTool(line, drag_button="right"))
        line.overlays.append(ZoomTool(line))

        # make some 2D data for a colourmap plot
        xy_range = (-5, 5)
        x = numpy.linspace(xy_range[0], xy_range[1], 100)
        y = numpy.linspace(xy_range[0], xy_range[1], 100)
        X, Y = numpy.meshgrid(x, y)
        Z = numpy.sin(X) * numpy.arctan2(Y, X)

        # easiest way to get a CMapImagePlot is to use the Plot class
        ds = ArrayPlotData()
        ds.set_data("img", Z)

        img = Plot(ds, padding=40)
        cmapImgPlot = img.img_plot(
            "img", xbounds=xy_range, ybounds=xy_range, colormap=viridis
        )[0]

        container.add(img)

        # now make another cursor
        csr2 = CursorTool(
            cmapImgPlot, drag_button="left", color="white", line_width=2.0
        )
        self.cursor2 = csr2

        csr2.current_position = 1.0, 1.5

        cmapImgPlot.overlays.append(csr2)

        # add some standard tools. Note, I'm assigning the PanTool to the
        # right mouse-button to avoid conflicting with the cursors
        cmapImgPlot.tools.append(PanTool(cmapImgPlot, drag_button="right"))
        cmapImgPlot.overlays.append(ZoomTool(cmapImgPlot))

    traits_view = View(
        VGroup(
            HGroup(
                Item(
                    "plot",
                    editor=ComponentEditor(),
                    resizable=True,
                    springy=True,
                    show_label=False,
                ),
                springy=True,
            ),
            HGroup(
                Item("cursor1pos", width=300), Item("cursor2pos", width=300)
            ),
        ),
        title="Cursor Tool Demo",
        resizable=True,
        width=800,
        height=420,
    )


# ===============================================================================
# # demo object that is used by the demo.py application.
# ===============================================================================
demo = CursorTest()

if __name__ == "__main__":
    demo.configure_traits()