Ejemplo n.º 1
0
def create_pie_chart(dataframe, title, palette):

    radio_tarta = 0.4

    df_pie_plot = dataframe.groupby("origen").size().sort_values(
        ascending=False).reset_index()
    df_pie_plot.columns = ["origen", "conteo"]

    df_pie_plot["porcentaje"] = df_pie_plot["conteo"] / df_pie_plot[
        "conteo"].sum() * 100
    df_pie_plot["porcentaje"] = df_pie_plot["porcentaje"].apply(
        lambda x: "{0:.2f}%".format(x))
    df_pie_plot["porcentaje_texto"] = df_pie_plot[
        "origen"] + "\n" + df_pie_plot["porcentaje"]

    df_pie_plot["angulo"] = df_pie_plot["conteo"] / df_pie_plot["conteo"].sum(
    ) * 2 * np.pi
    df_pie_plot["angulo_acumulado"] = df_pie_plot["angulo"].cumsum()
    df_pie_plot["angulo_bisectriz"] = df_pie_plot[
        "angulo_acumulado"] - df_pie_plot["angulo"] / 2.0
    df_pie_plot["posicion_x_texto"] = radio_tarta * 0.7 * np.cos(
        df_pie_plot["angulo_bisectriz"])
    df_pie_plot["posicion_y_texto"] = radio_tarta * 0.7 * np.sin(
        df_pie_plot["angulo_bisectriz"])

    df_pie_plot["color"] = palette[:len(df_pie_plot)]

    df_pie_plot_source = ColumnDataSource(data=df_pie_plot)

    pie_plot_bokeh = Figure(title=title,
                            x_range=(-0.45, 0.45),
                            y_range=(-0.45, 0.45))

    sectores = pie_plot_bokeh.annular_wedge(
        x=0,
        y=0,
        inner_radius=radio_tarta / 3.0,
        outer_radius=radio_tarta,
        start_angle=bokeh_cumsum("angulo", include_zero=True),
        end_angle=bokeh_cumsum('angulo'),
        line_color="white",
        line_width=3,
        fill_color='color',
        #legend_field="origen",
        alpha=0.8,
        hover_color="color",
        hover_alpha=1.0,
        source=df_pie_plot_source)

    textos = pie_plot_bokeh.text(x='posicion_x_texto',
                                 y='posicion_y_texto',
                                 text="porcentaje_texto",
                                 text_color="white",
                                 text_font_style="bold",
                                 text_align="center",
                                 text_baseline="middle",
                                 source=df_pie_plot_source)

    # Old hover:
    #hover_pie = HoverTool(tooltips="@{origen}: @{conteo}",
    #                      renderers=[sectores])

    # New hover:
    hover_pie = HoverTool(tooltips=[("Origen", "@{origen}"),
                                    ("Clientes", "@{conteo}"),
                                    ("Porcentaje", "@{porcentaje}")],
                          renderers=[sectores])

    pie_plot_bokeh.add_tools(hover_pie)

    pie_plot_bokeh.axis.axis_label = None
    pie_plot_bokeh.axis.visible = False
    pie_plot_bokeh.grid.grid_line_color = None

    return pie_plot_bokeh, df_pie_plot_source