Spaces:
Running
Running
drguilhermeapolinario
commited on
Update views/mesames.py
Browse files- 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("
|
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 |
+
|