Я уже знаю, как отображать отдельные графики боке на Django. То, что я сейчас ищу, - это объяснение высокого уровня о том, как подключить интерактивный сервер Bokeh (пример, который я использую: https://demo.bokeh.org/weather) к моему проекту Django. Ключевое слово, которое нужно подчеркнуть, это интерактивный . Когда я использую выпадающие списки на моей странице Django, сервер Bokeh должен реагировать интерактивно, как обычно, когда я запускаю bokeh serve --show app.py, например.
Как вы можете видеть ниже, я уже добавил большую часть кода урока в мое представление django. Все отображается отлично, однако интерактивности не происходит - например, когда я выбираю просмотр данных Сиэтла, ничего не происходит - потому что сервер bokeh не активируется или что-то еще?
# all my imports up here...
def homepage(request):
return render(request, 'pages/landing.html')
def alerts_dashboard(request):
# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
# THE FOLLOWING CODE FROM HERE ON DOWN IS PURE COPY-PASTED FROM
# THE BOKEH DEMO LINK ABOVE
STATISTICS = ['record_min_temp', 'actual_min_temp', 'average_min_temp', 'average_max_temp', 'actual_max_temp', 'record_max_temp']
def get_dataset(src, name, distribution):
df = src[src.airport == name].copy()
del df['airport']
df['date'] = pd.to_datetime(df.date)
# timedelta here instead of pd.DateOffset to avoid pandas bug < 0.18 (Pandas issue #11925)
df['left'] = df.date - datetime.timedelta(days=0.5)
df['right'] = df.date + datetime.timedelta(days=0.5)
df = df.set_index(['date'])
df.sort_index(inplace=True)
if distribution == 'Smoothed':
window, order = 51, 3
for key in STATISTICS:
df[key] = savgol_filter(df[key], window, order)
return ColumnDataSource(data=df)
def make_plot(source, title):
plot = figure(x_axis_type="datetime", plot_width=800, tools="", toolbar_location=None)
plot.title.text = title
plot.quad(top='record_max_temp', bottom='record_min_temp', left='left', right='right',
color=Blues4[2], source=source, legend="Record")
plot.quad(top='average_max_temp', bottom='average_min_temp', left='left', right='right',
color=Blues4[1], source=source, legend="Average")
plot.quad(top='actual_max_temp', bottom='actual_min_temp', left='left', right='right',
color=Blues4[0], alpha=0.5, line_color="black", source=source, legend="Actual")
# fixed attributes
plot.xaxis.axis_label = None
plot.yaxis.axis_label = "Temperature (F)"
plot.axis.axis_label_text_font_style = "bold"
plot.x_range = DataRange1d(range_padding=0.0)
plot.grid.grid_line_alpha = 0.3
return plot
def update_plot(attrname, old, new):
city = city_select.value
plot.title.text = "Weather data for " + cities[city]['title']
src = get_dataset(df, cities[city]['airport'], distribution_select.value)
source.data.update(src.data)
city = 'Austin'
distribution = 'Discrete'
cities = {
'Austin': {
'airport': 'AUS',
'title': 'Austin, TX',
},
'Boston': {
'airport': 'BOS',
'title': 'Boston, MA',
},
'Seattle': {
'airport': 'SEA',
'title': 'Seattle, WA',
}
}
city_select = Select(value=city, title='City: ', options=sorted(cities.keys()))
distribution_select = Select(value=distribution, title='Distribution: ', options=['Discrete', 'Smoothed'])
df = pd.read_csv('2015_weather.csv')
source = get_dataset(df, cities[city]['airport'], distribution)
plot = make_plot(source, "Weather data for " + cities[city]['title'])
city_select.on_change('value', update_plot)
distribution_select.on_change('value', update_plot)
controls = column(city_select, distribution_select)
theLayout = column(controls, plot, sizing_mode='stretch_both')
script, div = components(theLayout)
return render_to_response('pages/alerts_dashboard.html', {'script':script, 'linePlot': div})
Basic .html
<div class="container">
<div class="section">
{{ linePlot | safe }}
</div>
</div>
Я ушел
curdoc().add_root(row(plot, controls))
curdoc().title = "Weather"
конечно, я не думаю, что это мне поможет.
Я слышал о сокетах и слушателях, но, честно говоря, понятия не имею, о чем они. Можете ли вы описать мне, как это должно работать, и если сокеты / слушатели - правильный путь, о котором, если так, я буду обучаться. Или я пропускаю простое исправление?
Спасибо!