Как изменить цвет точечного графика в режиме реального времени боке? - PullRequest
0 голосов
/ 01 мая 2020

Я новичок в Боке и пытаюсь построить интерактивный график рассеяния. На этом графике я хотел бы изменить пороговое значение p, а затем изменить цвета в соответствии с правилом (если F C <0, точки синие; если F C> 0, точки красного цвета. Я пробовал:

from bokeh.plotting import ColumnDataSource, figure, output_file, show, curdoc
from bokeh.models import BoxSelectTool, LassoSelectTool,CustomJS, Slider
from bokeh.transform import linear_cmap
from bokeh.layouts import gridplot, column, row
import pandas as pd
import numpy as np

fc = np.random.uniform(0, 4, 1000)
p_value = np.random.uniform(0,1,1000)

df = pd.DataFrame([fc, p_value], ['FC', 'pvalue']).transpose()
df['log2(fc)'] = np.log2(df['FC'])
df['-log10(p)'] = -np.log10(df['pvalue'])

output_file("df.html")   
y = df['-log10(p)']
x = df['log2(fc)']
col = np.where(y> -np.log10(0.5), np.where( x>-0,  np.where( x<0, '#606060','#E4001B'), '#6194BC'), '#606060' )
source = ColumnDataSource(data=dict(
    x=df['log2(fc)'],
    y=df['-log10(p)'],
    pvalue=df['pvalue'],
    FC = df['log2(fc)'],
    color = col))

TOOLTIPS = [
    ("FC", "@FC"),
    ("pvalue", "@pvalue")
]


TOOLS="hover,crosshair,pan,wheel_zoom,zoom_in,zoom_out,box_zoom,undo,redo,reset,tap,save,box_select,poly_select,lasso_select,"
p = figure(plot_width=500, plot_height=500, tooltips=TOOLTIPS, 
           title="test", tools=TOOLS)

p.circle('x', 'y', size=5, source=source, alpha = 0.5, fill_color = 'color', line_color='color')
p.xaxis.axis_label = "log2(FC)"
p.yaxis.axis_label = "-log10(p)"
p.background_fill_color = "#fafafa"

p_slider = Slider(start=0.0, end=5, step=.01, title="p_value")

callback = CustomJS(args=dict(source=source,plot=p, color_mapper = col, pvalue=p_slider),
                    code="""
    const data = source.data;
    var P = pvalue.value;
    const x = df['p_value']
    const y = df['log2(fc)']
    source.change.emit();
""")



p_slider.js_on_change('value', callback)

layout = row(
    p,
    column(p_slider),
)


show(layout)

Несмотря на то, что при таком подходе мне показана полоса для управления значением p, я не могу управлять полосой и не меняю цвета в соответствии с величиной p ...

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

...