python - 格式化分箱时间(连续)条形图的轴
问题描述
我在格式化分箱时间条形图的 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
):
将文本标记、轴标签和轴刻度与条形标记的中心对齐。是否可以通过与数据相关或与缩放相关的量来偏移轴或数据?例如,轴
offset
以像素为单位,因此不合适。Vega 提供xOffset
encoding ,但Altair可能无法使用。遗憾的是band
orbandPosition
字段不适用于连续域。每个条应该只有一个刻度、一个网格和一个标签。我可以使用 vega-lite 解决这个问题,
"axis": {"tickCount": "day"}
但这会在 Altair 4.1.0 中生成模式错误。年份和月份转换的唯一轴标签格式,包括轴标签内的换行符。我相信注册的自定义格式类型将允许我使用自定义 JavaScript 函数,但我可以使用一个示例。
根据当前缩放级别下可见的条形图更改轴标签。例如,以高缩放级别添加工作日。按照这个是可以的。我不确定如何,但它可能涉及
alt.Condition
轴格式字段。然后将此格式字段传递给自定义格式函数(上图,A.3
)。
B ( x
/ x2
):
时不时地有一半大小的网格。请参阅屏幕截图。这很奇怪。编辑:从下面的截图来看,显然也是一个问题。
A
到现在都没注意到。条形之间的分隔线缺失或不一致。一个可能的解决方案是添加
alt.X(..., bin="binned")
,但这会删除网格垂直,我还没有考虑将它们添加回来。我不想减小x1
-x2
宽度,因为这会导致不希望的缩放相关间隙。轴标签不一致。我在 x 轴上同时看到了四种不同的标签格式,它比看起来更令人困惑:
%a %d
,%Y
,%b %d
,%B
. 奇怪的是,这不是 code version 的问题A
。希望这可以通过自定义格式函数修复,如A.3
. 我看到 vegascale/encode/labels/update/text
将 atimeFormat
与信号处理程序联系在一起。这与自定义格式功能相同吗?与 相同
A.2
。与 相同
A.3
。与 相同
A.4
。
以下是记录所有这些问题的图像:
一个 ( timeUnit
):
B ( x
/ x2
):
解决方案
推荐阅读
- python - 在运行时关闭文档
- c# - 打开新表单会导致它在循环/计时器时冻结(不响应)
- windows - 使用 pyinstaller 编译时,ffmpeg 未执行 clip.run()
- php - Woocommerce:更改商店目录页面上产品标题、价格和描述的顺序
- email - mailkit:当它是 Office365 帐户时如何获取电子邮件别名
- javascript - 查询字符串 XSLT
- android - Python kivy android 条码扫描器
- html - 如何在多个文件中重复相同的代码
- java - 如何使用 VersionEye maven 插件在不连接外部站点的情况下扫描 java 依赖项?
- android - 在我获得许可的同时坚持下去