Обратный вызов Bokeh Python, чтобы выделить выборки / переделать источник данных - PullRequest
0 голосов
/ 18 декабря 2018

Я только начинаю с Боке и не могу найти прямых примеров того, чего я пытаюсь достичь.

Вот что у меня есть:

from bokeh.plotting import figure, curdoc, show, output_file
from bokeh.models import ColumnDataSource
from bokeh.layouts import column, row
from bokeh.io import curdoc
import pandas as pd
import numpy as np

#Point data.
df = pd.DataFrame(np.random.randint(0,10,size=(5, 2)), columns=list('XY'),
                  index=['A','B','C','D','E'])

#Line data.
def linecoordinates(ar):
    return [i+ar for i in range(0,5)]
Ldf=pd.DataFrame()
Ldf["Xs"]=df['X'].apply(lambda p: linecoordinates(p))
Ldf["Ys"]=df['Y'].apply(lambda p: linecoordinates(p))


#Plotting points.
pointchart=figure(plot_width=500, plot_height=500, tools='lasso_select',
                  title="Point scatter")
pointchart_source= ColumnDataSource(df)
pointchart.circle("X","Y",source=pointchart_source)


#1. A way to plot the lines.
Lchart1=figure(plot_width=500, plot_height=500, title="By iterating through DF rows")
for r in Ldf.index:
    Lchart1.line(Ldf.loc[r,"Xs"], Ldf.loc[r,"Ys"])


#2. Can't use stored arrays as source.
Lchart2=figure(plot_width=500, plot_height=500, title="Can't get arrays from source")
Lchart2_source= ColumnDataSource(Ldf)
Lchart2.line("Xs", "Ys", source= Lchart2_source)



layout= row(pointchart,Lchart1, Lchart2)
show(layout)



#bokeh serve --show TestApp.py

Я пытаюсь сделать следующее:

  1. Создать источник данных для линейного графика, который будет иметь обычные интерактивные функции, которые обычно предлагает source.В приведенном выше примере кода я могу создать линейную диаграмму, передавая списки координат X / Y на диаграмму, перебирая кадр данных pandas.Последняя часть кода показывает линейную диаграмму, которую я не могу заставить работать, потому что я, вероятно, неправильно передаю списки координат линейной диаграмме.

  2. Я хочуПродемонстрируйте, как использовать обратный вызов Python для выделения линий на линейном графике, выполнив выбор Лассо из точек на точечном графике.Точечные и линейные источники данных будут иметь одинаковые индексы.

  3. Я хочу продемонстрировать, как использовать обратный вызов Python для заполнения линейной диаграммы из лассо-выборок в точечной диаграмме.Точки в разбросе имеют тот же индекс, что и данные линии, которые были сгенерированы заранее.

Спасибо за помощь

1 Ответ

0 голосов
/ 21 декабря 2018

Это не отвечает на вопрос о том, как передавать списки из ColumnDataSource для построения линий, но, вероятно, есть и другой лучший способ.Вот пример, который выполняет пункты 2 и 3 сверху.

from bokeh.plotting import figure, curdoc, show, output_file
from bokeh.models import ColumnDataSource
from bokeh.layouts import column, row
from bokeh.io import curdoc
import pandas as pd
import numpy as np


df = pd.DataFrame(np.random.randint(0,10,size=(5, 2)), columns=list('XY'),index=['A','B','C','D','E'])


#Plotting points on first chart.
pointchart=figure(plot_width=400, plot_height=400, tools='lasso_select',title="Point scatter")
pointchart_source= ColumnDataSource(df)
pointchart_glyph= pointchart.circle("X","Y",source=pointchart_source)

#Making point plot with same source.
linkedpointchart=figure(plot_width=400, plot_height=400, title="Point scatter_LinkedSource")
linkedpointchart.circle("X","Y",source=pointchart_source)


#Making plot populated by updated source.
newplot=figure(plot_width=400, plot_height=400, title="Point scatter New Source via Callback")
newdatasource= ColumnDataSource(df) 
pglyph = newplot.circle(x='X', y='Y', source=newdatasource)


def newsourcecallback(attr, old, new):
        indexvalues =list(pointchart_source.data['index'][new])
        newdataframe= df.loc[indexvalues,:]
        newsource=ColumnDataSource(newdataframe[["X","Y"]])
        pglyph.data_source.data=newsource.data
        print(indexvalues)

pointchart_glyph.data_source.selected.on_change('indices',newsourcecallback) 


layout= row(pointchart,linkedpointchart,newplot)
show(layout)


curdoc().add_root(row(pointchart,linkedpointchart,newplot))


#bokeh serve --show Callback_workingExample.py
...