You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 19:25:53