Python 我可以控制Bokeh创建的内联css吗(或者完全删除它)?

Python 我可以控制Bokeh创建的内联css吗(或者完全删除它)?,python,css,bokeh,pyviz,Python,Css,Bokeh,Pyviz,我正在PyViz面板中创建一个仪表板,据我所知,它在引擎盖下使用bokeh。它很容易使用,我很快就找到了一个90%的解决方案,但最终的布局(对我来说)更容易使用普通的CSS(网格布局或其他)。我可以从Python中将html ID和类附加到每个小部件/绘图/列/行等,但我还没有找到阻止bokeh在其生成的每个div上包含一长串内联css的方法。我希望布局是响应性的,没有硬编码的宽度/高度或诸如此类的东西 我已经在使用模板/index.html的目录中提供了main.ipynb中的面板代码,因此包

我正在PyViz面板中创建一个仪表板,据我所知,它在引擎盖下使用bokeh。它很容易使用,我很快就找到了一个90%的解决方案,但最终的布局(对我来说)更容易使用普通的CSS(网格布局或其他)。我可以从Python中将html ID和类附加到每个小部件/绘图/列/行等,但我还没有找到阻止bokeh在其生成的每个div上包含一长串内联css的方法。我希望布局是响应性的,没有硬编码的宽度/高度或诸如此类的东西

我已经在使用
模板/index.html
的目录中提供了
main.ipynb
中的面板代码,因此包含模板的解决方案是完全可以的。我不想在许多不同的根中创建整个仪表板,这些根被添加到模板中(如果我不需要的话),从行和列生成的html对于我来说是非常好的,如果我可以删除生成的内联css属性的话

我可以编写一个Python函数,遍历panel/bokeh小部件树并修改小部件(如果需要的话)。当然,我也可以在Javascript中遍历DOM,并在创建div时从div中删除样式属性,但这似乎不如将一些
拼凑在一起那么优雅!重要信息
css

旁白:有人知道如何阻止bokeh从Javascript更改html标题属性,或者如何从面板设置标题吗

仪表板示例: 这是一个没有任何自定义样式的极简仪表板。它在每个div上生成硬编码的宽度和高度(从Firefox devtools元素检查器中可以看到)。仪表板是左对齐的,不能有效地使用屏幕空间(左侧有大量空白,直方图的水平宽度与上列不同)。调整页面大小时,布局也没有响应

导入numpy
进口大熊猫
导入参数
导入面板
导入全息视图
从IPython.display导入显示
小组.扩展部分()
holoviews.extension('bokeh')
#创建语法数据集
N=1000
年龄=numpy.random.gamma(10,1.5,N)
缺陷=numpy.clip(numpy.random.chisquare(5,N)*年龄-10,01e100)。aType(int)
数据帧({'age':age,'defects':defects})
显示器(测向头(3))
#默认大小调整模式
SM=‘拉伸宽度’
类仪表板定义(参数化):
年龄=参数范围((0,20),(0,无),软边界=(0,30))
直方图=参数ObjectSelector('defects',['defects','age']))
def过滤器_数据(自身,表格):
返回表.select(age=self.age)
@参数取决于('年龄')
def使_分散(自):
散布=全息视图。点(df、[‘年龄’、‘缺陷’)
选定=自过滤数据(分散)
返回面板。面板(已选择,大小调整模式=SM)
@参数取决于('年龄','直方图')
def make_直方图(自身):
table=holoviews.table(df,self.histogram)
table=自过滤数据(table)
频率,边缘=numpy.直方图(表[self.直方图],15)
hist=全息视图。直方图((频率、边缘))
返回面板。面板(历史,大小调整模式=SM)
def布局(自):
返回面板.Column(面板.Row(self.param,
自我放逐,
调整尺寸(模式=SM),
自制柱状图,
调整大小(模式=SM)
dashboard=仪表板定义(name='dashboard parameters')
dash_panel=dashboard.layout()
#定义仪表板
模板=“”“
{%extends base%}
{%block title%}你好世界{%endblock%}
{%block contents%}
我的仪表盘
这是我目前未设计的仪表板


{{embed(root.dash1)} {%endblock%} """ tmpl=panel.Template(模板) tmpl.添加仪表盘(“仪表盘1”,仪表盘) tmpl.servable() #取消jupyter笔记本中预览仪表板的注释 #仪表板
我通过在holoviews中设置
responsive=True
解决了我的具体问题(感谢xavArtley in在这一部分的帮助)。从bokeh文档中,似乎删除了这个选项,但它在HoloView中,使用它可以使内联css与我想要的匹配

您必须在javascript运行之前设置元素的样式,否则大小将是错误的,但是您可以通过在模板序言中添加自定义css来做很多事情(postamble不起作用,至少在Firefox中不起作用)

一个有效的例子 这里,仪表板周围的容器决定仪表板组件的大小,而不是内联css(由Javascript设置以匹配周围的div元素):

导入numpy
进口大熊猫
导入参数
导入面板
导入全息视图
小组.扩展部分()
holoviews.extension('bokeh')
#创建语法数据集
N=1000
年龄=numpy.random.gamma(10,1.5,N)
缺陷=numpy.clip(numpy.random.chisquare(5,N)*年龄-10,01e100)。aType(int)
数据帧({'age':age,'defects':defects})
类仪表板定义(参数化):
年龄=参数范围((0,20),(0,无),软边界=(0,30))
直方图=参数ObjectSelector('defects',['defects','age']))
def过滤器_数据(自身,表格):
返回表.select(age=self.age)
@参数取决于('年龄')
def使_分散(自):
散布=全息视图。点(df、[‘年龄’、‘缺陷’)
选定=自过滤数据(分散)
hv_obj=已选择。选项(响应=真,方面=3)
返回面板。面板(hv_obj)
@参数取决于('年龄','直方图')
def make_直方图(自身):
table=holoviews.table(df,self.histogram)
table=自过滤数据(table)
频率,边缘=numpy.直方图(表[self.直方图],25)
hist=全息视图。直方图((频率、边缘))
hv_obj=历史选项(响应=真,方面=4)
返回面板。面板(hv_obj)
def布局(自):
返回面板.Column(面板.Row(self.param,
自己