Сделайте цвет и маркер точек разброса графика боке зависимыми от значений кадра данных - PullRequest
0 голосов
/ 03 июля 2018

Я играл с боке, чтобы получить интерактивный разброс, подсказки, интерактивные легенды и т. Д.

В настоящее время я могу установить цвет точек, используя значения столбца в кадре данных панд позади графика. Однако мне интересно, можно ли также установить тип маркера (ромб, круг, квадрат и т. Д.), Используя другой столбец в кадре данных?

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

1 Ответ

0 голосов
/ 03 июля 2018

Начиная с Bokeh 1.0 это можно сделать с помощью фильтров marker_map и CDS:

from bokeh.plotting import figure, show, output_file
from bokeh.sampledata.iris import flowers
from bokeh.transform import factor_cmap, factor_mark

SPECIES = ['setosa', 'versicolor', 'virginica']
MARKERS = ['hex', 'circle_x', 'triangle']

p = figure(title = "Iris Morphology", background_fill_color="#fafafa")
p.xaxis.axis_label = 'Petal Length'
p.yaxis.axis_label = 'Sepal Width'

p.scatter("petal_length", "sepal_width", source=flowers, legend="species", 
          fill_alpha=0.4, size=12,
          marker=factor_mark('species', MARKERS, SPECIES),
          color=factor_cmap('species', 'Category10_3', SPECIES))

show(p)

enter image description here


СТАРЫЙ ОТВЕТ

Начиная с Bokeh 0.13.0 это все еще открытый запрос объекта, для которого тип маркера можно параметризировать непосредственно из данных: #5884 Создать класс маркеров, который охватывает все маркеры и разрешает определенные тип маркера указывается из данных

Пока это не реализовано, лучше всего использовать CDSView моделей для разделения одного набора данных между несколькими методами глифа:

from bokeh.plotting import figure, show
from bokeh.models import ColumnDataSource, CDSView, GroupFilter
from bokeh.sampledata.iris import flowers

source = ColumnDataSource(flowers)

setosa = CDSView(source=source, filters=[GroupFilter(column_name='species', group='setosa')])
versicolor = CDSView(source=source, filters=[GroupFilter(column_name='species', group='versicolor')])
virginica = CDSView(source=source, filters=[GroupFilter(column_name='species', group='virginica')])

p = figure()

p.circle(x='petal_length', y='petal_width', source=source, view=setosa,
         size=10, color='red', alpha=0.6, legend='setosa')

p.square(x='petal_length', y='petal_width', source=source, view=versicolor,
         size=10, color='green', alpha=0.6, legend='versicolor')

p.triangle(x='petal_length', y='petal_width', source=source, view=virginica,
           size=10, color='blue', alpha=0.6, legend='virginica')

p.legend.location = "top_left"
show(p)

enter image description here

...