图中的 Altair 缺失值

问题描述


我想使用 altair 可视化数据框。 它是一个图形中的一条线和一个条形图,为我的数据框中的每个组 (ID) 绘制。 我的数据框缺少值。根据 https://altair-viz.github.io/user_guide/transform/impute.html 跳过缺失的条目,并在缺失的数据点上画一条线。 这实际上是我想要的,但是根据我的数据,这似乎不起作用。 我的折线图中缺少值。 我准备了一个简单的例子来解释我的问题:
import altair as alt
import numpy as np

#create dataframe
df = pd.DataFrame({'date': ['2020-04-03','2020-04-04','2020-04-05','2020-04-06','2020-04-03','2020-04-06'],'ID': ['a','a','b','b'],'bar': [np.nan,8,np.nan,np.nan],'line': [8,10,4,5,6,7] })

df:
         date ID  bar  line
0  2020-04-03  a  NaN   8.0
1  2020-04-04  a  8.0   NaN
2  2020-04-05  a  NaN  10.0
3  2020-04-06  a  NaN   8.0
4  2020-04-03  b  NaN   4.0
5  2020-04-04  b  8.0   5.0
6  2020-04-05  b  NaN   6.0
7  2020-04-06  b  NaN   7.0

# create graph
bars = alt.Chart(df).mark_bar(color="grey",size=5).encode(
         alt.X('monthdate(date):O'),y='bar:Q')

lines = alt.Chart(df).mark_line(point=True,size=2,).encode(
            alt.X('monthdate(date):O'),y='line:Q')

alt.layer(bars + lines,width=350,height=150).facet(facet=alt.Facet('ID:N'),).resolve_axis(y='independent',x='independent')

它给出了这个图像

enter image description here

有谁知道为什么这条线有一个中断 (a) 以及如何通过丢失的数据点绘制这条线? 我知道我可以使用“估算”来计算平均值并替换缺失值。 但这意味着该日期的数据点实际上并非如此。

感谢您的任何提示、想法或帮助!

解决方法

这是因为您在数据框中将值记录为 NaN,因此此观察有一个有效的日期条目,并且无法绘制 y 轴的 NaN。

这是您目前拥有的:

df = pd.DataFrame({'date': ['2020-04-03','2020-04-04','2020-04-05','2020-04-06','2020-04-03','2020-04-06'],'ID': ['a','a','b','b'],'line': [8,np.nan,10,8,4,5,6,7] })

alt.Chart(df).mark_line(point=True,size=2,).encode(
            alt.X('monthdate(date):O'),y='line:Q')

enter image description here

如果你去掉 NaN,你会得到你想要的行为

alt.Chart(df.dropna()).mark_line(point=True,size=2).encode(
            alt.X('monthdate(date):O'),y='line:Q')

enter image description here

对于上面的示例,如果您希望条形图保留所有值并且不删除行列中带有 NaN 的行,同时仍然使用图层和分面,则需要在两个图表中引用相同的数据框并使用 Altair 的 { {1}} 而不是熊猫 transform_filter

dropna