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

时间:2017-10-28 00:05:39

标签: python bokeh

我希望依靠数据框的顺序来按各种数据集的组大小进行排序,以便分类中人口最多的级别出现在数据框的早期,并且最后会出现小的稀有人群。我追求的目标是确保我的稀有种群总是出现在我的散点图的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是否重新排列我的数据以便渲染器服从重新排列的{{1而不是我原来的ColumnDataSource。这准确吗? Bokeh如何根据DataFrame的行顺序确定z顺序,两者之间是否有任何可预测的关系?

overlaid circles demonstrating confusing z-order

关于群集的真正问题是我们有一个包含数十万个数据点的完整事件记录。算法对数据进行子采样以进行分类,然后我采用那些子采样分类并通过这些标签有条件地着色数据点。大部分数据都是非抽样的,我希望它基本上可以播放到后台。采样和非采样数据都在同一个DataFrame,方便而不是绘制两个不同的字形,我可以考虑强制执行z顺序。在下面的散点图中,灰色数据点表示非抽样数据。 dense scatter plot with unknown z-order behavior

1 个答案:

答案 0 :(得分:1)

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

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

所有这一切,如果您需要显示数十万个点,您可能需要查看DataShader,这是一个快速,可配置的渲染管道,适用于与Bokeh紧密集成的大型数据集。 (已经证明,它可以在很多场合交互式地探索笔记本电脑上的数亿个点)