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

Altair热力图离散/分箱配色方案异常问题及修复方法

问题

我想创建一个用离散配色而非连续配色的热力图,需要用到5种颜色,觉得条件语句不太适用。在Google Groups上找到一个示例,但没法完全正常运行,怎么修改代码得到预期的热力图效果?

原代码如下:

import altair as alt
import pandas as pd
import numpy as np

np.random.seed(0)
df = pd.DataFrame({
    'x': np.random.randint(0, 5, 100),
    'y': np.random.randint(0, 5, 100),
    'z': np.random.rand(100)
})

alt.Chart(df).mark_rect().encode(
    x='x:O',
    y='y:O',
    color=alt.Color('mean(z)', bin=alt.Bin(maxbins=5))
)

预期效果:每个矩形根据mean(z)的区间显示5种离散颜色,颜色区分清晰,图例对应不同的数值区间。
实际效果:颜色仍为连续渐变,没有按5个离散区间区分。

解决方案

问题出在直接对聚合后的mean(z)使用bin参数,Altair中这种方式无法正确生成离散的颜色映射。需要先计算分组均值,再对均值分箱,最后将分箱结果作为离散变量映射颜色。

修改后的代码:

import altair as alt
import pandas as pd
import numpy as np

np.random.seed(0)
df = pd.DataFrame({
    'x': np.random.randint(0, 5, 100),
    'y': np.random.randint(0, 5, 100),
    'z': np.random.rand(100)
})

alt.Chart(df).mark_rect().encode(
    x='x:O',
    y='y:O',
    color=alt.Color('z_bin:N', title='Mean(z)区间')
).transform_aggregate(
    mean_z='mean(z)',
    groupby=['x', 'y']
).transform_bin(
    'z_bin', field='mean_z', bin=alt.Bin(maxbins=5)
)

代码说明

  • transform_aggregate:按x和y分组,计算每组的mean(z)并命名为mean_z;
  • transform_bin:对mean_z进行分箱,指定maxbins=5生成5个离散区间,结果存入z_bin;
  • 颜色映射时将z_bin指定为离散类型(:N),触发Altair的离散配色逻辑,实现5种颜色的区分。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 11:15:41