图中的 Altair 缺失值

Altair missing value in graph


我想使用 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-04','2020-04-05','2020-04-06'],
                    'ID': ['a','a','a','a','b','b','b','b'],'bar': [np.nan,8,np.nan,np.nan, np.nan, 8,np.nan,np.nan],
                    'line': [8,np.nan,10,8, 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')

它给出了这张图片

有谁知道为什么这条线有断点 (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-04','2020-04-05','2020-04-06'],
                    'ID': ['a','a','a','a','b','b','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')

如果你放弃 NaN,你会得到你想要的行为

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

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

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