如何让 HoloViews 绘图或 Hvplot 在 Databricks 上工作?
生成的绘图还应保持所有交互性。
3 回答
Bokehfile_html
将返回 HTML+JS 代码以提供数据的交互式绘图。总 HTML 必须小于 20MB。您的数据需要内联到您的 HTML 中,否则您可能会遇到 CSRF 错误。确保您已安装 python holoviews
、bokeh
和hvplot
包。例子:
import math
import numpy as np
import pandas as pd
import holoviews as hv
from bokeh.embed import components, file_html
from bokeh.resources import CDN
hv.extension('bokeh')
import hvplot
renderer = hv.renderer('bokeh').instance(fig='html', holomap='auto')
# see https://github.com/ioam/holoviews/issues/1819
def displayHoloviews(hv_plot, html_name="plot.html", width=1000, height=600, renderer=renderer):
plot = renderer.get_plot(hv_plot).state
setattr(plot, 'plot_width', width)
setattr(plot, 'plot_height', height)
displayHTML(file_html(plot, CDN, html_name))
index = pd.date_range('1/1/2000', periods=1000)
df = pd.DataFrame(np.random.randn(1000, 4), index=index, columns=list('ABCD')).cumsum()
displayHoloviews(hvplot.hvPlot(df).line(y=['A','B','C','D']))
您可以将 HoloViews 图保存为 HTML 文件,然后使用 displayHTML()。
解决方案的灵感来自此博客:
https ://anitagraser.com/2020/02/02/first-working-movingpandas-setup-on-databricks/
这种方法的缺点是您的 html 文件不应该变得太大,否则您可能会在保存笔记本时遇到问题。
这是一个工作示例:
# import libraries
import numpy as np
import pandas as pd
import holoviews as hv
import hvplot.pandas
# create sample date
df = pd.DataFrame(np.random.rand(50, 2), columns=['col1', 'col2'])
df['col3'] = np.random.randint(0, 2, 50)
# create holoviews scatter plot
hv_scatter = df.hvplot(kind='scatter', x='col1', y='col2', groupby='col3')
# save scatter plot as html
hv.save(hv_scatter, 'hv_scatter.html')
# assign html file to variable
with open('hv_scatter.html', 'r') as html_file:
html_scatter = html_file.read()
# display scatter plot
displayHTML(html_scatter)
作为替代方案,您还可以将绘图渲染为散景图,然后使用此笔记本的示例:
https ://docs.databricks.com/notebooks/visualizations/bokeh.html
你可以简单地使用
import holoviews as hv
your_plot = hv.Points(np.random.multivariate_normal((0,0), [[0.1, 0.1], [0.1, 1.0]], (1000,)))
renderer = hv.renderer("bokeh")
displayHTML(renderer.html(your_plot))
但是,AFAIU 使用displayHTML()
阻止了or的可扩展性功能,它只会显示最初渲染的绘图版本。其他答案也是如此,我不确定当前是否存在保留 DataBricks 可扩展性的解决方案(我对这样的解决方案非常感兴趣!)。decimate()
datashader