You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Altair中使用Vega/Vega-Lite规格创建圆形打包图?

Altair中实现Vega圆形打包(pack变换)的方法

Vega原生的pack变换目前并未在Altair的官方API中直接提供,但有几种无需手动修改Vega JSON规格的可行方案:

  • 直接注入Vega-Lite pack变换配置
    Altair的transform()方法支持传入任意符合Vega-Lite规范的变换参数。你可以直接构造pack变换的配置字典传入,示例代码如下:

    import altair as alt
    from vega_datasets import data
    
    # 示例数据源
    source = data.population.url
    
    chart = alt.Chart(source).mark_circle().transform(
        pack={
            "field": "people",  # 用于计算大小的字段
            "sort": {"field": "people", "order": "desc"},  # 排序规则
            "size": {"signal": "width"}  # 布局尺寸
        }
    ).encode(
        x="x:Q",
        y="y:Q",
        size="size:Q",
        color="age:N",
        tooltip=["age:N", "people:Q"]
    )
    

    这种方式直接复用Vega-Lite的pack变换能力,比手动修改JSON更稳定,同时保留Altair的链式调用特性。

  • 封装自定义pack变换函数
    为了提升代码复用性,你可以把pack变换的配置逻辑封装成一个自定义函数:

    def transform_pack(chart, field, sort=None, size=None):
        pack_config = {"field": field}
        if sort:
            pack_config["sort"] = sort
        if size:
            pack_config["size"] = size
        return chart.transform(**{"pack": pack_config})
    
    # 使用示例
    chart = alt.Chart(source).mark_circle()
    chart = transform_pack(chart, "people", sort={"field": "people", "order": "desc"})
    chart = chart.encode(x="x:Q", y="y:Q", size="size:Q")
    
  • 层级数据的替代方案
    若你的数据是树形嵌套结构,也可以通过transform_aggregate处理层级聚合,再结合mark_circle的size和位置编码近似实现圆形打包布局,但这种方法需要手动处理部分布局逻辑,复杂度较高。

需要注意:由于pack变换不属于Altair的官方稳定API,后续版本更新可能存在兼容性风险,建议结合当前使用的Altair和Vega-Lite版本进行测试验证。

内容的提问来源于stack exchange,提问作者Midnighter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 22:15:31