首页 > 解决方案 > 选择数据会切断 Altair 图中的标签

问题描述

我有一个类似于下面代码生成的 Altair 图表。在选择任何数据之前,我可以在折线图上看到标签(下面的第一张图片)xt但是,选择数据后,数字会出现在轴上并推出标签(下图第二张)。如何不让标签被切断?在我的实际问题中,x 轴和 y 轴的比例在选择之间可能会有很大差异,因此不能对所有可能的选择使用比例。

import altair as alt
import numpy as np
import pandas as pd

n_freq = 5
n_data = 1000

freqs = np.arange(1, n_freq + 1)
df_freq = pd.DataFrame({'f': freqs})
df_data = pd.DataFrame({
    'f': np.repeat(a=freqs, repeats=n_data),
    't': np.tile(A=np.linspace(0, 2, n_data), reps=n_freq),
})
df_data['x'] = np.sin(2 * np.pi * df_data['f'] * df_data['t'])

freq_selection = alt.selection_single(
    fields=('f',),
    empty='none',
    on='mouseover',
    nearest=True,
    clear='mouseout',
) 
freq_table = alt.Chart(df_freq).mark_text().encode(
    y=alt.Y(shorthand='f:Q', axis=None, scale=alt.Scale(domain=(0, n_freq + 1))),
    text='f:N',
).add_selection(freq_selection)
data_plot = alt.Chart(df_data).mark_line().encode(
    x='t:Q',
    y='x:Q',
).transform_filter(freq_selection)

alt.hconcat(freq_table, data_plot, spacing=100).properties(padding=100)

在进行选择之前:

选择前

做出选择后:

选择后

标签: altair

解决方案


vega-lite 渲染器通过显示数据的范围或通过显式比例域来选择轴限制。如果没有显示数据且没有刻度域,则该轴为空。

由于您不想直接设置比例域,解决此问题的一种方法是创建一些定义“默认”域的不可见数据,并将其分层到图表上。例如:

background = alt.Chart(
    {"values": [{"t": 0, "x": 0}, {"t": 1, "x": 1}]}
).mark_point(opacity=0).encode(
    x='t:Q',
    y='x:Q'
)

alt.hconcat(freq_table, background + data_plot, spacing=100).properties(padding=100)

在此处输入图像描述

请注意,空图表现在具有基于此透明数据限制的轴域。


推荐阅读