C2MV commited on
Commit
0dc4af9
verified
1 Parent(s): ffe4ab5

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +107 -17
app.py CHANGED
@@ -607,12 +607,16 @@ def cargar_excel(file):
607
  return concentracion_inicial, unidad_medida, n_filas, n_replicas, df_base, "", None, ""
608
 
609
  # Funci贸n para calcular la regresi贸n y generar el gr谩fico usando la tabla principal
610
- def calcular_regresion_tabla_principal(df, unidad_medida, filas_seleccionadas):
 
 
 
611
  if df is None or df.empty:
612
- return "Datos insuficientes", None
613
 
614
  col_concentracion = "Concentraci贸n Predicha Num茅rica"
615
  col_absorbancia = f"Concentraci贸n Real Promedio ({unidad_medida})"
 
616
 
617
  # Calcular promedio y desviaci贸n est谩ndar si es necesario
618
  n_replicas = len([col for col in df.columns if 'Concentraci贸n Real' in col and 'Promedio' not in col and 'Desviaci贸n' not in col])
@@ -621,6 +625,7 @@ def calcular_regresion_tabla_principal(df, unidad_medida, filas_seleccionadas):
621
  # Convertir columnas a num茅rico
622
  df[col_concentracion] = pd.to_numeric(df[col_concentracion], errors='coerce')
623
  df[col_absorbancia] = pd.to_numeric(df[col_absorbancia], errors='coerce')
 
624
 
625
  df_valid = df.dropna(subset=[col_concentracion, col_absorbancia])
626
 
@@ -629,7 +634,7 @@ def calcular_regresion_tabla_principal(df, unidad_medida, filas_seleccionadas):
629
 
630
  # Convertir filas_seleccionadas a 铆ndices
631
  if not filas_seleccionadas:
632
- return "Se necesitan m谩s datos", None
633
 
634
  indices_seleccionados = [int(s.split(' ')[1]) - 1 for s in filas_seleccionadas]
635
 
@@ -637,22 +642,22 @@ def calcular_regresion_tabla_principal(df, unidad_medida, filas_seleccionadas):
637
  df_valid = df_valid.loc[indices_seleccionados]
638
 
639
  if len(df_valid) < 2:
640
- return "Se requieren al menos dos puntos para calcular la regresi贸n", None
641
 
642
  # Calcular regresi贸n lineal
643
  slope, intercept, r_value, p_value, std_err = stats.linregress(df_valid[col_concentracion], df_valid[col_absorbancia])
644
 
645
- # Generar gr谩fico
646
- fig, ax = plt.subplots(figsize=(8, 6))
647
- ax.scatter(df_valid[col_concentracion], df_valid[col_absorbancia], color='blue', label='Datos')
648
- ax.plot(df_valid[col_concentracion], intercept + slope * df_valid[col_concentracion], 'r', label='Ajuste Lineal')
649
- ax.set_xlabel('Concentraci贸n Predicha Num茅rica')
650
- ax.set_ylabel(f'Concentraci贸n Real Promedio ({unidad_medida})')
651
- ax.set_title('Regresi贸n Lineal: Concentraci贸n Real vs Concentraci贸n Predicha')
652
- ax.legend()
653
 
654
  # A帽adir ecuaci贸n y R虏 en el gr谩fico
655
- ax.annotate(
656
  f'y = {intercept:.4f} + {slope:.4f}x\n$R^2$ = {r_value**2:.4f}',
657
  xy=(0.05, 0.95),
658
  xycoords='axes fraction',
@@ -661,7 +666,59 @@ def calcular_regresion_tabla_principal(df, unidad_medida, filas_seleccionadas):
661
  verticalalignment='top'
662
  )
663
 
664
- return "Regresi贸n calculada exitosamente", fig
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
665
 
666
  # Interfaz Gradio
667
  with gr.Blocks(theme=gr.themes.Soft()) as interfaz:
@@ -795,11 +852,39 @@ with gr.Blocks(theme=gr.themes.Soft()) as interfaz:
795
  with gr.Tab("馃搱 Regresi贸n Absorbancia vs Concentraci贸n"):
796
  gr.Markdown("## Ajuste de Regresi贸n utilizando datos de la Tabla Principal")
797
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
798
  calcular_regresion_btn = gr.Button("Calcular Regresi贸n")
799
 
800
  # Salidas
801
  estado_regresion_output = gr.Textbox(label="Estado de la Regresi贸n", interactive=False)
802
- grafico_regresion_output = gr.Plot(label="Gr谩fico de Regresi贸n")
 
 
803
 
804
  # Eventos para actualizar las opciones de filas
805
  def actualizar_opciones_filas(df):
@@ -968,8 +1053,13 @@ with gr.Blocks(theme=gr.themes.Soft()) as interfaz:
968
  # Evento al presionar el bot贸n de calcular regresi贸n
