从 DataFrame 派生时,ColumnDataSource 是否会更改行顺序?

Does a ColumnDataSource change the row order when deriving from a DataFrame?

我希望依靠数据框的顺序按各种数据集群的组大小进行排序,以便分类中人口最多的级别出现在数据框的早期,而少数稀有种群出现在最后。我追求的目标是确保我的稀有种群始终出现在散点图的 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 是否重新排列我的数据以便渲染器遵守重新排列的 [=11] 中的顺序外,我根本无法解释=] 而不是我原来的 DataFrame。这是准确的吗? Bokeh 如何根据 DataFrame 的行顺序确定 z 顺序,两者之间是否存在任何可预测的关系?

聚类的真正问题是我们有一个包含数十万个数据点的完整事件记录。算法对数据进行子采样以进行分类,然后我采用子样本分类并根据这些标签有条件地为数据点着色。大部分数据是未采样的,我希望它能在后台播放。采样数据和未采样数据都在相同的 ColumnDataSource 中,这很方便,而不是绘制两个不同的字形,我可能会考虑强制使用 z 顺序。在下面的散点图中,灰色数据点代表未采样的数据。

ColumnDataSource 永远不会改变数据的顺序。然而,为了优化绘图和命中测试,点从 CDN 复制并由字形视图放入 spatial index。未指定查询索引时返回点的顺序,这解释了您看到的结果。

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

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