2013-05-24 10 views
6

Ho una GUI che visualizza un grafico. Voglio adattare quella trama a un'immagine esistente. Ho visualizzato l'immagine sotto la trama usando:Ridimensiona l'immagine in matplotlib senza cambiare l'asse

myaxe.plot(...) 
myaxeimage = myaxe.imshow(myimage, axpect='auto', extent=myaxe.axis(), zorder=-1) 

Sono già in grado di giocare con l'opacità dell'immagine, utilizzando

myaxeimage.set_alpha() 

Ora mi piacerebbe essere in grado di ingrandire e fuori e per muoversi intorno all'immagine, utilizzando la GUI, senza toccare la trama e gli assi esistenti, al fine di allinearlo con la mia trama. In altre parole, desidero ridimensionare i fattori sx e sy e inserire l'origine dell'immagine in un dato punto (x,y), ritagliando parti dell'immagine fuori dagli assi. Come lo posso fare?

+1

forse utilizzare un secondo asse e vedere se è possibile renderlo trasparente (non è sicuro che sia comunque possibile). – tacaswell

risposta

0

Infine, seguita tcaswell suggerimento e usati 2 assi differenti. In questo modo, devo semplicemente giocare con set_xlim() e set_ylim() dei miei assi immagine per modificare l'origine e/o il fattore di ingrandimento della mia immagine. Ho ordinato di ottenere l'immagine sotto la mia trama, senza nasconderlo con la trama della trama, ho rimosso la cornice della trama e usato invece la cornice degli assi dell'immagine. Ho anche nascosto i segni di spunta dagli assi dell'immagine.

from matplotlib import pyplot 

f = pyplot.figure() 
a = f.add_subplot(111, frameon=False) # Remove frame 
a.plot(...) 

myimg = pyplot.imread(...) 
imgaxes = f.add_axes(a.get_position(), # new axes with same position 
    label='image', # label to ensure imgaxes is different from a 
    zorder=-1, # put image below the plot 
    xticks=[], yticks=[]) # remove the ticks 
img = imgaxes.imshow(myimg, aspect='auto') # ensure image takes all the place 

# now, to modify things 
img.set_alpha(...) 
imgaxes.set_xlim((x1, x2)) # x1 and x2 must be calculated from 
          # image size, origin, and zoom factor 
6

C'è un watermark example distribuito con matplotlib che è un po 'simile. A partire da quel codice, possiamo modificare come segue:

Utilizzare ax.imshow per tracciare prima l'immagine. Lo faccio perché il parametro extent influisce sull'estensione finale di ax. Dal momento che vogliamo che l'estensione finale sia regolata dallo plt.plot(...), mettiamola per ultimo.

myaximage = ax.imshow(im, aspect='auto', extent=(1,15,0.3,0.7), alpha=0.5, origin='upper', zorder=-1) 

Invece di extent=myaxe.axis(), utilizzare extent per controllare la posizione e la dimensione dell'immagine. extent=(1,15,0.3,0.7) posiziona l'immagine nel rettangolo con (1, 0.3) come angolo in basso a sinistra e (15, 0.7) come in alto a destra.

Con origin='upper', l'indice [0,0] dell'array im si trova nell'angolo in alto a sinistra dell'estensione. Con origin='lower' sarebbe stato collocato nell'angolo in basso a sinistra.


import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib.cbook as cbook 
import matplotlib.image as image 
np.random.seed(1) 
datafile = cbook.get_sample_data('logo2.png', asfileobj=False) 
im = image.imread(datafile) 
fig, ax= plt.subplots() 

myaximage = ax.imshow(im, aspect='auto', extent=(1,15,0.3,0.7), alpha=0.5, zorder=-1) 
ax.plot(np.random.rand(20), '-o', ms=20, lw=2, alpha=1.0, mfc='orange') 
ax.grid() 
plt.show() 

enter image description here


Se si desidera espandere l'immagine e clip per l'estensione della trama, potrebbe essere necessario utilizzare ax.set_xlim e ax.set_ylim così:

myaximage = ax.imshow(im, aspect='auto', extent=(-1,25,0.3,0.7), alpha=0.5, zorder=-1, 
         origin='upper') 

ax.plot(np.random.rand(20), '-o', ms=20, lw=2, alpha=1.0, mfc='orange') 
ax.set_xlim(0,20) 
ax.set_ylim(0,1) 

enter image description here


Oppure, per un maggiore controllo, è possibile agganciare l'immagine di un percorso arbitrario utilizzando myaximage.set_clip_path:

import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib.cbook as cbook 
import matplotlib.image as image 
import matplotlib.patches as patches 
np.random.seed(1) 
datafile = cbook.get_sample_data('logo2.png', asfileobj=False) 
im = image.imread(datafile) 
fig, ax= plt.subplots() 

myaximage = ax.imshow(im, aspect='auto', extent=(-5,25,0.3,0.7), 
         alpha=0.5, origin='upper', 
         zorder=-2) 
# patch = patches.Circle((300,300), radius=100) 
patch = patches.Polygon([[5, 0.4], [15, 0.4], [15, 0.6], [5, 0.6]], closed=True, 
         transform=ax.transData) 
myaximage.set_clip_path(patch) 
ax.plot(np.random.rand(20), '-o', ms=20, lw=2, alpha=1.0, mfc='orange', 
     zorder=-1) 

ax.set_xlim(0, 20) 
ax.set_ylim(0, 1) 

plt.show() 

enter image description here

Problemi correlati