tx3bas commited on
Commit
35befed
·
verified ·
1 Parent(s): bf73bfe

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +17 -27
app.py CHANGED
@@ -1,5 +1,5 @@
1
  import streamlit as st
2
- import plotly.graph_objects as go
3
  import pandas as pd
4
  from datetime import datetime, timedelta
5
 
@@ -24,31 +24,31 @@ st.sidebar.header("Configuración del Gráfico")
24
  chart_title = st.sidebar.text_input("Título del Gráfico", "Gráfico de Franjas de Tiempo Apiladas")
25
 
26
  # Seleccionar formato de tiempo
27
- time_format = st.sidebar.selectbox("Formato de Tiempo", ["Año", "Mes", "Día"])
28
 
29
  # Ingresar valores para franjas de tiempo
30
  num_y_vars = st.sidebar.number_input("Número de Variables Y", min_value=1, max_value=10, value=3, step=1)
 
31
  y_values = {}
32
  for i in range(num_y_vars):
33
  y_start = st.sidebar.text_input(f"Fecha de Inicio para Y-{i+1} (YYYY-MM-DD)", key=f"y_start_{i}", value=f"202{i}-01-01")
34
  y_end = st.sidebar.text_input(f"Fecha de Fin para Y-{i+1} (YYYY-MM-DD)", key=f"y_end_{i}", value=f"202{i+1}-12-31")
35
  y_name = st.sidebar.text_input(f"Nombre de la Variable Y-{i+1}", key=f"y_name_{i}", value=f"Y-{i+1}")
36
- y_color = st.sidebar.color_picker(f"Color para Y-{i+1}", f"#{hash(y_name)&0xFFFFFF:06x}", key=f"y_color_{i}")
37
  if y_start and y_end and y_name:
38
- y_values[y_name] = (y_start, y_end, y_color)
39
 
40
  # Opción para apilar franjas de tiempo
41
  stacked = st.sidebar.checkbox("Apilar Franjas de Tiempo", value=True)
42
 
43
  # Crear el DataFrame con franjas de tiempo
44
  data_list = []
45
- for y_name, (start_date, end_date, color) in y_values.items():
46
  data_list.append({
47
  'Variable': y_name,
48
  'Start': datetime.strptime(start_date, '%Y-%m-%d'),
49
- 'End': datetime.strptime(end_date, '%Y-%m-%d'),
50
- 'Color': color
51
  })
 
52
  data = pd.DataFrame(data_list)
53
 
54
  # Ajustar fechas para simular apilamiento si está activado
@@ -58,45 +58,35 @@ if stacked:
58
  data['End'] = data['End'] + data.groupby('Variable').cumcount() * offset
59
 
60
  # Crear gráfico de franjas de tiempo
61
- fig = go.Figure()
62
-
63
- for _, row in data.iterrows():
64
- fig.add_trace(go.Bar(
65
- x=[(row['End'] - row['Start']).days], # Convertir timedelta a días
66
- y=[row['Variable']],
67
- orientation='h',
68
- base=row['Start'],
69
- marker_color=row['Color'],
70
- name=row['Variable'],
71
- hoverinfo='text',
72
- text=f"{row['Variable']}<br>Inicio: {row['Start'].strftime('%Y-%m-%d')}<br>Fin: {row['End'].strftime('%Y-%m-%d')}",
73
- ))
74
 
75
  # Actualizar el diseño del gráfico
 
 
 
 
 
 
76
  fig.update_layout(
77
- title=chart_title,
78
  xaxis_title="Tiempo",
79
  yaxis_title="Variables",
80
  xaxis=dict(
81
- type='date',
82
- tickformat='%Y' if time_format == "Año" else ('%b %Y' if time_format == "Mes" else '%Y-%m-%d'),
83
  titlefont=dict(size=14),
84
  tickfont=dict(size=12),
85
  ),
86
  yaxis=dict(
87
- categoryorder="total ascending",
88
  titlefont=dict(size=14),
89
  tickfont=dict(size=12),
90
  ),
91
  width=800,
92
  height=600,
93
  margin=dict(l=60, r=40, t=100, b=40),
94
- font=dict(family="Times New Roman", size=18, color="black"),
95
- barmode='stack' if stacked else 'overlay'
96
  )
