为什么全息视图在 Spyder 中不显示直方图?

Why doesn't holoviews show histogram in Spyder?

我在 Windows 上安装了 Anaconda 3.7。它适用于 Jupyter 但不适用于 Spyder。 此代码:

import holoviews as hv
import pandas as pd
import numpy as np
output_notebook ()
flora = pd.read_csv ('iris.csv')
hv.extension('bokeh')
frequencies, edges = np.histogram(flora['petal width'], bins = 5)
print(frequencies, edges)
hv.Histogram(frequencies, edges, label = 'Histogram')

returns 仅值:

[49  8 41 29 23] [0.1  0.58 1.06 1.54 2.02 2.5 ]
WARNING:root:Histogram: Histogram edges should be supplied as a tuple along with the values, passing the edges will be deprecated in holoviews 2.0.

是否可以在 Spyder 中查看直方图?

(此处为 Spyder 维护者) Holoviews 生成要在网络浏览器中呈现的内容,Spyder 控制台目前无法显示该内容,抱歉。

作为解决方法,您可以通过将 Holoviews 图形放入 Panel 对象并对其调用 .show() 来在浏览器中打开图形。
Library Panel 可用于在浏览器中创建带有 Holoviews 图表的仪表板。
这是一个工作示例:

# library imports
import numpy as np
import pandas as pd
import holoviews as hv
hv.extension('bokeh', logo=False)
import panel as pn

# create sample data
data = np.random.normal(size=[50, 2])
df = pd.DataFrame(data, columns=['col1', 'col2'])

# create holoviews graph
hv_plot = hv.Points(df)

# display graph in browser
# a bokeh server is automatically started
bokeh_server = pn.Row(hv_plot).show(port=12345)

# stop the bokeh server (when needed)
bokeh_server.stop()

另请参阅:

或者 您可以将散景设置为渲染器的后端,然后使用 bokeh.render.show()。这将在浏览器中打开您的全息图:

import holoviews as hv
hv.extension('bokeh')
from bokeh.plotting import show

show(hv.render(your_holoviews_plot))

全息视图的美妙之处在于它允许您在基于现代浏览器的 bokeh 和熟悉的 matplotlib 之间进行选择显示它的图(以及 plotly 在某种程度上,主要用于 3D 图)。

Spyder 能够以内联方式(即在 python 控制台本身或最近是他们的新绘图面板)或交互方式(即在弹出窗口中 window - several backends exist, 在所有 qt) 中。您可以通过在您的 spyder ipython 控制台中输入 %matplotlib inline%matplotlib qt 在它们之间切换。

这些后端将成为您的全息视图生成的 matplotlib 绘图的地方!

现在,您需要明确告诉 holoviews 使用 matplotlib 作为后端来渲染图(我在下面提到的 holoview_object 可以是他们所说的 'element' 或组合这些:布局、覆盖、全息图……)。您可以使用

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 中直接或从 holoviews 对象开始显示 matplotlib 或散景图,请随意使用它们:

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 window 中弹出你的情节 ,请执行:

%matplotlib qt
hvshow(holoviews_object, 'matplotlib')

如果你想在你的浏览器中弹出你的情节(即使用散景),也可以交互,做:

hvshow(holoviews_object, 'bokeh')

我喜欢 spyder(比 jupyter notebooks 多得多)和 holoviews 一样多,我很高兴能够同时使用两者!