Python 从数据帧派生时,ColumnDataSource是否会更改行顺序?

Python 从数据帧派生时,ColumnDataSource是否会更改行顺序?,python,bokeh,Python,Bokeh,我希望依靠数据帧的顺序,根据不同数据簇的组大小进行排序,这样分类中人口最多的级别出现在数据帧的早期,少数罕见的群体出现在最后。我追求的目标是确保我的稀有种群在散布图的z顺序中始终出现在顶部 我用一个简单的堆叠圆的例子进行了实验,发现z顺序不是我所期望的,因为它们在我定义的原始数据框中的排列方式 这里有一个简单的例子来演示 import pandas import numpy from bokeh.application.handlers import FunctionHandler from b

我希望依靠数据帧的顺序,根据不同数据簇的组大小进行排序,这样分类中人口最多的级别出现在数据帧的早期,少数罕见的群体出现在最后。我追求的目标是确保我的稀有种群在散布图的z顺序中始终出现在顶部

我用一个简单的堆叠圆的例子进行了实验,发现z顺序不是我所期望的,因为它们在我定义的原始数据框中的排列方式

这里有一个简单的例子来演示

import pandas
import numpy
from bokeh.application.handlers import FunctionHandler
from bokeh.application import Application
from bokeh.models import ColumnDataSource, HoverTool
from bokeh.plotting import figure
from bokeh.server.server import Server

def modify_doc(doc):
    df = pandas.DataFrame()

    theta = numpy.linspace( 0 , 2*numpy.pi , 20 )
    colors = ['yellow' if (c % 2 == 0) else 'blue' for c in range(len(theta))]

    df['X'] = numpy.cos(theta)
    df['Y'] = numpy.sin(theta)

    source = ColumnDataSource(data=df) # does this change the order?

    plot = figure()
    plot.circle('X', 'Y', source=source, radius=0.22 , fill_alpha=1, color=colors)

    plot.add_tools( HoverTool( tooltips=[ ( '(x,y)', '$x,$y') , ( 'index' , "$index" ) ] ) )
    doc.add_root(plot)


bokeh_app = Application(FunctionHandler(modify_doc))

# Setting num_procs here means we can't touch the IOLoop before now, we must
# let Server handle that. If you need to explicitly handle IOLoops then you
# will need to use the lower level BaseServer class.
server = Server({'/': bokeh_app})
server.start()

if __name__ == '__main__':
    print('Opening Bokeh application on http://localhost:5006/')

    server.io_loop.add_callback(server.show, "/")
    server.io_loop.start()
我发现这里有两件事让人困惑,我希望顺序是逆时针运行的,第一象限中的光盘都在后续光盘的下方。相反,我看到的是顶部的光盘和底部的后续光盘。如果数据帧中的最后一个数据点一直打印到第一个数据点,则这种渲染将与反向打印一致。然而,我发现两张光盘之间存在其他不一致之处,这两张光盘相形见绌,除了想知道
ColumnDataSource
是否重新排列了我的数据,以便渲染器遵守重新排列的
ColumnDataSource
中的顺序,而不是我原来的
数据帧
之外,我根本无法解释。这准确吗?Bokeh如何确定相对于数据帧行顺序的z顺序,两者之间是否存在可预测的关系

关于集群的真正问题是,我们有一个包含几十万个数据点的完整事件记录。算法对要分类的数据进行子采样,然后我采用子采样分类,并根据这些标签对数据点进行有条件的着色。大部分的数据是未采样的,我希望它基本上能播放到后台。采样和未采样数据都在同一个<代码> CuthNoDaseSuths<代码>中,这是方便的,而不是绘制两个不同的字形,我可以考虑强迫它们的Z阶。在下面的散点图中,灰色数据点表示未采样的数据。
列数据源不会更改数据的顺序。然而,为了优化绘图和命中测试,从CDN复制点,并通过图示符视图将其放入一个图形中。未指定查询索引时返回点的顺序,这解释了您看到的结果

可能会添加一个选项来禁用空间索引(至少对于绘图而言,在非平凡数据集上进行命中测试是必要的),但这需要新的开发,因此下一步是请求该功能。这应该不是一项艰巨的任务,但核心团队的规模过大,因此,如果你有能力协作并成为一名贡献者,那么这将是增加核心团队的最快途径


综上所述,如果您需要显示数十万个点,您可能需要看一看,这是一个用于与Bokeh紧密集成的更大数据集的快速、可配置的渲染管道。(已经在许多场合演示了在笔记本电脑上以交互方式探索数亿个点)

aha因此,这是一种性能数据结构折衷,以实现Bokeh路线的不同功能(交互是一个巨大的功能)。我尝试使用数据分区和随后的字形构造来强制执行z顺序,似乎没有改变绘图,但我只测试了单个数据集。我来看看DataShader,谢谢你给我的好提示。我认为选择一个选项来使用空间索引来绘图是合理的和相当简单的,所以请考虑为它制定一个GH问题。