2016-08-08 2 views
1

Je réalise des illustrations pour mon papier en python en utilisant la bibliothèque matplotlib. Dans cette illustration j'ai beaucoup de lignes, de polygones, de cercles etc. Mais je veux aussi insérer une image de .png de l'extérieur.Insérer/ajuster png dans plot [matplotlib]

Voici ce que je suis en train de le faire jusqu'à présent:

import matplotlib.pyplot as plt 
import numpy as np 
from matplotlib.patches import Polygon 

fig, ax = plt.subplots() 

plt.tick_params(axis='x', which='both', bottom='off', top='off', labelbottom='off') 
ax.axis('off') 

# drawing circle 
ax.add_patch(
       plt.Circle((0, 0), 0.5, color = 'black') 
      ) 
# drawing polygon 
ax.add_patch(
     Polygon(
      [[0,0], [20, 15], [20, 40]], 
      closed=True, fill=False, lw=1) 
     ) 
# importing image 
im = plt.imread("frame.png") 
# defining image position/size 
rect = 0.5, 0.4, 0.4, 0.4 # What should these values be? 
newax = fig.add_axes(rect, anchor='NE', zorder=1) 
newax.imshow(im) 
newax.axis('off') 

ax.set_aspect(1) 
ax.set_xlim(0, 60) 
ax.set_ylim(0, 40) 
plt.show() 

La question est, comment puis-je déterminer les valeurs de rect = 0.5, 0.4, 0.4, 0.4? Par exemple, je veux que le coin inférieur gauche de mon .png soit au point [20, 15] et je veux que sa hauteur soit 25.

C'est l'image résultante:

nonadjusted image

Mais je veux ce cadre factice à ajuster à mes points de polygone, comme celui-ci (celui-ci est modifiée dans Photoshop):

adjusted in photoshop

PS Voici le link au frame.png pour expérimenter avec.

Répondre

1

pouvez-vous tracer vos lignes et l'image sur le même axe? pour cela, utilisez la touche extent dans plt.imshow()

import numpy as np 
import matplotlib.pyplot as plt 
from matplotlib.patches import Polygon 


im='d:/frame.png' 
img=plt.imread(im) 
fig, ax = plt.subplots() 

frame_height=25 
x_start=20 
y_start=15 
ax.imshow(img,extent=[x_start,x_start+frame_height,y_start,y_start+frame_height]) 

ax.add_patch(
     Polygon(
      [[0,0], [20, 15], [20, 40]], 
      closed=True, fill=False, lw=1) 
     ) 
ax.set_xlim(0, 60) 
ax.set_ylim(0, 40) 
plt.show() 
+0

Merci, cela a fonctionné pour moi. Je ne pensais pas que la réponse serait aussi simple que ça. De toute façon, excusez-moi si la question était trop stupide. –