Search code examples
pythonscatter-plotaltairvega-lite

Altair Color Scatter Plot on Condition


I have this 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

The variable s tells us the "distance" of the term from the central line (slope 1). And I need to make a scatterplot that looks like this:

chart

I have this code so far:

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

And that gives me an error.

Javascript Error: Expression parse error: (s:Q)?"red":"blue"
This usually means there's a typo in your chart specification. See the javascript console for the full traceback.

When I just do color = 's' I get this, which is closer: chart2

But again I need that double-gradient of colors. I know that the gradient is respective of the s variable, but I'm not sure how to make it have two gradients, one for each side of the central line.


Solution

  • s:Q is not a valid conditional statement. But, for example, you could write a condition like this:

      color = alt.condition(alt.datum.s < 0, alt.value('red'), alt.value('blue'))
    

    and points with s < 0 would be colored red, and all others would be colored blue.

    Alternatively, if you want to encode a continuous color scale by the value of s (rather than deciding between two colors based on a condition), you could do

      color = 's:Q'
    

    If you'd like to use a color scheme in this case that's different from the default, you can specify it this way:

      color = alt.Color('s:Q', scale=alt.Scale(scheme='redblue'))
    

    where the string passed to the scheme argument is one of the built-in named color schemes, listed at https://vega.github.io/vega/docs/schemes/#reference

    For more information on customizing colors in Altair, see https://altair-viz.github.io/user_guide/customization.html#customizing-colors