LƯU Ý: Câu hỏi này liên quan đến máy chủ Bokeh "thế hệ đầu tiên", đã bị ngừng sử dụng và bị xóa trong vài năm. Không có gì trong câu hỏi này hoặc câu trả lời của mình có liên quan đến bất kỳ phiên bản của Bokeh> = 0,11Nhiều câu hỏi với Bokeh hướng đối tượng
Tôi đang cố gắng để hiểu Bokeh cho một ứng dụng tương tác mà tôi đang xây dựng. Tôi đang xem Bokeh examples và tôi thấy rằng hầu hết các ví dụ được viết tất cả trong không gian tên chung, nhưng những cái trong thư mục con "ứng dụng" được viết theo kiểu đẹp, hướng đối tượng, trong đó lớp chính thừa hưởng từ một loại tài sản như HBox.
Đây sẽ là một mớ hỗn độn các câu hỏi vì tôi không nghĩ cách lập trình Bokeh này đã được ghi nhận rất tốt. Điều đầu tiên tôi gặp phải là cốt truyện không vẽ trừ khi tôi bao gồm extra_generated_classes
.
extra_generated_classes làm gì?
Thứ hai, có vẻ như vòng lặp sự kiện
setup_events
được gọi khi khởi động trướccreate
và sau đó mỗi lần âm mưu kích hoạt sự kiện.Tại sao setup_events cần phải đăng ký cuộc gọi lại mỗi lần sự kiện được kích hoạt? Và tại sao nó không chờ đợi để tạo ra để kết thúc trước khi cố gắng đăng ký chúng lần đầu tiên?
Điều cuối cùng tôi không chắc chắn là làm cách nào để buộc vẽ lại Glyph tại đây. Bản trình diễn thanh trượt hoạt động cho tôi và tôi đang cố gắng làm điều tương tự, ngoại trừ với một phân tán thay vì một dòng.
Tôi đặt dấu vết pdb ở cuối của
update_data
và tôi có thể đảm bảo rằngself.source
khớp vớiself.plot.renderers[-1].data_source
và cả hai đều đã được tinh chỉnh ngay từ đầu. Tuy nhiên, bản thân sốself.plot
không thay đổi.Phương pháp tiếp cận hướng đối tượng tương đương với cách gọi store_objects để cập nhật cốt truyện là gì?
Tôi đặc biệt bối rối bởi điều thứ ba này, bởi vì nó không giống như ví dụ sliders_app cần bất cứ điều gì như thế.Để làm rõ, tôi đang cố gắng để thực hiện một số biến của các widget/thanh trượt, vì vậy đây là những gì mã của tôi trông giống như:
lớp thuộc tính:
extra_generated_classes = [['ScatterBias', 'ScatterBias', 'HBox']]
maxval = 100.0
inputs = Instance(bkw.VBoxForm)
outputs = Instance(bkw.VBoxForm)
plots = Dict(String, Instance(Plot))
source = Instance(ColumnDataSource)
cols = Dict(String, String)
widgets = Dict(String, Instance(bkw.Slider))
# unmodified source
df0 = Instance(ColumnDataSource)
phương thức khởi
@classmethod
def create(cls):
obj = cls()
##############################
## load DataFrame
##############################
df = pd.read_csv('data/crime2013_tagged_clean.csv', index_col='full_name')
obj.cols = {'x': 'Robbery',
'y': 'Violent crime total',
'pop': 'Population'
}
cols = obj.cols
# only keep interested values
df2= df.ix[:, cols.values()]
# drop empty rows
df2.dropna(axis=0, inplace=True)
df0 = df2.copy()
df0.reset_index(inplace=True)
# keep copy of original data
obj.source = ColumnDataSource(df2)
obj.df0 = ColumnDataSource(df0)
##############################
## draw scatterplot
##############################
obj.plots = {
'robbery': scatter(x=cols['x'],
y=cols['y'],
source=obj.source,
x_axis_label=cols['x'],
y_axis_label=cols['y']),
'pop': scatter(x=cols['pop'],
y=cols['y'],
source=obj.source,
x_axis_label=cols['pop'],
y_axis_label=cols['y'],
title='%s by %s, Adjusted by by %s'%(cols['y'],
cols['pop'], cols['pop'])),
}
obj.update_data()
##############################
## draw inputs
##############################
# bokeh.plotting.scatter
## TODO: refactor so that any number of control variables are created
# automatically. This involves subsuming c['pop'] into c['ctrls'], which
# would be a dictionary mapping column names to their widget titles
pop_slider = obj.make_widget(bkw.Slider, dict(
start=-obj.maxval,
end=obj.maxval,
value=0,
step=1,
title='Population'),
cols['pop'])
##############################
## make layout
##############################
obj.inputs = bkw.VBoxForm(
children=[pop_slider]
)
obj.outputs = bkw.VBoxForm(
children=[obj.plots['robbery']]
)
obj.children.append(obj.inputs)
obj.children.append(obj.outputs)
return obj
update_data
def update_data(self):
"""Update y by the amount designated by each slider"""
logging.debug('update_data')
c = self.cols
## TODO:: make this check for bad input; especially with text boxes
betas = {
varname: getattr(widget, 'value')/self.maxval
for varname, widget in self.widgets.iteritems()
}
df0 = pd.DataFrame(self.df0.data)
adj_y = []
for ix, row in df0.iterrows():
## perform calculations and generate new y's
adj_y.append(self.debias(row))
self.source.data[c['y']] = adj_y
assert len(adj_y) == len(self.source.data[c['x']])
logging.debug('self.source["y"] now contains debiased data')
import pdb; pdb.set_trace()
Lưu ý rằng tôi đảm bảo rằng trình xử lý sự kiện được thiết lập và kích hoạt chính xác. Tôi chỉ không biết làm thế nào để làm cho dữ liệu nguồn thay đổi phản ánh trong phân tán.
Bạn có tìm thấy giải pháp cho vấn đề này, đặc biệt là để phân phát lại không? Tôi đang nghiên cứu Bokeh cho một cái gì đó tương tự. –
Cố gắng chia nhỏ các câu hỏi của bạn thành các phần nhỏ hơn nếu bạn muốn câu trả lời. – sorin