相当于 Matplotlib 的 Bokeh scatter_matrix
Bokeh equivalent of Matplotlib scatter_matrix
有没有比下面的代码更好的在 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)
特别是我希望能够将整个绘图网格作为一个实体进行缩放和平移,而不是 zoom/pan 鼠标悬停在其上的子图。
一般来说,要链接 panning/zooming,您可以共享要在绘图之间链接的范围。这在用户指南中有描述:
https://docs.bokeh.org/en/latest/docs/user_guide/interaction/linking.html
您还可以查看此链接的 SPLOM 示例:
https://github.com/bokeh/bokeh/blob/master/examples/models/iris_splom.py
该示例 longer/more 冗长,因为它使用了低级别 bokeh.models
API。重要的部分是它在创建的所有绘图上重新使用范围 xdr
和 ydr
。
在您的特定情况下,由于高级图表不预先接受范围参数 (IIRC),我认为您必须修复图表 "after the fact",所以可能是这样的:
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
万一有用,我遇到了同样的问题。事实上,您不希望 所有 轴链接 - 而是每行 y-axis 链接并且每列 x-axis 链接。我很惊讶这不是内置的散景功能。即使 iris 示例也出错了:
http://docs.bokeh.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)
有没有比下面的代码更好的在 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)
特别是我希望能够将整个绘图网格作为一个实体进行缩放和平移,而不是 zoom/pan 鼠标悬停在其上的子图。
一般来说,要链接 panning/zooming,您可以共享要在绘图之间链接的范围。这在用户指南中有描述:
https://docs.bokeh.org/en/latest/docs/user_guide/interaction/linking.html
您还可以查看此链接的 SPLOM 示例:
https://github.com/bokeh/bokeh/blob/master/examples/models/iris_splom.py
该示例 longer/more 冗长,因为它使用了低级别 bokeh.models
API。重要的部分是它在创建的所有绘图上重新使用范围 xdr
和 ydr
。
在您的特定情况下,由于高级图表不预先接受范围参数 (IIRC),我认为您必须修复图表 "after the fact",所以可能是这样的:
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
万一有用,我遇到了同样的问题。事实上,您不希望 所有 轴链接 - 而是每行 y-axis 链接并且每列 x-axis 链接。我很惊讶这不是内置的散景功能。即使 iris 示例也出错了:
http://docs.bokeh.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)