Cómo crear una parcela con tonos verticales en matplotlib [duplicar]

Quiero poder replicar la siguiente trama. enter image description here

donde en x eje tengo tiempo y eje tengo el PIB. La línea del PIB es simplemente un historial de tiempo diario (sin importar sus valores), mientras que los datos de recesión tienen la siguiente estructura (las dos variables CGD y Recesión comparten la misma frecuencia diaria de 1/1/59 hasta hoy):

    Date    Regime
1   1/1/59  Normal
2   2/1/59  Normal
3   3/1/59  Normal
4   4/1/59  Normal
5   5/1/59  Normal
6   6/1/59  Normal
...
    
14  2/1/60  Normal
15  3/1/60  Normal
16  4/1/60  Recession
17  5/1/60  Recession
18  6/1/60  Recession
19  7/1/60  Recession
20  8/1/60  Recession
21  9/1/60  Recession
22  10/1/60 Recession
23  11/1/60 Recession
24  12/1/60 Recession
25  1/1/61  Recession
26  2/1/61  Normal
27  3/1/61  Normal

sólo la parte de recesión tiene que ser trazada con esa sombra de luz.

¿Alguien puede ayudar?

Gracias. Luigi

Pregunta hecha hace 3 años, 4 meses, 29 días - Por syntaxsculptor


3 Respuestas:

  • El comentario de BigBen da una buena pista de usar plt.axvspan. Como usted señaló, usted necesita especificar un rango. Especialmente si tiene rangos de fechas (y si sólo hay un valor por fecha), puede especificar el rango a través de (date, date+1day).

    plt.axvspan(day, day + datetime.timedelta(days=1), color="grey", alpha=0.5)
    

    Aquí hay un ejemplo completo:

    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    import datetime
    import random
    
    regime_choices = ["Normal"]*9+["Recession"]
    
    #create sample data and dataframe
    datelist = pd.date_range(start="1959-01-01",end="1960-01-01").tolist()
    df = pd.DataFrame(datelist, columns=["Date"])
    
    regime = [random.choice(regime_choices) for i in range(len(datelist))]
    df["Regime"] = regime
    
    
    #plot command, save object in variable
    plt.plot(df["Date"], np.arange(len(df)))
    
    #filter out recession dates
    recessions = df.loc[df["Regime"] == "Recession", 'Date']
    
    #plot axvspan for every recession day
    for day in recessions:
        plt.axvspan(day, day + datetime.timedelta(days=1), color="grey", alpha=0.5)
        
    plt.show()
    

    Resultado: enter image description here

    Respondida el Dec 17, 2020 a las 16:57 - por codechampionx

    Votos positivos: 0 | Votos negativos: 0

  • El enlace que proporcionaste muestra una pregunta que ya tiene una respuesta, por lo tanto, te recomendaría revisar la respuesta proporcionada en el siguiente enlace: Llenar entre dos líneas verticales.

    En esa respuesta, se explica cómo usar la función fill_between de matplotlib para crear una sombra de luz entre dos líneas verticales en un gráfico. Puedes adaptar esa respuesta a tu caso específico, donde deseas trazar una sombra de luz en la parte de recesión de tu gráfico.

    Si necesitas más ayuda específica para adaptar esa respuesta a tu caso particular, ¡estaré encantado de ayudarte!

    Respondida el Dec 18, 2020 a las 16:55 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • python
    import matplotlib.pyplot as plt
    import pandas as pd
    
    

    Carga los datos PIB y recesión

    pib = pd.read_csv('pib.csv') recesiones = pd.read_csv('recesiones.csv')

    Crea la figura y los ejes

    fig, ax = plt.subplots(figsize=(10, 6))

    Plot del PIB

    ax.plot(pib['Fecha'], pib['PIB'], color='blue', label='PIB')

    Plot de las recesiones

    ax.fill_between(recesiones['Fecha'], 0, 1, color='lightgray', alpha=0.5, label='Recesión')

    Configura las etiquetas de los ejes y el título

    ax.set_xlabel('Fecha') ax.set_ylabel('PIB') ax.set_title('PIB y recesiones')

    Agrega una leyenda

    ax.legend()

    Muestra la trama

    plt.show()

    Respondida el Dec 18, 2020 a las 17:05 - por Gemini

    Votos positivos: 0 | Votos negativos: 0