【问题标题】:Why doesn't holoviews show histogram in Spyder?为什么全息视图在 Spyder 中不显示直方图?
【发布时间】:2023-04-05 18:59:01
【问题描述】:

我在 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')

只返回值:

[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 中查看直方图?

【问题讨论】:

  • 您可以使用matplotlib 绘制直方图。阅读this
  • @Bazingaa 谢谢你的回答。我知道matplotlib 可以画出来。我只是想了解如何在 Spyder 中使用 PyViz。
  • 将这个问题重命名为在 Spyder 中显示任何 HoloViews 输出可能会有所帮助,因为我认为这不是直方图的具体问题。

标签: python python-3.x spyder holoviews


【解决方案1】:

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

【讨论】:

【解决方案2】:

holoviews 的美妙之处在于它允许您在基于现代浏览器的 bokeh 和古老熟悉的 ma​​tplotlib 之间进行选择来显示其绘图(以及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,我很高兴能够同时使用这两者!

【讨论】:

    【解决方案3】:

    作为一种解决方法,您可以通过将 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()
    

    另请参阅:
    https://stackoverflow.com/questions/57971107/how-do-i-get-my-interactive-holoviews-graph-to-display-in-visual-studio-without/[][1]

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

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

    【讨论】:

    • 这是迄今为止显示我的可视化的最快方法。谢谢!
    • @BrianS 我刚刚添加了一个额外的替代解决方案。也许它更容易;)
    • 有趣的是,只有第一个解决方案对我有用...show(hv.render(your_holoviews_plot)) 执行没有错误,但浏览器没有打开,我没有看到情节
    猜你喜欢
    • 1970-01-01
    • 2022-01-17
    • 2021-03-23
    • 1970-01-01
    • 1970-01-01
    • 2015-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多