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.

Gráfico de barras Altair con línea en eje doble con fechas.

Seguí la documentación oficial para crear un gráfico de barras junto con un gráfico de líneas en un eje independiente con fechas en el eje X.

Aquí está el fragmento de código:

df = pd.DataFrame({
        'reportday': ['2021-11-08', '2021-11-09', '2021-11-10', '2021-11-11',
                      '2021-11-12', '2021-11-15', '2021-11-16', '2021-11-17', 
                      '2021-11-18', '2021-11-19'],
        'price': [328.0, 310.0, 301.0, 3330.0, 3278.0, 3200.0, 2189.0, 1701.0, 
                  1698.0, 1703.0],
        'production': [24.75, 16.30, 14.77, 14.10, 27.70, 26.70, 29.05, 19.58, 
                       24.88, 17.35]
})
df['reportday'] = pd.to_datetime(df['reportday'])

base = alt.Chart(df).encode(x=alt.X('reportday:T',
                                     axis=alt.Axis(labelAngle=325)))
line = base.mark_line(color='red').encode(y=alt.Y('price:Q',
                                                   axis=alt.Axis(grid=True)))
bar = base.mark_bar().encode(y='production:Q')
c = (line + bar).resolve_scale(y='independent').properties(width=600)

Intenté ajustar el ancho, pero la última etiqueta del eje x (Fri 19 en el caso anterior) aún se corta. ¿Alguna sugerencia para evitar esto?

Además, como puede ver, hay dos fechas (Sat 13 y Sun-14) en el gráfico, aunque el marco de datos no tiene esos valores (no hay datos para fines de semana). Esto crea una gran brecha en el gráfico, especialmente cuando hay muchas más filas durante varios meses. ¿Cómo puedo evitar que estas fechas aparezcan en el gráfico?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para evitar que la etiqueta del eje-x se corte, se puede aumentar el ancho del gráfico o ajustar el labelAngle a un valor más pequeño, como labelAngle=290. Esto girará las etiquetas del eje-x a un ángulo mejor que se ajuste al ancho del gráfico.

    Para evitar que los fines de semana aparezcan en el gráfico, se puede filtrar el marco de datos para incluir solo los días de la semana utilizando el atributo dt.weekday que devuelve el día de la semana como un entero, donde el lunes es 0 y el domingo es 6.

    Aquí está el fragmento de código modificado:

    import pandas as pd
    import altair as alt
    
    df = pd.DataFrame({
        'reportday': ['2021-11-08', '2021-11-09', '2021-11-10', '2021-11-11', '2021-11-12', '2021-11-15', '2021-11-16', '2021-11-17', '2021-11-18', '2021-11-19'],
        'price': [328.0, 310.0, 301.0, 3330.0, 3278.0, 3200.0, 2189.0, 1701.0, 1698.0, 1703.0],
        'production': [24.75, 16.30, 14.77, 14.10, 27.70, 26.70, 29.05, 19.58, 24.88, 17.35]
    })
    
    df['reportday'] = pd.to_datetime(df['reportday'])
    df = df[df['reportday'].dt.weekday < 5] # Filtrar solo los días de la semana
    
    base = alt.Chart(df).encode(
        x=alt.X('reportday:T', axis=alt.Axis(labelAngle=290))
    )
    
    line =  base.mark_line(color='red').encode(
        y=alt.Y('price:Q', axis=alt.Axis(grid=True))
    )
    
    bar = base.mark_bar().encode(
        y='production:Q'
    )
    
    c = (line + bar).resolve_scale(y='independent').properties(width=600)
    

    Esto debería crear un gráfico sin fines de semana y con las etiquetas del eje-x ajustadas al ancho del gráfico.

Comments are closed.