Как я могу повернуть маркер стрелки на графике боке, чтобы показать направление скорости ветра?

#python #bokeh #scatter-plot #marker

#python #боке #точечный график #маркер

Вопрос:

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

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

вот пример того, что у меня есть: Точечный график боке с прямоугольным маркером

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

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

Пример набора данных
Пример результата

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

Комментарии:

1. Чтобы уточнить, вам нужен график с несколькими треугольниками, каждый из которых «вращается», чтобы указать направление ветра для данного lon / широта? Может быть полезно добавить изображение к вашему сообщению.

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

3. Если вам нравится внешний вид, но вас беспокоит растягивание при изменении угла, возможно, рассмотрение проблемы с точки зрения ограничений помогло бы сделать ваши значения Delta X, Delta Y очень-очень маленькими. Не существует реальной величины изменения размера, которая изменила бы угол. — Если вас устраивает VeeHead, не забудьте принять ответ. За это вы также получите очки репутации.

Ответ №1:

Похоже, в 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)
  

У головы нет хвоста

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

 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)
  

введите описание изображения здесь

Комментарии:

1. Единственная проблема со стрелками заключается в том, что они занимают две точки для рисования (не угол). это легко сделать, если оси x и y имеют одинаковую единицу измерения и одинаковый размер. Это становится сложнее, когда x основано на времени, а y — на милях в час. Теперь, если бы был способ, которым я мог бы получить «длину» оси x и «длину оси y» для определения пропорций, тогда я мог бы использовать это.

2. можете ли вы добавить пару строк ваших данных к вашему первоначальному вопросу? Я думаю, что это все еще можно сделать