我一直在使用bokeh web server
。本地主机到html文件的Boost web服务器应用程序
我创建了一个Web应用程序,用我自己的数据和下面这个例子:https://github.com/bokeh/bokeh/blob/master/examples/app/movies/main.py
我已经完成了剧本,一切都OK。我可以使用此命令看到的结果是:bokeh serve --show main.py
我用于创建Web应用程序的模块有:
from os.path import dirname, join
from pandas import Series, DataFrame
from bokeh.plotting import figure
from bokeh.layouts import layout, widgetbox
from bokeh.models import ColumnDataSource, HoverTool, Div
from bokeh.models.widgets import Slider, Select, TextInput
from bokeh.io import curdoc
from scipy import stats
import numpy as np
import pandas
然而,我的目标是将结果上传到我的gh-pages
GitHub上的分支。
如何将bokeh
的结果保存为html文件以便在网页中使用它?
我尝试使用show
从bokeh.plotting
,但它显示本地主机路径为命令bokeh serve --show main.py
做的。
是否有其他命令我可以使用?
任何建议表示赞赏!提前致谢。
UPDATE
我用这个代码以获取解决方案。有了这段代码,我得到了一个html文件作为输出,但它需要改进。
from os.path import dirname, join
from pandas import Series, DataFrame
from bokeh.plotting import figure
from bokeh.layouts import layout, widgetbox
from bokeh.models import ColumnDataSource, HoverTool, Div
from bokeh.models.widgets import Slider, Select, TextInput
from bokeh.io import curdoc
from bokeh.resources import JSResources
from bokeh.embed import file_html
from bokeh.util.browser import view
from jinja2 import Template
from scipy import stats
import numpy as np
import pandas
csvdata = pandas.read_csv('Alimentacion.csv', low_memory = False, encoding = 'latin-1')
# Convert amount field into int()
def str_to_int(mainList):
for item in mainList:
newList = [(int(item.replace('$', '').replace(',', ''))/(1000000)) for item in mainList]
return newList
# Call str_to_int function
csvdata['CuantiaInt'] = str_to_int(csvdata['Cuantía'])
mean = np.mean(csvdata['CuantiaInt'])
# Assing colors to each contract by mean
csvdata['color'] = np.where(csvdata['CuantiaInt'] > mean, 'red', 'blue')
csvdata['alpha'] = np.where(csvdata['CuantiaInt'] > mean, 0.75, 0.75)
# Replace missing values (NaN) with 0
csvdata.fillna(0, inplace=True)
csvdata['revenue'] = csvdata.CuantiaInt.apply(lambda x: '{:,d}'.format(int(x)))
estados1 = [line.rstrip() for line in open('Estados1.txt')]
estados2 = [line.rstrip() for line in open('Estados2.txt')]
csvdata.loc[csvdata.Estado.isin(estados1), 'color'] = 'grey'
csvdata.loc[csvdata.Estado.isin(estados1), 'alpha'] = 0.75
csvdata.loc[csvdata.Estado.isin(estados2), 'color'] = 'brown'
csvdata.loc[csvdata.Estado.isin(estados2), 'alpha'] = 0.75
csvdata['z score'] = stats.zscore(csvdata['CuantiaInt'])
csvdata['sigma'] = np.std(csvdata['CuantiaInt'])
date_time = pandas.DatetimeIndex(csvdata['Fecha (dd-mm-aaaa)'])
newdates = date_time.strftime('%Y')
newdates = [int(x) for x in newdates]
csvdata['dates'] = newdates
csvdata['Dptos'] = csvdata['Loc dpto']
csvdata['Entidad'] = csvdata['Entidad Compradora']
csvdata['Proceso'] = csvdata['Tipo de Proceso']
axis_map = {
'Cuantía y promedio': 'z score',
'Cuantía (Millones de pesos)': 'CuantiaInt',
'Desviación estándar': 'sigma',
'Fecha del contrato': 'dates',
}
desc = Div(text=open(join(dirname(__file__), 'alimentacion.html')).read(), width=800)
DptosList = [line.rstrip() for line in open('locdpto.txt')]
ProcesosList = [line.rstrip() for line in open('tipoproceso.txt')]
EntidadesList = [line.rstrip() for line in open('entidades.txt')]
# Create Input controls
min_year = Slider(title = 'Año inicial', start = 2012, end = 2015, value = 2013, step = 1)
max_year = Slider(title = 'Año final', start = 2012, end = 2015, value = 2014, step = 1)
boxoffice = Slider(title = 'Costo del contrato (Millones de pesos)', start = 0, end = 77000, value = 0, step = 2)
dptos = Select(title = 'Departamentos', value = 'Todos los departamentos', options = DptosList)
proceso = Select(title = 'Tipo de Proceso', value = 'Todos los procesos', options = ProcesosList)
entidades = Select(title = 'Entidad Compradora', value = 'Todas las entidades', options = EntidadesList)
objeto = TextInput(title='Objeto del contrato')
x_axis = Select(title = 'X Axis', options = sorted(axis_map.keys()), value = 'Fecha del contrato')
y_axis = Select(title = 'Y Axis', options = sorted(axis_map.keys()), value = 'Cuantía (Millones de pesos)')
# Create Column Data Source that will be used by the plot
source = ColumnDataSource(data=dict(x=[], y=[], color=[], entidad=[], year=[], revenue=[], alpha=[]))
hover = HoverTool(tooltips=[
("Entidad", "@entidad"),
("Año", "@year"),
("$", "@revenue" + ' Millones de pesos')
])
p = figure(plot_height=500, plot_width=700, title='', toolbar_location=None, tools=[hover])
p.circle(x = 'x', y = 'y', source = source, size = 7, color = 'color', line_color = None, fill_alpha = 'alpha')
def select_contracts():
dptos_val = dptos.value
proceso_val = proceso.value
entidades_val = entidades.value
objeto_val = objeto.value.strip()
selected = csvdata[
(csvdata.dates >= min_year.value) &
(csvdata.dates <= max_year.value) &
(csvdata.CuantiaInt >= boxoffice.value)
]
if dptos_val != 'Todos los departamentos':
selected = selected[selected.Dptos.str.contains(dptos_val) == True]
if proceso_val != 'Todos los procesos':
selected = selected[selected.Proceso.str.contains(proceso_val) == True]
if entidades_val != 'Todas las entidades':
selected = selected[selected.Entidad.str.contains(entidades_val) == True]
if objeto_val != '':
selected = selected[selected.Objeto.str.contains(objeto_val) == True]
return selected
def update():
df = select_contracts()
x_name = axis_map[x_axis.value]
y_name = axis_map[y_axis.value]
p.xaxis.axis_label = x_axis.value
p.yaxis.axis_label = y_axis.value
p.title.text = '%d contratos seleccionados' % len(df)
source.data = dict(
x = df[x_name],
y = df[y_name],
color = df['color'],
entidad = df['Entidad'],
year = df['dates'],
revenue = df["revenue"],
alpha = df['alpha'],
)
controls = [min_year, max_year, boxoffice, dptos, proceso, entidades, objeto, x_axis, y_axis]
for control in controls:
control.on_change('value', lambda attr, old, new: update())
sizing_mode = 'fixed'
inputs = widgetbox(*controls, sizing_mode=sizing_mode)
l = layout([
[desc],
[inputs, p],
], sizing_mode=sizing_mode)
update()
curdoc().add_root(l)
curdoc().title = "Contratos"
with open('../Contratos/Alimentación/alimentacion.jinja', 'r') as f:
template = Template(f.read())
js_resources = JSResources(mode='inline')
html = file_html(l, resources=(js_resources, None), title="Contracts", template=template)
output_file = '../test.html'
with open(output_file, 'w') as f:
f.write(html)
view(output_file)
除非,OP实际上创建了这个美丽的图形,他想把它放在gh页面上作为一个静态的web图形。只是另一种可能性。 – Vasif
Bokeh不会以编程方式生成静态输出。这是一项长期以来的功能要求,但难以实施。我们正在研究一种涉及Chrome无头的解决方案,但尚未就绪。如果OP刚刚拍摄了一个屏幕截图,并询问在gh-pages上嵌入PNG的人不是Bokeh问题。 – bigreddot
这对我来说很深刻。我只是查看了什么是散景,并将其安装在我的包装箱上。伟大的工作,如果你参与其中。 :) – Vasif