J'ai Anaconda 3.7 installé sur Windows. Cela fonctionne dans Jupyter mais pas dans Spyder. Ce code:

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

Renvoie uniquement des valeurs:

[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.

Est-il possible de voir l'histogramme dans Spyder?

2
Joys 17 mars 2019 à 17:18

3 réponses

Meilleure réponse

( Mainteneur Spyder ici ) Holoviews produit du contenu à afficher dans un navigateur Web et les consoles Spyder ne sont pas en mesure d'afficher ce contenu pour le moment, désolé.

4
Carlos Cordoba 17 mars 2019 à 15:10

La beauté des holoviews est qu'il vous permet de choisir entre le bokeh moderne basé sur un navigateur et le bon vieux matplotlib pour afficher ses tracés (ainsi que plotly dans une certaine mesure, principalement pour les tracés 3D).

Spyder est capable de rendre les tracés matplotlib soit en ligne (c'est-à-dire dans la console python elle-même ou depuis récemment leur nouveau panneau de tracés) ou de manière interactive (c'est-à-dire dans une fenêtre contextuelle - plusieurs backends existent, parmi tous les qt). Vous pouvez basculer entre ceux-ci en tapant %matplotlib inline ou %matplotlib qt dans votre console spyder ipython.

Ces backends seront alors l'endroit où atterriront vos parcelles matplotlib générées par holoview !

Maintenant, vous devez dire explicitement à holoviews d'utiliser matplotlib comme backend pour rendre les tracés (ce que j'appelle ci-dessous holoview_object peut être soit ce qu'ils appellent un «élément» soit une combinaison de ceux-ci: mise en page, superposition, holomap ...) . Vous pouvez le faire en utilisant

matplotlib_fig = holoviews.render(holoview_object, backend='matplotlib')

Puis créez une figure matplotlib vide et piratez son gestionnaire pour l'afficher dans votre backend matplotlib par défaut :

dummy = plt.figure()
new_manager = dummy.canvas.manager
new_manager.canvas.figure = matplotlib_fig
fig.set_canvas(new_manager.canvas)

En utilisant les concepts ci-dessus, je me suis créé des fonctions utilitaires pour afficher facilement des tracés matplotlib ou bokeh depuis spyder, directement ou en commençant par un objet holoviews, n'hésitez pas à les utiliser :

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

En résumé: si vous souhaitez rendre votre tracé statiquement dans le volet de tracé spyder (ou la console python si vous n'utilisez pas leur volet de tracé), faites :

%matplotlib inline
hvshow(holoviews_object, 'matplotlib')

Si vous souhaitez afficher votre tracé dans une fenêtre qt interactive, procédez comme suit :

%matplotlib qt
hvshow(holoviews_object, 'matplotlib')

Si vous souhaitez afficher votre tracé dans votre navigateur (c'est-à-dire avec bokeh), également de manière interactive, procédez comme suit :

hvshow(holoviews_object, 'bokeh')

J'adore spyder (bien plus que les cahiers jupyter) autant que les holoviews et je suis ravi de pouvoir utiliser les deux ensemble !

4
Maxime Beau 5 oct. 2020 à 16:56

Pour contourner le problème, vous pouvez ouvrir votre graphique dans votre navigateur en plaçant votre graphique Holoviews dans un objet Panel et en appelant .show() dessus.
Le panneau Bibliothèque peut être utilisé pour créer un tableau de bord avec des graphiques Holoviews dans votre navigateur.
Voici un exemple fonctionnel :

# 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()

Voir également : Comment afficher mon graphique Holoviews interactif dans Visual Studio (sans Jupyter) ?

1
Sander van den Oord 17 sept. 2019 à 20:51