969
  calcular_regresion_btn.click(
970
  fn=calcular_regresion_tabla_principal,
971
- inputs=[tabla_output, unidad_input, filas_seleccionadas],
972
- outputs=[estado_regresion_output, grafico_regresion_output]
 
 
 
 
 
973
  )
974
 
975
  # Lanzar la interfaz
 
607
  return concentracion_inicial, unidad_medida, n_filas, n_replicas, df_base, "", None, ""
608
 
609
  # Funci贸n para calcular la regresi贸n y generar el gr谩fico usando la tabla principal
610
+ def calcular_regresion_tabla_principal(df, unidad_medida, filas_seleccionadas,
611
+ palette_puntos, estilo_puntos,
612
+ palette_linea_ajuste, estilo_linea_ajuste,
613
+ mostrar_linea_ajuste, mostrar_puntos):
614
  if df is None or df.empty:
615
+ return "Datos insuficientes", None, None
616
 
617
  col_concentracion = "Concentraci贸n Predicha Num茅rica"
618
  col_absorbancia = f"Concentraci贸n Real Promedio ({unidad_medida})"
619
+ col_desviacion = f"Desviaci贸n Est谩ndar ({unidad_medida})"
620
 
621
  # Calcular promedio y desviaci贸n est谩ndar si es necesario
622
  n_replicas = len([col for col in df.columns if 'Concentraci贸n Real' in col and 'Promedio' not in col and 'Desviaci贸n' not in col])
 
625
  # Convertir columnas a num茅rico
626
  df[col_concentracion] = pd.to_numeric(df[col_concentracion], errors='coerce')
627
  df[col_absorbancia] = pd.to_numeric(df[col_absorbancia], errors='coerce')
628
+ df[col_desviacion] = pd.to_numeric(df[col_desviacion], errors='coerce')
629
 
630
  df_valid = df.dropna(subset=[col_concentracion, col_absorbancia])
631
 
 
634
 
635
  # Convertir filas_seleccionadas a 铆ndices
636
  if not filas_seleccionadas:
637
+ return "Se necesitan m谩s datos", None, None
638
 
639
  indices_seleccionados = [int(s.split(' ')[1]) - 1 for s in filas_seleccionadas]
640
 
 
642
  df_valid = df_valid.loc[indices_seleccionados]
643
 
644
  if len(df_valid) < 2:
645
+ return "Se requieren al menos dos puntos para calcular la regresi贸n", None, None
646
 
647
  # Calcular regresi贸n lineal
648
  slope, intercept, r_value, p_value, std_err = stats.linregress(df_valid[col_concentracion], df_valid[col_absorbancia])
649
 
650
+ # Generar gr谩fico original
651
+ fig_original, ax_original = plt.subplots(figsize=(8, 6))
652
+ ax_original.scatter(df_valid[col_concentracion], df_valid[col_absorbancia], color='blue', label='Datos')
653
+ ax_original.plot(df_valid[col_concentracion], intercept + slope * df_valid[col_concentracion], 'r', label='Ajuste Lineal')
654
+ ax_original.set_xlabel('Concentraci贸n Predicha Num茅rica')
655
+ ax_original.set_ylabel(f'Concentraci贸n Real Promedio ({unidad_medida})')
656
+ ax_original.set_title('Regresi贸n Lineal: Concentraci贸n Real vs Concentraci贸n Predicha (Original)')
657
+ ax_original.legend()
658
 
659
  # A帽adir ecuaci贸n y R虏 en el gr谩fico
660
+ ax_original.annotate(
661
  f'y = {intercept:.4f} + {slope:.4f}x\n$R^2$ = {r_value**2:.4f}',
662
  xy=(0.05, 0.95),
663
  xycoords='axes fraction',
 
666
  verticalalignment='top'
667
  )
668
 
