riccardoscalco
3/2/2013 - 8:40 PM

Milla's version of horizons in python

Milla's version of horizons in python

import numpy as np
import matplotlib.pyplot as plt

def makeLayer(y, height):
    neg=0.0
    pos=0.0
    if y > 0:
        if y - height >= 0:
            pos = height
            y -= pos
        else:
            pos = y
    elif y < 0:
        if y + height <= 0:
            neg = height
            y += neg
        else:
            neg = -y
    return pos, neg

def horizonPlot(x, y, nfolds=3, negcolor='CornflowerBlue', poscolor='DarkGreen'):
    fig, ax = plt.subplots(figsize=(17,3), dpi=300)
    alpha = 1.0/nfolds
    vlayer = np.vectorize(makeLayer)
    height = np.ceil(np.abs(y).max()/nfolds)
    while (y != 0).any():

        layer = vlayer(y,height)
        y -= layer[0];
        y += layer[1]
        ax.fill_between(x, 0, layer[0], color=poscolor, alpha=alpha)
        ax.fill_between(x, height-layer[1], height, color=negcolor, alpha=alpha)

        ax.set_yticks([])
        ax.set_xlim([x.min(), x.max()])
        ax.set_ylim([0, height])

    return fig

if 1:
    x = np.linspace(0, np.pi*4, 137)
    y = (2*np.random.normal(size=137) + x**2)
    xx = np.hstack([-1*x[::-1], x])
    yy = np.hstack([-1*y[::-1], y])
    fig = horizonPlot(xx, yy, nfolds=3)