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

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_xlim
và ax.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)

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

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