669
+ # Generar gr谩fico personalizado
670
+ sns.set(style="whitegrid")
671
+ fig_personalizado, ax_personalizado = plt.subplots(figsize=(8, 6))
672
+
673
+ # Obtener colores de las paletas
674
+ colors_puntos = sns.color_palette(palette_puntos, as_cmap=False)
675
+ colors_linea_ajuste = sns.color_palette(palette_linea_ajuste, as_cmap=False)
676
+
677
+ color_puntos = colors_puntos[0]
678
+ color_linea_ajuste = colors_linea_ajuste[0]
679
+
680
+ if mostrar_puntos:
681
+ ax_personalizado.errorbar(
682
+ df_valid[col_concentracion],
683
+ df_valid[col_absorbancia],
684
+ yerr=df_valid[col_desviacion],
685
+ fmt=estilo_puntos,
686
+ color=color_puntos,
687
+ ecolor='gray',
688
+ elinewidth=1,
689
+ capsize=3,
690
+ label='Datos'
691
+ )
692
+
693
+ if mostrar_linea_ajuste:
694
+ ax_personalizado.plot(
695
+ df_valid[col_concentracion],
696
+ intercept + slope * df_valid[col_concentracion],
697
+ color=color_linea_ajuste,
698
+ linestyle=estilo_linea_ajuste,
699
+ label='Ajuste Lineal'
700
+ )
701
+
702
+ ax_personalizado.set_xlabel('Concentraci贸n Predicha Num茅rica')
703
+ ax_personalizado.set_ylabel(f'Concentraci贸n Real Promedio ({unidad_medida})')
704
+ ax_personalizado.set_title('Regresi贸n Lineal Personalizada')
705
+ ax_personalizado.legend()
706
+
707
+ # A帽adir ecuaci贸n y R虏 en el gr谩fico
708
+ ax_personalizado.annotate(
709
+ f'y = {intercept:.4f} + {slope:.4f}x\n$R^2$ = {r_value**2:.4f}',
710
+ xy=(0.05, 0.95),
711
+ xycoords='axes fraction',
712
+ fontsize=12,
713
+ backgroundcolor='white',
714
+ verticalalignment='top'
715
+ )
716
+
717
+ # Crear tabla resumida
718
+ df_resumen = df_valid[[col_concentracion, col_absorbancia, col_desviacion]].copy()
719
+ df_resumen.columns = ['Concentraci贸n Predicha', 'Absorbancia Promedio', 'Desviaci贸n Est谩ndar']
720
+
721
+ return "Regresi贸n calculada exitosamente", fig_original, fig_personalizado, df_resumen
722
 
723
  # Interfaz Gradio
724
  with gr.Blocks(theme=gr.themes.Soft()) as interfaz:
 
852
  with gr.Tab("馃搱 Regresi贸n Absorbancia vs Concentraci贸n"):
853
  gr.Markdown("## Ajuste de Regresi贸n utilizando datos de la Tabla Principal")
854
 
855
+ # Opciones de personalizaci贸n
856
+ with gr.Row():
857
+ paletas_colores = ["deep", "muted", "pastel", "bright", "dark", "colorblind", "Set1", "Set2", "Set3"]
858
+ palette_puntos_regresion = gr.Dropdown(
859
+ choices=paletas_colores,
860
+ value="deep",
861
+ label="Paleta para Puntos"
862
+ )
863
+ estilo_puntos_regresion = gr.Dropdown(
864
+ choices=["o", "s", "^", "D", "v", "<", ">", "h", "H", "p", "*", "X", "d"],
865
+ value="o",
866
+ label="Estilo de Puntos"
867
+ )
868
+ palette_linea_ajuste_regresion = gr.Dropdown(
869
+ choices=paletas_colores,
870
+ value="muted",
871
+ label="Paleta L铆nea de Ajuste"
872
+ )
873
+ estilo_linea_ajuste_regresion = gr.Dropdown(
874
+ choices=["-", "--", "-.", ":"],
875
+ value="-",
876
+ label="Estilo L铆nea de Ajuste"
877
+ )
878
+ mostrar_linea_ajuste_regresion = gr.Checkbox(value=True, label="Mostrar L铆nea de Ajuste")
879
+ mostrar_puntos_regresion = gr.Checkbox(value=True, label="Mostrar Puntos")
880
+
881
  calcular_regresion_btn = gr.Button("Calcular Regresi贸n")
882
 
883
  # Salidas
884
  estado_regresion_output = gr.Textbox(label="Estado de la Regresi贸n", interactive=False)
885
+ grafico_original_output = gr.Plot(label="Gr谩fico Original")
886
+ grafico_personalizado_output = gr.Plot(label="Gr谩fico Personalizado")
887
+ tabla_resumen_output = gr.DataFrame(label="Tabla Resumida")
888
 
889
  # Eventos para actualizar las opciones de filas
890
  def actualizar_opciones_filas(df):
 
1053
  # Evento al presionar el bot贸n de calcular regresi贸n
1054
  calcular_regresion_btn.click(
1055
  fn=calcular_regresion_tabla_principal,
1056
+ inputs=[
1057
+ tabla_output, unidad_input, filas_seleccionadas,
1058
+ palette_puntos_regresion, estilo_puntos_regresion,
1059
+ palette_linea_ajuste_regresion, estilo_linea_ajuste_regresion,
1060
+ mostrar_linea_ajuste_regresion, mostrar_puntos_regresion
1061
+ ],
1062
+ outputs=[estado_regresion_output, grafico_original_output, grafico_personalizado_output, tabla_resumen_output]
1063
  )
1064
 
1065
  # Lanzar la interfaz