C2MV commited on
Commit
aa2abb4
verified
1 Parent(s): 330f424

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +122 -156
app.py CHANGED
@@ -41,10 +41,12 @@ def calcular_promedio_desviacion(df, n_replicas, unidad_medida, decimales):
41
 
42
  return df
43
 
44
- def generar_graficos(df_valid, n_replicas, unidad_medida, palette_puntos, estilo_puntos,
45
- palette_linea_ajuste, estilo_linea_ajuste,
46
- palette_linea_ideal, estilo_linea_ideal,
47
- palette_barras_error, mostrar_linea_ajuste, mostrar_linea_ideal, mostrar_puntos):
 
 
48
  col_predicha_num = "Concentraci贸n Predicha Num茅rica"
49
  col_real_promedio = f"Concentraci贸n Real Promedio ({unidad_medida})"
50
  col_desviacion = f"Desviaci贸n Est谩ndar ({unidad_medida})"
@@ -66,16 +68,7 @@ def generar_graficos(df_valid, n_replicas, unidad_medida, palette_puntos, estilo
66
 
67
  fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 6))
68
 
69
- colors_puntos = sns.color_palette(palette_puntos, as_cmap=False)
70
- colors_linea_ajuste = sns.color_palette(palette_linea_ajuste, as_cmap=False)
71
- colors_linea_ideal = sns.color_palette(palette_linea_ideal, as_cmap=False)
72
- colors_barras_error = sns.color_palette(palette_barras_error, as_cmap=False)
73
-
74
- color_puntos = colors_puntos[0]
75
- color_linea_ajuste = colors_linea_ajuste[0]
76
- color_linea_ideal = colors_linea_ideal[0]
77
- color_barras_error = colors_barras_error[0]
78
-
79
  if mostrar_puntos:
80
  if n_replicas > 1:
