使用Streamlit+Altair绘制多序列Dataframe并解决transform_fold报错
问题解决:Altair绘制多玩家ELO折线图报错修复
transform_fold作用说明
Altair中的transform_fold对应pandas的melt操作,作用是将宽表转换为长表:
- 输入参数
fold接收要展开的列名列表(也就是你定义的players_names) - 默认会生成两个新字段:
key:存储原来的列名,即玩家名称value:存储原来列对应的数值,即ELO分数
- 你也可以通过
as_参数自定义生成的字段名,避免记默认名称出错
报错原因
你遇到的报错核心有三点:
transform_fold默认生成的玩家名列是key,你代码中使用的variable字段不存在,Altair找不到对应字段无法推断类型- 没有给字段指定数据类型,Altair可能无法自动识别时间、数值、分类类型
- 缺少交互配置,无法实现缩放功能
修复后完整代码
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
相关产品推荐
相关产品推荐

