drguilhermeapolinario commited on
Commit
7ede75c
·
verified ·
1 Parent(s): 48004ad

Update views/mesames.py

Browse files
Files changed (1) hide show
  1. views/mesames.py +269 -269
views/mesames.py CHANGED
@@ -1,269 +1,269 @@
1
- import pandas as pd
2
- import plotly.graph_objects as go
3
- from streamlit_option_menu import option_menu
4
- import streamlit as st
5
- from streamlit_extras.stylable_container import stylable_container
6
-
7
-
8
- st.title("Crescimento populacional - UBS Flamengo")
9
-
10
- with stylable_container(
11
- key="banner",
12
- css_styles="""
13
- img {
14
- width: 1800px;
15
- height: 340px;
16
- overflow: hidden;
17
- position: relative;
18
- object-fit: cover;
19
- border-radius: 20px; /* Adiciona bordas arredondadas */
20
- mask-image: linear-gradient(to bottom, rgba(0, 0, 0, 1), rgba(0, 0, 0, 0));
21
- -webkit-mask-image: linear-gradient(to bottom, rgba(0, 0, 0, 1), rgba(0, 0, 0, 0)); /* For Safari */
22
- }
23
- """,
24
- ):
25
- st.image("src/images/pop.jpg")
26
- st.title("Crescimento populacional - UBS Flamengo")
27
-
28
- raw_data = [
29
- {"Mês": "mai-21", "Usuários": 3402, "Domicílios": 1440, "Famílias": 1269},
30
- {"Mês": "jun-21", "Usuários": 3503, "Domicílios": 1462, "Famílias": 1304},
31
- {"Mês": "jul-21", "Usuários": 3559, "Domicílios": 1478, "Famílias": 1323},
32
- {"Mês": "ago-21", "Usuários": 3592, "Domicílios": 1490, "Famílias": 1338},
33
- {"Mês": "set-21", "Usuários": 3755, "Domicílios": 1573, "Famílias": 1380},
34
- {"Mês": "out-21", "Usuários": 3776, "Domicílios": 1533, "Famílias": 1384},
35
- {"Mês": "nov-21", "Usuários": 3839, "Domicílios": 1553, "Famílias": 1397},
36
- {"Mês": "dez-21", "Usuários": 3926, "Domicílios": 1581, "Famílias": 1423},
37
- {"Mês": "jan-22", "Usuários": 3951, "Domicílios": 1596, "Famílias": 1437},
38
- {"Mês": "fev-22", "Usuários": 4035, "Domicílios": 1638, "Famílias": 1465},
39
- {"Mês": "mar-22", "Usuários": 4131, "Domicílios": 1672, "Famílias": 1500},
40
- {"Mês": "abr-22", "Usuários": 4306, "Domicílios": 1723, "Famílias": 1555},
41
- {"Mês": "mai-22", "Usuários": 4553, "Domicílios": 1795, "Famílias": 1625},
42
- {"Mês": "jun-22", "Usuários": 4639, "Domicílios": 1817, "Famílias": 1653},
43
- {"Mês": "jul-22", "Usuários": 4719, "Domicílios": 1848, "Famílias": 1676},
44
- {"Mês": "ago-22", "Usuários": 4776, "Domicílios": 1869, "Famílias": 1687},
45
- {"Mês": "set-22", "Usuários": 4831, "Domicílios": 1883, "Famílias": 1699},
46
- {"Mês": "out-22", "Usuários": 4871, "Domicílios": 1900, "Famílias": 1709},
47
- {"Mês": "nov-22", "Usuários": 4874, "Domicílios": 1906, "Famílias": 1708},
48
- {"Mês": "dez-22", "Usuários": 4920, "Domicílios": 1914, "Famílias": 1720},
49
- {"Mês": "jan-23", "Usuários": 5135, "Domicílios": 2006, "Famílias": 1776},
50
- {"Mês": "fev-23", "Usuários": 5396, "Domicílios": 2084, "Famílias": 1848},
51
- {"Mês": "mar-23", "Usuários": 5544, "Domicílios": 2127, "Famílias": 1893},
52
- {"Mês": "abr-23", "Usuários": 5546, "Domicílios": 2140, "Famílias": 1910},
53
- {"Mês": "mai-23", "Usuários": 5579, "Domicílios": 2164, "Famílias": 1920},
54
- {"Mês": "jun-23", "Usuários": 5642, "Domicílios": 2181, "Famílias": 1946},
55
- {"Mês": "jul-23", "Usuários": 5681, "Domicílios": 2200, "Famílias": 1961},
56
- {"Mês": "ago-23", "Usuários": 5728, "Domicílios": 2208, "Famílias": 1972},
57
- {"Mês": "set-23", "Usuários": 5774, "Domicílios": 2228, "Famílias": 1983},
58
- {"Mês": "out-23", "Usuários": 5841, "Domicílios": 2245, "Famílias": 2007},
59
- {"Mês": "nov-23", "Usuários": 5891, "Domicílios": 2297, "Famílias": 2027},
60
- {"Mês": "dez-23", "Usuários": 5933, "Domicílios": 2281, "Famílias": 2036},
61
- {"Mês": "jan-24", "Usuários": 5982, "Domicílios": 2307, "Famílias": 2050},
62
- {"Mês": "fev-24", "Usuários": 6005, "Domicílios": 2333, "Famílias": 2057},
63
- {"Mês": "mar-24", "Usuários": 6020, "Domicílios": 2327, "Famílias": 2070},
64
- {"Mês": "abr-24", "Usuários": 6074, "Domicílios": 2370, "Famílias": 2095},
65
- ]
66
-
67
- df = pd.DataFrame(raw_data)
68
-
69
- @st.cache_data
70
- def processar_dados(dados, intervalo):
71
- """
72
- Process data based on the specified interval and return the aggregated data.
73
-
74
- Parameters:
75
- - dados: List of dictionaries containing data for each month.
76
- - intervalo: String indicating the interval for data aggregation.
77
-
78
- Returns:
79
- - List of dictionaries with aggregated data based on the specified interval.
80
- """
81
- if intervalo == "Mensal":
82
- return dados
83
- agrupamentos = {"Trimestral": 3, "Semestral": 6, "Anual": 12}
84
- dados_agrupados = []
85
- for i in range(0, len(dados), agrupamentos[intervalo]):
86
- grupo = dados[i : i + agrupamentos[intervalo]]
87
- ultimo_Mês = grupo[-1]["Mês"]
88
- dados_agrupados.append(
89
- {
90
- "Mês": ultimo_Mês,
91
- "Usuários": max(d["Usuários"] for d in grupo),
92
- "Domicílios": max(d["Domicílios"] for d in grupo),
93
- "Famílias": max(d["Famílias"] for d in grupo),
94
- }
95
- )
96
- return dados_agrupados
97
-
98
- @st.cache_data
99
- def formatar_data(Mês):
100
- """
101
- A function that formats the data based on the input Mês parameter.
102
-
103
- Parameters:
104
- - Mês (str): A string containing the month and year separated by a hyphen.
105
-
106
- Returns:
107
- - str: A formatted string in the format "month/year".
108
- """
109
- m, a = Mês.split("-")
110
- return f"{m}/{a}"
111
-
112
-
113
- # Adicionando estilo personalizado
114
- st.markdown(
115
- """
116
- <style>
117
- .stSelectbox [data-baseweb="select"] {
118
- max-width: 300px;
119
- }
120
- .st-emotion-cache-16idsys p {
121
- font-size: 20px;
122
- font-weight: bold;
123
- color: #4FCBFC;
124
- }
125
- </style>
126
- """,
127
- unsafe_allow_html=True,
128
- )
129
-
130
- # Criando duas colunas para os menus de opções
131
- col1, col2, col3 = st.columns([3, 2, 2])
132
-
133
- with col1:
134
- st.dataframe(df, use_container_width=True, height= 250, hide_index=True)
135
-
136
- with col2:
137
- intervalo = option_menu(
138
- "Intervalo de Tempo",
139
- ["Mensal", "Trimestral", "Semestral", "Anual"],
140
- icons=["calendar-month", "calendar-quarter", "calendar-half", "calendar-year"],
141
- menu_icon="cast",
142
- default_index=0,
143
- styles={
144
- "container": {"padding": "0!important", "background-color": "#262730"},
145
- "icon": {"color": "#4FCBFC", "font-size": "18px"},
146
- "nav-link": {
147
- "font-size": "14px",
148
- "text-align": "center",
149
- "margin": "0px",
150
- "padding": "10px",
151
- "--hover-color": "#363940",
152
- "color": "#FFFFFF",
153
- },
154
- "nav-link-selected": {"background-color": "#0083B8"},
155
- "separator": {"border-color": "#4B4B4B"},
156
- },
157
- )
158
-
159
- with col3:
160
- metrica = option_menu(
161
- "Métrica",
162
- ["Todos", "Usuários", "Domicílios", "Famílias"],
163
- icons=["list", "person", "house", "people"],
164
- menu_icon="cast",
165
- default_index=0,
166
- styles={
167
- "container": {"padding": "0!important", "background-color": "#262730"},
168
- "icon": {"color": "#4FCBFC", "font-size": "18px"},
169
- "nav-link": {
170
- "font-size": "14px",
171
- "text-align": "center",
172
- "margin": "0px",
173
- "padding": "10px",
174
- "--hover-color": "#363940",
175
- "color": "#FFFFFF",
176
- },
177
- "nav-link-selected": {"background-color": "#0083B8"},
178
- "separator": {"border-color": "#4B4B4B"},
179
- },
180
- )
181
-
182
- dados_processados = processar_dados(raw_data, intervalo)
183
-
184
- # Switch para mostrar valores nos pontos
185
- mostrar_valores = st.checkbox("Mostrar valores nos pontos", value=True)
186
-
187
- # Criação do gráfico
188
- fig = go.Figure()
189
-
190
- metricas = ["Usuários", "Domicílios", "Famílias"] if metrica == "Todos" else [metrica]
191
- cores = {"Usuários": "#1f77b4", "Domicílios": "#ff7f0e", "Famílias": "#2ca02c"}
192
-
193
-
194
- # Slider Component
195
- st.sidebar.header("Ajustes dos Balões")
196
- balloon_positions = {}
197
- for m in metricas:
198
- balloon_positions[m] = st.sidebar.slider(
199
- f"Posição do balão para {m}", min_value=-100, max_value=0, value=-40, step=5
200
- )
201
-
202
- annotations = []
203
-
204
- for m in metricas:
205
- x_data = [formatar_data(d["Mês"]) for d in dados_processados]
206
- y_data = [d[m] for d in dados_processados]
207
-
208
- fig.add_trace(
209
- go.Scatter(
210
- x=x_data,
211
- y=y_data,
212
- mode="lines+markers",
213
- name=m,
214
- line=dict(color=cores[m], width=3),
215
- marker=dict(size=8, symbol="circle", line=dict(width=2, color="white")),
216
- )
217
- )
218
-
219
- if mostrar_valores:
220
- for i, (x, y) in enumerate(zip(x_data, y_data)):
221
- annotations.append(
222
- dict(
223
- x=x,
224
- y=y,
225
- xref="x",
226
- yref="y",
227
- text=f"{y:,.0f}",
228
- showarrow=True,
229
- arrowhead=7,
230
- ax=0,
231
- ay=balloon_positions[m], # Usa a posição ajustada para cada métrica
232
- bgcolor=cores[m],
233
- opacity=0.8,
234
- bordercolor="white",
235
- borderwidth=2,
236
- borderpad=4,
237
- font=dict(color="white", size=10),
238
- )
239
- )
240
-
241
- fig.update_layout(
242
- title={
243
- "text": "Crescimento na Área de Saúde",
244
- "y": 0.95,
245
- "x": 0.5,
246
- "xanchor": "center",
247
- "yanchor": "top",
248
- "font": dict(size=24, color="#4FCBFC"),
249
- },
250
- xaxis_title="Mês",
251
- yaxis_title="Quantidade",
252
- legend_title="Métricas",
253
- template="plotly_dark",
254
- plot_bgcolor="#262730",
255
- paper_bgcolor="#262730",
256
- font=dict(color="white"),
257
- xaxis=dict(showgrid=True, gridcolor="#4B4B4B", tickangle=45),
258
- yaxis=dict(showgrid=True, gridcolor="#4B4B4B"),
259
- legend=dict(
260
- bgcolor="rgba(0,0,0,0)",
261
- bordercolor="rgba(0,0,0,0)",
262
- font=dict(size=12, color="white"),
263
- ),
264
- margin=dict(l=50, r=50, t=80, b=50),
265
- annotations=annotations,
266
- )
267
-
268
- st.plotly_chart(fig, use_container_width=True)
269
-
 
