Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将mark_线分层到交互式线图上会显著降低Altair中的性能_Python_Pandas_Altair - Fatal编程技术网

Python 将mark_线分层到交互式线图上会显著降低Altair中的性能

Python 将mark_线分层到交互式线图上会显著降低Altair中的性能,python,pandas,altair,Python,Pandas,Altair,我创建了一个虚拟数据集来说明我的问题: import pandas as pd import numpy as np import altair as alt # Use more rows than recommended so it's a bit easier to # see the slowdown with human eyes. alt.data_transformers.disable_max_rows() # Create N rows with 2 columns.

我创建了一个虚拟数据集来说明我的问题:

import pandas as pd
import numpy as np
import altair as alt

# Use more rows than recommended so it's a bit easier to 
# see the slowdown with human eyes.
alt.data_transformers.disable_max_rows()

# Create N rows with 2 columns. 
N=10000
test_df = pd.DataFrame({'t' : range(0, N, 1), # Integers counting up from 0 to N - 1.
                        'A' : np.random.randint(0, 100, size=N)}) # random integer between 0 and 100.
我使用它来创建线图:

test_line = alt.Chart(test_df).mark_line().encode(x='t:Q', y='A:Q').interactive(bind_y=False)
所有这些都很好,即使有5000多行,当我平移和缩放时,渲染的交互式折线图也很快。这显然取决于机器(即,在不同的机器上运行此代码将导致平移和缩放的不同性能)

向前走,我试图画一条垂直线来标记一个兴趣点。代码的灵感来自于

这样,生成的交互式折线图在屏幕上的垂直线的平移和缩放速度

如果我移动绘图,使垂直线不在屏幕上,则平移和缩放再次变得快速

当我尝试将多个图连接在一起时,这个问题会变得更糟,每个图都是交互式的,并且有一条垂直线


有没有更好的方法来画这条垂直线?有什么方法可以预先渲染所有内容并保存到本地文件?我很惊讶(也很困惑)一条线怎么会对渲染速度如此有害。

导致性能损失的不是垂直线而是传输计算。原因是正在为数据框中的每一行计算值,您可以看到,如果单击三点操作按钮“在Vega编辑器中打开图表”,单击右侧的
Data Viewer
,然后选择
Data_1
。我相信这也是为什么这条线在情节中看起来有点粗的原因,可能有10000条线在彼此的上面

要仅创建一行,可以执行以下操作:

v_rule = alt.Chart(pd.DataFrame({'a': [5000]})).mark_rule(color='red').encode(x='a')
alt.layer(test_line, v_rule)

老兄,这就解决了。言语无法形容我有多感激。一般来说,在使用
transform\u calculate
时,尤其是在大型数据集上,我是否应该小心?或者这里的问题是所有的
transform\u calculate
结果堆叠在一起,因此渲染器必须加倍努力才能在一个屏幕上显示10000行?@KenLin Happy it help=)通常,过多的打印元素会减慢交互图表的速度,尤其是当您缩小并将所有视图都放在同一视图中时。我相信,你不需要特别注意
transform\u calculate
。还有一个问题,我实际上没有“织女星编辑器中的开放图表”。相反,我有“查看源代码”和“查看编译的织女星”。我可以使用这两种方法中的任何一种来帮助我调试屏幕上呈现的内容过多吗?我真的没有意识到屏幕上有10000行。我确信这只是一行。@KenLin通常在“查看编译的织女星”下还有一项,所以请确保您可以看到整个菜单。你可以在文档中的图表上看到一个例子,例如这里,嗯,我在工作中使用了一个内部版本。我将尝试在我自己的个人机器上设置一个,看看是否有效。谢谢
v_rule = alt.Chart(pd.DataFrame({'a': [5000]})).mark_rule(color='red').encode(x='a')
alt.layer(test_line, v_rule)