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

Snowflake中Streamlit应用Altair choropleth无法渲染及配色异常

问题原因与解决方案

核心原因:数据类型不匹配导致Lookup关联失败

在Snowflake的Streamlit环境中,Altair解析TopoJSON的id字段时会默认将其识别为字符串类型,而本地环境可能自动兼容整数与字符串的关联匹配。当你的DataFrame中FIPS_CD是整数类型时,transform_lookup无法将整数1001与字符串类型的TopoJSON id完成匹配,导致所有地理要素的FIPS_COLOR字段返回NaN,最终地图无配色、图例显示NaN。

解决方案:统一数据类型

将DataFrame中的FIPS_CD转换为字符串类型,确保与TopoJSON的id类型一致:

修改后的完整代码:

import streamlit as st
import altair as alt
import pandas as pd
from vega_datasets import data

us_counties = alt.topo_feature(data.us_10m.url, "counties")

dist_background = alt.Chart(us_counties).mark_geoshape(fill="lightgray", stroke="white").project("albersUsa")

# 将FIPS_CD改为字符串类型
df = {"FIPS_CD": "1001",
      "FIPS_COLOR": 1}

df = pd.DataFrame(df, index=[0])

dist_foreground = (
    alt.Chart(us_counties)
    .mark_geoshape()
    .transform_lookup(lookup="id", from_=alt.LookupData(df, "FIPS_CD", ["FIPS_COLOR"]))
    .encode(color=alt.Color("FIPS_COLOR:Q"))
    .project(type="albersUsa")
)

dist_chart = alt.layer(dist_background, dist_foreground).properties(width=800, height=800)
st.altair_chart(dist_chart, use_container_width=True)

如果FIPS_CD是从其他数据源读取的整数,可通过astype统一转换:

df["FIPS_CD"] = df["FIPS_CD"].astype(str)

额外验证点

  1. 进入Vega编辑器后,检查TopoJSON的id字段类型(应为字符串),确认DataFrame中FIPS_CD类型与其完全一致;
  2. 若问题仍存在,可尝试显式指定LookupData的键类型:
from_=alt.LookupData(df, key="FIPS_CD:O", fields=["FIPS_COLOR"])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 00:12:27