如何在Altair折线图中压缩指定X轴日期范围?
问题描述
我有一张燃尽图,X轴为日期,Y轴代表剩余对象数量。当存在大量「停滞」数据(即连续一段时间内无对象完成)时,该部分数据会占据图表过多空间,而图表的后半段才是用户关注的重点。已知两个目标日期,请问是否可以压缩指定的X轴日期范围?
可复现代码示例
import datetime import streamlit as st import altair as alt import pandas as pd x_values = [datetime.date(2022, 1, 7), datetime.date(2022, 1, 28), datetime.date(2022, 1, 29), datetime.date(2022, 1, 30), datetime.date(2022, 1, 31), datetime.date(2022, 2, 1), datetime.date(2022, 2, 2), datetime.date(2022, 2, 3), datetime.date(2022, 2, 4), datetime.date(2022, 2, 5), datetime.date(2022, 2, 6), datetime.date(2022, 2, 7), datetime.date(2022, 2, 8), datetime.date(2022, 2, 9), datetime.date(2022, 2, 10), datetime.date(2022, 2, 11), datetime.date(2022, 2, 12),datetime.date(2022, 12, 8), datetime.date(2023, 8, 20), datetime.date(2023, 8, 21), datetime.date(2023, 8, 22), datetime.date(2023, 8, 23), datetime.date(2023, 8, 24), datetime.date(2023, 8, 25), datetime.date(2023, 8, 26), datetime.date(2023, 8, 27), datetime.date(2023, 8, 28), datetime.date(2023, 8, 29), datetime.date(2023, 8, 30), datetime.date(2023, 8, 31), datetime.date(2023, 9, 1), datetime.date(2023, 9, 2), datetime.date(2023, 9, 3), datetime.date(2023, 9, 4), datetime.date(2023, 9, 5), datetime.date(2023, 9, 6), datetime.date(2023, 9, 7), datetime.date(2023, 9, 8), datetime.date(2023, 9, 9)] y_values = [3521, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 1808.695652173913, 1417.391304347826, 1417.391304347826, 1417.391304347826, 1026.086956521739, 634.782608695652, 243.47826086956502, 0] # 燃尽折线图 line_data = pd.DataFrame({'x': x_values, 'y': y_values}) chart_width = 400 chart_height = 600 line_chart = alt.Chart(line_data).mark_line().encode( x=alt.X('x:T', axis=alt.Axis(title='日期', grid=True, ticks=True, tickCount=12, format='%Y-%m-%d', labelAngle=-45, tickColor='pink', tickSize=10, tickWidth=3)), y=alt.Y('y:Q', axis=alt.Axis(title='剩余对象数')) ) st.altair_chart(line_chart, use_container_width=True)

解决方案
当然可以压缩指定的X轴日期范围,以下是两种实用实现方式:
方法1:直接过滤数据(仅展示关注区间)
如果只需要聚焦目标日期范围内的有效数据,可直接筛选DataFrame,只保留该区间的记录,图表会自动缩小X轴范围,聚焦到核心数据段。
修改后的核心代码:
# 定义目标日期范围(可替换为用户输入) start_date = datetime.date(2023, 8, 20) end_date = datetime.date(2023, 9, 9) # 筛选数据 filtered_data = line_data[(line_data['x'] >= start_date) & (line_data['x'] <= end_date)] # 基于筛选后的数据绘制图表 line_chart = alt.Chart(filtered_data).mark_line().encode( x=alt.X('x:T', axis=alt.Axis(title='日期', grid=True, ticks=True, tickCount=12, format='%Y-%m-%d', labelAngle=-45, tickColor='pink', tickSize=10, tickWidth=3)), y=alt.Y('y:Q', axis=alt.Axis(title='剩余对象数')) )
方法2:保留全量数据,仅压缩显示范围
如果需要保留完整数据但只想聚焦目标区间,可通过Altair的scale参数设置X轴定义域,图表仅展示指定日期范围,同时支持交互缩放等操作。
修改后的X轴编码部分:
x=alt.X('x:T', scale=alt.Scale(domain=[start_date, end_date]), # 指定显示的日期范围 axis=alt.Axis(title='日期', grid=True, ticks=True, tickCount=12, format='%Y-%m-%d', labelAngle=-45, tickColor='pink', tickSize=10, tickWidth=3)),
进阶:添加交互选择功能
结合Streamlit的日期输入组件,让用户手动选择聚焦区间,灵活性更强:
# 在构建DataFrame前添加日期选择组件 start_date = st.date_input("选择起始日期", datetime.date(2023, 8, 20)) end_date = st.date_input("选择结束日期", datetime.date(2023, 9, 9))
内容的提问来源于stack exchange,提问作者Binx
相关产品推荐
相关产品推荐

