Извинения, если на этот вопрос ответили где-то еще в StackOverflow, я приложил все усилия, чтобы найти ответ, прежде чем публиковать этот вопрос.
Я работаю над созданием веб-приложения на основе Flask, используя Bokeh для визуализации данных на работе. У меня не было проблем с встраиванием точечных / линейных графиков с использованием bokeh.embed.components и bokeh.plotting.figure.
Я хотел бы отобразить данные, которые используются для создания графика, в виджете DataTable под графиком. К сожалению, использование компонентов для генерации скрипта и div не работает для виджетов. Компоненты также не работают при использовании столбца, строки или макета, созданного с помощью bokeh.layouts.
Общий макет моего кода - это файл Python, который содержит мое приложение Flask, и файл HTML, который содержит макет моей веб-страницы. Общая схема файла Python приведена ниже:
from flask import Flask, render_template
import pandas as pd
import numpy as np
from bokeh.models import ColumnDataSource
from bokeh.models.widgets import DataTable, TableColumn
from bokeh.plotting import figure
from bokeh.layouts import widgetbox, column
from bokeh.embed import components
app = Flask(__name__)
x = np.linspace(0, 2, 1000)
y = np.sin(x)
df = pd.DataFrame({"x": x, "y":y}) # Not sure how to provide sample data
@app.route("/")
def index():
p = figure()
p.scatter(df['x'], df['y'])
data_source = ColumnDataSource(df)
columns = [
TableColumn(field="field1", title="Field 1"),
TableColumn(field="field2", title="Field 2"),
TableColumn(field="field3", title="Field 3"),
]
data_table = DataTable(source=data_source, columns=columns)
script, div = components(column(p, widgetbox(data_table)))
return render_template('sample.html', script=script, div=div)
Шаблон HTML ("sample.html") будет выглядеть примерно так:
<html>
<head>
<link
href="http://cdn.pydata.org/bokeh/release/bokeh-1.0.4.min.css"
rel="stylesheet" type="text/css">
<link
href="http://cdn.pydata.org/bokeh/release/bokeh-widgets-1.0.4.min.css"
rel="stylesheet" type="text/css">
<script src="http://cdn.pydata.org/bokeh/release/bokeh-1.0.4.min.js"></script>
<script src="http://cdn.pydata.org/bokeh/release/bokeh-widgets-1.0.4.min.js"></script>
</head>
<body>
{{ script|safe }}
{{ div|safe }}
</body>
</html>
Я решил использовать простую синусоидальную волну в качестве примера данных для этого кода, но в реальной жизни я использую файл Excel (pd.read_excel) для проверки кода перед подключением веб-приложения к базе данных.
В коде Python, если я заменю
script, div = components(column(p, widgetbox(data_table))
с
script, div = components(p)
код работает отлично. Таким образом, это наводит меня на мысль, что проблема заключается в встраивании виджета или компоновки графиков и виджетов. Заранее благодарим за любую помощь, которую вы можете оказать.