holoviews 的美妙之处在于它允许您在基于现代浏览器的 bokeh 和古老熟悉的 matplotlib 之间进行选择来显示其绘图(以及plotly 在某种程度上,主要用于 3D 绘图)。
Spyder 能够以内联方式(即在 python 控制台本身或最近是他们的新绘图面板)或交互方式(即在弹出窗口中 -several backends exist,在所有 qt 中)呈现 matplotlib 图。您可以通过在 spyder ipython 控制台中键入 %matplotlib inline 或 %matplotlib qt 在这些之间进行切换。
这些后端将成为您的 holoview 生成的 matplotlib 绘图的位置!
现在,您需要明确告诉 holoviews 使用 matplotlib 作为后端来渲染绘图(我在下面所说的 holoview_object 可以是他们所谓的“元素”或这些元素的组合:布局、覆盖、全息图。 ..)。您可以使用
matplotlib_fig = holoviews.render(holoview_object, backend='matplotlib')
然后创建一个空的 matplotlib 图形并破解其管理器以将其显示在您的默认 matplotlib 后端:
dummy = plt.figure()
new_manager = dummy.canvas.manager
new_manager.canvas.figure = matplotlib_fig
fig.set_canvas(new_manager.canvas)
使用上面的概念,我为自己制作了一些实用函数,以便在 spyder 中轻松显示 matplotlib 或散景图,直接或从 holoviews 对象开始,随意使用它们:
import matplotlib.pyplot as plt
import bokeh as bk
import holoviews as hv
def mplshow(fig):
# create a dummy figure and use its
# manager to display "fig"
dummy = plt.figure()
new_manager = dummy.canvas.manager
new_manager.canvas.figure = fig
fig.set_canvas(new_manager.canvas)
def bkshow(bkfig, title=None, save=0, savePath='~/Downloads'):
if title is None: title=bkfig.__repr__()
if save:bk.plotting.output_file(f'{title}.html')
bk.plotting.show(bkfig)
def hvshow(hvobject, backend='matplotlib', return_mpl=True):
'''
Holoview utility which
- for dynamic display, interaction and data exploration:
in browser, pops up a holoview object as a bokeh figure
- for static instanciation, refinement and data exploitation:
in matplotlib current backend, pops up a holoview object as a matplotlib figure
and eventually returns it for further tweaking.
Parameters:
- hvobject: a Holoviews object e.g. Element, Overlay or Layout.
- backend: 'bokeh' or 'matplotlib', which backend to use to show figure
- return_mpl: bool, returns a matplotlib figure
'''
assert backend in ['bokeh', 'matplotlib']
if backend=='matplotlib' or return_mpl:
mplfig=hv.render(hvobject, backend='matplotlib')
if backend=='bokeh': bkshow(hv.render(hvobject, backend='bokeh'))
elif backend=='matplotlib': mplshow(mplfig)
if return_mpl: return mplfig
总结:
如果您希望在 spyder 绘图窗格中静态渲染您的绘图(或者如果您不使用它们的绘图窗格,则使用 python 控制台),请执行以下操作:
%matplotlib inline
hvshow(holoviews_object, 'matplotlib')
如果您希望在交互式 qt 窗口中弹出您的绘图,请执行以下操作:
%matplotlib qt
hvshow(holoviews_object, 'matplotlib')
如果您希望在浏览器中以交互方式弹出您的绘图(即使用散景),请执行以下操作:
hvshow(holoviews_object, 'bokeh')
我喜欢 spyder(远胜于 jupyter 笔记本)和 holoviews,我很高兴能够同时使用这两者!