2016-12-02 7 views
0

Я пытаюсь bokeh. До сих пор это довольно забавно. Но я не полностью понимаю это. Моя цель - сделать простую, но интерактивную диаграмму рассеяния.Этикетка и символ цвета в bokeh

У меня есть три основные вопрос:

  1. Я хочу, чтобы маркировать график рассеяния с names
  2. Я хочу разброс быть окрашен в соответствии с colors
  3. Я хотел бы виджеты, где я могу решить, если отображаются цвета и имена.

Вот что я сделал до сих пор. Я пытался использовать LabelSet, но я застрял. Любая помощь очень ценится!

# interactive widget bokeh figure 
from bokeh.io import curdoc 
from bokeh.layouts import row, widgetbox 
from bokeh.models import ColumnDataSource 
from bokeh.models.widgets import Slider, TextInput 
from bokeh.plotting import figure 
from bokeh.models import Range1d, LabelSet, Label 
import numpy as np 

# data 
x = [-4, 3, 2, 4, 10, 11, -2, 6] 
y = [-3, 2, 2, 9, 11, 12, -5, 6] 
names = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'] 
colors =['r', 'y', 'y', 'r', 'g', 'g', 'g', 'g'] 



p = figure(plot_height=400, plot_width=400, title="a little interactive chart",   
       tools="crosshair,pan,reset,save,wheel_zoom", 
       x_range=[-10, 10], y_range=[-10, 10]) 

labels = LabelSet(x='x', y='y', text='names', level='glyph', 
     x_offset=5, y_offset=5) 

p.add_layout(labels) 


p.circle(x, y, fill_color="red", line_color="red", size=6) 

# Set up widgets 
text = TextInput(title="title", value='a little interavtive chart') 

# Set up callbacks 
def update_title(attrname, old, new): 
    p.title.text = text.value 

text.on_change('value', update_title) 

# # Set up layouts and add to document 
inputs = widgetbox(text, names) 

curdoc().add_root(row(inputs, p, width=800)) 
curdoc().title = "Sliders" 

ответ

1

Обычно используется LabelSet настроив его с тем же источником данных, как некоторые глифов визуализатора. Я нахожу каждый раз, когда вы используете источники данных столбцов, лучше всего их просто создать. Вот обновленная версия кода, который делает:

# interactive widget bokeh figure 
from bokeh.io import curdoc 
from bokeh.layouts import row, widgetbox 
from bokeh.models import ColumnDataSource, Range1d, LabelSet, Label 
from bokeh.models.widgets import Slider, TextInput 
from bokeh.plotting import figure 

# data 
x = [-4, 3, 2, 4, 10, 11, -2, 6] 
y = [-3, 2, 2, 9, 11, 12, -5, 6] 
names = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'] 
colors =['r', 'y', 'y', 'r', 'g', 'g', 'g', 'g'] 

# create a CDS by hand 
source = ColumnDataSource(data=dict(x=x, y=y, names=names, colors=colors)) 

p = figure(plot_height=400, plot_width=400, title="a little interactive chart", 
      tools="crosshair,pan,reset,save,wheel_zoom", 
      x_range=[-10, 10], y_range=[-10, 10]) 

# pass the CDS here, and column names (not the arrays themselves) 
p.circle('x', 'y', fill_color="red", line_color="red", size=6, source=source) 

# pass the CDS here too 
labels = LabelSet(x='x', y='y', text='names', level='glyph', 
     x_offset=5, y_offset=5, source=source) 
p.add_layout(labels) 

# Set up widgets 
text = TextInput(title="title", value='a little interavtive chart') 

# Set up callbacks 
def update_title(attrname, old, new): 
    p.title.text = text.value 

text.on_change('value', update_title) 

# # Set up layouts and add to document 
inputs = widgetbox(text) 

curdoc().add_root(row(inputs, p, width=800)) 
curdoc().title = "Sliders" 

Я также удалил names из widgetbox, потому что виджет коробки могут содержать только виджет модели. Может быть, вы собираетесь использовать имена в виде виджета Select или что-то в этом роде?

+0

Ничего себе! Спасибо! Да, я пытаюсь использовать 'Select'. Я совершенно не знаком с боке. Извините за отправку таких новичков! Хотя, вероятно, мне придется сделать это некоторое время ... – Rachel

+0

Не 'fill_color =" red "' overwrite 'colors = colors'? Моя идея заключалась в том, чтобы использовать «цвета» для заполнения глифов отдельно? – Rachel

+0

А ... Мне нужно передать «цвета» с помощью «круга»! Спасибо! – Rachel