Source code for pesummary.core.plots.interactive

# Licensed under an MIT style license -- see LICENSE.md

import plotly.graph_objects as go
import plotly

__author__ = ["Charlie Hoy <charlie.hoy@ligo.org>"]


def write_to_html(fig, filename):
    """Write a plotly.graph.objects.go.Figure to a html file

    Parameters
    ----------
    fig: plotly.graph.objects.go.Figure object
        figure containing the plot that you wish to save to html
    filename: str
        name of the file that you wish to write the figure to
    """
    div = plotly.offline.plot(fig, include_plotlyjs=False, output_type='div')
    data = "<script src='https://cdn.plot.ly/plotly-latest.min.js'></script>\n"
    data += (
        "<script src='https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/"
        "MathJax.js?config=TeX-MML-AM_SVG'></script>"
    )
    with open(filename, "w") as f:
        data += div
        f.write(data)


def histogram2d(
    x, y, xlabel='x', ylabel='y', contour=False, contour_color='Blues',
    marker_color='rgba(248,148,6,1)', dimensions={'width': 900, 'height': 900},
    write_to_html_file="interactive_2d_histogram.html", showgrid=False,
    showlegend=False
):
    """Build an interactive 2d histogram plot

    Parameters
    ----------
    x: np.ndarray
        An array containing the x coordinates of the points to be histogrammed
    y: np.ndarray
        An array containing the y coordinates of the points to be histogrammed
    xlabel: str
        The label for the x coordinates
    ylabel: str
        The label for the y coordinates
    contour: Bool
        Whether or not to show contours on the scatter plot
    contour_color: str
        Name of the matplotlib palette to use for contour colors
    marker_color: str
        Color to use for the markers
    dimensions: dict
        A dictionary giving the width and height of the figure.
    write_to_html_file: str
        Name of the html file you wish to write the figure to
    showgrid: Bool
        Whether or not to show a grid on the plot
    showlegend: Bool
        Whether or not to add a legend to the plot
    """
    fig = go.Figure()
    if contour:
        fig.add_trace(
            go.Histogram2dContour(
                x=x, y=y, colorscale=contour_color, reversescale=True,
                xaxis='x', yaxis='y', histnorm="probability density"
            )
        )
    fig.add_trace(
        go.Scatter(
            x=x, y=y, xaxis='x', yaxis='y', mode='markers',
            marker=dict(color=marker_color, size=3)
        )
    )
    fig.add_trace(
        go.Histogram(
            y=y, xaxis='x2', marker=dict(color=marker_color),
            histnorm="probability density"
        )
    )
    fig.add_trace(
        go.Histogram(
            x=x, yaxis='y2', marker=dict(color=marker_color),
            histnorm="probability density"
        )
    )

    fig.update_layout(
        autosize=False,
        xaxis=dict(
            zeroline=False, domain=[0, 0.85], showgrid=showgrid
        ),
        yaxis=dict(
            zeroline=False, domain=[0, 0.85], showgrid=showgrid
        ),
        xaxis2=dict(
            zeroline=False, domain=[0.85, 1], showgrid=showgrid
        ),
        yaxis2=dict(
            zeroline=False, domain=[0.85, 1], showgrid=showgrid
        ),
        height=dimensions["height"],
        width=dimensions["width"],
        bargap=0,
        hovermode='closest',
        showlegend=showlegend,
        font=dict(
            size=10
        ),
        xaxis_title=xlabel,
        yaxis_title=ylabel,
    )
    if write_to_html_file is not None:
        write_to_html(fig, write_to_html_file)
        return
    return fig


[docs] def ridgeline( data, labels, xlabel='x', palette='colorblind', colors=None, width=3, write_to_html_file="interactive_ridgeline.html", showlegend=False, dimensions={'width': 1100, 'height': 700} ): """Build an interactive ridgeline plot Parameters ---------- data: list, np.ndarray The samples you wish to produce a ridgline plot for. This should be a 2 dimensional array where the zeroth axis is the list of samples and the next axis is are the dimensions of the space labels: list List of labels corresponding to each set of samples xlabel: str The label for the x coordinates palette: str Name of the seaborn colorpalette to use for the different posterior distributions colors: list List of colors to use for the different posterior distributions width: float Width of the violin plots write_to_html_file: str Name of the html file you wish to write the figure to showlegend: Bool Whether or not to add a legend to the plot dimensions: dict A dictionary giving the width and height of the figure """ fig = go.Figure() if colors is None: import seaborn colors = seaborn.color_palette( palette=palette, n_colors=len(data) ).as_hex() for dd, label, color in zip(data, labels, colors): fig.add_trace(go.Violin(x=dd, line_color=color, name=label)) fig.update_traces( orientation='h', side='positive', width=width, points=False ) fig.update_layout( xaxis_showgrid=False, xaxis_zeroline=False, xaxis_title=xlabel, width=dimensions["width"], height=dimensions["height"], font=dict(size=18), showlegend=showlegend ) if write_to_html_file is not None: write_to_html(fig, write_to_html_file) return return fig
[docs] def corner( data, labels, dimensions={'width': 900, 'height': 900}, show_diagonal=False, colors={'selected': 'rgba(248,148,6,1)', 'not_selected': 'rgba(0,0,0,1)'}, show_upper_half=False, write_to_html_file="interactive_corner.html" ): """Build an interactive corner plot Parameters ---------- data: list, np.ndarray The samples you wish to produce a corner plot for. This should be a 2 dimensional array where the zeroth axis is the list of samples and the next axis is are the dimensions of the space labels: list, np.ndarray A list of names for each dimension dimensions: dict A dictionary giving the width and height of the figure. show_diagonal: Bool Whether or not to show the diagonal scatter plots colors: dict A dictionary of colors for the individual samples. The dictionary should have keys 'selected' and 'not_selected' to indicate the colors to be used when the markers are selected and not selected respectively show_upper_half: Bool Whether or not to show the upper half of scatter plots write_to_html_file: str Name of the html file you wish to write the figure to """ data_structure = [ dict(label=label, values=value) for label, value in zip( labels, data ) ] fig = go.Figure( data=go.Splom( dimensions=data_structure, marker=dict( color=colors["not_selected"], showscale=False, line_color='white', line_width=0.5, size=3 ), selected=dict(marker=dict(color=colors["selected"])), diagonal_visible=show_diagonal, showupperhalf=show_upper_half, ) ) fig.update_layout( dragmode='select', width=dimensions["width"], height=dimensions["height"], hovermode='closest', font=dict( size=10 ) ) if write_to_html_file is not None: write_to_html(fig, write_to_html_file) return return fig