web-dev-qa-db-ja.com

ボケの無限水平線

ボケで無限の水平線をプロットする方法はありますか?ユーザーがズームアウトしている距離に関係なく、線の端点が表示されることはありません。

これは私がこれまでに試したことです。空のキャンバスを印刷するだけです:

import bokeh.plotting as bk
import numpy as np

p = bk.figure()
p.line([-np.inf,np.inf], [0,0], legend="y(x) = 0")
bk.show(p)

1つの方法は、エンドポイントを非常に高い/低い値に設定し、図のx_rangeとy_rangeをそれらに対して非常に小さくすることです。

import bokeh.plotting as bk
import numpy as np

p = bk.figure(x_range=[-10,10])
p.line([-np.iinfo(np.int64).max, np.iinfo(np.int64).max], [0,0], legend="y(x) = 0")
bk.show(p)

しかし、誰かがよりエレガントな解決策を持っていることを願っています。

編集:古いソリューションを削除

21

「スパン」を探しています:

スパン(ラインタイプの注釈)は単一の寸法(幅または高さ)を持ち、プロット領域のエッジまで伸びます。

http://docs.bokeh.org/en/latest/docs/user_guide/annotations.html#spans をご覧ください。

したがって、コードは次のようになります。

import numpy as np
import bokeh.plotting as bk
from bokeh.models import Span

p = bk.figure()

# Vertical line
vline = Span(location=0, dimension='height', line_color='red', line_width=3)
# Horizontal line
hline = Span(location=0, dimension='width', line_color='green', line_width=3)

p.renderers.extend([vline, hline])
bk.show(p)

このソリューションを使用すると、ユーザーは自由にパンとズームを行うことができます。行の終わりは表示されません。

38

セグメントと光線に関するボケの説明 は、次のソリューションを示します(rayを使用):

常にプロットのエッジまで伸びる「無限」の光線を作成するには、長さとして0を指定します。

そして実際、次のコードは無限の水平線を生成します。

import numpy as np
import bokeh.plotting as bk
p = bk.figure()
p.ray(x=[0], y=[0], length=0, angle=0, line_width=1)
p.ray(x=[0], y=[0], length=0, angle=np.pi, line_width=1)
bk.show(p)
10
jhin

中央から2本の光線をプロットする場合、長さはピクセル単位であるため、ズームインまたはズームアウトしても光線は小さくなりません。だからこのようなもの:

p.ray(x=[0],y=[0],length=300, angle=0, legend="y(x) = 0")
p.ray(x=[0],y=[0],length=300, angle=np.pi, legend="y(x) = 0")

しかし、ユーザーがどちらかの方向にパンすると、光線の端が表示されます。ユーザーがパンしないように(ズームした場合でも)防止できる場合、これは水平線用の少し優れたコードです。

ユーザーが好きな場所にズームおよびパンできる場合、(私が知る限り)説明したように水平線を表示する良い方法はありません。

3
Alejandro

時系列と組み合わせてスパンを使用する方法について疑問がある場合は、日付をUNIXタイムスタンプに変換します。

start_date = time.mktime(datetime.date(2018, 3, 19).timetuple())*1000
vline = Span(location=start_date,dimension='height', line_color='red',line_width=3)

または、完全な例については このリンク を参照してください。

1
Guido