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.

Ver el esquema de colores actual en Altair

Al dibujar un gráfico con varias capas, algunas capas tienen colores incompatibles.

Traté de solucionarlo usando un alt.Scale. El problema es que los colores no coinciden con el tema que había seleccionado. Me gustaría poder usar los colores del tema actual, pero poder elegir cuál se utiliza para cada elemento en el gráfico.

En particular, este es mi código:

make_era_labels = lambda df_slice, mode : \
    alt.Chart(df_slice).mark_text(
        align='right' if mode == 'high' else 'left',
        baseline='top',
        size = 14,
        fontWeight='bold',
        angle = 270,
        dx = -20,#120,
        dy=20,#25
    ).encode(
      text='Era',
      x=alt.X('start', title = x_axis),
      y=alt.value(0 if mode =="high" else 600),  # pixels from top
      color=alt.Color('Era', 
                      legend = None, 
                      scale=alt.Scale(
                          domain=['Pre Deep Learning Era', 'Deep Learning Era', 'Large Scale Era'],
                          range=['yellow', 'blue', 'red']) if large_scale_action == 'isolate' else alt.Undefined
                      )
    )

midpoint = pd.to_datetime(f"{(year_start.year + year_end.year) // 2}-01-01")
left_era_labels = make_era_labels(eras_df[eras_df['start'] < midpoint], "high")
right_era_labels = make_era_labels(eras_df[eras_df['start'] > midpoint], "low")

Dado que estoy creando el gráfico en dos partes, los colores no están coordinados y el primer color del esquema se repite. Pero cuando elijo los colores yo mismo con un alt.Scale, los colores ya no coinciden con el tema.

En lugar de range=['yellow', 'blue', 'red'], me gustaría tener colores correspondientes al tema actual. Por ejemplo, el yellow que aparece ahora es demasiado brillante.

Intenté usar alt.themes.get(), pero eso solo me devuelve de manera poco útil VegaTheme('fivethirtyeight'), el nombre del tema que estoy usando.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Como experto en tecnología de la información especializado en Python y Altair, hay un par de formas en las que podrías intentar resolver este problema. Una opción es utilizar la clase ColorScheme de la librería altair_saver. Esta librería está diseñada para funcionar con Altair y brinda funcionalidades adicionales que no están disponibles en el paquete básico de Altair, incluyendo acceso a esquemas de color predefinidos. Aquí hay un ejemplo de código que demuestra cómo utilizar este enfoque:

    import altair_saver
    import altair as alt
    
    # Define una lista de colores para utilizar. Puedes elegir entre los esquemas de color predefinidos o crear el tuyo propio.
    colors = altair_saver.ColorScheme('tableau10').colors
    
    # Utiliza altair_saver para generar una escala de color utilizando estos colores
    color_scale = alt.Scale(domain=['Era Pre Aprendizaje Profundo', 'Era de Aprendizaje Profundo', 'Era a Gran Escala'],
                            range=colors)
    
    # Ahora utiliza esta escala en tu gráfica
    make_era_labels = lambda df_slice, mode: \
        alt.Chart(df_slice).mark_text(
            align='right' if mode == 'high' else 'left',
            baseline='top',
            size=14,
            fontWeight='bold',
            angle=270,
            dx=-20,  # 120,
            dy=20  # 25
        ).encode(
            text='Era',
            x=alt.X('start', title=x_axis),
            y=alt.value(0 if mode == "high" else 600),  # píxeles desde la parte superior
            color=alt.Color('Era',
                            legend=None,
                            scale=color_scale,  # Utiliza la escala de color que definimos anteriormente
                            )
        )
    
    midpoint = pd.to_datetime(f"{(year_start.year + year_end.year) // 2}-01-01")
    left_era_labels = make_era_labels(eras_df[eras_df['start'] < midpoint], "high")
    right_era_labels = make_era_labels(eras_df[eras_df['start'] > midpoint], "low")
    

    Este código crea un objeto ColorScheme, el cual se utiliza para definir una escala de color para el gráfico. La clase ColorScheme brinda acceso a una variedad de esquemas de color incorporados que puedes utilizar, y también puedes crear el tuyo propio pasando una lista de colores. Aquí he utilizado el esquema de color “tableau10”, el cual consiste en 10 colores distintos que están optimizados para su uso en visualizaciones de datos.

    Por defecto, la clase ColorScheme devuelve una lista de valores RGB. Sin embargo, Altair espera que los colores se especifiquen utilizando códigos hex. Para convertir los valores RGB a códigos hex, podemos utilizar la función rgb2hex de la librería matplotlib, de la siguiente manera:

    import matplotlib.colors
    
    # Convierte los valores RGB a códigos hex
    colors = [matplotlib.colors.rgb2hex(color) for color in colors]
    

    Ahora tienes una lista de códigos hex que se pueden utilizar para definir el rango de tu escala de color. O, simplemente podrías utilizar los valores RGB y Altair automáticamente los convertirá a códigos hex.

    Ten en cuenta que, dependiendo del tema que estés utilizando, es posible que debas ajustar los colores para lograr el efecto deseado. Es posible que necesites experimentar con diferentes esquemas de color para encontrar uno que funcione bien con el tema que has elegido. Pero una vez que hayas encontrado algo que funcione, utilizar un esquema de color predefinido puede ser una forma fácil de asegurarte de que tus colores se ajusten al estilo general de tu gráfica.

Comments are closed.