Как построить одну линию с различными типами штрихов, используя боке? - PullRequest
0 голосов
/ 14 мая 2019

Я пытаюсь построить линию для набора точек. В настоящее время у меня есть набор точек в виде имен столбцов X, Y и Тип в виде фрейма данных. Всякий раз, когда тип равен 1, я хотел бы изобразить точки пунктирной линией, а всякий раз, когда тип равен 2, я хотел бы изобразить точки сплошной линией. В настоящее время я использую цикл for для перебора всех точек и построения каждой точки с помощью plt.dash. Тем не менее, это замедляет время выполнения, так как я хочу построить более 40000 точек. Итак, это простой способ нанести на линию общие точки с другим типом штрихов?

1 Ответ

0 голосов
/ 15 мая 2019

Вы можете реализовать это, нарисовав несколько line сегментов, подобных этому (Bokeh v1.1.0)

import pandas as pd
from bokeh.plotting import figure, show
from bokeh.models import ColumnDataSource, Range1d, LinearAxis

line_style = {1: 'solid', 2: 'dashed'}

data = {'name': [1, 1, 1, 2, 2, 2, 1, 1, 1, 1],
        'counter': [1, 2, 3, 3, 4, 5, 5, 6, 7, 8],
        'score': [150, 150, 150, 150, 150, 150, 150, 150, 150, 150],
        'age': [20, 21, 22, 22, 23, 24, 24, 25, 26, 27]}
df = pd.DataFrame(data)

plot = figure(y_range = (100, 200))
plot.extra_y_ranges = {"Age": Range1d(19, 28)}
plot.add_layout(LinearAxis(y_range_name = "Age"), 'right')

for i, g in df.groupby([(df.name != df.name.shift()).cumsum()]):
    source = ColumnDataSource(g)
    plot.line(x = 'counter', y = 'score', line_dash = line_style[g.name.unique()[0]], source = source)
    plot.circle(x = 'counter', y = 'age', color = "blue", size = 10, y_range_name = "Age", source = source)

show(plot)

enter image description here

...