97
 
98
  # Mostrar el gráfico
99
  st.plotly_chart(fig)
100
 
101
  # Información adicional
102
- st.write("Aquí puede añadir información adicional sobre los gráficos generados.")
 
1
  import streamlit as st
2
+ import plotly.express as px
3
  import pandas as pd
4
  from datetime import datetime, timedelta
5
 
 
24
  chart_title = st.sidebar.text_input("Título del Gráfico", "Gráfico de Franjas de Tiempo Apiladas")
25
 
26
  # Seleccionar formato de tiempo
27
+ time_format = st.sidebar.selectbox("Formato de Tiempo", ["Año"])
28
 
29
  # Ingresar valores para franjas de tiempo
30
  num_y_vars = st.sidebar.number_input("Número de Variables Y", min_value=1, max_value=10, value=3, step=1)
31
+
32
  y_values = {}
33
  for i in range(num_y_vars):
34
  y_start = st.sidebar.text_input(f"Fecha de Inicio para Y-{i+1} (YYYY-MM-DD)", key=f"y_start_{i}", value=f"202{i}-01-01")
35
  y_end = st.sidebar.text_input(f"Fecha de Fin para Y-{i+1} (YYYY-MM-DD)", key=f"y_end_{i}", value=f"202{i+1}-12-31")
36
  y_name = st.sidebar.text_input(f"Nombre de la Variable Y-{i+1}", key=f"y_name_{i}", value=f"Y-{i+1}")
 
37
  if y_start and y_end and y_name:
38
+ y_values[y_name] = (y_start, y_end)
39
 
40
  # Opción para apilar franjas de tiempo
41
  stacked = st.sidebar.checkbox("Apilar Franjas de Tiempo", value=True)
42
 
43
  # Crear el DataFrame con franjas de tiempo
44
  data_list = []
45
+ for y_name, (start_date, end_date) in y_values.items():
46
  data_list.append({
47
  'Variable': y_name,
48
  'Start': datetime.strptime(start_date, '%Y-%m-%d'),
49
+ 'End': datetime.strptime(end_date, '%Y-%m-%d')
 
50
  })
51
+
52
  data = pd.DataFrame(data_list)
53
 
54
  # Ajustar fechas para simular apilamiento si está activado
 
58
  data['End'] = data['End'] + data.groupby('Variable').cumcount() * offset
59
 
60
  # Crear gráfico de franjas de tiempo
61
+ fig = px.timeline(data, x_start="Start", x_end="End", y="Variable", color="Variable", title=chart_title)
 
 
 
 
 
 
 
 
 
 
 
 
62
 
63
  # Actualizar el diseño del gráfico
64
+ fig.update_yaxes(categoryorder="total ascending")
65
+
66
+ # Personalizar el formato de tiempo en el eje X
67
+ if time_format == "Año":
68
+ tickformat = "%Y"
69
+
70
  fig.update_layout(
 
71
  xaxis_title="Tiempo",
72
  yaxis_title="Variables",
73
  xaxis=dict(
74
+ tickformat=tickformat,
 
75
  titlefont=dict(size=14),
76
  tickfont=dict(size=12),
77
  ),
78
  yaxis=dict(
 
79
  titlefont=dict(size=14),
80
  tickfont=dict(size=12),
81
  ),
82
  width=800,
83
  height=600,
84
  margin=dict(l=60, r=40, t=100, b=40),
85
+ font=dict(family="Times New Roman", size=18, color="black")
 
86
  )
87
 
88
  # Mostrar el gráfico
89
  st.plotly_chart(fig)
90
 
91
  # Información adicional
92
+ st.write("Aquí puede añadir información adicional sobre los gráficos generados.")