【问题标题】:altair bar chart with Line on Dual Axis with dates带有日期的双轴线的 altair 条形图
【发布时间】:2021-11-27 09:24:09
【问题描述】:

我按照official docs 创建了一个条形图以及一个独立轴上的折线图,X 轴上是日期。

这里是代码sn-p

df = pd.DataFrame({
    'reportday': ['2021-11-08', '2021-11-09', '2021-11-10', '2021-11-11','2021-11-12', '2021-11-15','2021-11-16', '2021-11-17', '2021-11-18','2021-11-19'],
    'price': [328.0, 310.0, 301.0, 3330.0, 3278.0, 3200.0, 2189.0, 1701.0, 1698.0, 1703.0],
    'production': [24.75, 16.30, 14.77, 14.10, 27.70, 26.70, 29.05, 19.58, 24.88, 17.35]
})
df['reportday'] = pd.to_datetime(df['reportday'])    
base = alt.Chart(df).encode(x=alt.X('reportday:T', axis=alt.Axis(labelAngle=325)))
line =  base.mark_line(color='red').encode(y=alt.Y('price:Q', axis=alt.Axis(grid=True)))
bar = base.mark_bar().encode(y='production:Q')
c = (line + bar).resolve_scale(y='independent').properties(width=600)

输出:

我尝试调整宽度,但最后一个 x 轴标签(上例中为星期五 19)仍然被截断。有什么技巧可以避免这种情况吗?

您还可以看到,图表中绘制了两个日期(周六 13 日和周日 14 日),即使数据框没有这样的值(没有周末的数据)。这在图表中造成了很大的差距,尤其是当几个月有更多行时。如何防止这些日期出现在图表中?

【问题讨论】:

    标签: python data-visualization altair


    【解决方案1】:

    您的示例代码实际上为我显示了周五 19 日,但您可以更明确地通过scale=alt.Scale(domain=['2021-11-08', '2021-11-20']))) 设置域或使用scale=alt.Scale(nice=True)

    我不确定时间轴上是否存在间隙,因为它们本质上是连续的。听起来序数轴可能更适合您?

    base = alt.Chart(df).encode(x=alt.X('monthdate(reportday):O', axis=alt.Axis(labelAngle=325)))
    line =  base.mark_line(color='red').encode(y=alt.Y('price:Q', axis=alt.Axis(grid=True)))
    bar = base.mark_bar().encode(y='production:Q')
    
    (bar + line).resolve_scale(y='independent').properties(width=600)
    

    要解决 VL 中的时区错误(请参阅 cmets),您可以改用 pandas 来格式化日期:

    df['reportday'] = pd.to_datetime(df['reportday']).dt.strftime('%b %d')
    
    base = alt.Chart(df).encode(x=alt.X('reportday:O', axis=alt.Axis(labelAngle=325)))
    

    【讨论】:

    • 优秀的@joelostblom,序数轴是有道理的。这张图看起来好多了。但是我注意到的一件事是日期已经改变了一天(Nov08 现在是 Nov07,Nov19 现在是 Now18 等等),这是时区问题吗?
    • @Neo 有趣一开始我没有注意到,但似乎这个已解决的错误是问题所在,当新版本的 VL 发布并更新 Altair 以支持该问题时,它将被修复版本。 github.com/vega/vega-lite/issues/7795。同时,您可以使用上面更新答案末尾所示的 pandas。
    • 真棒@joelostblom,感谢您的更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-27
    • 1970-01-01
    • 1970-01-01
    • 2019-06-25
    • 1970-01-01
    相关资源
    最近更新 更多