如何从数据和元数据表创建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。
这可能吗?如果可以,我在做什么错了?
答案 0 :(得分:0)
当前没有使用Altair或Vega-Lite进行动态数据加载的内置方法,但是正在努力处理更大的数据集并将计算推入数据库后端。有关详细信息,请参见https://github.com/vega/scalable-vega。