交互式 Altair 图中的条形宽度

时间:2021-01-20 06:25:11

标签: python data-visualization altair

如何使条形达到一整天的宽度?现在,这些条形更像是划分一天的开始的线。我是否从条形标记切换到矩形标记?我玩乐队秤吗?还是在不修改数据的情况下强制分箱?

现在酒吧太薄了。因为图表是交互式的,所以我无法设置条形宽度;宽度与缩放无关。缩小太远,条形开始重叠。放大得太远,它们又看起来像线条。

天数位于 x 轴上。标签不应该改变。该图是交互式的,其宽度是固定的。条形之间的空白应反映缺失的天数,而不是用条形填充。

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

c1 = np.random.randint(1,6, size=15)
c2 = pd.date_range(start="2021-01-01",end="2021-01-15")
df = pd.DataFrame({"day": c2, "value": c1})
df = df.drop([2, 5,6,7,13])
alt.Chart(df).mark_bar().encode(alt.X("day:T"), alt.Y("value")).interactive(bind_y=False).properties(width=800)

example of thin bars

理想情况下,当条形图填满一整天时,日期标记应以条形图为中心(而不是在开始处)。

1 个答案:

答案 0 :(得分:2)

您可以通过将 timeUnitordinal encoding 结合使用来实现此目的。即替换

alt.X("day:T")

alt.X("date(day):O")

结果如下: enter image description here

根据您想要的轴标签,您可以改用 monthdateyearmonthdate 时间单位。

如果您希望轴仍具有交互性,则不能选择序数编码。在这种情况下,另一种选择是使用 XX2 编码指定条形宽度,以及用于定义限制的计算变换。例如:

alt.Chart(df).transform_calculate(
    day = "toDate(datum.day)",
    start = "datum.day - 12 * 60 * 60 * 1000",  # -12 hours in milliseconds
    end = "datum.day + 12 * 60 * 60 * 1000",    # +12 hours in milliseconds
).mark_bar().encode(
    alt.X("start:T"),
    alt.X2("end:T"),
    alt.Y("value")
).interactive(bind_y=False).properties(width=800)

enter image description here