web-dev-qa-db-fra.com

Comment insérer une petite image au coin d'une parcelle avec Matplotlib?

Ce que je veux est vraiment simple. J'ai un petit fichier image appelé "logo.png" que je souhaite afficher sur le coin supérieur gauche de mes parcelles. Mais vous ne pouvez pas trouver d'exemple de cela dans les exemples Galerie de Matplotlib

Im en utilisant django et mon code est quelque chose comme ça

def get_bars(request)
    ...
    fig = Figure(facecolor='#F0F0F0',figsize=(4.6,4))
    ...
    ax1 = fig.add_subplot(111,ylabel="Valeur",xlabel="Code",autoscale_on=True)
    ax1.bar(ind,values,width=width, color='#FFCC00',edgecolor='#B33600',linewidth=1)
    ...
    canvas = FigureCanvas(fig)
    response = HttpResponse(content_type='image/png')
    canvas.print_png(response)
    return response

des idées?? thxs à l'avance

24
pleasedontbelong

Si vous voulez l'image au coin de votre chiffre réelle (plutôt que sur le coin de votre axe), examinez-vous figimage .

Peut-être quelque chose comme ça? (Utiliser PIL pour lire l'image):

import matplotlib.pyplot as plt
import Image
import numpy as np

im = Image.open('/home/jofer/logo.png')
height = im.size[1]

# We need a float array between 0-1, rather than
# a uint8 array between 0-255
im = np.array(im).astype(np.float) / 255

fig = plt.figure()

plt.plot(np.arange(10), 4 * np.arange(10))

# With newer (1.0) versions of matplotlib, you can 
# use the "zorder" kwarg to make the image overlay
# the plot, rather than hide behind it... (e.g. zorder=10)
fig.figimage(im, 0, fig.bbox.ymax - height)

# (Saving with the same dpi as the screen default to
#  avoid displacing the logo image)
fig.savefig('/home/jofer/temp.png', dpi=80)

plt.show()

alt text

Une autre option, si vous souhaitez que l'image soit une fraction fixe de la largeur/hauteur de la figure consiste à créer un axes "factices" et placez l'image en elle avec imshow. De cette façon, la taille et la position de l'image sont indépendantes du DPI et de la taille absolue de la figure:

import matplotlib.pyplot as plt
from matplotlib.cbook import get_sample_data

im = plt.imread(get_sample_data('grace_hopper.jpg'))

fig, ax = plt.subplots()
ax.plot(range(10))

# Place the image in the upper-right corner of the figure
#--------------------------------------------------------
# We're specifying the position and size in _figure_ coordinates, so the image
# will shrink/grow as the figure is resized. Remove "zorder=-1" to place the
# image in front of the axes.
newax = fig.add_axes([0.8, 0.8, 0.2, 0.2], anchor='NE', zorder=-1)
newax.imshow(im)
newax.axis('off')

plt.show()

enter image description here

43
Joe Kington