首页 > 解决方案 > 格式化分箱时间(连续)条形图的轴

问题描述

我在格式化分箱时间条形图的 x 轴时遇到了一些问题。

这是数据:

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

c1 = pd.date_range(start="2021-01-01",end="2021-02-15")
c2 = np.random.randint(1,6, size=len(c1))
df = pd.DataFrame({"day": c1, "value": c2})
df = df.drop(np.random.choice(df.index, size=12, replace=False))

这是一种方法,我们称之为A. 这使用 atimeUnit来分箱数据,但在幕后它使用x/x2编码。

c1 = alt.Chart(df).mark_bar().encode\
    ( alt.X("monthdate(day):T")
    , alt.Y("value")
    )

t1 = alt.Chart(df).mark_text(baseline="bottom").encode\
    ( alt.X("monthdate(day):T")
    , alt.Y("value")
    , alt.Text("value")
    )

(c1 + t1).interactive(bind_y=False).properties(width=800)

这是另一种方法,我们称之为B. 这直接使用x/x2编码。

c2 = alt.Chart(df).transform_calculate\
    ( day = "toDate(datum.day)"
    , start = "datum.day - 12*60*60*1000"
    , end = "datum.day + 12*60*60*1000"
    ).mark_bar().encode\
    ( alt.X("start:T")
    , alt.X2("end:T")
    , alt.Y("value")
    )

t2 = alt.Chart(df).mark_text(baseline="bottom").encode\
    ( alt.X("day:T")
    , alt.Y("value")
    , alt.Text("value")
    )

(c2 + t2).interactive(bind_y=False).properties(width=800)

每个都有自己的格式问题,有很多重叠。

一个 ( timeUnit):

  1. 将文本标记、轴标签和轴刻度与条形标记的中心对齐。是否可以通过与数据相关或与缩放相关的量来偏移轴或数据?例如,轴offset以像素为单位,因此不合适。Vega 提供xOffset encoding ,但Altair可能无法使用。遗憾的是bandorbandPosition字段不适用于连续域。

  2. 每个条应该只有一个刻度、一个网格和一个标签。我可以使用 vega-lite 解决这个问题,"axis": {"tickCount": "day"}但这会在 Altair 4.1.0 中生成模式错误。

  3. 年份和月份转换的唯一轴标签格式,包括轴标签内的换行符。我相信注册的自定义格式类型将允许我使用自定义 JavaScript 函数,但我可以使用一个示例。

  4. 根据当前缩放级别下可见的条形图更改轴标签。例如,以高缩放级别添加工作日。按照这个是可以的。我不确定如何,但它可能涉及alt.Condition轴格式字段。然后将此格式字段传递给自定义格式函数(上图,A.3)。

B ( x/ x2):

  1. 时不时地有一半大小的网格。请参阅屏幕截图。这很奇怪。编辑:从下面的截图来看,显然也是一个问题。A到现在都没注意到。

  2. 条形之间的分隔线缺失或不一致。一个可能的解决方案是添加alt.X(..., bin="binned"),但这会删除网格垂直,我还没有考虑将它们添加回来。我不想减小x1-x2宽度,因为这会导致不希望的缩放相关间隙。

  3. 轴标签不一致。我在 x 轴上同时看到了四种不同的标签格式,它比看起来更令人困惑:%a %d, %Y, %b %d, %B. 奇怪的是,这不是 code version 的问题A。希望这可以通过自定义格式函数修复,如A.3. 我看到 vegascale/encode/labels/update/text将 atimeFormat与信号处理程序联系在一起。这与自定义格式功能相同吗?

  4. 与 相同A.2

  5. 与 相同A.3

  6. 与 相同A.4

以下是记录所有这些问题的图像:

一个 ( timeUnit):

枚举图像和文本的所有时间分箱问题

B ( x/ x2):

枚举图像和文本的所有 x1/x2 问题

标签: pythondata-visualizationaltairvega

解决方案


推荐阅读