web-dev-qa-db-fra.com

Comment travailler avec des images dans Bokeh (Python)

Par exemple, vous pouvez tracer une image dans matplotlib en utilisant ce code:

%matplotlib inline
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
img=mpimg.imread('image.png')
plt.imshow(img)

Est-ce que quelque chose comme ça est possible avec Bokeh (0.10)?

16
Trevor McCormick

Vous pouvez utiliser le glyphe ImageURL (image_url méthode plot) pour charger des images localement ou à partir du Web.

from bokeh.plotting import figure, show, output_file

output_file('image.html')

p = figure(x_range=(0,1), y_range=(0,1))
p.image_url(url=['tree.png'], x=0, y=1, w=0.8, h=0.6)
## could also leave out keywords
# p.image_url(['tree.png'], 0, 1, 0.8, h=0.6)  
show(p)

Image Example

One gotcha - si vous ne représentez qu'une image (et aucune autre donnée), vous devrez définir explicitement les plages de tracé.

Voici les documents:

http://docs.bokeh.org/en/latest/docs/reference/models/glyphs.html#bokeh.models.glyphs.ImageURL

22
Luke Canavan

La réponse précédente était utile. Cependant, je voulais une option d'image uniquement sans objet supplémentaire. Ainsi, l'ajout de la réponse pour Bokeh version 0.12.0 et la suppression de toutes les grilles, axes et barre d'outils.

from bokeh.plotting import figure, curdoc
from bokeh.models import ColumnDataSource, Range1d

bosch_logo = "static/tree.jpg"
logo_src = ColumnDataSource(dict(url = [bosch_logo]))

page_logo = figure(plot_width = 500, plot_height = 500, title="")
page_logo.toolbar.logo = None
page_logo.toolbar_location = None
page_logo.x_range=Range1d(start=0, end=1)
page_logo.y_range=Range1d(start=0, end=1)
page_logo.xaxis.visible = None
page_logo.yaxis.visible = None
page_logo.xgrid.grid_line_color = None
page_logo.ygrid.grid_line_color = None
page_logo.image_url(url='url', x=0.05, y = 0.85, h=0.7, w=0.9, source=logo_src)
page_logo.outline_line_alpha = 0 
curdoc().add_root(page_logo)
9
Jayant

L'exécution de cet exemple à l'aide du service bokeh est un peu plus délicate. Je suggère de configurer correctement le répertoire de travail:

server_folder/
     +main.py
     +static/
         +logo.png

.. et exécutez la commande bokeh serve depuis le répertoire [~ # ~] ci-dessus [~ # ~] dossier_serveur

bokeh serve server_folder --show

Ensuite, ce code fonctionne pour moi

#main.py file
from bokeh.plotting import figure, curdoc
x_range = (-20,-10) # could be anything - e.g.(0,1)
y_range = (20,30)
p = figure(x_range=x_range, y_range=y_range)
#img_path = 'https://docs.bokeh.org/en/latest/_static/images/logo.png'
img_path = 'server_folder/static/logo.png'
p.image_url(url=[img_path],x=x_range[0],y=y_range[1],w=x_range[1]-x_range[0],h=y_range[1]-y_range[0])
doc = curdoc()
doc.add_root(p)

enter image description here

5
Karel Marik

Une autre option consiste à afficher l'image dans un div .:

from bokeh.io import output_notebook, show
from bokeh.models.widgets import Div

output_notebook()
div_image = Div(text="""<img src="https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/7.png" alt="div_image">""", width=150, height=150)
show(div_image)

Squirtle Sprite

ImageURL ne peut pas être mis à jour dynamiquement avec un rappel . Cependant, en utilisant un div, vous pouvez le faire en traitant le div_image.text comme une chaîne régulière Python, par exemple:

from ipywidgets import interact

from bokeh.io import output_notebook, show, Push_notebook
from bokeh.models.widgets import Div

output_notebook()
div_image = Div(text="""<img src="https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/1.png" alt="div_image">""", width=100, height=100)

def update(pokemon_number=1):
    div_image.text = """<img src="https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/{}.png" alt="div_image">""".format(pokemon_number)
    Push_notebook()

show(div_image, notebook_handle=True)

interact(update, pokemon_number=[1, 4, 7])

Pokemon selector

Bien sûr, la source d'image peut également pointer vers un fichier local.

(Testé dans Python 3.7.3 et bokeh 1.2.0)

2
Arturo