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"] # Create the figure fig = go.Figure() # Add an initial trace for demonstration fig.add_trace(go.Bar(x=["Place 1", "Place 2", "Place 3"], y=[5, 7, 4], name="ancient")) # 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) ]) # 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)