2015-12-24 9 views
5

Vorrei tracciare un grafico su uno sfondo di immagine usando matplotlib. Ho trovato come farlo in MATLAB http://www.peteryu.ca/tutorials/matlab/plot_over_image_backgroundStampa su uno sfondo di immagine in python

Ho provato qualcosa di fondamentale come questo:

im = plt.imread("dd.png") 
implot = plt.imshow(im) 
theta=np.linspace(0,2*np.pi,50) 
z=np.cos(theta)*39+145 
t=np.sin(theta)*39+535-78+39 
plt.plot(z,t) 
plt.show() 

ma mi ha dato qualcosa di veramente brutto:

something really ugly

+2

'imshow' può richiedere molti più argomenti che consentono di specificare dove è posizionata l'immagine e la sua estensione nello spazio delle coordinate. Per impostazione predefinita, l'angolo in alto a sinistra è posizionato su (0, 0) e ogni pixel è 1x1 unità in larghezza e altezza. –

risposta

17

Proprio come nel Esempio di MATLAB a cui ti sei collegato, devi specificare l'estensione desiderata dell'immagine quando chiami allo imshow.

Per impostazione predefinita, matplotlib e MATLAB posizionano entrambi l'angolo in alto a sinistra dell'immagine, vanno giù e verso destra da lì e impostano ciascun pixel come un quadrato 1x1 nello spazio delle coordinate. Questo è ciò che sta facendo la tua immagine.

È possibile controllare questo con il parametro extent che assume la forma di un elenco [left, right, bottom, top].

Non usando misura assomiglia a questo:

import matplotlib.pyplot as plt 
img = plt.imread("airlines.jpg") 
fig, ax = plt.subplots() 
ax.imshow(img) 

enter image description here

Si può vedere che abbiamo un 1600 x 1200 di Samuel L. Jackson ottenere, francamente, un po 'seccato con il serpente a bordo della sua volo aereo

Ma se vogliamo tracciare una linea che va da 0 a 300 in entrambe le dimensioni su questo, siamo in grado di fare proprio questo:

fig, ax = plt.subplots() 
x = range(300) 
ax.imshow(img, extent=[0, 400, 0, 300]) 
ax.plot(x, x, '--', linewidth=5, color='firebrick') 

enter image description here

non so se la linea sarà aiutare il signor Jackson con il suo problema serpente. Per lo meno, non renderà le cose più difficili.