Scatter 对象和 figure.scatter 方法的区别

Difference between Scatter object and figure.scatter method

我有以下与这两张图相关的问题:

图 1:

output_notebook()
scatter = Scatter(df_b, x='log_umsatz', y='log_fte', color='target', legend="top_right")
show(scatter)

图 2

output_notebook()
scatter = figure(plot_width=500, plot_height=500)
scatter.scatter(x=df_b['log_umsatz'], y=df_b['log_fte'], color=df['target'])
p.legend.location = "top_left"
p.legend.click_policy="hide"
show(scatter)

如您所见,我使用散景生成了两个散点图。在第二张图中,我尝试引入一些与 p.legend.click_policy="hide" 的交互性。我有两个问题:交互性不起作用,图例和颜色编码在第二个示例中丢失。怎么会?我希望图 1 和图 2 相同。

您的主要问题是您使用的图 1 Scatter 是散景图模型。 Bokeh Charts 是一个用于绘制数据的高级库,并在幕后为您进行大量数据处理和图表格式化。在图 2 中,您正在使用 Bokeh 字形来创建绘图,因此您需要更加明确地说明您希望它做什么。

修复你的代码,我可以生成与原始散点图相同的图表。

cds = ColumnDataSource(df_b)
color_mapper = CategoricalColorMapper(
    palette=['red', 'green'], factors=[0, 1])

scatter = figure(plot_width=500, plot_height=500)
scatter.circle(x='log_umsatz', y='log_fte',
               color={'field': 'target', 'transform': color_mapper}, alpha=0.5,
               source=cds, legend='target')
scatter.legend.location = "top_right"

如您所见,我们需要调用多个其他散景对象。 ColumnDataSource 存储 pandas 数据,CategoricalColorMapper 将颜色映射到因子。


现在向情节添加交互式图例有点复杂。现在,在 Bokeh 上,交互式图例以每个字形为基础工作。也就是说,每个字形都必须单独绘制才能处理。您可以阅读更多相关信息 here,这里有一个快速演示可以帮助您。

scatter = figure(plot_width=500, plot_height=500)
scatter.circle(x=[1, 2, 3], y=[1, 2, 3], color='red', legend='0', alpha=0.5)
scatter.circle(x=[4, 5], y=[4, 5], color='green', legend='1', alpha=0.5)
scatter.legend.location = "top_right"
scatter.legend.click_policy = "hide"