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)
额外验证点
- 进入Vega编辑器后,检查TopoJSON的
id字段类型(应为字符串),确认DataFrame中FIPS_CD类型与其完全一致; - 若问题仍存在,可尝试显式指定
LookupData的键类型:
from_=alt.LookupData(df, key="FIPS_CD:O", fields=["FIPS_COLOR"])
内容的提问来源于stack exchange,提问作者jh_
相关产品推荐
相关产品推荐

