Можно ли легко изменить / создать собственный маркер рассеяния для боке? - PullRequest
3 голосов
/ 16 марта 2019

Я относительно новичок в построении питона и боке.Я пытаюсь использовать график рассеяния для отображения скорости ветра и его направления.Я хотел использовать маркер треугольника и вращение, чтобы указать скорость ветра.Однако, поскольку треугольник по умолчанию в боке - это равносторонний треугольник, направление ветра на самом деле сбивает с толку (вы не можете сказать, какая голова, а какая хвост).

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

Вот пример того, что у меня есть: Диаграмма рассеяния Bokeh с прямоугольным маркером

Для ясности приведу краткий набросок маркера формы, который я ищу: Желаемый прямоугольник и Маркер прямоугольника по умолчанию

EDTI:

Вот примерный набор данных.Я также использовал стрелку, как предложено J'e.Вот пример результата:

Sample Dataset Sample Result

Это работает нормально, но не идеально.Поскольку я планирую внедрить этот график и растянуть его (sizing_mode = "stretch_both"), углы будут отклоняться.Я не думаю, что это было проблемой при использовании прямоугольников и углов для рисования.

1 Ответ

1 голос
/ 16 марта 2019

Кажется, в API нет ничего, что могло бы сделать это напрямую. Используя bokeh.models VeeHead, вы можете нарисовать стрелку VeeHead

import numpy as np
from bokeh.plotting import figure, show, output_file
from bokeh.models import ColumnDataSource
from bokeh.models import Arrow, VeeHead

# Create a sin wave of x/y coordinates 
N = 300
x = np.linspace(0, 4*np.pi, N)
y = np.sin(x)

source = ColumnDataSource(data=dict(x=x, y=y))
TOOLS = "pan,wheel_zoom,box_zoom,reset,save"

# create a new plot and add a renderer
p = figure(tools=TOOLS, width=700, height=700, title=None)
p.line('x', 'y', source=source)


for i in range(N-1):
    p.add_layout(Arrow(end=VeeHead(size=25,fill_alpha=0.5), x_start=x[i], y_start=y[i], x_end=x[i+1], y_end=y[i+1])) 
show(p)

VeeHead no Tail

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

import numpy as np
from bokeh.plotting import figure, show, output_file
from bokeh.models import ColumnDataSource
from bokeh.models import Arrow, VeeHead

# prepare some date
N = 300
x = np.linspace(0, 4*np.pi, N)
y = np.sin(x)

source = ColumnDataSource(data=dict(x=x, y=y))
TOOLS = "pan,wheel_zoom,box_zoom,reset,save"

# create a new plot and add a renderer
p = figure(tools=TOOLS, width=700, height=700, title=None)
p.line('x', 'y', source=source)

for i in range(11, N-1):
    m = (y[i]-y[i-1])/(x[i]-x[i-1])
    Y = m*(x[i]-x[i-10]) # not point slope
    p.add_layout(Arrow(end=VeeHead(size=25,fill_alpha=0.5), x_start=x[i-10], y_start=Y, x_end=x[i], y_end=y[i])) 
show(p)

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...