नोट: यह प्रश्न "पहली पीढ़ी" बोके सर्वर से संबंधित है, जिसे कई वर्षों तक हटा दिया गया है और हटा दिया गया है। इस सवाल का या उसके जवाब में कुछ नहीं Bokeh के किसी भी संस्करण के लिए प्रासंगिक है> = 0,11ऑब्जेक्ट-ओरिएंटेड बोके
मुझे लगता है कि मैं निर्माण कर रहा हूँ एक इंटरैक्टिव अनुप्रयोग के लिए Bokeh समझने की कोशिश कर रहा हूँ। मैं Bokeh examples पर देख रहा हूँ, और मुझे लगता है कि उदाहरण के सबसे ग्लोबल नेम स्पेस में सभी लिखे गए हैं, लेकिन "एप्लिकेशन" उपनिर्देशिका में लोगों को एक अच्छा, वस्तु उन्मुख शैली, जहां से मुख्य वर्ग inhereits में लिखे गए हैं एचबीओक्स जैसी संपत्ति वर्ग।
यह सवालों की एक mish मैश हो सकता है क्योंकि मैं Bokeh बहुत अच्छी तरह से प्रलेखित किया गया था प्रोग्रामिंग की इस तरह से नहीं लगता जा रहा है। पहली बात जो मैंने सामना की थी वह यह था कि साजिश तब तक नहीं खींची जब तक कि मैंने extra_generated_classes
शामिल नहीं किया।
अतिरिक्त_generated_classes क्या करता है?
दूसरा, ऐसा लगता है कि इवेंट लूप
setup_events
create
से पहले स्टार्टअप पर कॉल किया जाता है और बाद में हर बार साजिश एक ईवेंट ट्रिगर करती है।प्रत्येक बार ईवेंट ट्रिगर होने पर setup_events को कॉलबैक पंजीकृत करने की आवश्यकता क्यों होती है? और पहली बार पंजीकरण करने का प्रयास करने से पहले इसे खत्म करने के लिए क्यों इंतजार नहीं करना है?
आखिरी बात मैं के बारे में अनिश्चित हूँ कैसे यहाँ एक ग्लिफ़ की एक redraw मजबूर करने के लिए है। स्लाइडर डेमो मेरे लिए काम करता है, और मैं मूल रूप से एक ही चीज़ करने की कोशिश कर रहा हूं, एक रेखा के बजाय स्कैटरप्लॉट को छोड़कर।
मैं अपने
update_data
के अंत में एक pdb ट्रेस निर्धारित करते हैं, और मुझे लगता है किself.source
self.plot.renderers[-1].data_source
से मेल खाता है और उन दोनों को शुरू से ही बदलाव किया गया है कि गारंटी ले सकते हैं। हालांकि,self.plot
स्वयं नहीं बदलता है।ऑब्जेक्ट उन्मुख दृष्टिकोण प्लॉट को अद्यतन करने के लिए 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()
ध्यान दें कि मुझे यकीन है कि ईवेंट हैंडलर सेटअप हो जाता है और सही ढंग से ट्रिगर हो जाता है। मुझे नहीं पता कि बदले गए स्रोत डेटा को स्कैटरप्लॉट में कैसे प्रतिबिंबित किया जाए।
क्या आपको इस समस्या का हल मिल गया, खासकर स्कैटर को फिर से प्रस्तुत करने के लिए? मैं कुछ इसी तरह के लिए बोके की जांच कर रहा हूं। –
यदि आप उत्तर चाहते हैं तो अपने प्रश्नों को छोटे हिस्सों में विभाजित करने का प्रयास करें। – sorin