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 / basic / horizon_plot.py
Size: Mime:
"""
Implementation of a sample horizon plot, showing both negative and positive
values in the same banded region.
"""

# Major library imports
from numpy import cumprod, linspace, random
import time

# Enthought library imports
from enable.api import Component, ComponentEditor
from traits.api import HasTraits, Instance
from traitsui.api import Item, Group, View

# Chaco imports
from chaco.api import (
    ArrayDataSource,
    LinearMapper,
    DataRange1D,
    HPlotContainer,
    OverlayPlotContainer,
    PlotGrid,
    PlotAxis,
    FilledLinePlot,
    BandedMapper,
    HorizonPlot,
    ColorBar,
    RdBu as cmap,
)
from chaco.tools.api import PanTool

from chaco.scales.api import CalendarScaleSystem
from chaco.scales_tick_generator import ScalesTickGenerator


def create_dates(numpoints, units="days"):
    """Returns **numpoints** number of dates that evenly bracket the current
    date and time.  **units** should be one of "weeks", "days", "hours"
    "minutes", or "seconds".
    """
    units_map = {
        "weeks": 7 * 24 * 3600,
        "days": 24 * 3600,
        "hours": 3600,
        "minutes": 60,
        "seconds": 1,
    }
    now = time.time()
    dt = units_map[units]
    dates = linspace(now, now + numpoints * dt, numpoints)
    return dates


# ===============================================================================
# # Create the Chaco plot.
# ===============================================================================
def _create_plot_components():
    # Create the data and datasource objects
    # In order for the date axis to work, the index data points need to
    # be in units of seconds since the epoch.  This is because we are using
    # the CalendarScaleSystem, whose formatters interpret the numerical values
    # as seconds since the epoch.
    high = 1.0
    numpoints = 5000

    random.seed(1000)

    index = create_dates(numpoints)
    price = 100 * cumprod(random.lognormal(0.0, 0.04, size=numpoints))
    changes = price / price[0] - 1.0

    index_ds = ArrayDataSource(index)
    value_ds = ArrayDataSource(changes, sort_order="none")
    value_range = DataRange1D(value_ds, low=-high, high=high)

    index_mapper = LinearMapper(
        range=DataRange1D(index_ds), stretch_data=False
    )

    horizon = HorizonPlot(
        bands=4,
        index=index_ds,
        value=value_ds,
        index_mapper=index_mapper,
        value_mapper=BandedMapper(range=DataRange1D(low=0, high=high)),
        color_mapper=cmap(range=value_range),
    )
    horizon.tools.append(
        PanTool(horizon, constrain=True, constrain_direction="x")
    )
    axis = PlotAxis(
        mapper=horizon.value_mapper,
        component=horizon,
        orientation="left",
        tick_label_position="outside",
    )
    horizon.overlays.append(axis)

    bottom_axis = PlotAxis(
        horizon,
        orientation="bottom",
        tick_generator=ScalesTickGenerator(scale=CalendarScaleSystem()),
    )
    horizon.overlays.append(bottom_axis)

    filled = FilledLinePlot(
        index=index_ds,
        value=value_ds,
        index_mapper=index_mapper,
        value_mapper=LinearMapper(range=value_range, stretch_data=False),
        fill_color=(0.81960784, 0.89803922, 0.94117647),
        edge_color="transparent",
    )
    filled.tools.append(
        PanTool(filled, constrain=True, constrain_direction="x")
    )
    axis = PlotAxis(
        mapper=filled.value_mapper,
        component=filled,
        orientation="left",
        tick_label_position="outside",
    )
    filled.overlays.append(axis)

    grid = PlotGrid(
        mapper=filled.value_mapper,
        component=filled,
        orientation="horizontal",
        line_color="lightgray",
        line_style="dot",
    )
    filled.underlays.append(grid)

    colormap = horizon.color_mapper
    colorbar = ColorBar(
        index_mapper=LinearMapper(range=colormap.range),
        color_mapper=colormap,
        orientation="v",
        resizable="v",
        width=20,
        padding=20,
    )

    padding = (40, 20, 0, 0)
    over1 = HPlotContainer(
        use_backbuffer=True, padding=padding, padding_top=20
    )
    over1.add(filled)
    over1.add(colorbar)

    over2 = OverlayPlotContainer(padding=padding, padding_bottom=40)
    over2.add(horizon)

    return over1, over2


filled_size = (800, 220)
horizon_size = (800, 70)
title = "Horizon plot example"

# ===============================================================================
# # Demo class that is used by the demo.py application.
# ===============================================================================
class Demo(HasTraits):
    filled = Instance(Component)
    horizon = Instance(Component)

    traits_view = View(
        Group(
            Item(
                "filled",
                editor=ComponentEditor(size=filled_size),
                show_label=False,
            ),
            Item(
                "horizon",
                editor=ComponentEditor(size=horizon_size),
                show_label=False,
            ),
            orientation="vertical",
        ),
        resizable=False,
        title=title,
        width=filled_size[0],
        height=filled_size[1] + horizon_size[1],
    )


filled, horizon = _create_plot_components()
demo = Demo(horizon=horizon, filled=filled)


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