| # |
| # Licensed to the Apache Software Foundation (ASF) under one or more |
| # contributor license agreements. See the NOTICE file distributed with |
| # this work for additional information regarding copyright ownership. |
| # The ASF licenses this file to You under the Apache License, Version 2.0 |
| # (the "License"); you may not use this file except in compliance with |
| # the License. You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| |
| import dash_bootstrap_components as dbc |
| import pandas as pd |
| import plotly.express as px |
| from dash import Dash, Input, Output, dcc, html |
| |
| df = pd.read_csv("example_segments.csv") |
| # app = Dash(__name__, external_stylesheets=[dbc.themes.FLATLY]) |
| |
| |
| # Side Bar |
| SIDEBAR_STYLE = { |
| "position": "fixed", |
| "top": 0, |
| "left": 0, |
| "bottom": 0, |
| "width": "12rem", |
| "padding": "2rem 1rem", |
| "background-color": "lightgrey", |
| "color": "black", |
| } |
| CONTENT_STYLE = { |
| "margin-left": "15rem", |
| "margin-right": "2rem", |
| "padding": "2rem1rem", |
| "color": "black", |
| } |
| |
| |
| # Overlapping segments data |
| fixed_time = df[df["Segment Type"].str.contains("Segment_Type.FIXED_TIME")] |
| generate = df[df["Segment Type"].str.contains("Segment_Type.GENERATE")] |
| deadspace = df[df["Segment Type"].str.contains("Segment_Type.DEADSPACE")] |
| |
| deadspace = deadspace.head() |
| generate = generate.head() |
| fixed_time = fixed_time.head() |
| All = [fixed_time, generate, deadspace] |
| result = pd.concat(All) |
| |
| """Overlapping Segments Graph |
| This visualization displays segments types that overlap over start and end times """ |
| |
| fig = px.timeline( |
| result, |
| x_start="Start Time", |
| x_end="End Time", |
| y="Segment Type", |
| color="Segment Type", |
| ) |
| fig.update_yaxes(autorange="reversed") |
| |
| |
| # Line Graph |
| df["timeline"] = df["Start Time"] + df["End Time"] |
| df["timeline"] = pd.to_datetime(df["timeline"]).dt.time |
| fig_line = px.line(df, x="timeline", y="Number of Logs", title="Segments") |
| fig_line.update_traces(mode="markers+lines") |
| fig_line.update_xaxes(rangeslider_visible=True) |
| |
| |
| fig_line.update_layout( |
| title="Number of Logs by Time", |
| xaxis_title="Timeline", |
| yaxis_title="Number of logs", |
| font=dict(size=15), |
| template="plotly_dark", |
| # "plotly", "plotly_white", "plotly_dark", |
| # "ggplot2", "seaborn", "simple_white", "none" |
| ) |
| |
| # Bubble Chart |
| fig_bubble = px.scatter( |
| df.head(100), |
| x="Start Time", |
| y="End Time", |
| size="Number of Logs", |
| color="Segment Type", |
| hover_name="Generate Matched Values", |
| ) |
| |
| # Pie Chart |
| fig_pie = px.pie(df, values="Number of Logs", names="Segment Type") |
| # fig_pie.show() |
| |
| # Bar Chart |
| fig_bar = px.histogram( |
| df, |
| x="Segment Type", |
| y="Number of Logs", |
| color="Segment Type", |
| barmode="group", |
| histfunc="avg", |
| height=400, |
| ) |
| # Area Chart |
| fig_area = px.area( |
| df, x="Start Time", y="End Time", color="Segment Type", line_group="Number of Logs" |
| ) |
| |
| |
| # Time Between Segments Conversion |
| df["Start Time"] = pd.to_datetime(df["Start Time"]) |
| df["End Time"] = pd.to_datetime(df["End Time"]) |
| # Duration of segments |
| lst = [] |
| for i in range(len(df["End Time"])): |
| lst.append((df["End Time"][i] - df["Start Time"][i]).total_seconds()) |
| |
| # print(lst) |
| |
| df["Duration"] = lst |
| |
| # Time Between Segments in a Gantt Chart |
| fig_gantt = px.timeline( |
| df, x_start="Start Time", x_end="End Time", y="Segment Type", color="Duration" |
| ) |
| fig.update_yaxes(autorange="reversed") |
| |
| # Time Between Segments in a Histogram |
| fig_hist = px.histogram( |
| df, |
| x="Segment Type", |
| y="Number of Logs", |
| color="Duration", |
| barmode="group", |
| histfunc="avg", |
| height=400, |
| ) |
| |
| |
| child = dbc.Container( |
| [ |
| dbc.Row(dbc.Col(html.H1("Segments Plotly Dashboard"))), # header |
| dbc.Row( |
| [ |
| dbc.Col( |
| [ |
| html.H5("Overlapping Segments", className="text-center"), |
| dcc.Tab( |
| label="Segment Types Overlapping", |
| children=[ |
| dcc.Graph( |
| id="chrt-portfolio-main", |
| figure=fig.update_layout(template="plotly_dark"), |
| style={"height": 550}, |
| ), |
| html.Hr(), |
| ], |
| ), |
| ], |
| width={"size": 8, "offset": 0, "order": 1}, |
| ), |
| dbc.Col( |
| [ # second column on second row |
| html.H5("Bar Chart", className="text-center"), |
| dcc.Graph( |
| id="indicators-ptf", |
| figure=fig_bar.update_layout(template="plotly_dark"), |
| style={"height": 550}, |
| ), |
| html.Hr(), |
| ], |
| width={"size": 4, "offset": 0, "order": 2}, |
| ), # width second column on second row |
| dbc.Col( |
| [ # third column on second row |
| html.H5("Pie Chart", className="text-center"), |
| dcc.Graph( |
| id="pie-top15", |
| figure=fig_pie.update_layout(template="plotly_dark"), |
| style={"height": 380}, |
| ), |
| html.Hr(), |
| ], |
| width={"size": 4, "offset": 0, "order": 2}, |
| ), |
| ] |
| ), |
| dbc.Row( |
| [ # start of third row |
| dbc.Col( |
| [ # first column on third row |
| html.H5("Number of logs by Time", className="text-center"), |
| dcc.Graph( |
| id="chrt-portfolio-secondary", |
| figure=fig_line, |
| style={"height": 380}, |
| ), |
| ], |
| width={"size": 10, "offset": 0, "order": 1}, |
| ), |
| ] |
| ), |
| dbc.Row( |
| [ # start of third row |
| dbc.Col( |
| [ # first column on third row |
| html.H5("Filtering By Segment Type", className="text-center"), |
| dcc.Tab( |
| label="Filtering By Segment Type", |
| children=[ |
| dcc.Dropdown( |
| id="Segment_Types", |
| options=[ |
| { |
| "label": "Fixed Times", |
| "value": "Segment_Type.FIXED_TIME", |
| }, |
| { |
| "label": "Generate", |
| "value": "Segment_Type.GENERATE", |
| }, |
| { |
| "label": "Deadspace", |
| "value": "Segment_Type.DEADSPACE", |
| }, |
| ], |
| multi=False, |
| value="Segment_Type.FIXED_TIME", |
| ), |
| html.Div(id="output_container", children=[]), |
| html.Br(), |
| dcc.Graph(id="segment", figure={}), |
| ], |
| ), |
| ], |
| width={"size": 8, "offset": 0, "order": 1}, |
| ), |
| ] |
| ), |
| ] |
| ) |
| |
| |
| sidebar = html.Div( |
| # navbar = html.Div( |
| [ |
| # html.H5("Navigation Menu", className='display-6'), |
| html.Hr(), |
| html.P("Dashboard Menu", className="text-center"), |
| dbc.Nav( |
| [ |
| dbc.NavLink("Home", href="/", active="exact"), |
| dbc.NavLink("Plotly", href="https://plotly.com/", active="exact"), |
| dbc.NavLink("Gantt", href="/Gantt", active="exact"), |
| dbc.NavLink("Documentation", href="/page-docs", active="exact"), |
| dbc.DropdownMenu( |
| label="Plotly Graphs", |
| toggle_style={ |
| "color": "#008080", |
| "background": "#D3D3D3", |
| }, |
| children=[ |
| dbc.DropdownMenuItem(dcc.Link("Gantt Chart", href="/Gantt")), |
| dbc.DropdownMenuItem("Bar Chart"), |
| dbc.DropdownMenuItem("Line Chart"), |
| dbc.DropdownMenuItem(dcc.Link("Upload", href="/upload")), |
| ], |
| nav=True, |
| in_navbar=True, |
| ), |
| ], |
| vertical=True, |
| pills=True, |
| ), |
| ], |
| style=SIDEBAR_STYLE, |
| ) |
| |
| |
| content = html.Div(id="page-content", children=child, style=CONTENT_STYLE) |
| |
| app = Dash(__name__, external_stylesheets=[dbc.themes.SPACELAB]) |
| # app = JupyterDash(__name__) |
| |
| |
| app.layout = html.Div( |
| [ |
| # dcc.Location(id='url'), |
| # sidebar, |
| # navbar, |
| content |
| ] |
| ) |
| layout = content |
| |
| |
| @app.callback( |
| [ |
| Output(component_id="output_container", component_property="children"), |
| Output(component_id="segment", component_property="figure"), |
| ], |
| [Input(component_id="Segment_Types", component_property="value")], |
| ) |
| def update_graph(option_segment): |
| print(option_segment) |
| print(type(option_segment)) |
| |
| container = "Segment Types is:{}".format(option_segment) |
| dff = df.copy() |
| dff = dff[dff["Segment Type"] == option_segment] |
| # Plotly Express |
| fig = px.timeline( |
| dff.head(50), |
| x_start="Start Time", |
| x_end="End Time", |
| y="Segment Name", |
| color="Number of Logs", |
| ) |
| fig.update_yaxes(autorange="reversed") |
| fig.update_layout(template="plotly_dark") |
| # fig.show() |
| |
| return container, fig |
| |
| |
| if __name__ == "__main__": |
| app.run_server(debug=True, port=3099) |