2016-08-08 4 views
1

Я делаю иллюстрации для своей статьи на python, используя библиотеку matplotlib. На этой иллюстрации у меня много линий, полигонов, кругов и т. Д. Но тогда я также хочу вставить изображение .png извне.Вставка/настройка png в сюжет [matplotlib]

Вот что я пытаюсь сделать, до сих пор:

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

Таким образом, вопрос, как определить значения для rect = 0.5, 0.4, 0.4, 0.4? Например, я хочу, чтобы нижний левый угол моего .png находился в точке [20, 15], и я хочу, чтобы его высота была 25.

Это результирующее изображение:

nonadjusted image

Но я хочу, чтобы это манекен рамки быть отрегулирована на мои точки многоугольника, как это (это один скорректированные в фотошопе):

adjusted in photoshop

PS Вот link на frame.png, чтобы поэкспериментировать с.

ответ

1

Вы можете построить свои линии и картинку на одной оси? для этого используйте ключ extent в 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

Спасибо, это работает для меня. Не думал, что ответ будет таким легким. Во всяком случае, извините меня, если вопрос был слишком глупым. –