2014-10-03 13 views
32

नोट: यह प्रश्न "पहली पीढ़ी" बोके सर्वर से संबंधित है, जिसे कई वर्षों तक हटा दिया गया है और हटा दिया गया है। इस सवाल का या उसके जवाब में कुछ नहीं Bokeh के किसी भी संस्करण के लिए प्रासंगिक है> = 0,11ऑब्जेक्ट-ओरिएंटेड बोके




मुझे लगता है कि मैं निर्माण कर रहा हूँ एक इंटरैक्टिव अनुप्रयोग के लिए Bokeh समझने की कोशिश कर रहा हूँ। मैं Bokeh examples पर देख रहा हूँ, और मुझे लगता है कि उदाहरण के सबसे ग्लोबल नेम स्पेस में सभी लिखे गए हैं, लेकिन "एप्लिकेशन" उपनिर्देशिका में लोगों को एक अच्छा, वस्तु उन्मुख शैली, जहां से मुख्य वर्ग inhereits में लिखे गए हैं एचबीओक्स जैसी संपत्ति वर्ग।

यह सवालों की एक mish मैश हो सकता है क्योंकि मैं Bokeh बहुत अच्छी तरह से प्रलेखित किया गया था प्रोग्रामिंग की इस तरह से नहीं लगता जा रहा है। पहली बात जो मैंने सामना की थी वह यह था कि साजिश तब तक नहीं खींची जब तक कि मैंने extra_generated_classes शामिल नहीं किया।

  1. अतिरिक्त_generated_classes क्या करता है?

    दूसरा, ऐसा लगता है कि इवेंट लूप setup_eventscreate से पहले स्टार्टअप पर कॉल किया जाता है और बाद में हर बार साजिश एक ईवेंट ट्रिगर करती है।

  2. प्रत्येक बार ईवेंट ट्रिगर होने पर setup_events को कॉलबैक पंजीकृत करने की आवश्यकता क्यों होती है? और पहली बार पंजीकरण करने का प्रयास करने से पहले इसे खत्म करने के लिए क्यों इंतजार नहीं करना है?

    आखिरी बात मैं के बारे में अनिश्चित हूँ कैसे यहाँ एक ग्लिफ़ की एक redraw मजबूर करने के लिए है। स्लाइडर डेमो मेरे लिए काम करता है, और मैं मूल रूप से एक ही चीज़ करने की कोशिश कर रहा हूं, एक रेखा के बजाय स्कैटरप्लॉट को छोड़कर।

    मैं अपने update_data के अंत में एक pdb ट्रेस निर्धारित करते हैं, और मुझे लगता है कि self.sourceself.plot.renderers[-1].data_source से मेल खाता है और उन दोनों को शुरू से ही बदलाव किया गया है कि गारंटी ले सकते हैं। हालांकि, self.plot स्वयं नहीं बदलता है।

  3. ऑब्जेक्ट उन्मुख दृष्टिकोण प्लॉट को अद्यतन करने के लिए store_objects को कॉल करने के बराबर क्या है?

    मैं विशेष रूप से इस तीसरे व्यक्ति से उलझन में हूं, क्योंकि ऐसा नहीं लगता है कि sliders_app उदाहरण की तरह कुछ भी चाहिए।स्पष्टीकरण के लिए, मैं विगेट्स/स्लाइडर के परिवर्तनशील बनाने की कोशिश कर रही है, इसलिए इस तरह मेरे कोड दिखता है: वर्ग

गुण:

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) 

इनिशियलाइज़ विधि

@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() 

ध्यान दें कि मुझे यकीन है कि ईवेंट हैंडलर सेटअप हो जाता है और सही ढंग से ट्रिगर हो जाता है। मुझे नहीं पता कि बदले गए स्रोत डेटा को स्कैटरप्लॉट में कैसे प्रतिबिंबित किया जाए।

+0

क्या आपको इस समस्या का हल मिल गया, खासकर स्कैटर को फिर से प्रस्तुत करने के लिए? मैं कुछ इसी तरह के लिए बोके की जांच कर रहा हूं। –

+10

यदि आप उत्तर चाहते हैं तो अपने प्रश्नों को छोटे हिस्सों में विभाजित करने का प्रयास करें। – sorin

उत्तर

3

मैं वही जवाब खोज रहा हूं (दस्तावेज़ीकरण की कमी इसे मुश्किल बनाती है)।

जवाब में, सवाल करने के लिए # 1, "extra_generated_classes" की उपयोगिता क्या है:

tl; डॉ extra_generated_classes एक modulename, classname परिभाषित करता है, और parentname js/एचटीएमएल कोड जनरेट टेम्पलेट में प्रयोग किया जाता है, और फैली अभिभावक वर्ग ऐप कक्षा में पारित होता है (आमतौर पर उदाहरण में एचबीओक्स या वीबॉक्स)।

लंबा उत्तर। Bokeh/server/utils/plugins.py में स्रोत कोड को देखें, यह वह कोड है जो - स्क्रिप्ट कमांड लाइन तर्क का उपयोग करके बोकेह-सर्वर को पास कोड पर चलाया जाता है। Plugins.py के अंत में, आप देख सकते हैं कि extra_generated_classes को फ्लास्क विधि render_template पर पास किया गया है, जो Jinja2 टेम्पलेट प्रस्तुत करता है। modulename, classname, और parentname, जो 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 एक है टेम्पलेट के अंदर देख रहे हैं, oneobj.html, extra_generated_classes तीन चीजों की सरणियों की एक सरणी है बोके/सर्वर/विचार/plugins.py में पायथन कोड, और केवल टेम्पलेट app.js के लिए render_template को कॉल करता है, जिसे आप बोके/सर्वर/टेम्पलेट्स में पा सकते हैं। यह टेम्पलेट modulename, classname, और parentname लेता है, और मूल रूप से जेएस कोड बनाता है जो अभिभावक (उदा। एचबीओक्स या वीबॉक्स) को वर्गनाम (आपका ऐप) में बढ़ाता है।

संबंधित मुद्दे