用散景叠加多条线

问题描述 投票:0回答:1

如何在

bokeh
中的同一个图形上叠加多条线?

这是我尝试过的;考虑以下数据。

import pandas as pd

df = pd.DataFrame(
    {
        "seq": list(range(5)) + list(range(5)),
        "a": ["foo"] * 5 + ["bar"] * 5,
        "b": np.concatenate(
            (np.linspace(1, 5, 5, dtype=int), np.linspace(1, 5, 5, dtype=int) + 3)
        ),
    }
)

我可以画这样的散点图:

cds1 = ColumnDataSource(df)

myfig = figure(y_range=(-1, 10), height=400, width=400)
myfig.scatter(
    "seq",
    "b",
    source=cds1,
    marker=factor_mark("a", ["circle", "diamond"], ["foo", "bar"]),
    color=factor_cmap("a", Category10[3], ["foo", "bar"]),
    size=10,
)

show(myfig)

enter image description here

我希望连接这些点,但我不能将

factor_cmap
figure.line
一起使用。 所以我尝试创建视图并一次调用一个视图,如下所示:

foo = GroupFilter(column_name="a", group="foo")
bar = GroupFilter(column_name="a", group="bar")

myfig2 = figure(y_range=(-1, 10), height=400, width=400)
myfig2.line("seq", "b", source=cds1, view=CDSView(filter=foo), color=Category10[3][0])
myfig2.line("seq", "b", source=cds1, view=CDSView(filter=bar), color=Category10[3][1])

show(myfig2)

但是然后我收到这样的错误:

ERROR:bokeh.core.validation.check:E-1024 (CDSVIEW_FILTERS_WITH_CONNECTED): CDSView filters are not compatible with glyphs with connected topology such as Line or Patch: GlyphRenderer(id='p1094', ...)

我不想使用

figure.multi_line
,因为我想通过在 JS 中重置
CustomJS
来切换
cds1.data
回调中每行的可见性。 我有什么想法可以继续吗?或者也许除了重置之外还有更好的方法来实现这一点
cds1.data

python bokeh interactive
1个回答
0
投票

您可以使用 pandas

groupyby
并为每个组绘制散点和线条渲染器。 使用图例,您可以链接渲染器和图例对象的
click_policy
,您可以定义它的行为方式。

from bokeh.models import ColumnDataSource, FactorRange
from bokeh.plotting import figure, show, output_notebook
output_notebook()

p = figure(y_range=(-1, 10), height=400, width=400)
for name, group in df.groupby('a'):
    if name == 'foo':
        color = 'blue'
        marker = 'circle'
    else:
        color = 'orange'
        marker = 'diamond'
    p.line('seq', 'b', source=group, color=color, legend_label=name)
    p.scatter('seq', 'b', source=group, marker=marker, color=color, size=7, legend_label=name)
    
p.legend.click_policy="hide"

show(p)

connected renderers

© www.soinside.com 2019 - 2024. All rights reserved.