es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Xlsxwriter creando un gráfico que omite las celdas en blanco.

Estoy analizando una lista de datos de Python a Excel. Necesito graficar la relación entre los objetos y el tiempo. Sin embargo, los objetos no tienen todas las columnas llenas. Se ve algo como esto:

enter image description here

Usando XLSXWriter, pude graficar tanto el Objeto A como el Objeto B con respecto al Tiempo. Mi código es algo así:

chart.add_series({
            'name': 'Objeto A',
            'categories': ['Sheet1', 1, 0, 17, 0], # Fila 2 -> 18, columna 0 (Tiempo)
            'values': ['Sheet1', 1, 1, 17, 1]})    # Fila 2 -> 18, columna 1 (Objeto A)
chart.add_series({
            'name': 'Objeto B',
            'categories': ['Sheet1', 1, 0, 17, 0],
            'values': ['Sheet1', 1, 2, 17, 2]})
chart.show_blanks_as('span')

La línea “chart.show_blanks_as(‘span’)” me ha ayudado a conectar los datos existentes con una línea, lo que significa que las celdas “en blanco” se tratan como algunos valores en esa línea recta. Pero, en el eje x todavía se muestran todos los valores del eje x, del 1 al 9.

¿Hay alguna manera de que el eje x solo muestre los valores de “Tiempo” cuando al menos uno de los objetos tiene datos? (Para este ejemplo: 1, 2, 2.5, 3, 4.5, 6, 6.5, 7.5). Esto facilitará a otros usuarios que vean el archivo de Excel conocer el tiempo cuando hay datos reales.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Sí, hay una manera de asegurarse de que el eje x solo muestre valores de “Tiempo” cuando haya datos reales para al menos uno de los objetos. Un enfoque es ajustar dinámicamente el rango del eje x en función de la presencia de datos. Aquí tienes un código de ejemplo que muestra este enfoque:

    # Determinar los valores mínimos y máximos de tiempo para cada objeto
    tiempos_obj_a = [fila[0] for fila in datos if fila[1]]  # Supone que los datos son una lista de tuplas (tiempo, objeto_a, objeto_b)
    tiempos_obj_b = [fila[0] for fila in datos if fila[2]]
    tiempo_minimo = min(min(tiempos_obj_a), min(tiempos_obj_b))
    tiempo_maximo = max(max(tiempos_obj_a), max(tiempos_obj_b))
    
    # Establecer el rango del eje x del gráfico en función de los valores mínimos y máximos de tiempo
    grafico.set_eje_x({
        'valor_minimo': tiempo_minimo,
        'valor_maximo': tiempo_maximo,
        'formato_numero': '0.0',
    })
    
    # Agregar las series de Objeto A y Objeto B como antes
    grafico.agregar_serie({
        'nombre': 'Objeto A',
        'categorias': ['Hoja1', 1, 0, len(datos), 0],
        'valores': ['Hoja1', 1, 1, len(datos), 1],
    })
    grafico.agregar_serie({
        'nombre': 'Objeto B',
        'categorias': ['Hoja1', 1, 0, len(datos), 0],
        'valores': ['Hoja1', 1, 2, len(datos), 2],
    })
    
    # Ocultar las etiquetas del eje x para los valores de tiempo que no tienen datos para ninguno de los objetos
    for i in range(1, len(datos) + 1):
        if datos[i-1][1] == '' and datos[i-1][2] == '':
            grafico.set_eje_x({
                'visible': False,
                'linea': {'ninguna': True},
                'marcador_tick_principal': 'ninguno',
            }, i)
    

    Este código establece el rango del eje x para abarcar solo los valores de tiempo que tienen datos para al menos uno de los objetos. Luego, recorre cada fila de datos y oculta las etiquetas del eje x (es decir, los valores de tiempo) para los cuales no hay datos para Objeto A ni Objeto B. Ten en cuenta que el método grafico.set_eje_x() se llama con un parámetro adicional i, que especifica el índice del punto en el eje x para el cual se están estableciendo las propiedades del eje.

    ¡Espero que esto te ayude! Avísame si tienes alguna pregunta adicional.

Comments are closed.