如何在Altair中缩放盈利数据以适配股价图层?
解决股价与盈利数据量级差异的叠加显示问题
方法1:使用双Y轴(推荐方案)
双Y轴是处理跨量级数据叠加的标准方案,能让股价和盈利各自使用独立的Y轴刻度,既保留数据准确性,又清晰展示两者的时间对应关系。
实现思路:
- 保留股价图表的原始Y轴(对应50-100美元的股价范围)
- 为盈利图表配置独立的Y轴,通过
resolve_scale(y='independent')让两个图层的Y轴缩放完全独立
示例代码:
# 假设股价图表基础配置如下 price_chart = alt.Chart(price_df).mark_line(color="blue").encode( x='Date:T', y='Close:Q', tooltip=['Date:T', 'Close:Q'] ) # 修改预期盈利图表的Y轴配置,指定独立缩放与轴标签 expected_chart = alt.Chart(earnings_df).mark_point( size=point_size, strokeWidth=stroke_size, color="gray" ).encode( x='Date:T', y=alt.Y( "EstimatedEarning:Q", axis=alt.Axis(title='盈利(美元)', labels=True), scale=alt.Scale(domain=[min_earning, max_earning]) ), tooltip=tooltip, ).transform_filter(date_filter) # 实际盈利图表同理 actual_chart = alt.Chart(earnings_df).mark_point( size=point_size, strokeWidth=stroke_size, color="green" ).encode( x='Date:T', y=alt.Y( "ActualEarning:Q", axis=alt.Axis(title='盈利(美元)', labels=True), scale=alt.Scale(domain=[min_earning, max_earning]) ), tooltip=tooltip, ).transform_filter(date_filter) # 叠加所有图表并启用独立Y轴 combined_chart = (price_chart + expected_chart + actual_chart).resolve_scale( y='independent' ).properties( title=f"{symbol_name} 季度股价与盈利对比", height=500, width=800 )
方法2:对盈利数值进行缩放转换
如果不想使用双Y轴,可以通过计算将盈利数值放大到股价的量级范围,同时在tooltip或轴标签中明确说明实际值。
示例代码:
# 定义缩放系数,比如将盈利乘以100,匹配50-100的股价范围 scale_factor = 100 expected_chart = alt.Chart(earnings_df).mark_point( size=point_size, strokeWidth=stroke_size, color="gray" ).encode( x='Date:T', y=alt.Y( f"EstimatedEarning:Q * {scale_factor}:Q", axis=alt.Axis(title=f'盈利(实际值 = 显示值/{scale_factor} 美元)'), scale=alt.Scale(domain=[50, 100]) # 对齐股价的Y轴范围 ), # Tooltip显示原始盈利值,避免误导 tooltip=[ 'Date:T', alt.Tooltip('EstimatedEarning:Q', title='预期盈利(美元)') ] ).transform_filter(date_filter) # 实际盈利图表同理,之后与股价图表叠加即可
方法3:手动偏移盈利数据(仅可视化需求)
如果只是想让盈利点显示在图表上方区域,可直接手动偏移盈利数值的scale domain,但这种方法会扭曲盈利数据的实际数值关系,仅适合纯展示场景:
expected_chart = alt.Chart(earnings_df).mark_point( size=point_size, strokeWidth=stroke_size, color="gray" ).encode( x=x_axis, y=alt.Y( "EstimatedEarning:Q", axis=alt.Axis(labels=True, title='盈利'), scale=alt.Scale(domain=[min_earning + 49.5, max_earning + 49.5]) # 手动偏移到股价范围 ), tooltip=tooltip, ).transform_filter(date_filter)
内容的提问来源于stack exchange,提问作者engineer-x
相关产品推荐
相关产品推荐

