Altair绘制含线性与多项式回归的分面图故障排查请求
问题排查:Altair分面图中多项式回归无法显示的解决办法
问题描述
需要在Altair中制作分面图,每个分面叠加散点图、线性回归线和多项式回归线,但添加多项式回归后无法正常显示。尝试过调整1、3、5阶多项式,问题依旧。以下是原始数据和代码片段:
原始数据生成代码
years = list(range(2024, 2051)) rcp_scenarios = ['RCP2.6', 'RCP4.5', 'RCP6.0', 'RCP8.5'] data = {"YEAR": years} for rcp in rcp_scenarios: data[rcp] = np.random.uniform(low=500, high=2000, size=len(years)) df = pd.DataFrame(data) df_melted = pd.melt(df, id_vars=["YEAR"], value_vars=rcp_scenarios, var_name="RCP", value_name="RR")
原始绘图代码
scatter = alt.Chart(All_RCP_Df_yearly).mark_circle(size=60, opacity=0.60).encode( x=alt.X('YEAR'), y=alt.Y('RR', title="Annual Precipitation [mm]"), color='RCP', tooltip=['YEAR', 'RR', 'RCP']) linear_regression = alt.Chart(All_RCP_Df_yearly).transform_regression( 'YEAR', 'RR', method='linear', groupby=['RCP'] ).mark_line(opacity=0.75).encode( x='YEAR', y='RR', color='RCP') polynomial_regression = alt.Chart(All_RCP_Df_yearly).transform_regression( 'YEAR', 'RR', method='poly', order=2, groupby=['RCP'] ).mark_line(opacity=0.75, strokeDash=[5, 3]).encode( x='YEAR', y='RR', color='RCP') chart = scatter + linear_regression + polynomial_regression chart = chart.facet( columns=2, facet=alt.Facet('RCP')) chart.display()
问题原因
- 分面与groupby冲突:
facet已经按照RCP完成数据分组,此时在transform_regression中再次使用groupby=['RCP']会导致重复分组,多项式回归的计算结果无法正确映射到对应分面,从而无法显示。 - 数据集名称不匹配:数据生成的是
df_melted,但绘图代码中使用的是All_RCP_Df_yearly,二者需要保持一致。
修复后的完整代码
import altair as alt import pandas as pd import numpy as np # 生成数据 years = list(range(2024, 2051)) rcp_scenarios = ['RCP2.6', 'RCP4.5', 'RCP6.0', 'RCP8.5'] data = {"YEAR": years} for rcp in rcp_scenarios: data[rcp] = np.random.uniform(low=500, high=2000, size=len(years)) df = pd.DataFrame(data) df_melted = pd.melt(df, id_vars=["YEAR"], value_vars=rcp_scenarios, var_name="RCP", value_name="RR") # 绘制散点图 scatter = alt.Chart(df_melted).mark_circle(size=60, opacity=0.60).encode( x=alt.X('YEAR'), y=alt.Y('RR', title="年降水量 [mm]"), color='RCP', tooltip=['YEAR', 'RR', 'RCP'] ) # 线性回归(移除groupby) linear_regression = alt.Chart(df_melted).transform_regression( 'YEAR', 'RR', method='linear' ).mark_line(opacity=0.75).encode( x='YEAR', y='RR', color='RCP' ) # 多项式回归(移除groupby,示例为2阶) polynomial_regression = alt.Chart(df_melted).transform_regression( 'YEAR', 'RR', method='poly', order=2 ).mark_line(opacity=0.75, strokeDash=[5, 3]).encode( x='YEAR', y='RR', color='RCP' ) # 组合图表并分面 chart = (scatter + linear_regression + polynomial_regression).facet( columns=2, facet=alt.Facet('RCP') ) chart.display()
说明
- 移除
transform_regression中的groupby=['RCP'],分面操作已完成分组,回归变换会自动基于每个分面的独立数据计算。 - 统一数据集名称为
df_melted,确保数据来源一致。 - 可通过调整
order参数修改多项式阶数(如1、3、5),用strokeDash区分线性与回归线样式。
内容的提问来源于stack exchange,提问作者Luckasino
相关产品推荐
相关产品推荐

