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

Joy*_*oys 2 python python-3.x spyder holoviews

我在 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')
Run Code Online (Sandbox Code Playgroud)

只返回值:

[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.
Run Code Online (Sandbox Code Playgroud)

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

Car*_*oba 5

这里是 Spyder 维护者)Holoviews 生成要在 Web 浏览器中呈现的内容,Spyder 控制台目前无法显示该内容,抱歉。


San*_*ord 5

作为解决方法,您可以通过将 Holoviews 图形放入 Panel 对象中并调用.show()它来在浏览器中打开图形。
库面板可用于在浏览器中创建带有 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()
Run Code Online (Sandbox Code Playgroud)

另请参阅:
/sf/ask/4057977521/[][1]

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

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

show(hv.render(your_holoviews_plot))
Run Code Online (Sandbox Code Playgroud)


Max*_*eau 5

holoviews 的美妙之处在于它允许您在现代基于浏览器的散景和古老的熟悉的matplotlib之间进行选择以显示其绘图(以及在某种程度上的绘图,主要用于 3D 绘图)。

Spyder 能够内联(即在 python 控制台本身或因为最近是他们的新绘图面板)或交互式(即在弹出窗口中 -存在多个后端,在所有 qt 中)呈现 matplotlib 图。您可以通过在 spyder ipython 控制台中键入%matplotlib inline%matplotlib qt在这些之间切换。

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

现在,您需要明确地告诉 holoviews 使用 matplotlib 作为后端来渲染绘图(我在下面提到的 holoview_object 可以是他们所谓的“元素”或它们的组合:布局、叠加、全息图...) . 你可以使用

matplotlib_fig = holoviews.render(holoview_object, backend='matplotlib')
Run Code Online (Sandbox Code Playgroud)

然后创建一个空的 matplotlib 图并破解其管理器以在您的默认 matplotlib 后端显示它:

dummy = plt.figure()
new_manager = dummy.canvas.manager
new_manager.canvas.figure = matplotlib_fig
fig.set_canvas(new_manager.canvas)
Run Code Online (Sandbox Code Playgroud)

使用上面的概念,我为自己制作了一些实用函数,以便在 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
Run Code Online (Sandbox Code Playgroud)

总结:如果您希望在 spyder 绘图窗格(或 Python 控制台,如果您不使用他们的绘图窗格)中静态呈现您的绘图,请执行以下操作:

%matplotlib inline
hvshow(holoviews_object, 'matplotlib')
Run Code Online (Sandbox Code Playgroud)

如果您希望在交互式 qt 窗口中弹出您的绘图,请执行以下操作:

%matplotlib qt
hvshow(holoviews_object, 'matplotlib')
Run Code Online (Sandbox Code Playgroud)

如果你想在你的浏览器中弹出你的情节(即散景),也是交互式的,请执行以下操作:

hvshow(holoviews_object, 'bokeh')
Run Code Online (Sandbox Code Playgroud)

我喜欢 spyder(不仅仅是 jupyter 笔记本)和全息视图一样,我很高兴能够同时使用两者!