Istnieje plik watermark example dystrybuowany z matplotlib, który jest podobny. Zaczynając od tego kodu, możemy zmodyfikować w następujący sposób:
Użyj najpierw ax.imshow
, aby narysować obraz. Robię to, ponieważ parametr extent
wpływa na ostateczny zakres ax
. Ponieważ chcemy, aby ostateczny zakres był zarządzany przez plt.plot(...)
, umieśćmy go na końcu.
myaximage = ax.imshow(im, aspect='auto', extent=(1,15,0.3,0.7), alpha=0.5, origin='upper', zorder=-1)
Zamiast extent=myaxe.axis()
użyć extent
kontrolować położenie i rozmiar obrazu. extent=(1,15,0.3,0.7)
umieszcza obraz w prostokącie jako (1, 0.3)
jako lewy dolny róg i (15, 0.7)
jako prawy górny róg.
Z origin='upper'
indeks [0,0]
indeks tablicy im
jest umieszczony w lewym górnym rogu zakresu. Z origin='lower'
zostałby umieszczony w lewym dolnym rogu.
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()
Jeśli chcesz rozszerzyć obraz i przypiąć go do tego stopnia, działki, może trzeba użyć ax.set_xlim
i ax.set_ylim
także:
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)
Albo na większą kontrolę, można obcięcie obrazu do dowolnej ścieżki za pomocą 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()
może użyć drugiej osi i sprawdzić, czy można uczynić ją przezroczystą (nie jest to jednak możliwe). – tacaswell