我可以使用altair / vega查找表来选择不是联接字段的行(即使用数据+元数据文件)吗?

时间:2020-07-31 18:25:10

标签: altair vega-lite

如何从数据和元数据表创建altair / vega折线图,而数据表太大而无法容纳在内存中?也可以使用查找来选择不是联接字段的行

为简单起见,我将其显示为Altair + Pandas,但实际数据表非常庞大,因此我希望从json或csv加载它们。

我有一个类似的数据表:

data = pd.DataFrame([
        ('A', 0.5, 0.45, 0.2, 0.25, 0.55, 0.45, 0.4, 0),
        ('B', 0.2, 0.3, 0.1, 0, 0.15, 0.25, 0.1, 0),
        ('C', 0.3, 0.25, 0.7, 0.75, 0.3, 0.3, 0.5, 1),
    ],
    columns = ('gene', 's1r1t1', 's1r2t1', 's1r1t2', 's1r2t2', 's2r1t1', 's2r2t1', 's2r2t1', 's2r2t2'),
).set_index('gene')

(实际上有5万行)

具有相应的元数据,例如:

md = pd.DataFrame([
        ('s1r1t1', 1, 1, 1),
        ('s1r2t1', 1, 2, 1),
        ('s1r1t2', 1, 1, 2),
        ('s1r2t2', 1, 2, 2),
        ('s2r1t1', 2, 1, 1),
        ('s2r2t1', 2, 2, 1),
        ('s2r2t1', 2, 1, 2),
        ('s2r2t2', 2, 2, 2),
    ],
    columns = ('sample', 'subject', 'replicate', 'timepoint'),
).set_index('sample')

(实际上有4个重复,6个时间点和5个实验条件)

并希望按时间点显示单个基因的表达水平图。

对于这样的小集合,我可以将其绘制成图形:

data_melt = data.reset_index().melt(
    id_vars='gene',
    var_name='sample',
)

merged = pd.merge( 
    left=md.reset_index(), 
    right=data_melt, 
    left_on='sample',
    right_on='sample',
    
)

dropdown = alt.selection_single(
    fields=['gene'], 
    bind=alt.binding_select(options=data.index.to_list()),
    name='gene',
    init={'gene': data.index[0]}
)

alt.Chart(
    merged
).mark_line(
).encode(
    x='timepoint:O',
    y='mean(value):Q'
).add_selection(
    dropdown
).transform_filter(
    dropdown
)

但是,我想以某种方式仅从数据表中加载一小部分(理想情况下是单个基因)。 我一直在尝试类似的方法:

# Create files and serve them via proxy
data_fname = 'data.csv'
data.to_csv(data_fname)
md_fname =  'metadata.csv'
md.to_csv('metadata.csv')
alt.data_transformers.enable('data_server')

# Build chart
lookup = alt.LookupData(
    data=data_fname,
    key='gene',
    fields=md.index.to_list(),
)

c = alt.Chart(md_fname).mark_point().encode(
    x='timepoint:O',
    y='gene:Q'
).add_selection(
    dropdown
).transform_filter(
    dropdown
).transform_lookup(
    from_=lookup,
    lookup='gene', 
)

但是显然已经弄乱了查找,因为无论是在开发笔记本中还是在Web服务器上的已导出HTML中,图表均不显示任何内容,并且JSON中固定了指向实际文件的url。

这可能吗?如果可以,我在做什么错了?

1 个答案:

答案 0 :(得分:0)

当前没有使用Altair或Vega-Lite进行动态数据加载的内置方法,但是正在努力处理更大的数据集并将计算推入数据库后端。有关详细信息,请参见https://github.com/vega/scalable-vega