如何在聚合工具提示中显示所有值?

How do I show all values in an aggregated tooltip?

我希望 myval 显示每个汇总年份的每辆车的名称,例如。 “雪佛兰 chevelle malibu”。

[object Object] 似乎与 JavaScript 相关。

import altair as alt
from vega_datasets import data
import pandas as pd
import pdb

df = data.cars()
alt.renderers.enable("altair_viewer")


mychart = (
    alt.Chart(df)
    .transform_joinaggregate(count="count(*)", myval="values(Name)", groupby=["Year"])
    .mark_bar()
    .encode(
        x=alt.X(
            "Year",
            timeUnit=alt.TimeUnitParams(unit="year", step=1),
            type="quantitative",
        ),
        y=alt.Y("count", type="quantitative"),
        tooltip=alt.Tooltip(["myval:N"]),
    )
)

mychart.show()

这是一个很好的问题,我不确定是否有令人满意的答案。这显示为 [object Object], [object Object] 等的原因是因为 values 聚合 returns 每个值的 整行 的列表。所以完整的表示应该是这样的:

[{'Name': 'chevrolet chevelle malibu', 'Miles_per_Gallon': 18.0, 'Cylinders': 8, 'Displacement': 307.0, 'Horsepower': 130.0, 'Weight_in_lbs': 3504, 'Acceleration': 12.0, 'Year': 1970, 'Origin': 'USA'}, {'Name': 'buick skylark 320', 'Miles_per_Gallon': 15.0, 'Cylinders': 8, 'Displacement': 350.0, 'Horsepower': 165.0, 'Weight_in_lbs': 3693, 'Acceleration': 11.5, 'Year': 1970, 'Origin': 'USA'}, ...]

这只是前两个条目!很明显,它不会真正适合工具提示。对于它的价值,较新版本的 Vega 对此进行了改进(您可以通过查看 vega editor 中的等效图表来查看),但它仍然不是您要找的东西。

您需要的是一种从列表中的每个值中提取名称的方法...而且我确信 Vega-Lite 转换提供了任何好的方法来做到这一点(vega expression 语言没有任何类似于列表理解或函数映射的内容。

我能想到的最好的是这样的,显示前 4 个值:

mychart = (
    alt.Chart(df)
    .transform_joinaggregate(count="count(*)", myval="values(Name)", groupby=["Year"])
    .transform_calculate(
        first_val="datum.myval[0].Name",
        second_val="datum.myval[1].Name",
        third_val="datum.myval[2].Name",
        fourth_val="datum.myval[3].Name",
      )
    .mark_bar()
    .encode(
        x=alt.X(
            "Year",
            timeUnit=alt.TimeUnitParams(unit="year", step=1),
            type="quantitative",
        ),
        y=alt.Y("count", type="quantitative"),
        tooltip=alt.Tooltip(["first_val:N", "second_val:N", "third_val:N", "fourth_val:N"]),
    )
)

另一种选择是不使用工具提示,而是使用鼠标悬停时更新的第二个图表:

base = (
    alt.Chart(df)
    .transform_joinaggregate(count="count(*)", values="values(Name)", groupby=["Year"])
)

selection = alt.selection_single(fields=['Year'], on='mouseover', empty='none')

bars = (
    base    
    .mark_bar()
    .encode(
        x=alt.X(
            "Year:N",
            timeUnit=alt.TimeUnitParams(unit="year", step=1),
            type="quantitative",
        ),
        y=alt.Y("count", type="quantitative"),
    )
).add_selection(selection)

text = (
    base
    .transform_filter(selection)
    .transform_flatten(['values'])
    .transform_calculate(Name="datum.values.Name")
    .mark_text()
    .encode(
        y=alt.Y('Name:N', axis=None),
        text='Name:N'
    )
).properties(width=300)

chart2 = bars | text

我很想知道是否有人知道更完整的解决方案。