2015-03-01 14 views
15

Có cách nào để vẽ một đường ngang vô hạn bằng Bokeh không? Điểm cuối của dòng sẽ không bao giờ hiển thị, cho dù người dùng đang phóng to đến mức nào.Đường ngang vô hạn trong Bokeh

Đây là những gì tôi đã thử cho đến nay. Nó chỉ in canvas trống:

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) 

Một cách để đặt điểm cuối cực kỳ cao/thấp và x_range và y_range rất nhỏ so với chúng.

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) 

Tuy nhiên, tôi hy vọng rằng ai đó có giải pháp thanh lịch hơn.

Edit: loại bỏ giải pháp lỗi thời

+1

Nếu bạn đang sử dụng dòng để nhấn mạnh các vùng ô khác nhau, bạn có thể quan tâm đến [BoxAnnotations] mới (http://bokeh.pydata.org/en/latest/docs/user_guide/plotting.html#box -nội dung)! – jhin

+0

Vui lòng xem xét thay đổi câu trả lời được chấp nhận, hoặc 'Span' hoặc 'BoxAnnotation' tốt hơn câu trả lời được chấp nhận cũ. – bigreddot

+0

Bạn nói đúng. Cả hai giải pháp đều hoạt động tốt. Tôi đã chọn các nhịp vì tôi nghĩ chúng có nhiều ý nghĩa hơn "được sử dụng" cho những gì tôi dự định so với các tia vô hạn, nếu điều đó có ý nghĩa gì. –

Trả lời

19

Bạn đang tìm kiếm "nhịp":

nhịp (dòng kiểu chú thích) có một đơn kích thước (chiều rộng hoặc chiều cao) và mở rộng đến cạnh của khu vực ô.

Xin vui lòng, hãy nhìn vào http://bokeh.pydata.org/en/latest/docs/user_guide/annotations.html#spans

Vì vậy, mã sẽ trông giống như:

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) 

Với giải pháp này người dùng được phép xoay và thu phóng theo ý thích. Sự kết thúc của các dòng sẽ không bao giờ xuất hiện.

+0

Tôi tự hỏi: đường thẳng, hình tròn và glyphs khác có thể được vẽ dựa trên" nguồn ". Chúng ta có thể nạp một ColumnDataSource vào đây. Điều này cho phép chúng ta thay đổi ColumnDataSource và do đó tạo ra các lô tương tác với một máy chủ Bokeh. Câu hỏi của tôi: Các chú thích như Span có hoạt động giống nhau không? Nói cách khác, tôi có thể di chuyển đường thẳng đứng xung quanh bằng cách liên kết giá trị "vị trí" với thanh trượt không? – Thornhale

3

Nếu bạn vẽ hai tia từ giữa họ sẽ không trở nên nhỏ hơn khi bạn phóng to hoặc thu kể từ khi chiều dài là trong pixel. Vì vậy, một cái gì đó như thế này:

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") 

Nhưng nếu người dùng quét theo một trong hai hướng kết thúc của tia sẽ hiển thị. Nếu bạn có thể ngăn cản người dùng panning ở tất cả (ngay cả khi họ phóng to) thì đây là một mã đẹp hơn cho một đường ngang.

Nếu người dùng có thể phóng to và xoay bất cứ nơi nào họ muốn, không có cách nào tốt (theo như tôi có thể biết) để có được đường ngang như bạn mô tả.

+0

Cảm ơn!Với một chút sửa đổi, tia sáng đang làm trò lừa. Tôi đang chỉnh sửa câu hỏi của mình. Tuy nhiên, nó không phải là ở tất cả các thanh lịch. –

+0

Câu trả lời này nên được superceded bây giờ rằng 'Spans' có sẵn – bigreddot

7

Các Bokeh documentation on segments and rays chỉ ra các giải pháp sau đây (sử dụng ray):

Để có một “vô hạn” ray, mà luôn luôn mở rộng đến các cạnh của cốt truyện , xác định 0 cho chiều dài.

Và quả thực, đoạn code sau tạo ra một vô hạn, đường ngang:

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)