web-dev-qa-db-fra.com

Tracer sur un arrière-plan d'image en python

Je voudrais tracer un graphique sur un fond d'image en utilisant matplotlib. J'ai trouvé comment le faire dans matlab http://www.peteryu.ca/tutorials/matlab/plot_over_image_background

J'ai essayé quelque chose de basique comme ça:

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()

mais ça m'a donné quelque chose de vraiment moche:

something really ugly

16
A.Tipe

Tout comme dans l'exemple MATLAB auquel vous avez lié, vous devez spécifier l'étendue souhaitée de l'image lorsque vous appelez imshow.

Par défaut, matplotlib et MATLAB placent tous deux le coin supérieur gauche de l'image sur l'origine, descendent vers la droite à partir de là et définissent chaque pixel comme un carré 1x1 dans l'espace de coordonnées. C'est ce que fait votre image.

Vous pouvez contrôler cela avec le paramètre extent qui prend la forme d'une liste [left, right, bottom, top].

Ne pas utiliser l'étendue ressemble à ceci:

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

enter image description here

Vous pouvez voir que nous avons un 1600 x 1200 de Samuel L. Jackson qui, très franchement, est plutôt ennuyé par le serpent à bord de son vol.

Mais si nous voulons tracer une ligne allant de 0 à 300 dans les deux dimensions sur cela, nous pouvons le faire:

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

Je ne sais pas si la ligne aidera M. Jackson avec son problème de serpent. À tout le moins, cela ne rendra pas les choses plus difficiles.

62
Paul H