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 dispersión de colores Altair según la condición

Tengo este df:

       x            y          term        s
0  0.000000    0.132653    matlab      0.893072
1  0.000000    0.142857    matrix      0.905120
2  0.012346    0.153061    laboratory  0.902610
3  0.987654    0.989796    be          0.857932
4  0.938272    0.959184    a           0.861948

La variable s nos dice la “distancia” del término desde la línea central (pendiente 1).
Y necesito hacer un gráfico de dispersión que se vea así:

chart

Tengo este código hasta ahora:

chart = alt.Chart(scatterdata_df).mark_circle().encode(
        x = alt.X('x:Q', axis = alt.Axis(tickMinStep = 0.05)),
        y = alt.Y('y:Q', axis = alt.Axis(tickMinStep = 0.05)),
        color=alt.condition('s:Q', alt.value('red'), alt.value('blue')),
        tooltip = ['term']
    ).properties(
        width = 500,
        height = 500
    ) 
chart

Y eso me da un error.

Error de Javascript: Error de análisis de expresión: (s:Q)?”red”:”blue”
Esto generalmente significa que hay un error tipográfico en la especificación del gráfico. Consulta la consola de Javascript para obtener el seguimiento completo.

Cuando solo hago color = 's' obtengo esto, que está más cerca:

chart2

Pero nuevamente necesito ese doble degradado de colores. Sé que el degradado es respecto a la variable s, pero no estoy seguro de cómo hacer que tenga dos degradados, uno para cada lado de la línea central.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para crear un degradado doble de colores, puedes usar el parámetro scale en Altair. Aquí tienes una versión actualizada del código que debería darte el gráfico de dispersión deseado:

    import altair as alt
    import pandas as pd
    
    scatterdata_df = pd.DataFrame({
        'x': [0.000000, 0.000000, 0.012346, 0.987654, 0.938272],
        'y': [0.132653, 0.142857, 0.153061, 0.989796, 0.959184],
        'term': ['matlab', 'matrix', 'laboratory', 'be', 'a'],
        's': [0.893072, 0.905120, 0.902610, 0.857932, 0.861948],
    })
    
    color_scale = alt.Scale(domain=(-1,1), range=['blue', 'white', 'red'])
    
    chart = alt.Chart(scatterdata_df).mark_circle().encode(
            x = alt.X('x:Q', axis = alt.Axis(tickMinStep = 0.05)),
            y = alt.Y('y:Q', axis = alt.Axis(tickMinStep = 0.05)),
            color=alt.Color('s:Q', scale=color_scale),
            tooltip = ['term']
    ).properties(
            width = 500,
            height = 500
    ) 
    chart
    

    En este código, he definido una escala personalizada color_scale que asigna la variable s a un degradado que va desde el azul, pasando por el blanco, hasta el rojo. El parámetro domain=(-1,1) especifica que la escala debe centrarse alrededor de 0 (es decir, la línea central con una pendiente de 1), de modo que los valores positivos de s se asignen a rojo y los valores negativos de s se asignen a azul.

    Con este código, deberías obtener un gráfico de dispersión que se ve como la primera imagen que proporcionaste.

Comments are closed.