2013-05-24 8 views
6

Tôi có GUI hiển thị ô. Tôi muốn phù hợp với cốt truyện đó với một hình ảnh hiện có. Tôi hiển thị hình ảnh dưới những âm mưu sử dụng:Hình ảnh tỷ lệ trong matplotlib mà không thay đổi trục

myaxe.plot(...) 
myaxeimage = myaxe.imshow(myimage, axpect='auto', extent=myaxe.axis(), zorder=-1) 

Tôi đã có thể chơi với opacity của hình ảnh, sử dụng

myaxeimage.set_alpha() 

Bây giờ tôi muốn để có thể phóng to và thu ra ngoài và di chuyển xung quanh hình ảnh, sử dụng GUI, mà không cần chạm vào ô và trục hiện có, để căn chỉnh nó với cốt truyện của tôi. Nói cách khác, tôi muốn chia tỷ lệ cho các yếu tố sxsy và đặt nguồn gốc của hình ảnh tại một điểm (x,y) nhất định, cắt các phần của hình ảnh ra ngoài các trục. Làm thế nào tôi có thể làm điều đó?

+1

có thể sử dụng trục thứ hai và xem bạn có thể minh bạch không (không chắc chắn điều đó có thể xảy ra). – tacaswell

Trả lời

0

Cuối cùng, tôi đi theo tcaswell gợi ý và sử dụng 2 trục khác nhau. Bằng cách này, tôi chỉ đơn giản là phải chơi với set_xlim()set_ylim() trục hình ảnh của tôi để thay đổi nguồn gốc và/hoặc hệ số thu phóng của hình ảnh của tôi. Tôi yêu cầu để có được hình ảnh bên dưới cốt truyện của tôi, mà không che giấu nó với khung của cốt truyện, tôi đã loại bỏ khung của cốt truyện và sử dụng khung của các trục hình ảnh thay thế. Tôi cũng ẩn các ve từ các trục hình ảnh.

from matplotlib import pyplot 

f = pyplot.figure() 
a = f.add_subplot(111, frameon=False) # Remove frame 
a.plot(...) 

myimg = pyplot.imread(...) 
imgaxes = f.add_axes(a.get_position(), # new axes with same position 
    label='image', # label to ensure imgaxes is different from a 
    zorder=-1, # put image below the plot 
    xticks=[], yticks=[]) # remove the ticks 
img = imgaxes.imshow(myimg, aspect='auto') # ensure image takes all the place 

# now, to modify things 
img.set_alpha(...) 
imgaxes.set_xlim((x1, x2)) # x1 and x2 must be calculated from 
          # image size, origin, and zoom factor 
6

Có một số watermark example được phân phối với matplotlib tương tự như vậy. Bắt đầu từ mã đó, chúng tôi có thể sửa đổi như sau:

Sử dụng ax.imshow để vẽ hình ảnh trước tiên. Tôi làm điều này vì thông số extent ảnh hưởng đến mức độ cuối cùng là ax. Vì chúng tôi muốn mức độ cuối cùng được điều chỉnh bởi plt.plot(...), hãy đặt nó cuối cùng.

myaximage = ax.imshow(im, aspect='auto', extent=(1,15,0.3,0.7), alpha=0.5, origin='upper', zorder=-1) 

Thay vì extent=myaxe.axis(), hãy sử dụng extent để kiểm soát vị trí và kích thước của hình ảnh. extent=(1,15,0.3,0.7) đặt hình ảnh vào hình chữ nhật với (1, 0.3) làm góc dưới cùng bên trái và (15, 0.7) làm góc trên cùng bên phải.

Với origin='upper', chỉ số [0,0] của mảng im được đặt ở góc trên bên trái của phạm vi. Với origin='lower' nó sẽ được đặt ở góc dưới bên trái.


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

enter image description here


Nếu bạn muốn mở rộng hình ảnh và clip nó vào mức độ của cốt truyện, bạn có thể cần phải sử dụng ax.set_xlimax.set_ylim cũng như:

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) 

enter image description here


Hoặc, để kiểm soát nhiều hơn, bạn có thể cắt hình ảnh một con đường tùy ý bằng cách sử dụng 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() 

enter image description here