81
  ax1.errorbar(
@@ -135,6 +128,7 @@ def generar_graficos(df_valid, n_replicas, unidad_medida, palette_puntos, estilo
135
 
136
  ax1.legend(loc='lower right', fontsize=10)
137
 
 
138
  residuos = df_valid[col_real_promedio] - df_valid['Ajuste Lineal']
139
  ax2.scatter(
140
  df_valid[col_predicha_num],
@@ -257,12 +251,13 @@ def actualizar_analisis(df, n_replicas, unidad_medida, filas_seleccionadas, deci
257
  slope, intercept, r_value, p_value, std_err = stats.linregress(df_valid[col_predicha_num], df_valid[col_real_promedio])
258
  df_valid['Ajuste Lineal'] = intercept + slope * df_valid[col_predicha_num]
259
 
 
260
  fig = generar_graficos(
261
  df_valid, n_replicas, unidad_medida,
262
- palette_puntos='deep', estilo_puntos='o',
263
- palette_linea_ajuste='muted', estilo_linea_ajuste='-',
264
- palette_linea_ideal='bright', estilo_linea_ideal='--',
265
- palette_barras_error='pastel',
266
  mostrar_linea_ajuste=True,
267
  mostrar_linea_ideal=False,
268
  mostrar_puntos=True
@@ -271,47 +266,6 @@ def actualizar_analisis(df, n_replicas, unidad_medida, filas_seleccionadas, deci
271
 
272
  return estado, fig, informe, df
273
 
274
- def actualizar_graficos(df, n_replicas, unidad_medida,
275
- palette_puntos, estilo_puntos,
276
- palette_linea_ajuste, estilo_linea_ajuste,
277
- palette_linea_ideal, estilo_linea_ideal,
278
- palette_barras_error,
279
- mostrar_linea_ajuste, mostrar_linea_ideal, mostrar_puntos,
280
- filas_seleccionadas, decimales):
281
- if df is None or df.empty:
282
- return None
283
-
284
- df = calcular_promedio_desviacion(df, n_replicas, unidad_medida, decimales)
285
-
286
- col_predicha_num = "Concentraci贸n Predicha Num茅rica"
287
- col_real_promedio = f"Concentraci贸n Real Promedio ({unidad_medida})"
288
-
289
- df[col_predicha_num] = pd.to_numeric(df[col_predicha_num], errors='coerce')
290
- df[col_real_promedio] = pd.to_numeric(df[col_real_promedio], errors='coerce')
291
-
292
- df_valid = df.dropna(subset=[col_predicha_num, col_real_promedio])
293
- df_valid.reset_index(drop=True, inplace=True)
294
-
295
- if not filas_seleccionadas:
296
- return None
297
-
298
- indices_seleccionados = [int(s.split(' ')[1]) - 1 for s in filas_seleccionadas]
299
- df_valid = df_valid.loc[indices_seleccionados]
300
-
301
- if len(df_valid) < 2:
302
- return None
303
-
304
- fig = generar_graficos(
305
- df_valid, n_replicas, unidad_medida,
306
- palette_puntos, estilo_puntos,
307
- palette_linea_ajuste, estilo_linea_ajuste,
308
- palette_linea_ideal, estilo_linea_ideal,
309
- palette_barras_error,
310
- mostrar_linea_ajuste, mostrar_linea_ideal, mostrar_puntos
311
- )
312
-
313
- return fig
314
-
315
  def exportar_informe_word(df_valid, informe_md, unidad_medida):
316
  doc = docx.Document()
317
 
@@ -450,13 +404,13 @@ def limpiar_datos(n_replicas):
450
  "Concentraci贸n Predicha (mg/L)": [2000000/(1/(1/(2**i))) for i in range(7)]
451
  })
452
  return (
453
- 2000000,
454
- "UFC",
455
- 7,
456
- df,
457
- "",
458
- None,
459
- ""
460
  )
461
 
462
  def generar_datos_sinteticos_evento(df, n_replicas, unidad_medida):
@@ -526,14 +480,23 @@ def cargar_excel(file):
526
 
527
  return concentracion_inicial, unidad_medida, n_filas, n_replicas, df_sistema, "", None, ""
528
 
 
 
 
 
 
 
 
 
529
  def calcular_regresion_tabla_principal(df, unidad_medida, filas_seleccionadas_regresion,
530
- palette_puntos, estilo_puntos,
531
- palette_linea_ajuste, estilo_linea_ajuste,
532
  mostrar_linea_ajuste, mostrar_puntos,
533
  legend_location, decimales,
534
  titulo_grafico_original, titulo_grafico_personalizado,
535
  eje_x_original, eje_y_original,
536
  eje_x_personalizado, eje_y_personalizado):
 
537
  if df is None or df.empty:
538
  return "Datos insuficientes", None, None, None
539
 
@@ -559,7 +522,7 @@ def calcular_regresion_tabla_principal(df, unidad_medida, filas_seleccionadas_re
559
  if not filas_seleccionadas_regresion:
560
  return "Se necesitan m谩s datos", None, None, None
561
 
562
- indices_seleccionados = [int(s.split(' ')[1]) - 1 for s in filas_seleccionadas_regresion if s.split(' ')[1].isdigit() and int(s.split(' ')[1]) - 1 < len(df_valid)]
563
  if len(indices_seleccionados) < 2:
564
  return "Se requieren al menos dos puntos para calcular la regresi贸n", None, None, None
565
 
@@ -570,12 +533,13 @@ def calcular_regresion_tabla_principal(df, unidad_medida, filas_seleccionadas_re
570
  sns.set(style="whitegrid")
571
  fig_original, ax_original = plt.subplots(figsize=(8, 6))
572
 
 
573
  ax_original.errorbar(
574
  df_original[col_concentracion],
575
  df_original[col_real_promedio],
576
  yerr=df_original[col_desviacion],
577
- fmt='o',
578
- color='blue',
579
  ecolor='gray',
580
  elinewidth=1,
581
  capsize=3,
@@ -587,7 +551,7 @@ def calcular_regresion_tabla_principal(df, unidad_medida, filas_seleccionadas_re
587
  ax_original.plot(
588
  df_original[col_concentracion],
589
  intercept_all + slope_all * df_original[col_concentracion],
590
- color='red',
591
  linestyle='-',
592
  label='Ajuste Lineal'
593
  )
@@ -606,15 +570,10 @@ def calcular_regresion_tabla_principal(df, unidad_medida, filas_seleccionadas_re
606
  verticalalignment='top'
607
  )
608
 
 
609
  sns.set(style="whitegrid")
610
  fig_personalizado, ax_personalizado = plt.subplots(figsize=(8, 6))
611
 
612
- colors_puntos = sns.color_palette(palette_puntos, as_cmap=False)
613
- colors_linea_ajuste = sns.color_palette(palette_linea_ajuste, as_cmap=False)
614
-
615
- color_puntos = colors_puntos[0]
616
- color_linea_ajuste = colors_linea_ajuste[0]
617
-
618
  if mostrar_puntos:
619
  ax_personalizado.errorbar(
620
  df_valid[col_concentracion],
@@ -656,18 +615,35 @@ def calcular_regresion_tabla_principal(df, unidad_medida, filas_seleccionadas_re
656
 
657
  return "Regresi贸n calculada exitosamente", fig_original, fig_personalizado, df_resumen
658
 
659
- def actualizar_opciones_filas(df):
660
- if df is None or df.empty:
661
- update = gr.update(choices=[], value=[])
662
- else:
663
- opciones = [f"Fila {i+1}" for i in df.index]
664
- update = gr.update(choices=opciones, value=opciones)
665
- return update, update
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
666
 
 
 
667
  with gr.Blocks(theme=gr.themes.Soft()) as interfaz:
668
  gr.Markdown("""
669
  # 馃搳 Sistema Avanzado de Calibraci贸n con An谩lisis Estad锟斤拷stico
670
- Cargue el Excel con las 3 hojas (Hoja1 con 5 primeras columnas, Hoja2 y Hoja3 r茅plicas), edite y calcule.
671
  """)
672
 
673
  with gr.Tab("馃摑 Datos de Calibraci贸n"):
@@ -733,23 +709,13 @@ with gr.Blocks(theme=gr.themes.Soft()) as interfaz:
733
  )
734
 
735
  with gr.Row():
736
- paletas_colores = ["deep", "muted", "pastel", "bright", "dark", "colorblind", "Set1", "Set2", "Set3"]
737
-
738
- palette_puntos_dropdown = gr.Dropdown(
739
- choices=paletas_colores,
740
- value="deep",
741
- label="Paleta para Puntos"
742
- )
743
  estilo_puntos_dropdown = gr.Dropdown(
744
  choices=["o", "s", "^", "D", "v", "<", ">", "h", "H", "p", "*", "X", "d"],
745
  value="o",
746
- label="Estilo de Puntos"
747
- )
748
- palette_linea_ajuste_dropdown = gr.Dropdown(
749
- choices=paletas_colores,
750
- value="muted",
751
- label="Paleta L铆nea de Ajuste"
752
  )
 
753
  estilo_linea_ajuste_dropdown = gr.Dropdown(
754
  choices=["-", "--", "-.", ":"],
755
  value="-",
@@ -757,27 +723,18 @@ with gr.Blocks(theme=gr.themes.Soft()) as interfaz:
757
  )
758
 
759
  with gr.Row():
760
- palette_linea_ideal_dropdown = gr.Dropdown(
761
- choices=paletas_colores,
762
- value="bright",
763
- label="Paleta L铆nea Ideal"
764
- )
765
  estilo_linea_ideal_dropdown = gr.Dropdown(
766
  choices=["--", "-", "-.", ":"],
767
  value="--",
768
  label="Estilo L铆nea Ideal"
769
  )
770
- palette_barras_error_dropdown = gr.Dropdown(
771
- choices=paletas_colores,
772
- value="pastel",
773
- label="Paleta Barras de Error"
774
- )
775
  mostrar_linea_ajuste = gr.Checkbox(value=True, label="Mostrar L铆nea de Ajuste")
776
  mostrar_linea_ideal = gr.Checkbox(value=False, label="Mostrar L铆nea Ideal")
777
  mostrar_puntos = gr.Checkbox(value=True, label="Mostrar Puntos")
778
  graficar_btn = gr.Button("馃搳 Graficar", variant="primary")
779
 
780
- # Bot贸n para recalcular informe
781
  recalcular_btn = gr.Button("馃攧 Calcular Otra Vez", variant="secondary")
782
 
783
  with gr.Row():
@@ -801,29 +758,20 @@ with gr.Blocks(theme=gr.themes.Soft()) as interfaz:
801
  )
802
 
803
  with gr.Row():
804
- paletas_colores = ["deep", "muted", "pastel", "bright", "dark", "colorblind", "Set1", "Set2", "Set3"]
805
- palette_puntos_regresion = gr.Dropdown(
806
- choices=paletas_colores,
807
- value="deep",
808
- label="Paleta para Puntos"
809
- )
810
  estilo_puntos_regresion = gr.Dropdown(
811
  choices=["o", "s", "^", "D", "v", "<", ">", "h", "H", "p", "*", "X", "d"],
812
  value="o",
813
- label="Estilo de Puntos"
814
- )
815
- palette_linea_ajuste_regresion = gr.Dropdown(
816
- choices=paletas_colores,
817
- value="muted",
818
- label="Paleta L铆nea de Ajuste"
819
  )
 
820
  estilo_linea_ajuste_regresion = gr.Dropdown(
821
  choices=["-", "--", "-.", ":"],
822
  value="-",
823
- label="Estilo L铆nea de Ajuste"
824
  )
825
- mostrar_linea_ajuste_regresion = gr.Checkbox(value=True, label="Mostrar L铆nea de Ajuste")
826
- mostrar_puntos_regresion = gr.Checkbox(value=True, label="Mostrar Puntos")
827
 
828
  with gr.Row():
829
  legend_location_dropdown = gr.Dropdown(
@@ -873,6 +821,7 @@ with gr.Blocks(theme=gr.themes.Soft()) as interfaz:
873
  grafico_personalizado_output = gr.Plot(label="Gr谩fico Personalizado")
874
  tabla_resumen_output = gr.DataFrame(label="Tabla Resumida")
875
 
 
876
  tabla_output.change(
877
  fn=actualizar_opciones_filas,
878
  inputs=[tabla_output],
@@ -885,21 +834,60 @@ with gr.Blocks(theme=gr.themes.Soft()) as interfaz:
885
  outputs=[estado_output, graficos_output, informe_output, tabla_output]
886
  )
887
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
888
  graficar_btn.click(
889
- fn=actualizar_graficos,
890
  inputs=[
891
  tabla_output, replicas_slider, unidad_input,
892
- palette_puntos_dropdown, estilo_puntos_dropdown,
893
- palette_linea_ajuste_dropdown, estilo_linea_ajuste_dropdown,
894
- palette_linea_ideal_dropdown, estilo_linea_ideal_dropdown,
895
- palette_barras_error_dropdown,
896
  mostrar_linea_ajuste, mostrar_linea_ideal, mostrar_puntos,
897
  filas_seleccionadas, decimales_slider
898
  ],
899
  outputs=graficos_output
900
  )
901
 
902
- # Nuevo bot贸n "Calcular Otra Vez" para recalcular informe y gr谩fico
903
  recalcular_btn.click(
904
  fn=actualizar_analisis,
905
  inputs=[tabla_output, replicas_slider, unidad_input, filas_seleccionadas, decimales_slider],
@@ -1037,29 +1025,6 @@ with gr.Blocks(theme=gr.themes.Soft()) as interfaz:
1037
  outputs=exportar_latex_file
1038
  )
1039
 
1040
- def iniciar_con_ejemplo():
1041
- df = pd.DataFrame({
1042
- "Soluci贸n": [1.00,0.80,0.67,0.60,0.53,0.47,0.40],
1043
- "H2O": [0.00,0.20,0.33,0.40,0.47,0.53,0.60],
1044
- "Factor de Diluci贸n": [1.00,1.25,1.50,1.67,1.87,2.14,2.50],
1045
- "Concentraci贸n Predicha Num茅rica": [150,120,100,90,80,70,60],
1046
- "Concentraci贸n Predicha (mg/L)": [150,120,100,90,80,70,60]
1047
- })
1048
- df["Concentraci贸n Real 1 (UFC)"] = [1.715,1.089,0.941,0.552,0.703,0.801,0.516]
1049
- n_replicas = 1
1050
- estado, fig, informe, df = actualizar_analisis(df, n_replicas, "UFC", [f"Fila {i+1}" for i in df.index], 3)
1051
- return (
1052
- 2000000,
1053
- "UFC",
1054
- 7,
1055
- df,
1056
- estado,
1057
- fig,
1058
- informe,
1059
- [f"Fila {i+1}" for i in df.index],
1060
- 3
1061
- )
1062
-
1063
  interfaz.load(
1064
  fn=iniciar_con_ejemplo,
1065
  outputs=[concentracion_input, unidad_input, filas_slider, tabla_output, estado_output, graficos_output, informe_output, filas_seleccionadas, decimales_slider]
@@ -1069,8 +1034,8 @@ with gr.Blocks(theme=gr.themes.Soft()) as interfaz:
1069
  fn=calcular_regresion_tabla_principal,
1070
  inputs=[
1071
  tabla_output, unidad_input, filas_seleccionadas_regresion,
1072
- palette_puntos_regresion, estilo_puntos_regresion,
1073
- palette_linea_ajuste_regresion, estilo_linea_ajuste_regresion,
1074
  mostrar_linea_ajuste_regresion, mostrar_puntos_regresion,
1075
  legend_location_dropdown, decimales_slider,
1076
  titulo_grafico_original, titulo_grafico_personalizado,
@@ -1080,5 +1045,6 @@ with gr.Blocks(theme=gr.themes.Soft()) as interfaz:
1080
  outputs=[estado_regresion_output, grafico_original_output, grafico_personalizado_output, tabla_resumen_output]
1081
  )
1082
 
 
1083
  if __name__ == "__main__":
1084
  interfaz.launch()
 
41
 
42
  return df
43
 
44
+ def generar_graficos(df_valid, n_replicas, unidad_medida,
45
+ color_puntos, estilo_puntos,
46
+ color_linea_ajuste, estilo_linea_ajuste,
47
+ color_linea_ideal, estilo_linea_ideal,
48
+ color_barras_error,
49
+ mostrar_linea_ajuste, mostrar_linea_ideal, mostrar_puntos):
50
  col_predicha_num = "Concentraci贸n Predicha Num茅rica"
51
  col_real_promedio = f"Concentraci贸n Real Promedio ({unidad_medida})"
52
  col_desviacion = f"Desviaci贸n Est谩ndar ({unidad_medida})"
 
68
 
69
  fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 6))
70
 
71
+ # Gr谩fico principal
 
 
 
 
 
 
 
 
 
72
  if mostrar_puntos:
73
  if n_replicas > 1:
74
  ax1.errorbar(
 
128
 
129
  ax1.legend(loc='lower right', fontsize=10)
130
 
131
+ # Gr谩fico de residuos
132
  residuos = df_valid[col_real_promedio] - df_valid['Ajuste Lineal']
133
  ax2.scatter(
134
  df_valid[col_predicha_num],
 
251
  slope, intercept, r_value, p_value, std_err = stats.linregress(df_valid[col_predicha_num], df_valid[col_real_promedio])
252
  df_valid['Ajuste Lineal'] = intercept + slope * df_valid[col_predicha_num]
253
 
254
+ # Generar gr谩fico con colores por defecto (se actualizar谩n con el bot贸n Graficar)
255
  fig = generar_graficos(
256
  df_valid, n_replicas, unidad_medida,
257
+ color_puntos="#0000FF", estilo_puntos='o',
258
+ color_linea_ajuste="#00FF00", estilo_linea_ajuste='-',
259
+ color_linea_ideal="#FF0000", estilo_linea_ideal='--',
260
+ color_barras_error="#FFA500",
261
  mostrar_linea_ajuste=True,
262
  mostrar_linea_ideal=False,
263
  mostrar_puntos=True
 
266
 
267
  return estado, fig, informe, df
268
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
269
  def exportar_informe_word(df_valid, informe_md, unidad_medida):
270
  doc = docx.Document()
271
 
 
404
  "Concentraci贸n Predicha (mg/L)": [2000000/(1/(1/(2**i))) for i in range(7)]
405
  })
406
  return (
407
+ 2000000,
408
+ "UFC",
409
+ 7,
410
+ df,
411
+ "",
412
+ None,
413
+ ""
414
  )
415
 
416
  def generar_datos_sinteticos_evento(df, n_replicas, unidad_medida):
 
480
 
481
  return concentracion_inicial, unidad_medida, n_filas, n_replicas, df_sistema, "", None, ""
482
 
483
+ def actualizar_opciones_filas(df):
484
+ if df is None or df.empty:
485
+ update = gr.update(choices=[], value=[])
486
+ else:
487
+ opciones = [f"Fila {i+1}" for i in df.index]
488
+ update = gr.update(choices=opciones, value=opciones)
489
+ return update, update
490
+
491
  def calcular_regresion_tabla_principal(df, unidad_medida, filas_seleccionadas_regresion,
492
+ color_puntos, estilo_puntos,
493
+ color_linea_ajuste, estilo_linea_ajuste,
494
  mostrar_linea_ajuste, mostrar_puntos,
495
  legend_location, decimales,
496
  titulo_grafico_original, titulo_grafico_personalizado,
497
  eje_x_original, eje_y_original,
498
  eje_x_personalizado, eje_y_personalizado):
499
+
500
  if df is None or df.empty:
501
  return "Datos insuficientes", None, None, None
502
 
 
522
  if not filas_seleccionadas_regresion:
523
  return "Se necesitan m谩s datos", None, None, None
524
 
525
+ indices_seleccionados = [int(s.split(' ')[1]) - 1 for s in filas_seleccionadas_regresion]
526
  if len(indices_seleccionados) < 2:
527
  return "Se requieren al menos dos puntos para calcular la regresi贸n", None, None, None
528
 
 
533
  sns.set(style="whitegrid")
534
  fig_original, ax_original = plt.subplots(figsize=(8, 6))
535
 
536
+ # Gr谩fico Original
537
  ax_original.errorbar(
538
  df_original[col_concentracion],
539
  df_original[col_real_promedio],
540
  yerr=df_original[col_desviacion],
541
+ fmt=estilo_puntos,
542
+ color=color_puntos,
543
  ecolor='gray',
544
  elinewidth=1,
545
  capsize=3,
 
551
  ax_original.plot(
552
  df_original[col_concentracion],
553
  intercept_all + slope_all * df_original[col_concentracion],
554
+ color=color_linea_ajuste,
555
  linestyle='-',
556
  label='Ajuste Lineal'
557
  )
 
570
  verticalalignment='top'
571
  )
572
 
573
+ # Gr谩fico Personalizado
574
  sns.set(style="whitegrid")
575
  fig_personalizado, ax_personalizado = plt.subplots(figsize=(8, 6))
576
 
 
 
 
 
 
 
577
  if mostrar_puntos:
578
  ax_personalizado.errorbar(
579
  df_valid[col_concentracion],
 
615
 
616
  return "Regresi贸n calculada exitosamente", fig_original, fig_personalizado, df_resumen
617
 
618
+ def iniciar_con_ejemplo():
619
+ df = pd.DataFrame({
620
+ "Soluci贸n": [1.00,0.80,0.67,0.60,0.53,0.47,0.40],
621
+ "H2O": [0.00,0.20,0.33,0.40,0.47,0.53,0.60],
622
+ "Factor de Diluci贸n": [1.00,1.25,1.50,1.67,1.87,2.14,2.50],
623
+ "Concentraci贸n Predicha Num茅rica": [150,120,100,90,80,70,60],
624
+ "Concentraci贸n Predicha (mg/L)": [150,120,100,90,80,70,60],
625
+ "Concentraci贸n Real 1 (UFC)": [1.715,1.089,0.941,0.552,0.703,0.801,0.516]
626
+ })
627
+ n_replicas = 1
628
+ estado, fig, informe, df = actualizar_analisis(df, n_replicas, "UFC", [f"Fila {i+1}" for i in df.index], 3)
629
+ return (
630
+ 2000000,
631
+ "UFC",
632
+ 7,
633
+ df,
634
+ estado,
635
+ fig,
636
+ informe,
637
+ [f"Fila {i+1}" for i in df.index],
638
+ 3
639
+ )
640
 
641
+
642
+ # Interfaz Gradio
643
  with gr.Blocks(theme=gr.themes.Soft()) as interfaz:
644
  gr.Markdown("""
645
  # 馃搳 Sistema Avanzado de Calibraci贸n con An谩lisis Estad锟斤拷stico
646
+ Configure los par谩metros, edite los valores en la tabla y luego presione "Calcular" para obtener el an谩lisis.
647
  """)
648
 
649
  with gr.Tab("馃摑 Datos de Calibraci贸n"):
 
709
  )
710
 
711
  with gr.Row():
712
+ color_puntos_picker = gr.ColorPicker(label="Color de Puntos", value="#0000FF")
 
 
 
 
 
 
713
  estilo_puntos_dropdown = gr.Dropdown(
714
  choices=["o", "s", "^", "D", "v", "<", ">", "h", "H", "p", "*", "X", "d"],
715
  value="o",
716
+ label="Estilo de Punto"
 
 
 
 
 
717
  )
718
+ color_linea_ajuste_picker = gr.ColorPicker(label="Color de la L铆nea de Ajuste", value="#00FF00")
719
  estilo_linea_ajuste_dropdown = gr.Dropdown(
720
  choices=["-", "--", "-.", ":"],
721
  value="-",
 
723
  )
724
 
725
  with gr.Row():
726
+ color_linea_ideal_picker = gr.ColorPicker(label="Color L铆nea Ideal", value="#FF0000")
 
 
 
 
727
  estilo_linea_ideal_dropdown = gr.Dropdown(
728
  choices=["--", "-", "-.", ":"],
729
  value="--",
730
  label="Estilo L铆nea Ideal"
731
  )
732
+ color_barras_error_picker = gr.ColorPicker(label="Color Barras de Error", value="#FFA500")
 
 
 
 
733
  mostrar_linea_ajuste = gr.Checkbox(value=True, label="Mostrar L铆nea de Ajuste")
734
  mostrar_linea_ideal = gr.Checkbox(value=False, label="Mostrar L铆nea Ideal")
735
  mostrar_puntos = gr.Checkbox(value=True, label="Mostrar Puntos")
736
  graficar_btn = gr.Button("馃搳 Graficar", variant="primary")
737
 
 
738
  recalcular_btn = gr.Button("馃攧 Calcular Otra Vez", variant="secondary")
739
 
740
  with gr.Row():
 
758
  )
759
 
760
  with gr.Row():
761
+ color_puntos_regresion_picker = gr.ColorPicker(label="Color Puntos Regresi贸n", value="#0000FF")
 
 
 
 
 
762
  estilo_puntos_regresion = gr.Dropdown(
763
  choices=["o", "s", "^", "D", "v", "<", ">", "h", "H", "p", "*", "X", "d"],
764
  value="o",
765
+ label="Estilo de Puntos (Regresi贸n)"
 
 
 
 
 
766
  )
767
+ color_linea_ajuste_regresion_picker = gr.ColorPicker(label="Color L铆nea Ajuste (Regresi贸n)", value="#00FF00")
768
  estilo_linea_ajuste_regresion = gr.Dropdown(
769
  choices=["-", "--", "-.", ":"],
770
  value="-",
771
+ label="Estilo L铆nea de Ajuste (Regresi贸n)"
772
  )
773
+ mostrar_linea_ajuste_regresion = gr.Checkbox(value=True, label="Mostrar L铆nea de Ajuste (Regresi贸n)")
774
+ mostrar_puntos_regresion = gr.Checkbox(value=True, label="Mostrar Puntos (Regresi贸n)")
775
 
776
  with gr.Row():
777
  legend_location_dropdown = gr.Dropdown(
 
821
  grafico_personalizado_output = gr.Plot(label="Gr谩fico Personalizado")
822
  tabla_resumen_output = gr.DataFrame(label="Tabla Resumida")
823
 
824
+ # Eventos
825
  tabla_output.change(
826
  fn=actualizar_opciones_filas,
827
  inputs=[tabla_output],
 
834
  outputs=[estado_output, graficos_output, informe_output, tabla_output]
835
  )
836
 
837
+ def actualizar_graficos_custom(df, n_replicas, unidad_medida,
838
+ color_puntos, estilo_puntos,
839
+ color_linea_ajuste, estilo_linea_ajuste,
840
+ color_linea_ideal, estilo_linea_ideal,
841
+ color_barras_error,
842
+ mostrar_linea_ajuste, mostrar_linea_ideal, mostrar_puntos,
843
+ filas_seleccionadas, decimales):
844
+ if df is None or df.empty:
845
+ return None
846
+
847
+ df = calcular_promedio_desviacion(df, n_replicas, unidad_medida, decimales)
848
+
849
+ col_predicha_num = "Concentraci贸n Predicha Num茅rica"
850
+ col_real_promedio = f"Concentraci贸n Real Promedio ({unidad_medida})"
851
+
852
+ df[col_predicha_num] = pd.to_numeric(df[col_predicha_num], errors='coerce')
853
+ df[col_real_promedio] = pd.to_numeric(df[col_real_promedio], errors='coerce')
854
+
855
+ df_valid = df.dropna(subset=[col_predicha_num, col_real_promedio])
856
+ df_valid.reset_index(drop=True, inplace=True)
857
+
858
+ if not filas_seleccionadas:
859
+ return None
860
+
861
+ indices_seleccionados = [int(s.split(' ')[1]) - 1 for s in filas_seleccionadas]
862
+ df_valid = df_valid.loc[indices_seleccionados]
863
+
864
+ if len(df_valid) < 2:
865
+ return None
866
+
867
+ fig = generar_graficos(
868
+ df_valid, n_replicas, unidad_medida,
869
+ color_puntos, estilo_puntos,
870
+ color_linea_ajuste, estilo_linea_ajuste,
871
+ color_linea_ideal, estilo_linea_ideal,
872
+ color_barras_error,
873
+ mostrar_linea_ajuste, mostrar_linea_ideal, mostrar_puntos
874
+ )
875
+ return fig
876
+
877
  graficar_btn.click(
878
+ fn=actualizar_graficos_custom,
879
  inputs=[
880
  tabla_output, replicas_slider, unidad_input,
881
+ color_puntos_picker, estilo_puntos_dropdown,
882
+ color_linea_ajuste_picker, estilo_linea_ajuste_dropdown,
883
+ color_linea_ideal_picker, estilo_linea_ideal_dropdown,
884
+ color_barras_error_picker,
885
  mostrar_linea_ajuste, mostrar_linea_ideal, mostrar_puntos,
886
  filas_seleccionadas, decimales_slider
887
  ],
888
  outputs=graficos_output
889
  )
890
 
 
891
  recalcular_btn.click(
892
  fn=actualizar_analisis,
893
  inputs=[tabla_output, replicas_slider, unidad_input, filas_seleccionadas, decimales_slider],
 
1025
  outputs=exportar_latex_file
1026
  )
1027
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1028
  interfaz.load(
1029
  fn=iniciar_con_ejemplo,
1030
  outputs=[concentracion_input, unidad_input, filas_slider, tabla_output, estado_output, graficos_output, informe_output, filas_seleccionadas, decimales_slider]
 
1034
  fn=calcular_regresion_tabla_principal,
1035
  inputs=[
1036
  tabla_output, unidad_input, filas_seleccionadas_regresion,
1037
+ color_puntos_regresion_picker, estilo_puntos_regresion,
1038
+ color_linea_ajuste_regresion_picker, estilo_linea_ajuste_regresion,
1039
  mostrar_linea_ajuste_regresion, mostrar_puntos_regresion,
1040
  legend_location_dropdown, decimales_slider,
1041
  titulo_grafico_original, titulo_grafico_personalizado,
 
1045
  outputs=[estado_regresion_output, grafico_original_output, grafico_personalizado_output, tabla_resumen_output]
1046
  )
1047
 
1048
+
1049
  if __name__ == "__main__":
1050
  interfaz.launch()