vega / altair

Declarative statistical visualization library for Python
https://altair-viz.github.io/
BSD 3-Clause "New" or "Revised" License
9.4k stars 795 forks source link

Incorrect conversion to VL of `empty` when using parameter compositions #3598

Open joelostblom opened 2 months ago

joelostblom commented 2 months ago

What happened?

The following code works as expected:

click = alt.selection_point(empty=False)
ctrl_click = alt.selection_point(on='click[event.ctrlKey]', empty=False)

points = alt.Chart(data.cars.url).mark_point().encode(
    x='Horsepower:Q',
    y='Miles_per_Gallon:Q',
    fill=alt.condition(ctrl_click, alt.value('red'), alt.value('white')),
    size=alt.condition(click, alt.value(1000), alt.value(50))
).add_params(
    click, ctrl_click
)

points

image

Open the Chart in the Vega Editor

However, when changing the fill condition to include a parameter composition:

fill=alt.condition(ctrl_click & click, alt.value('red'), alt.value('white')),

The value empty=False is no longer respected for that encoding channel:

image

Open the Chart in the Vega Editor

In the VL spec you can see that this happens because Altair converts the parameter composition into the following VL:

"condition": {
  "test": {"and": [{"param": "param_208"}, {"param": "param_207"}]},
  "value": "red"
},

What would you like to happen instead?

The correct conversion to VL would look like this:

"condition": {
  "test": {"and": [{"param": "param_208", "empty": false}, {"param": "param_207", "empty": false}]},
  "value": "red"
},

Not sure how long this has been present, but as I show above it is not related to the resent introduction of when since it also happens with condition.

Which version of Altair are you using?

5.4.1

dangotbanned commented 2 months ago

This is unrelated to both condition and when.

All of these Parameter methods use Parameter.name only

https://github.com/vega/altair/blob/62cd37774cc1abfe2905b2ae554c75ee33a65907/altair/vegalite/v5/api.py#L391-L421