2016-01-11 1 views
2

У меня есть два связанных участка рассеяния с точками, которые имеют разные непрозрачности. Проблема в том, что при выборе некоторых точек с помощью инструмента выбора окна все невыбранные точки становятся одинаковыми непрозрачностью.Есть ли способ иметь многократные непрозрачности для неэлементного глифа в боке?

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

Есть ли способ, которым я могу достичь этого в API построения чертежей?

Могу ли я продлить nonselection_glyph, чтобы его альфа-атрибут принимал массив значений непрозрачности, таких как альфа-атрибут маркера круга?

import numpy as np 
from bokeh.plotting import output_file, figure, gridplot, show 
from bokeh.models import ColumnDataSource, Circle 

N = 100 
max = 100 
x1 = np.random.random(size = N) * max 
y1 = np.random.random(size = N) * max 
a1 = np.random.choice(a = [0.2, 0.5, 1], size = N) 
x2 = np.random.random(size = N) * max 
y2 = np.random.random(size = N) * max 
a2 = np.random.choice(a = [0.2, 0.5, 1], size = N) 

output_file('scatter.html') 
source = ColumnDataSource(data = dict(x1 = x1, y1 = y1, x2 = x2, y2 = y2, 
             a1 = a1, a2 = a2)) 

left = figure(tools = 'box_select, tap', width = 400, height = 400, 
       x_range = (0,100), y_range = (0,100)) 
right = figure(tools = 'box_select, tap', width = 400, height = 400, 
       x_range = (0,100), y_range = (0,100)) 

points1 = left.circle('x1', 'y1', source = source, size = 10, 
         fill_color = 'blue', line_color = None, alpha = 'a1') 
points2 = right.circle('x2', 'y2', source = source, size = 10, 
         fill_color = 'blue', line_color = None, alpha = 'a2') 
points1.selection_glyph = Circle(fill_color = 'red', line_color = None) 
points2.selection_glyph = Circle(fill_color = 'red', line_color = None) 

p = gridplot([[left, right]]) 
show(p) 

ответ

1

Попробуйте это:

import numpy as np 
from bokeh.plotting import output_file, figure, gridplot, show 
from bokeh.models import ColumnDataSource, Circle 

N = 100 
max = 100 
x1 = np.random.random(size = N) * max 
y1 = np.random.random(size = N) * max 
a1 = np.random.choice(a = [0.2, 0.5, 1], size = N) 
x2 = np.random.random(size = N) * max 
y2 = np.random.random(size = N) * max 
a2 = np.random.choice(a = [0.2, 0.5, 1], size = N) 

source = ColumnDataSource(data = dict(x1 = x1, y1 = y1, x2 = x2, y2 = y2, 
             a1 = a1, a2 = a2, a1n = a1 * 0.5, a2n=a2*0.5)) 

left = figure(tools = 'box_select, tap', width = 400, height = 400, 
       x_range = (0,100), y_range = (0,100)) 
right = figure(tools = 'box_select, tap', width = 400, height = 400, 
       x_range = (0,100), y_range = (0,100)) 

points1 = left.circle('x1', 'y1', source = source, size = 10, 
         fill_color = 'blue', line_color = None, alpha = 'a1') 
points2 = right.circle('x2', 'y2', source = source, size = 10, 
         fill_color = 'blue', line_color = None, alpha = 'a2') 
points1.selection_glyph = Circle(fill_color = 'red', line_color = None) 
points2.selection_glyph = Circle(fill_color = 'red', line_color = None) 
points1.nonselection_glyph.fill_alpha = "a1n" 
points2.nonselection_glyph.fill_alpha = "a2n" 
p = gridplot([[left, right]]) 
show(p) 
0

Я обнаружил, что nonselection_glyphможет принять массив значений непрозрачности, но этот массив должен быть в ColumnDataSource.