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()
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)
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()
forse utilizzare un secondo asse e vedere se è possibile renderlo trasparente (non è sicuro che sia comunque possibile). – tacaswell