From c526e00039602783e5ce50238e430a2d7459f5d6 Mon Sep 17 00:00:00 2001 From: 1kamma Date: Tue, 17 Oct 2023 18:54:17 +0300 Subject: [PATCH] with selection of the places --- ratios.py | 92 +++++++++++++++++++++++++++++-------------------------- 1 file changed, 49 insertions(+), 43 deletions(-) diff --git a/ratios.py b/ratios.py index 70f3d1e..9f11540 100644 --- a/ratios.py +++ b/ratios.py @@ -1,58 +1,64 @@ import pandas as pd +import dash +import dash_core_components as dcc +import dash_html_components as html +from dash.dependencies import Input, Output import plotly.graph_objects as go # Read the CSV file into a Pandas DataFrame file_path = "texts_by_period_and_location_saparated_by_periods_in_columns.csv" df = pd.read_csv(file_path) +# Initialize the Dash app +app = dash.Dash(__name__) + # Define the columns to summarize columns_to_summarize = ["ancient", "old", "middle", "new", "late"] -# Group the data by the "place" column and calculate sums within each group -grouped = df.groupby("place")[columns_to_summarize].sum().reset_index() - -# Create a stacked bar chart using Plotly +# Create the figure fig = go.Figure() -# Add a bar trace for each category -for col in columns_to_summarize: - fig.add_trace(go.Bar(x=grouped["place"], y=grouped[col], name=col, text=grouped[col], textposition='auto')) +# Add an initial trace for demonstration +fig.add_trace(go.Bar(x=["Place 1", "Place 2", "Place 3"], + y=[5, 7, 4], name="ancient")) -# Customize the layout -fig.update_layout( - title="Summary of Categories by Place with Selection", - xaxis_title="Place", - yaxis_title="Total Count", - xaxis=dict(categoryorder='total descending'), - barmode='stack' -) - -# Enable selection by clicking -fig.update_traces(selector=dict(mode='lasso')) - -# Enable searching for place names -fig.update_layout(updatemenus=[ - { - 'buttons': [ - { - 'args': [{'visible': [True] * len(grouped)}], - 'label': 'Show All', - 'method': 'restyle' - }, - { - 'args': [{'visible': [grouped["place"] == place for place in grouped["place"]]}], - 'label': 'Select Place', - 'method': 'restyle' - } - ], - 'direction': 'down', - 'showactive': False, - 'x': 0.1, - 'xanchor': 'left', - 'y': 1.1, - 'yanchor': 'top' - } +# Define the app layout +app.layout = html.Div([ + html.H1("Interactive Bar Graph with Filtering"), + dcc.Checklist( + id="place-selector", + options=[{"label": place, "value": place} for place in df["place"].unique()], + value=df["place"].unique().tolist(), + labelStyle={'display': 'block'} + ), + dcc.Checklist( + id="column-selector", + options=[{"label": col, "value": col} for col in columns_to_summarize], + value=columns_to_summarize, + labelStyle={'display': 'block'} + ), + dcc.Graph(id="bar-graph", figure=fig) ]) -# Show the interactive graph -fig.show() +# Define callback functions to update the graph +@app.callback( + Output("bar-graph", "figure"), + [Input("place-selector", "value"), Input("column-selector", "value")] +) +def update_graph(selected_places, selected_columns): + filtered_df = df[(df["place"].isin(selected_places)) & (df[selected_columns].sum(axis=1) > 0)] + grouped = filtered_df.groupby("place")[selected_columns].sum().reset_index() + fig = go.Figure() + for col in selected_columns: + fig.add_trace(go.Bar(x=grouped["place"], y=grouped[col], name=col, text=grouped[col], textposition='auto')) + fig.update_layout( + title="Summary of Categories by Place with Selection", + xaxis_title="Place", + yaxis_title="Total Count", + xaxis=dict(categoryorder='total descending'), + barmode='stack' + ) + return fig + +if __name__ == "__main__": + app.run_server(debug=True)