Source code for profit.ui.hist_utils

import plotly.graph_objects as go
import numpy as np


[docs]def dens_hist(a, edges, outside): count, edges = np.histogram(a, edges) if outside[0]: count = np.append(len(a[a < edges[0]]), count) edges = np.append(edges[0] - (edges[1] - edges[0]), edges) if outside[1]: count = np.append(count, len(a[a > edges[-1]])) density = count * 100 / len(a) return density, edges
[docs]def format_hist(fig, bins, edges, density, title, outside, colors): fig.update_yaxes(autorange="reversed") fig.update_layout( title=dict( text="<b>{}</b>".format(title), x=0.5, y=0.97, xanchor="center", yanchor="top", ), titlefont=dict(size=30), autosize=False, width=380, height=400, xaxis=dict( linecolor="black", linewidth=2, mirror=True, showgrid=False, showticklabels=False, zeroline=False, domain=[0.15, 1], ), yaxis=dict( linecolor="black", linewidth=2, mirror=True, showgrid=False, showticklabels=False, zeroline=False, ), margin=dict(l=210, r=1, t=50, b=2), plot_bgcolor=colors[0], paper_bgcolor=colors[1], barmode="overlay", showlegend=False, ) annotations = [] scale = np.max(np.abs(edges)) if scale < 1e-2: fmt = "{:.2e}" elif scale < 1e-1: fmt = "{:.3f}" elif scale < 1e0: fmt = "{:.2f}" elif scale < 1e1: fmt = "{:.1f}" elif scale < 1e3: fmt = "{:.0f}" else: fmt = "{:.2e}" for k, xd in enumerate(density): yd = edges[k] if outside[0] and k == 0: label = "< {}".format(fmt).format(bins[0]) elif outside[1] and k == len(density) - 1: label = "> {}".format(fmt).format(bins[-1]) else: label = "{0} - {0}".format(fmt).format(edges[k], edges[k + 1]) annotations.append( dict( xref="paper", yref="y", x=-1.2, y=yd, xanchor="left", text="{}".format(label), font=dict(size=24), showarrow=False, align="left", ) ) # labeling the bar net worth annotations.append( dict( xref="paper", yref="y1", y=yd, x=0.14, xanchor="right", text="{:.1f}".format(xd) + "%", font=dict(size=24), showarrow=False, align="right", ) ) fig.update_layout(annotations=annotations)
[docs]def draw_hist(edges, density): fig = go.Figure( data=go.Bar( y=edges, x=density, orientation="h", marker=dict(color="black", line=dict(color="white", width=1)), ) ) return fig
[docs]def fig_hist( da, bins, title, condi=None, outside=(False, True), colors=("#8ecbad", "#b3ffd9") ): density, edges = dens_hist(da, bins, outside) if condi is None: fig = draw_hist(edges, density) else: density2, edges2 = dens_hist(da[condi], bins, outside) bar1 = go.Bar( y=edges2, x=density2, orientation="h", marker=dict(color="black", line=dict(color="black")), ) bar2 = go.Bar( y=edges, x=density, orientation="h", marker=dict(color="rgba(0,0,0,0)", line=dict(color="white", width=1)), ) fig = go.Figure(data=[bar1, bar2]) density = density2 edges = edges2 format_hist(fig, bins, edges, density, title, outside, colors) return fig
[docs]def add_border(fig): fig.add_shape( type="rect", xref="paper", yref="paper", x0=-0.325, y0=-0.125, x1=1.023, y1=1.16, line=dict( color="black", width=2, ), )