1
+ import pandas as pd
2
+ import plotly.graph_objects as go
3
+ from streamlit_option_menu import option_menu
4
+ import streamlit as st
5
+ from streamlit_extras.stylable_container import stylable_container
6
+
7
+
8
+ st.title("Crescimento populacional - UBS Flamengo")
9
+
10
+ with stylable_container(
11
+ key="banner",
12
+ css_styles="""
13
+ img {
14
+ width: 1800px;
15
+ height: 340px;
16
+ overflow: hidden;
17
+ position: relative;
18
+ object-fit: cover;
19
+ border-radius: 20px; /* Adiciona bordas arredondadas */
20
+ mask-image: linear-gradient(to bottom, rgba(0, 0, 0, 1), rgba(0, 0, 0, 0));
21
+ -webkit-mask-image: linear-gradient(to bottom, rgba(0, 0, 0, 1), rgba(0, 0, 0, 0)); /* For Safari */
22
+ }
23
+ """,
24
+ ):
25
+ st.image("pop.jpg")
26
+ st.title("Crescimento populacional - UBS Flamengo")
27
+
28
+ raw_data = [
29
+ {"Mês": "mai-21", "Usuários": 3402, "Domicílios": 1440, "Famílias": 1269},
30
+ {"Mês": "jun-21", "Usuários": 3503, "Domicílios": 1462, "Famílias": 1304},
31
+ {"Mês": "jul-21", "Usuários": 3559, "Domicílios": 1478, "Famílias": 1323},
32
+ {"Mês": "ago-21", "Usuários": 3592, "Domicílios": 1490, "Famílias": 1338},
33
+ {"Mês": "set-21", "Usuários": 3755, "Domicílios": 1573, "Famílias": 1380},
34
+ {"Mês": "out-21", "Usuários": 3776, "Domicílios": 1533, "Famílias": 1384},
35
+ {"Mês": "nov-21", "Usuários": 3839, "Domicílios": 1553, "Famílias": 1397},
36
+ {"Mês": "dez-21", "Usuários": 3926, "Domicílios": 1581, "Famílias": 1423},
37
+ {"Mês": "jan-22", "Usuários": 3951, "Domicílios": 1596, "Famílias": 1437},
38
+ {"Mês": "fev-22", "Usuários": 4035, "Domicílios": 1638, "Famílias": 1465},
39
+ {"Mês": "mar-22", "Usuários": 4131, "Domicílios": 1672, "Famílias": 1500},
40
+ {"Mês": "abr-22", "Usuários": 4306, "Domicílios": 1723, "Famílias": 1555},
41
+ {"Mês": "mai-22", "Usuários": 4553, "Domicílios": 1795, "Famílias": 1625},
42
+ {"Mês": "jun-22", "Usuários": 4639, "Domicílios": 1817, "Famílias": 1653},
43
+ {"Mês": "jul-22", "Usuários": 4719, "Domicílios": 1848, "Famílias": 1676},
44
+ {"Mês": "ago-22", "Usuários": 4776, "Domicílios": 1869, "Famílias": 1687},
45
+ {"Mês": "set-22", "Usuários": 4831, "Domicílios": 1883, "Famílias": 1699},
46
+ {"Mês": "out-22", "Usuários": 4871, "Domicílios": 1900, "Famílias": 1709},
47
+ {"Mês": "nov-22", "Usuários": 4874, "Domicílios": 1906, "Famílias": 1708},
48
+ {"Mês": "dez-22", "Usuários": 4920, "Domicílios": 1914, "Famílias": 1720},
49
+ {"Mês": "jan-23", "Usuários": 5135, "Domicílios": 2006, "Famílias": 1776},
50
+ {"Mês": "fev-23", "Usuários": 5396, "Domicílios": 2084, "Famílias": 1848},
51
+ {"Mês": "mar-23", "Usuários": 5544, "Domicílios": 2127, "Famílias": 1893},
52
+ {"Mês": "abr-23", "Usuários": 5546, "Domicílios": 2140, "Famílias": 1910},
53
+ {"Mês": "mai-23", "Usuários": 5579, "Domicílios": 2164, "Famílias": 1920},
54
+ {"Mês": "jun-23", "Usuários": 5642, "Domicílios": 2181, "Famílias": 1946},
55
+ {"Mês": "jul-23", "Usuários": 5681, "Domicílios": 2200, "Famílias": 1961},
56
+ {"Mês": "ago-23", "Usuários": 5728, "Domicílios": 2208, "Famílias": 1972},
57
+ {"Mês": "set-23", "Usuários": 5774, "Domicílios": 2228, "Famílias": 1983},
58
+ {"Mês": "out-23", "Usuários": 5841, "Domicílios": 2245, "Famílias": 2007},
59
+ {"Mês": "nov-23", "Usuários": 5891, "Domicílios": 2297, "Famílias": 2027},
60
+ {"Mês": "dez-23", "Usuários": 5933, "Domicílios": 2281, "Famílias": 2036},
61
+ {"Mês": "jan-24", "Usuários": 5982, "Domicílios": 2307, "Famílias": 2050},
62
+ {"Mês": "fev-24", "Usuários": 6005, "Domicílios": 2333, "Famílias": 2057},
63
+ {"Mês": "mar-24", "Usuários": 6020, "Domicílios": 2327, "Famílias": 2070},
64
+ {"Mês": "abr-24", "Usuários": 6074, "Domicílios": 2370, "Famílias": 2095},
65
+ ]
66
+
67
+ df = pd.DataFrame(raw_data)
68
+
69
+ @st.cache_data
70
+ def processar_dados(dados, intervalo):
71
+ """
72
+ Process data based on the specified interval and return the aggregated data.
73
+
74
+ Parameters:
75
+ - dados: List of dictionaries containing data for each month.
76
+ - intervalo: String indicating the interval for data aggregation.
77
+
78
+ Returns:
79
+ - List of dictionaries with aggregated data based on the specified interval.
80
+ """
81
+ if intervalo == "Mensal":
82
+ return dados
83
+ agrupamentos = {"Trimestral": 3, "Semestral": 6, "Anual": 12}
84
+ dados_agrupados = []
85
+ for i in range(0, len(dados), agrupamentos[intervalo]):
86
+ grupo = dados[i : i + agrupamentos[intervalo]]
87
+ ultimo_Mês = grupo[-1]["Mês"]
88
+ dados_agrupados.append(
89
+ {
90
+ "Mês": ultimo_Mês,
91
+ "Usuários": max(d["Usuários"] for d in grupo),
92
+ "Domicílios": max(d["Domicílios"] for d in grupo),
93
+ "Famílias": max(d["Famílias"] for d in grupo),
94
+ }
95
+ )
96
+ return dados_agrupados
97
+
98
+ @st.cache_data
99
+ def formatar_data(Mês):
100
+ """
101
+ A function that formats the data based on the input Mês parameter.
102
+
103
+ Parameters:
104
+ - Mês (str): A string containing the month and year separated by a hyphen.
105
+
106
+ Returns:
107
+ - str: A formatted string in the format "month/year".
108
+ """
109
+ m, a = Mês.split("-")
110
+ return f"{m}/{a}"
111
+
112
+
113
+ # Adicionando estilo personalizado
114
+ st.markdown(
115
+ """
116
+ <style>
117
+ .stSelectbox [data-baseweb="select"] {
118
+ max-width: 300px;
119
+ }
120
+ .st-emotion-cache-16idsys p {
121
+ font-size: 20px;
122
+ font-weight: bold;
123
+ color: #4FCBFC;
124
+ }
125
+ </style>
126
+ """,
127
+ unsafe_allow_html=True,
128
+ )
129
+
130
+ # Criando duas colunas para os menus de opções
131
+ col1, col2, col3 = st.columns([3, 2, 2])
132
+
133
+ with col1:
134
+ st.dataframe(df, use_container_width=True, height= 250, hide_index=True)
135
+
136
+ with col2:
137
+ intervalo = option_menu(
138
+ "Intervalo de Tempo",
139
+ ["Mensal", "Trimestral", "Semestral", "Anual"],
140
+ icons=["calendar-month", "calendar-quarter", "calendar-half", "calendar-year"],
141
+ menu_icon="cast",
142
+ default_index=0,
143
+ styles={
144
+ "container": {"padding": "0!important", "background-color": "#262730"},
145
+ "icon": {"color": "#4FCBFC", "font-size": "18px"},
146
+ "nav-link": {
147
+ "font-size": "14px",
148
+ "text-align": "center",
149
+ "margin": "0px",
150
+ "padding": "10px",
151
+ "--hover-color": "#363940",
152
+ "color": "#FFFFFF",
153
+ },
154
+ "nav-link-selected": {"background-color": "#0083B8"},
155
+ "separator": {"border-color": "#4B4B4B"},
156
+ },
157
+ )
158
+
159
+ with col3:
160
+ metrica = option_menu(
161
+ "Métrica",
162
+ ["Todos", "Usuários", "Domicílios", "Famílias"],
163
+ icons=["list", "person", "house", "people"],
164
+ menu_icon="cast",
165
+ default_index=0,
166
+ styles={
167
+ "container": {"padding": "0!important", "background-color": "#262730"},
168
+ "icon": {"color": "#4FCBFC", "font-size": "18px"},
169
+ "nav-link": {
170
+ "font-size": "14px",
171
+ "text-align": "center",
172
+ "margin": "0px",
173
+ "padding": "10px",
174
+ "--hover-color": "#363940",
175
+ "color": "#FFFFFF",
176
+ },
177
+ "nav-link-selected": {"background-color": "#0083B8"},
178
+ "separator": {"border-color": "#4B4B4B"},
179
+ },
180
+ )
181
+
182
+ dados_processados = processar_dados(raw_data, intervalo)
183
+
184
+ # Switch para mostrar valores nos pontos
185
+ mostrar_valores = st.checkbox("Mostrar valores nos pontos", value=True)
186
+
187
+ # Criação do gráfico
188
+ fig = go.Figure()
189
+
190
+ metricas = ["Usuários", "Domicílios", "Famílias"] if metrica == "Todos" else [metrica]
191
+ cores = {"Usuários": "#1f77b4", "Domicílios": "#ff7f0e", "Famílias": "#2ca02c"}
192
+
193
+
194
+ # Slider Component
195
+ st.sidebar.header("Ajustes dos Balões")
196
+ balloon_positions = {}
197
+ for m in metricas:
198
+ balloon_positions[m] = st.sidebar.slider(
199
+ f"Posição do balão para {m}", min_value=-100, max_value=0, value=-40, step=5
200
+ )
201
+
202
+ annotations = []
203
+
204
+ for m in metricas:
205
+ x_data = [formatar_data(d["Mês"]) for d in dados_processados]
206
+ y_data = [d[m] for d in dados_processados]
207
+
208
+ fig.add_trace(
209
+ go.Scatter(
210
+ x=x_data,
211
+ y=y_data,
212
+ mode="lines+markers",
213
+ name=m,
214
+ line=dict(color=cores[m], width=3),
215
+ marker=dict(size=8, symbol="circle", line=dict(width=2, color="white")),
216
+ )
217
+ )
218
+
219
+ if mostrar_valores:
220
+ for i, (x, y) in enumerate(zip(x_data, y_data)):
221
+ annotations.append(
222
+ dict(
223
+ x=x,
224
+ y=y,
225
+ xref="x",
226
+ yref="y",
227
+ text=f"{y:,.0f}",
228
+ showarrow=True,
229
+ arrowhead=7,
230
+ ax=0,
231
+ ay=balloon_positions[m], # Usa a posição ajustada para cada métrica
232
+ bgcolor=cores[m],
233
+ opacity=0.8,
234
+ bordercolor="white",
235
+ borderwidth=2,
236
+ borderpad=4,
237
+ font=dict(color="white", size=10),
238
+ )
239
+ )
240
+
241
+ fig.update_layout(
242
+ title={
243
+ "text": "Crescimento na Área de Saúde",
244
+ "y": 0.95,
245
+ "x": 0.5,
246
+ "xanchor": "center",
247
+ "yanchor": "top",
248
+ "font": dict(size=24, color="#4FCBFC"),
249
+ },
250
+ xaxis_title="Mês",
251
+ yaxis_title="Quantidade",
252
+ legend_title="Métricas",
253
+ template="plotly_dark",
254
+ plot_bgcolor="#262730",
255
+ paper_bgcolor="#262730",
256
+ font=dict(color="white"),
257
+ xaxis=dict(showgrid=True, gridcolor="#4B4B4B", tickangle=45),
258
+ yaxis=dict(showgrid=True, gridcolor="#4B4B4B"),
259
+ legend=dict(
260
+ bgcolor="rgba(0,0,0,0)",
261
+ bordercolor="rgba(0,0,0,0)",
262
+ font=dict(size=12, color="white"),
263
+ ),
264
+ margin=dict(l=50, r=50, t=80, b=50),
265
+ annotations=annotations,
266
+ )
267
+
268
+ st.plotly_chart(fig, use_container_width=True)
269
+