交互式 Altair 图中的条形宽度
Bar Widths in Interactive Altair Graphs
如何使条形与一整天一样宽?现在,条形图更像是划分当天 start 的线条。我是否从条形标记切换到矩形标记?我会玩带秤吗?还是在不修改数据的情况下强制分箱?
现在条形图太细了。因为图形是交互式的,所以我无法设置条形宽度;宽度与缩放无关。缩小得太远,条形开始重叠。放大得太远,它们看起来又像线条了。
天数在 x 轴上。标签不应该改变。该图是交互式的,其宽度是固定的。条形图之间的空白 space 应反映缺少的天数,而不是用条形图填充。
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)
理想情况下,当条形图填满一整天时,日期标记应位于条形图的中央(而不是在开始处)。
您可以使用 timeUnit with an ordinal encoding 来完成此操作。即替换
alt.X("day:T")
和
alt.X("date(day):O")
结果如下所示:
根据您想要的轴标签,您可以改用 monthdate
或 yearmonthdate
时间单位。
如果您希望轴仍然是交互的,则序号编码不是一个选项。在这种情况下,另一种选择是使用 X
和 X2
编码指定条形宽度,以及用于定义限制的计算转换。例如:
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)
如何使条形与一整天一样宽?现在,条形图更像是划分当天 start 的线条。我是否从条形标记切换到矩形标记?我会玩带秤吗?还是在不修改数据的情况下强制分箱?
现在条形图太细了。因为图形是交互式的,所以我无法设置条形宽度;宽度与缩放无关。缩小得太远,条形开始重叠。放大得太远,它们看起来又像线条了。
天数在 x 轴上。标签不应该改变。该图是交互式的,其宽度是固定的。条形图之间的空白 space 应反映缺少的天数,而不是用条形图填充。
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)
理想情况下,当条形图填满一整天时,日期标记应位于条形图的中央(而不是在开始处)。
您可以使用 timeUnit with an ordinal encoding 来完成此操作。即替换
alt.X("day:T")
和
alt.X("date(day):O")
结果如下所示:
根据您想要的轴标签,您可以改用 monthdate
或 yearmonthdate
时间单位。
如果您希望轴仍然是交互的,则序号编码不是一个选项。在这种情况下,另一种选择是使用 X
和 X2
编码指定条形宽度,以及用于定义限制的计算转换。例如:
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)