You need to enable JavaScript to run this app. 使用Streamlit+Altair绘制多序列Dataframe并解决transform_fold报错
优惠活动
大模型
产品
解决方案
定价
更多

使用Streamlit+Altair绘制多序列Dataframe并解决transform_fold报错

问题解决:Altair绘制多玩家ELO折线图报错修复

transform_fold作用说明

Altair中的transform_fold对应pandas的melt操作,作用是将宽表转换为长表:

  • 输入参数fold接收要展开的列名列表(也就是你定义的players_names)
  • 默认会生成两个新字段:
    • key:存储原来的列名,即玩家名称
    • value:存储原来列对应的数值,即ELO分数
  • 你也可以通过as_参数自定义生成的字段名,避免记默认名称出错

报错原因

你遇到的报错核心有三点:

  1. transform_fold默认生成的玩家名列是key,你代码中使用的variable字段不存在,Altair找不到对应字段无法推断类型
  2. 没有给字段指定数据类型,Altair可能无法自动识别时间、数值、分类类型
  3. 缺少交互配置,无法实现缩放功能

修复后完整代码

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

# [...获取elo_df的代码部分...]
# 提前将date列转为时间类型,避免X轴显示异常
elo_df['date'] = pd.to_datetime(elo_df['date'])

k = alt.Chart(elo_df).transform_fold(
    fold=players_names,
    # 可选:自定义生成的字段名,后续编码直接用自定义名称即可,更易读
    # as_=['player_name', 'elo_score']
).mark_line().encode(
    # :T表示字段为时间类型
    alt.X('date:T', title='日期'),
    # :Q表示字段为数值类型,Y轴值域按需求设置为1350-1600
    alt.Y('value:Q', scale=alt.Scale(domain=[1350, 1600]), title='ELO分数'),
    # :N表示字段为分类类型,对应玩家名称
    color=alt.Color('key:N', title='玩家'),
).interactive() # 新增这行即可支持缩放、平移交互

st.altair_chart(k, use_container_width=True)

如果你在transform_fold中自定义了字段名,只需要把编码部分的key、value替换为你自定义的名称即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 11:15:04