2014-10-03 15 views
32

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.

  1. 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ước create và sau đó mỗi lần âm mưu kích hoạt sự kiện.

  2. 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ằng self.source khớp với self.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.

  3. 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.

+0

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ự. –

+10

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

Trả lời

3

tôi đang tìm kiếm những câu trả lời giống nhau (thiếu tài liệu hướng dẫn làm cho nó khó khăn).

Trong câu trả lời, đặt câu hỏi # 1, các tiện ích của "extra_generated_classes" là gì:

tl; dr extra_generated_classes định nghĩa một môđun, classname, và parentname sử dụng trong mẫu tạo mã js/html, và mở rộng lớp cha được chuyển vào lớp ứng dụng (thường là HBox hoặc VBox trong các ví dụ).

Câu trả lời dài hơn. Hãy xem mã nguồn trong bokeh/server/utils/plugins.py, đây là mã chạy trên mã được chuyển đến máy chủ bokeh bằng cách sử dụng đối số dòng lệnh --script. Vào cuối plugins.py, bạn có thể thấy rằng extra_generated_classes được chuyển đến phương thức bình render_template, hiển thị mẫu Jinja2. Nhìn bên trong mẫu, oneobj.html, extra_generated_classes là một mảng của các mảng của ba điều: môđun, classname, và parentname, được thông qua vào bokeh.server.generatejs:

{% block extra_scripts %} 
    {% for modulename, classname, parentname in extra_generated_classes %} 
    <script 
    src="{{ url_for('bokeh.server.generatejs', modulename=modulename, classname=classname, parentname=parentname) }}" 
    ></script> 
    {% endfor %} 
{% endblock %} 

bokeh.server.generatejs là một Mã Python trong bokeh/server/views/plugins.py, và chỉ gọi render_template cho một tệp app.js, mà bạn có thể tìm thấy trong bokeh/server/templates. Mẫu này lấy modulename, classname và parentname, và về cơ bản tạo mã js mở rộng tên cha (ví dụ: HBox hoặc VBox) thành classname (ứng dụng của bạn).

Các vấn đề liên quan