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.

Varios gráficos en la misma figura, coordenadas de tiempo, usando python.

Estoy intentando trazar múltiples gráficos en la misma figura usando Python. El gráfico debe ser lineal, las coordenadas x representan la hora del día y las coordenadas y coinciden con los valores. Cada gráfico corresponde a una fecha diferente.

Los datos se almacenan dentro de un diccionario. Las claves representan las fechas y los valores contienen 2 listas: la primera coincide con las coordenadas x y la segunda con las coordenadas y.
Por ejemplo:

dict_data = {"4 Abril": [[datetime(1900, 1, 1, 22, 59), datetime(1900, 1, 1, 23, 1), datetime(1900, 1, 1, 23, 8), datetime(1900, 1, 1, 23, 50)], [405, 320, 300, 360]], "5 Abril": [[datetime(1900, 1, 1, 8, 10), datetime(1900, 1, 1, 9, 40), datetime(1900, 1, 1, 11, 8), datetime(1900, 1, 1, 11, 10)], [120, 20, 10, 0]]}

Encontré un artículo en Stack Overflow, “Plotting time in Python with Matplotlib”, pero no fue útil porque el eje x en el gráfico que crearon está en tipo “datetime”, mientras que yo uso “datetime.time” (no quiero que el eje x muestre las fechas). Además, el gráfico que crearon es un gráfico de dispersión, mientras que yo lo necesito lineal.

Esto es lo que intenté:

def multiple_plots(dict_data):
    """
    Método para trazar múltiples gráficos en una sola figura.
    Recibe un diccionario con la representación de los datos en el archivo CSV.
    Cada clave en el diccionario representa una fecha diferente que tendrá su propio gráfico en el gráfico.
    """
    for date, coordinates in dict_data.items():
        time_coordinates = coordinates[0]
        # convirtiendo las coordenadas x al tipo datetime.time a int
        x_coordinates = matplotlib.dates.date2num(time_coordinates)
        val_coordinates = coordinates[1]
        plt.plot(list(map(int, x_coordinates)), list(map(int, val_coordinates)), label=date)

    plt.legend(loc='mejor')
    plt.show()
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Este código parece ir en la dirección correcta. Sin embargo, un problema es que el eje x actualmente muestra números en lugar de la hora del día real. Para solucionar esto, puedes usar la función xticks de matplotlib para establecer las etiquetas de los marcadores para mostrar la hora del día como una cadena. Aquí tienes una versión actualizada del código:

    import matplotlib.pyplot as plt
    import matplotlib.dates as mdates
    
    def multiple_plots(dict_data):
        """
        Método para graficar múltiples veces en una figura.
        Recibe un diccionario con la representación de los datos en el archivo csv.
        Cada clave en el diccionario representa una fecha diferente que tendrá su propia gráfica en el gráfico.
        """
        # configura la gráfica
        fig, ax = plt.subplots()
        ax.set_xlabel('Hora del día')
        ax.set_ylabel('Valores')
    
        # grafica los datos de cada fecha
        for date, coordinates in dict_data.items():
            time_coordinates = coordinates[0]
            x_coordinates = mdates.date2num(time_coordinates)
            val_coordinates = coordinates[1]
            ax.plot(x_coordinates, val_coordinates, label=date)
    
        # formatea las etiquetas de los marcadores del eje x para mostrar solo la hora del día
        ax.xaxis.set_major_locator(mdates.HourLocator(interval=1))
        ax.xaxis.set_major_formatter(mdates.DateFormatter('%H:%M'))
    
        # muestra la leyenda y la gráfica
        ax.legend(loc='best')
        plt.show()
    

    Este código debería crear una gráfica con un eje x lineal que muestra la hora del día, y líneas separadas para los datos de cada fecha.

Comments are closed.