相当于Matplotlib scatter_matrix的Bokeh

时间:2016-12-02 13:36:37

标签: python matplotlib bokeh

是否有更好的方法可以在Bokeh中复制matplotlibs scatter_matrix(对所有数据绘制所有数据),而不是下面的代码:

    defaults.width = 100
    defaults.height = 100
    scatter_plots = []
    y_max = len(dataset.columns)-1
    for i, y_col in enumerate(dataset):
        for j, x_col in enumerate(dataset):
            df = pd.DataFrame({x_col: dataset[x_col].tolist(), y_col: dataset[y_col].tolist()})
            p = Scatter(df, x=x_col, y=y_col)
            if j > 0:
                p.yaxis.axis_label = ""
                p.yaxis.visible = False
            if i < y_max:
                p.xaxis.axis_label = ""
                p.xaxis.visible = False
            scatter_plots.append(p)
    grid = gridplot(scatter_plots, ncols = len(dataset.columns))
    show(grid)

特别是我希望能够将整个网格图形缩放和平移为单个实体,而不是缩放/平移鼠标悬停在其上的子图。

2 个答案:

答案 0 :(得分:1)

通常,要进行链接平移/缩放,您需要共享要在绘图之间链接的范围。 “用户指南”中对此进行了描述:

http://bokeh.pydata.org/en/latest/docs/user_guide/interaction/linking.html#linked-panning

您还可以查看此链接的SPLOM示例:

https://github.com/bokeh/bokeh/blob/master/examples/models/iris_splom.py

该示例更长/更详细,因为它使用低级bokeh.models API。重要的部分是它会在创建的有关情节中重复使用范围xdrydr

在您的特定情况下,由于高级别图表不能预先接受范围参数(IIRC),我认为您必须修复图表&#34;事后&#34;,所以可能是这样的:

xr = scatter_plots[0].x_range
yr = scatter_plots[0].y_range
for p in scatter_plots:
    p.x_range = xr
    p.y_range = yr

答案 1 :(得分:0)

如果它有用,我遇到了同样的问题。事实上,你并不希望所有轴连接 - 而是每行y轴连接,每列x轴连接。我很惊讶这不是一个内置的散景功能。即使是虹膜,这个例子也会出错:http://bokeh.pydata.org/en/latest/docs/gallery/iris_splom.html

这是我使用的代码段:

def scatter_matrix(dataset):
    dataset_source = ColumnDataSource(data=dataset)
    scatter_plots = []
    y_max = len(dataset.columns)-1
    for i, y_col in enumerate(dataset.columns):
        for j, x_col in enumerate(dataset.columns):
            p = figure(plot_width=100, plot_height=100, x_axis_label=x_col, y_axis_label=y_col)
            p.circle(source=dataset_source,x=x_col, y=y_col, fill_alpha=0.3, line_alpha=0.3, size=3)
            if j > 0:
                p.yaxis.axis_label = ""
                p.yaxis.visible = False
                p.y_range = linked_y_range
            else:
                linked_y_range = p.y_range
                p.plot_width=160
            if i < y_max:
                p.xaxis.axis_label = ""
                p.xaxis.visible = False
            else:
                p.plot_height=140
            if i > 0:
                p.x_range = scatter_plots[j].x_range

            scatter_plots.append(p)

    grid = gridplot(scatter_plots, ncols = len(dataset.columns))
    show(grid)